测速器_MS-US级_代码修改
jrcsh2009/02/24电子技术 IP:广东
找到了一个差不多的应用列子  不过个是 秒级的  C51作的记时器

我想吧他改到  MS  或 US 秒级的  用来测 电磁枪子弹的 速度  大到数据在  10M/S  ~~ 300M/S (有 200M/S 就不错了)

显示最终也可能改成 用 数码管吧  


下边这个实列   会的先帮我看看吧   怎么样改更好  电路就能不动就不动吧 [s:258]

近期时间不多~~~  我的水平也有限 要慢慢找书对代码 哈哈 在想怎么样改





           K1=P1.4  K2=P1.5   K3=P1.6  K4=P1.7
;*          1602LCD显示秒表                                                     *
;*          K3 --- 控制按键                                                     *
;*                 第一次按下时,开始计时,第二次按下时,暂停计时。               *
;*                 第三次按下时,累计计时,第四次按下时,暂停计时。               *
;*          K4 --- 清零按键:                                                   *
;*                 在任何状态下,按一下K4,均可清零。                           *
;*                                                                              *

;---------------------------------------
;晶振 11.0592M
;定时器0,方式1
;计时中断程序每隔10ms中断一次
;---------------------------------------
          TLOW   EQU  0CH     ;定时器初值
          THIGH  EQU  0DCH

          HOUR   EQU  30H
          MIN    EQU  31H
          SEC    EQU  32H
          SEC0   EQU  33H     ;10ms计数值
          KEY_S  EQU  34H     ;为键当前的端口状况
          KEY_V  EQU  35H     ;为键上次的端口状况
          X      EQU  36H     ;LCD 地址变量
          KEY_C  EQU  37H     ;键计数单元

          K1     EQU  P1.4
          K2     EQU  P1.5
          K3     EQU  P1.6
          K4     EQU  P1.7

          BEEP  EQU  P3.7
          RS    EQU  P2.0     ;LCD控制端口定义
          RW    EQU  P2.1
          EN    EQU  P2.2

;----------------------------------------------------
          ORG   0000H
          JMP  START
          ORG  0BH
          JMP  T0_INT
;----------------------------------------------------
START:    MOV  SP,#60H
          CLR  EN
          CALL  SET_LCD
          CALL  INIT            初始化变量
          MOV  KEY_V,#01H
          CALL  INIT_TIMER      初始化定时器
          CALL  MENU
LOOP:     CALL   CONV           ;时间计数处理
          CALL LOOP1
          CALL  SKEY            判是否有键按下
          JZ  LOOP              无键按下转LOOP
          CALL   CONV
          CALL  SKEY
          JZ  LOOP
          MOV  KEY_V,KEY_S      交换数据
          CALL  P_KEY
          JMP  LOOP
;-----------------------------------------------------
LOOP1:    JB  K4,LOOP2         ;判清零键是否按下
          CALL  BZ
          JMP  START
LOOP2:    RET
;-----------------------------------------------------
P_KEY:                          
          MOV  A,KEY_V
          JB  ACC.0,P_KEY3
          INC  KEY_C
          MOV  A,KEY_C          K3键是否第一次按下?
          CJNE  A,#01H,P_KEY1
          MOV    DPTR,#MADJ    显示执行信息
          MOV    A,#1          
          CALL   LCD_PRINT
          SETB  TR0            启动中断
          RET
P_KEY1:                          K3键是否第二次按下?
          MOV   A,KEY_C
          CJNE  A,#02H,P_KEY2
          MOV   DPTR,#MADJ1      显示执行信息
          MOV   A,#1
          CALL  LCD_PRINT
          CLR   TR0              停止中断
          RET
P_KEY2:                          K3键是否第三次按下?
          MOV   A,KEY_C
          CJNE  A,#03H,P_KEY3
          MOV   DPTR,#MADJ2      显示执行信息
          MOV   A,#1
          CALL  LCD_PRINT
          SETB   TR0             ;启动中断
          RET
P_KEY3:                          K3键是否第四次按下?
          MOV   A,KEY_C
          CJNE  A,#04H,P_KEY4
          MOV   DPTR,#MADJ3      显示执行信息
          MOV   A,#1
          CALL  LCD_PRINT
          CLR   TR0              启动中断
P_KEY4:   RET
;-------------------------------------------------------
SKEY:     CLR  A                判是否有键按下子程序
          MOV  KEY_S,A
          MOV  C,K3
          RLC  A
          ORL  KEY_S,A
          MOV  A,KEY_S
          XRL  A,KEY_V          有键按下,A 中内容不为零
          RET
;--------------------------------------------------------
LMESS1:  DB  "                ",0  LCD 第一行显示消息
LMESS2:  DB  "TIME            ",0  LCD 第二行显示消息
;--------------------------------------------------------
INIT:    CLR  A
         MOV  KEY_C,A         ;初始化控制变量
         MOV  SEC0,A
         MOV  SEC,A
         MOV  MIN,A
         MOV  HOUR,A
         MOV  KEY_S,A
         MOV  KEY_V,A
         SETB  BEEP
         CLR  TR0
         RET
;------------------------------------------------------------
INIT_TIMER:                     ;初始化定时器接口
         MOV  TMOD,#01H         ;设置定时器0 工作模式为模式1
         MOV  IE,  #82H         ;启用定时器0 中断产生
         MOV  TL0,#TLOW
         MOV  TH0,#THIGH
         RET
;-------------------------------------------------------------
T0_INT:
         PUSH  ACC           ;定时器0计时中断程序
         MOV  TL0,#TLOW
         MOV  TH0,#THIGH
         INC  SEC0
         MOV  A,SEC0         ;10ms 计数值加1
         CJNE  A,#100,TT
         MOV  SEC0,#0
         INC  SEC            秒加1
         MOV  A,SEC
         CJNE  A,#60,TT
         INC  MIN            分加1
         MOV  SEC,#0
         MOV  A,MIN
         CJNE  A,#60,TT
         INC  HOUR           ;时加1
         MOV  MIN,#0
         MOV  A,HOUR
         CJNE  A,#24,TT
         MOV  SEC0,#0
         MOV  SEC,#0          秒、分、时单元清0
         MOV  MIN,#0
         MOV  HOUR,#0
TT:     POP  ACC
         RETI
;-------------------------------------------------------
;   在第二行显示数字
;-------------------------------------------------------
SHOW_DIG2:                    在 LCD 的第二行显示数字
          MOV  B,#10         ;设置被除数
          DIV  AB            结果A存商数,B存余数
          ADD  A,#30H        A为十位数,转换为字符
          PUSH  B            B放入堆栈暂存
          MOV  B,X           ;设置 LCD 显示的位置
          CALL  LCDP2        由 LCD 显示出来
          POP  B             ;
          MOV  A,B           ;B为个位数
          ADD  A,#30H        转换为字符
          INC  X             ;LCD 显示位置加1
          MOV  B,X           ;设置 LCD 显示的位置
          CALL  LCDP2        由 LCD 显示出来
          RET
;-------------------------------------------
;转换为 ASCII 码并显示
;-------------------------------------------
CONV:
          MOV  A,HOUR        加载小时数据
          MOV  X,#5          设置位置
          CALL  SHOW_DIG2    显示数据
          INC  X             ;
          MOV  A,#':'        
          MOV  B,X           ;
          CALL  LCDP2        
          MOV  A,MIN         ;加载分钟数据
          INC  X             ;设置位置
          CALL  SHOW_DIG2    显示数据
          INC  X             ;
          MOV  A,#':'        
          MOV  B,X           ;
          CALL  LCDP2        
          MOV  A,SEC         ;加载秒数数据
          INC  X             ;设置位置
          CALL  SHOW_DIG2    显示数据
          INC  X             ;
          MOV  A,#':'        
          MOV  B,X           ;
          CALL  LCDP2        
          MOV  A,SEC0        加载秒数数据
          INC  X             ;设置位置
          CALL  SHOW_DIG2
          RET
;---------------------------------------------------------
;  LCD  CONTROL
;---------------------------------------------------------
SET_LCD:                     ;对 LCD 做初始化设置及测试
          CLR  EN
          CALL  INIT_LCD     ;初始化 LCD
          MOV  R5,#10
          CALL  DELAY
          MOV  DPTR,#LMESS1  指针指到显示消息1
          MOV  A,#1          显示在第一行
          CALL  LCD_PRINT
          MOV  DPTR,#LMESS2  指针指到显示消息2
          MOV  A,#2          显示在第二行
          CALL  LCD_PRINT
          RET
;----------------------------------------------------------
INIT_LCD1:                   ;LCD 控制指令初始化
          MOV  A,#38H        双列显示,字形5*7点阵
          CALL  WCOM         ;
          call  delay1
          MOV  A,#0CH        开显示,显示光标,光标不闪烁
          CALL  WCOM         ;
          call  delay1
          MOV  A,#01H        清除 LCD 显示屏
          CALL  WCOM         ;
          call  delay1
          RET
;----------------------------------------------------------
ENABLE:                       ;写指令
          CLR RS              RS=L,RW=L,E=高脉冲
          CLR RW              D0-D7=指令码
          SETB EN
          ACALL DELAY1          
          CLR EN
          RET
;----------------------------------------------------------
LCD_PRINT:       ;在LCD的第一行或第二行显示字符

          CJNE  A,#1,LINE2  判断是否为第一行
  LINE1:  MOV  A,#80H       ;设置 LCD 的第一行地址
          CALL  WCOM        写入命令
          CALL  CLR_LINE    清除该行字符数据
          MOV  A,#80H       ;设置 LCD 的第一行地址
          CALL  WCOM        写入命令
          JMP  FILL
  LINE2:  MOV  A,#0C0H      设置 LCD 的第二行地址
          CALL  WCOM        写入命令
          CALL  CLR_LINE    清除该行字符数据
          MOV  A,#0C0H      设置 LCD 的第二行地址
          CALL  WCOM
  FILL:   CLR  A            填入字符
          MOVC  A,@A+DPTR   ;由消息区取出字符
          CJNE  A,#0,LC1    判断是否为结束码
          RET
  LC1:    CALL  WDATA       ;写入数据
          INC  DPTR         ;指针加1
          JMP  FILL         ;继续填入字符
          RET
;-------------------------------------------------------
CLR_LINE:                  清除该行 LCD 的字符
          MOV  R0,#24
   CL1:   MOV  A,#' '
          CALL  WDATA
          DJNZ  R0,CL1
          RET
;-------------------------------------------------------
   DE:    MOV  R7,#250      延时500微秒
          DJNZ  R7,$
          RET
;-------------------------------------------------------
   EN1:
          CLR   RW
          SETB  EN         ;短脉冲产生启用信号
          CALL  DE
          CLR  EN
          CALL  DE
          RET
;------------------------------------------------------
INIT_LCD:                  8位I/O控制 LCD 接口初始化
          MOV  P0,#38H     ;双列显示,字形5*7点阵
          call  enable
          call  delay1
          MOV  P0,#38H     ;双列显示,字形5*7点阵
          call  enable
          call  delay1
          MOV  P0,#38H     ;双列显示,字形5*7点阵
          call  enable
          call  delay1
          CALL  INIT_LCD1
          RET
;-----------------------------------------------------
WCOM:                     ;以8位控制方式将命令写至LCD
          MOV  P0,A       ;写入命令
          call  enable
          RET
;-----------------------------------------------------
WDATA:                    以8位控制方式将数据写至LCD
          MOV  P0,A       ;写入数据
          SETB  RS        设置写入数据
          CALL  EN1
          RET
;-----------------------------------------------------
;第二行显示字符
;-----------------------------------------------------
LCDP2:                    在LCD的第二行显示字符
         PUSH  ACC        
         MOV  A,B         ;设置显示地址
         ADD  A,#0C0H     ;设置LCD的第二行地址
         CALL  WCOM       ;写入命令
         POP  ACC         ;由堆栈取出A
         CALL  WDATA      写入数据
         RET
;----------------------------------------------------
DELAY:                    延时10MS
         MOV  R6,#50
  D1:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,D1
         DJNZ  R5,DELAY
         RET
;-----------------------------------------------------
DELAY1:                    延时5MS
         MOV  R6,#25
  D2:    MOV  R7,#100
         DJNZ  R7,$
         DJNZ  R6,D2
         RET
;-----------------------------------------------------
BZ:                        蜂鸣器
         MOV  R6,#100
  B1:    CALL  DEX
         CPL  BEEP
         DJNZ  R6,B1
         MOV  R5,#10
         CALL  DELAY
         RET
DEX:    MOV  R7,#180
DE1:    NOP
         DJNZ  R7,DE1
         RET

;-------------------------------------------------
MMENU:  DB  " SECOND-CLOCK 0 ",0
MADJ:   DB  " BEGIN COUNT  1 ",0
MADJ1:  DB  " PAUST COUNT  2 ",0
MADJ2:  DB  " BEGIN COUNT  3 ",0
MADJ3:  DB  " PAUST COUNT  4 ",0
;-------------------------------------------------
MENU:                      LCD 显示工作菜单消息
         MOV  DPTR,#MMENU
         MOV  A,#1
         CALL  LCD_PRINT
         RET
;-------------------------------------------------
         END
+2000  科创币    科创网    2009/02/24 请版主注意加分。
来自:电子信息 / 电子技术
30
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
hamdad
16年0个月前 IP:未同步
77572
乱盖倍数字冠之谬误,修正之道路漫漫兮……
E(exa)=1E18=1000,000,000,000,000,000
P(peta)=1E15=1000,000,000,000,000
T(tera)=1E12=1000,000,000,000
G(giga)=1E9=1000,000,000
M(mega)=1E6=1000,000
K(kilo)=1E3=1000
h(hecto)=1E2=100
da(deca)=1E1=10
d(deci)=1E-1=0.1
c(centi)=1E-2=0.01
m(milli)=1E-3=0.001
μ(micro)=1E-6=0.000001
n(nano)=1E-9=0.000000001
p(pico)=1E-12=0.000000000001
f(femto)=1E-15=0.000000000000001
a(atto)=1E-18=0.000000000000000001

请参考本人过去在本论坛的科普贴
XXXXXXXXXXXXXXXXXXXXXXXX/t/4003

代码当中,机器也许不会计较『M』与『m』的区别,文字描述中,这两个倍数字冠可是差了拾亿倍……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
hamdad
16年0个月前 IP:未同步
77573
今昔有别
楼主如果有幸找到195X年公私合营XXX电气作坊制造的标称值为『1MF』的石蜡浸渍纸介质电容器,千万不要以为是1,000,000F或者是0.001F(1000μF),按照当时的惯例,『M』实际是『Micro』之缩写。

希腊字母当中,小写为『μ』,大写为『M』。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
77575
还有一个实列


;=================================================
; 简单时钟
;
; 时间设定    分钟减1    SW1
;        分钟加1    SW2
;        小时减1    SW3
;        小时加1    SW4
;=================================================
LED1    EQU    021H
LED2    EQU    022H
LED3    EQU    023H
LED4    EQU    024H

JS1    EQU    025H    25MS (0-99)
JS2    EQU    026H    1S   (0-39)
TimeS    EQU    027H    (0-59)秒
TimeM    EQU    028H    (0-59)分钟
TimeH    EQU    029H    (0-23)小时

LedT0    EQU    030H

    ORG 0000H
    LJMP START;转入主程序
    ORG    000BH            定时器0中断入口

INT_TO:
    PUSH    ACC
    PUSH    PSW
;=============================时钟
    INC    JS1
    MOV    A,JS1
    CJNE    A,#100,INT_TIME
    MOV    JS1,#00

    INC    JS2
    MOV    A,JS2
    CJNE    A,#40,INT_TIME
    MOV    JS2,#00
    ===========================================
    (11.0592MHz  补偿)提高精度。
    (250.6510417-250)*4000/250=10.4166672
        MOV    JS1,#10
    ===========================================

    秒数加1
    INC    TimeS
    MOV    A,TimeS
    CJNE    A,#60,INT_TIME
    MOV    TimeS,#00
    分钟加1
    INC    TimeM
    MOV    A,TimeM
    CJNE    A,#60,INT_TIME
    MOV    TimeM,#00
    小时加1
    INC    TimeH
    MOV    A,TimeH
    CJNE    A,#24,INT_TIME
    MOV    TimeH,#00
    INT_TIME:

    MOV    A,TimeH
    CALL    HEXtoBCD
    MOV    LED1,A
    MOV    LED2,B

    MOV    A,TimeM
    CALL    HEXtoBCD
    MOV    LED3,A
    MOV    LED4,B


;=============================显示

    MOV    A,#11110000B    关数码管
    ORL    P2,A
    MOV    A,LedT0
    CJNE    A,#0,INT_T0_1
    MOV    A,LED1
    MOVC    A,@A+DPTR
    MOV    P0,A
    CLR    P2.7    
    MOV    LedT0,#1
    LJMP    INT_T0_END
INT_T0_1:
      
    MOV    A,LedT0
    CJNE    A,#1,INT_T0_2
    MOV    A,LED2
    MOVC    A,@A+DPTR
    MOV    P0,A
    CLR    P2.6    
    MOV    LedT0,#2

    点小数点
    MOV    C,TimeS.0
    MOV    P0.5,C
    LJMP    INT_T0_END
INT_T0_2:
      
     MOV    A,LedT0
    CJNE    A,#2,INT_T0_3
    MOV    A,LED3
    MOVC    A,@A+DPTR
    MOV    P0,A
    CLR    P2.5    
    MOV    LedT0,#3
    LJMP    INT_T0_END
INT_T0_3:
      
    MOV    A,LED4
    MOVC    A,@A+DPTR
    MOV    P0,A
    CLR    P2.4    
    MOV    LedT0,#0
    LJMP    INT_T0_END
      
INT_T0_END:

    POP    PSW    
    POP    ACC

RETI

;========十六进制转换为十进制,A高位,B低位
HEXtoBCD:    
     mov   b,#0ah          HEX>BCD
     div   ab
     anl   a,#00001111b
     anl   b,#00001111b
RET

START:
    MOV    SP,#60H

    CLR    A
    MOV    JS1,A
    MOV    JS2,A
    MOV    TimeH,A
    MOV    TimeS,A
    MOV    TimeM,A

    MOV    TMOD,#02H    设定T0为工作方式2,八位自动重载。
    MOV    TH0,#025    
    MOV    TL0,#025    256-(250*11.0592/12)=256-230.4=25.6   250us(11.0592)
                用25时,中断时间为250.6510417us
                
    SETB    TR0        开定时器0
    SETB    ET0        致能定时0中断
    CLR    TF0        清定时0中断标志
    SETB    EA        开总中断

    MOV    LedT0,#00H
    MOV    DPTR,#TABLE

MAIN:

       MOV    A,#00000011B
    ORL    A,P3
    CPL    A
    JZ        MAIN
    LCALL    DELAY10MS    去抖动
    MOV    A,#00000011B
    ORL    A,P3
    CPL    A
    JZ        MAIN

    JB        ACC.2,KEY_SW1
    JB        ACC.3,KEY_SW2
    JB        ACC.4,KEY_SW3
    JB        ACC.5,KEY_SW4
    LJMP    MAIN

;==============时间设定.分钟减1
KEY_SW1:
    CLR    C
    MOV    A,TimeM
    SUBB    A,#1
    MOV    TimeM,A
    JNC    KEY_SW1_END    
    借位,表示已经减到小于0
    MOV    TimeM,#59
    KEY_SW1_END:
    AJMP    KEY_END

;==============时间设定.分钟加1
KEY_SW2:
    INC    TimeM
    MOV    A,TimeM
    CJNE    A,#60,KEY_SW2_END
    MOV    TimeM,#00
    KEY_SW2_END:
    AJMP    KEY_END

;==============时间设定.小时减1
KEY_SW3:
    CLR    C
    MOV    A,TimeH
    SUBB    A,#1
    MOV    TimeH,A
    JNC    KEY_SW3_END    
    借位,表示已经减到小于0
    MOV    TimeH,#23
    KEY_SW3_END:
    AJMP    KEY_END

;==============时间设定.小时加1
KEY_SW4:
    INC    TimeH
    MOV    A,TimeH
    CJNE    A,#24,KEY_SW4_END
    MOV    TimeH,#00
    KEY_SW4_END:
    AJMP    KEY_END
;按键放开处理
KEY_END:
    MOV    A,#00000011B
    ORL    A,P3
    CPL    A
    JNZ    KEY_END
    LJMP    MAIN

DELAY10MS:
    MOV R4,#20
DELAY10MSA:
    MOV R5,#247
    DJNZ R5,$
    DJNZ R4,DELAY10MSA
RET

TABLE:
    DB    00101000B    0
    DB    11101011B    1
    DB    00110010B    2
    DB    10100010B    3
    DB    11100001B    4
    DB    10100100B    5
    DB    00100100B    6
    DB    11101010B    7
    DB    00100000B    8
    DB    10100000B    9
    DB    01100000B    A
    DB    00100101B    b
    DB    00111100B    C
    DB    00100011B    d
    DB    00110100B    E
    DB    01110100B    F
    DB    11110111B    -
    DB    11111111B    
END
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
77576

  秒是国际单位制中时间的基本单位,符号是s。有时也会借用英文缩写标示为sec.。
  国际单位制词头经常与秒结合以做更细微的划分,例如ms(毫秒,千分之一秒)、µs(微秒,百万分之一秒)和ns(奈秒,十亿分之一秒)。虽然国际单位制词头虽然也可以用于扩增时间,例如ks(千秒)、Ms(百万秒)和Gs(十亿秒),但实际上很少这样子使用,大家都还是习惯用60进制的分、时和24进制的日做为秒的扩充。
  毫秒 (ms)
  微秒 (µs)
  纳秒 (ns)
  皮秒 (ps)
  飞秒 (fs)
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
77577
Re:乱盖倍数字冠之谬误,修正之道路漫漫兮……
引用第1楼hamdad于2009-02-24 00:42发表的 乱盖倍数字冠之谬误,修正之道路漫漫兮…… :
E(exa)=1E18=1000,000,000,000,000,000
P(peta)=1E15=1000,000,000,000,000
T(tera)=1E12=1000,000,000,000
G(giga)=1E9=1000,000,000
M(mega)=1E6=1000,000
.......



的确  不是说你说错了  而是~~~我个人让为~~~你很有空


很有空是吧  帮我看看怎么样改成   uS 级的 记时表吧
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
我说要有光
16年0个月前 IP:未同步
77584
汗。。全是汇编的。。。

LZ为什么不用C
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
AsyncMaster
16年0个月前 IP:未同步
77616
单片机测微秒级别不准.因为本身周期也是微秒级的.执行命令需要时间
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
HK007
16年0个月前 IP:未同步
77621
引用第6楼小光Telnet于2009-02-24 08:11发表的  :
汗。。全是汇编的。。。

LZ为什么不用C

做这种精确到1微秒计时的只有用汇编...
用C误差大...,还要算指令执行时间,麻烦.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
16年0个月前 IP:未同步
77650
如果用STC12系列的单片机就没问题了,那个系列的时钟速度相当于普通51在420MHz下的速度。
或者用AVR也能做到uS级。
用C的话,可以考虑在测速的过程中不显示数据,完成后再显示。
或者用脉冲源+计数器
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°
16年0个月前 IP:未同步
77671
我直看得懂C = - 。。

这种情况我一般用高速芯片配合单片机 直接算很不可靠的 。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
我说要有光
16年0个月前 IP:未同步
77678
我也只看得懂C。。。

话说420MHz貌似能赶上过去的奔腾处理器了。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
16年0个月前 IP:未同步
77680
我上一个C写的计时器吧,但是完整的程序和测试要几天,我会开主题贴的。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
77880
汇编  命令时间好计算   效率高  


还有  C现在 我一点点也不会哈哈~~  

  是要花些时间慢慢学会 C
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
93°
16年0个月前 IP:未同步
77881
= -  。。我来找pia了

我会

delphi/java/c#/vb/XXXXXt/cpp
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
77894
引用第14楼93°于2009-02-25 21:41发表的  :
= -  。。我来找pia了

我会

delphi/java/c#/vb/XXXXXt/cpp


  会为么多~~~~精通了哪个了 呵呵

  C系 过关了 就好一般都可以了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
77935
引用第12楼warmonkey于2009-02-24 19:55发表的  :
我上一个C写的计时器吧,但是完整的程序和测试要几天,我会开主题贴的。



~~~我又找到了 C的列子    ~~  和上边的汇编是用一样的电路的 [s:255]


/*                                                                             *
*                 数码管显示秒表, 分辨率0.01s                                     *
*                 K1=P1.4---控制按钮                                           *
*                       第一次按下时, 启动开始计时                             *
*                       第二次按下时, 停止                                     *
*                       第三次按下时, 归零                                     *
*                                                                              *
*    秒单位,寄存器与数码管对应关系:                                            *
*                                                                              *
* --- 秒单位 ---------- 数码管端口 ---- 缓冲区 --------- 计时BCD码值寄存器     *
*     十万位               P20        dis_buf[7]          sec_bcd[7]           *
*     万位                 P21        dis_buf[6]          sec_bcd[6]           *
*     千位                 P22        dis_buf[5]          sec_bcd[5]           *
*     百位                 P23        dis_buf[4]          sec_bcd[4]           *
*     十位                 P24        dis_buf[3]          sec_bcd[3]           *
*     个位(1.s)            P25        dis_buf[2]          sec_bcd[2]           *
*     十分位(0.1s)         P26        dis_buf[1]          sec_bcd[1]           *
*     百分位(0.01s)        P27        dis_buf[0]          sec_bcd[0]           *
*                                                                              *
********************************************************************************
*/

#include <reg51.h>
#include <intrins.h>

unsigned char data dis_digit;
unsigned char key_s, key_v;

unsigned char code dis_code[11]={0xc0,0xf9,0xa4,0xb0,    // 0, 1, 2, 3
                0x99,0x92,0x82,0xf8,0x80,0x90, 0xff};// 4, 5, 6, 7, 8, 9, off
unsigned char dis_buf[8];        // 显示缓冲区
unsigned char sec_bcd[8];         // 秒计数值, BCD码
unsigned char dis_index;        //
unsigned char key_times;        // K1 按下次数                //

void clr_time();    
void update_disbuf();
bit    scan_key();
void proc_key();
void delayms(unsigned char ms);

sbit    K1 = P1^4;


void main(void)
{
    P0 = 0xff;
    P2 = 0xff;
    TMOD = 0x11;        // 定时器0, 1工作模式1, 16位定时方式
    TH1 = 0xdc;
    TL1 = 0;

    TH0 = 0xFC;
    TL0 = 0x17;
    
    clr_time();            //
                              
    dis_digit = 0x7f;        // 初始显示P20口数码管
    dis_index = 0;            //
    
    key_times = 0;
    key_v = 0x01;
    
    IE = 0x8a;                // 使能timer0, timer1中断
    
    TR0 = 1;
    TR1 = 0;
    while(1)
    {
        if(scan_key())
        {
            delayms(10);
            if(scan_key())
            {
                key_v = key_s;
                proc_key();
            }
        }
        
    }
}

void clr_time()
{
    sec_bcd[0] = 0x0;
    sec_bcd[1] = 0x0;
    sec_bcd[2] = 0x0;
    sec_bcd[3] = 0x0;
    sec_bcd[4] = 0x0;
    sec_bcd[5] = 0x0;
    sec_bcd[6] = 0x0;
    sec_bcd[7] = 0x0;  
    
    update_disbuf();
    
}

bit scan_key()
{
    key_s = 0x00;
    key_s |= K1;
    return(key_s ^ key_v);    
}

void proc_key()
{
    if((key_v & 0x01) == 0)
    {
        key_times++;
        if(key_times == 1)
        {
            TR1 = 1;
        }
        else if(key_times == 2)
        {    
            TR1 = 0;
        }
        else
        {
            clr_time();
            key_times = 0;
        }
        
    }
}

void timer0() interrupt 1
// 定时器0中断服务程序, 用于数码管的动态扫描
// dis_index --- 显示索引, 用于标识当前显示的数码管和缓冲区的偏移量
// dis_digit --- 位选通值, 传送到P2口用于选通当前数码管的数值, 如等于0xfe时,
//                选通P2.0口数码管
// dis_buf   --- 显于缓冲区基地址    
{
    TH0 = 0xFC;
    TL0 = 0x17;
    
    P2 = 0xff;                            // 先关闭所有数码管
    P0 = dis_buf[dis_index];            // 显示代码传送到P0口
    P2 = dis_digit;                        //

    dis_digit = _cror_(dis_digit,1);    // 位选通值右移(P20<-P27), 下次中断时选通下一位数码管
    dis_index++;                        //
                    
    dis_index &= 0x07;            // 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描
}

void timer1() interrupt 3
//
{    
    unsigned char i;
    TH1 |= 0xdc;
    for(i = 0; i < 8; i++)
    {
        sec_bcd[i]++;            // 低位加1
        if(sec_bcd[i] < 10)        // 如果低位满10则向高位进1
            break;            // 低位未满10
        sec_bcd[i] = 0;            // 低位满10清0
    }
    update_disbuf();            // 更新显示缓冲区
}

void update_disbuf()
// 更新显示缓冲区
{
    dis_buf[0] = dis_code[sec_bcd[0]];
    dis_buf[1] = dis_code[sec_bcd[1]];
    dis_buf[2] = dis_code[sec_bcd[2]] & 0x7f;    // 加上小数点
    dis_buf[3] = dis_code[sec_bcd[3]];
    dis_buf[4] = dis_code[sec_bcd[4]];
    dis_buf[5] = dis_code[sec_bcd[5]];
    dis_buf[6] = dis_code[sec_bcd[6]];
    dis_buf[7] = dis_code[sec_bcd[7]];
}

void delayms(unsigned char ms)    
// 延时子程序
{                        
    unsigned char i;
    while(ms--)
    {
        for(i = 0; i < 120; i++);
    }
}
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
80986
;=============================时钟
    INC    JS1
    MOV    A,JS1
    CJNE    A,#1,INT_TIME
    MOV    JS1,#00

    INC    JS2
    MOV    A,JS2
    CJNE    A,#40,INT_TIME
    MOV    JS2,#00
    ===========================================
    (11.0592MHz  补偿)提高精度。
    (250.6510417-250)*4000/250=10.4166672
    MOV    JS1,#02
    ===========================================

    秒数加1
    INC    TimeS
    
    MOV    A,TimeS
    CJNE    A,#4,INT_TIME
    MOV    TimeS,#00
    分钟加1
    INC    TimeM
    MOV    A,TimeM

    CJNE    A,#99,INT_TIME

    MOV    TimeM,#00

    小时加1
    INC    TimeH
    MOV    A,TimeH

    CJNE    A,#100,INT_TIME
    MOV    TimeH,#00
    INT_TIME:

    MOV    A,TimeH
    CALL    HEXtoBCD
    MOV    LED1,A
    MOV    LED2,B

    MOV    A,TimeM
    CALL    HEXtoBCD
    MOV    LED3,A
    MOV    LED4,B



这部份 是用来跑 豪秒的   用4个数码管显视出来  

98进一位是用来修正  时间的  正常是 100位 在进

在去哪挖个  中断  程序显示 当时 变量的 就差不多了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
82536
现在有 2个板本  一个是  数码管 可以同时记 8位 或更多

别一个是    液精显示的  可显示的  位置相当多 2X16 个 最多

代码以抄为主改为负  

照片 006.jpg


照片 001.jpg
照片 002.jpg
照片 003.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
82547
忘加个说明先  不知到了 1mS 的精度 测  电磁枪的子弹行了没  





照片 0032.jpg
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
16年0个月前 IP:未同步
82778
1ms×100m/s=10cm
不行……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
82892
引用第20楼warmonkey于2009-03-19 18:26发表的  :
1ms×100m/s=10cm
不行……


    
哪不是要跑进 0.00001 秒 行了没 也就是  10uS
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
82904
现在  在有2个修改方案吧  

一个是 减少写 LCD 的 时间    可行性不大  最后就是 显不不正常


二个就是  先不显示 实时 时间   按了停止后 在显示   这个是可行性比较高的 就是效时有些准
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
82913
LCD 可能 放去  因为 写LCD的动作也要用去 好多动作

又要改回来用数码管
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
HK007
16年0个月前 IP:未同步
82918
LZ简直2死了,不会用中断啊.
XXXXXXXXXXXXXXXXXXXXXXXX/t/12760
这贴我已经给你提建议了,你自己没看到
[s:243]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
16年0个月前 IP:未同步
82953
引用第24楼HK007于2009-03-20 11:37发表的  :
LZ简直2死了,不会用中断啊.
XXXXXXXXXXXXXXXXXXXXXXXX/t/12760
这贴我已经给你提建议了,你自己没看到
[s:243]



收到收到
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
AsyncMaster
15年11个月前 IP:未同步
83618
..居然不用中断..
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
warmonkey
15年11个月前 IP:未同步
83676
我无语,不会中断……
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
15年11个月前 IP:未同步
83891
引用第27楼warmonkey于2009-03-22 09:33发表的  :
我无语,不会中断……



要不你写~~~  我作电路好了 哈哈
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
15年1个月前 IP:未同步
179207
当当当当此贴内容 也终于 有了新进展

XXXXXXXXXXXXXXXXXXXXXXXX/t/22137

  定板了
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
jrcsh
学者 笔友
文章
491
回复
6730
学术分
4
2009/01/02注册,7年0个月前活动

.

主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}