打印

菜鸟出来晒太阳了,欢迎砖头。体育100米计时器程序。

[复制链接]
2270|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
oufuqiang|  楼主 | 2007-12-7 23:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ov, LED, vr, ck, se
;-------------------------------------------------------------------------------
;               体育百米计时器源程序
;               总架构:欧福强
;               74HC595传输子程序:韦国权
;               LED段码:谢名全
;-------------------------------------------------------------------------------
                SCK     EQU     P1.1            ;移位时钟
                RCK     EQU     P1.2            ;更新显示脉冲
                SI      EQU     P1.3            ;串行数据
;-------------------------------------------------------------------------------
;               30H,31H,32H,33H                 ;板载LED段码缓冲区
;               34H,35H                         ;延时子程序使用
;               R1                              ;串行LED发送循环计数
;               R2,R3,R4,R5,                    ;|计时十进制数字缓冲区|
;              .01 .1 1  10                     ;|对应位              |
;               40H,41H,41H,43H                 ;串行LED段码缓冲区
;-------------------------------------------------------------------------------
                ORG     0000H
                SJMP    INIT                    ;系统初始化
                ORG     000BH
                LJMP    TIMER_0_IRQ             ;定时器0中断
                ORG     001BH
                LJMP    TIMER_1_IRQ             ;定时器1中断
;-------------------------------------------------------------------------------
                ORG     0040H                   ;系统初始化区
INIT:           MOV     TMOD,#11H               ;都工作在方式1--16位定时器
                MOV     SP,#71H                 ;堆栈区设置
                SETB    PT0                     ;10ms定时器中断优先
;--------------------------------
                MOV     TH0,#0D8H               ;置初值(10MS/12MHz)
                MOV     TL0,#0F4H               ;TO
;--------------------------------
                MOV     TH1,#03CH               ;置初值(50MS/12MHz)
                MOV     TL1,#0B0H               ;T1
;--------------------------------
                SETB    TR1                     ;启动(50ms)定时器
                MOV     IE,#8AH                 ;打开总中断使能以及定时器中断
;--------------------------------
                MOV     R2,#0                   ;用户初始化区
                MOV     R3,#0
                MOV     R4,#0
                MOV     R5,#0
;-------------------------------------------------------------------------------
MAIN:           LCALL   OnbordDisp              ;用户程序区,扫描板载LED
                LCALL   KEYSCAN_DEAL            ;扫描键盘并处理
                SJMP    MAIN                    
;-------------------------------------------------------------------------------
TIMER_0_IRQ:    MOV     TH0,#0D8H               ;定时器0中断服务程序(10ms)
                MOV     TL0,#0F4H               ;恢复(10ms)定时初值
;--------------------------------
                LCALL   TimeCount               ;10ms节拍程序区,时间计数
T0_DRE_EXIT:    RETI
;-------------------------------------------------------------------------------
TIMER_1_IRQ:    MOV     TH1,#03CH               ;定时器1中断服务程序(50ms)
                MOV     TL1,#0B0H               ;恢复(50ms)定时初值
;--------------------------------
                LCALL   ValToCode               ;50ms节拍程序区,转换板载段码
                LCALL   S_LedValToCode          ;转换串行LED数值成段码
                LCALL   SenDataToLed            ;发送到串行LED并显示
T1_DRE_EX:      RETI
;-------------------------------------------------------------------------------
DELAY:          DJNZ    34H,$                   ;精确0.1S延时子程序
                DJNZ    35H,DELAY
                MOV     35H,#194
                MOV     34H,#78
                DJNZ    34H,$
                RET
;-------------------------------------------------------------------------------
OnbordCodeTab:  DB      88H,0BEH,0C4H,94H,0B2H,91H,81H,0BCH        ;板载LED段码
                DB      80H,90H,0A0H,83H,0C9H,86H,0C1H,0E1H
SeriaLedTab:    DB      0FCH,60H,0DAH,0F2H,66H,0B6H,0BEH,0E0H      ;串行LED段码
                DB      0FEH,0F6H
;-------------------------------------------------------------------------------
ValToCode:      MOV     A,R2                    ;数值转段码子程序(板载)
                MOV     DPTR,#OnbordCodeTab     ;指针指向板载段码表
                MOVC    A,@A+DPTR
                MOV     30H,A
                MOV     A,R3
                MOVC    A,@A+DPTR
                MOV     31H,A
                MOV     A,R4
                MOVC    A,@A+DPTR
                ANL     A,#7FH                  ;秒个位加上小数点
                MOV     32H,A
                MOV     A,R5
                MOVC    A,@A+DPTR
                MOV     33H,A
                RET
;-------------------------------------------------------------------------------
TimeCount:      INC   R2                        ;计时累加程序
                CJNE  R2,#0AH,TC_DRE_Exit       ;百分秒增值判断
                MOV   R2,#00H
                INC   R3
                CJNE  R3,#0AH,TC_DRE_Exit       ;十分秒增值判断
                MOV   R3,#00H
                INC   R4
;--------------------------------
                CPL   P1.0                      ;秒节拍程序区
;--------------------------------
                CJNE  R4,#0AH,TC_DRE_Exit       ;秒增值判断
                MOV   R4,#00H
                INC   R5
;--------------------------------
                NOP                             ;十秒节拍程序区
;--------------------------------
                CJNE  R5,#0AH,TC_DRE_Exit       ;十位秒增值判断
                MOV   R5,#00H
TC_DRE_Exit:    RET
;-------------------------------------------------------------------------------
OnbordDisp:     MOV   P2,#0FFH                  ;板载LED扫描子程序
                MOV   P0,30H
                MOV   P2,#0EFH
                DJNZ  70H,$
                MOV   P2,#0FFH
                MOV   P0,31H
                MOV   P2,#0DFH
                DJNZ  70H,$
                MOV   P2,#0FFH
                MOV   P0,32H
                MOV   P2,#0BFH
                DJNZ  70H,$
                MOV   P2,#0FFH
                MOV   P0,33H
                MOV   P2,#7FH
                DJNZ  70H,$
                MOV   P2,#0FFH
                RET
;-------------------------------------------------------------------------------
SenDataToLed:   CLR   SCK                       ;更新串行LED显示数据
                CLR   RCK
                CLR   SI
                MOV   R1,#8                     ;循环值清零
;--------------------------------
                MOV   A,40H                     ;读入段码
LO1:            RRC   A
                MOV   SI,C
                CLR   SCK
                SETB  SCK
                DJNZ  R1,LO1
                MOV   R1,#8
;--------------------------------
                MOV   A,41H
LO2:            RRC   A
                MOV   SI,C
                CLR   SCK
                SETB  SCK
                DJNZ  R1,LO2
                MOV   R1,#8
;--------------------------------
                MOV   A,42H
LO3:            RRC   A
                MOV   SI,C
                CLR   SCK
                SETB  SCK
                DJNZ  R1,LO3
                MOV   R1,#8
;--------------------------------
                MOV   A,43H
LO4:            RRC   A
                MOV   SI,C
                CLR   SCK
                SETB  SCK
                DJNZ  R1,LO4
;--------------------------------
                SETB  RCK                       ;更新串行LED显示
                CLR   RCK                       ;停止更新
                RET
;-------------------------------------------------------------------------------
S_LedValToCode: MOV   DPTR,#SeriaLedTab         ;串行LED段码转换子程序
                MOV   A,R2
                MOVC  A,@A+DPTR
                MOV   40H,A
;--------------------------------
                MOV   A,R3
                MOVC  A,@A+DPTR
                MOV   41H,A
;--------------------------------
                MOV   A,R4
                MOVC  A,@A+DPTR
                ORL   a,#1                      ;秒个位加上小数点
                MOV   42H,A
;--------------------------------
                MOV   A,R5
                JZ    S_ZERO_EXIT
                MOVC  A,@A+DPTR
                MOV   43H,A
                RET
S_ZERO_EXIT:    MOV   43H,#0                    ;无效零消隐
                RET
;-------------------------------------------------------------------------------
KEYSCAN_DEAL:   JB    P2.0,NEXT1KEY             ;键盘扫描处理子程序,P2.0:复位
                CLR   TR0                       ;停止计时
                MOV   R2,#0
                MOV   R3,#0
                MOV   R4,#0
                MOV   R5,#0                     ;时间计数区清零
                RET                             ;复位键返回
;--------------------------------
NEXT1KEY:       JB    P2.2,NEXT2KEY             ;P2.1:停止键
                CLR   TR0                       ;停止计时
                RET                             ;停止键返回
;--------------------------------
NEXT2KEY:       JB    P2.1,KEY_DEAL_END         ;P2.2,计时启动键
                SETB  TR0                       ;启动计时
                JNB   P2.1,$                    ;等待按键释放
KEY_DEAL_END:   RET                             ;启动键返回
;-------------------------------------------------------------------------------
                END

相关链接:https://bbs.21ic.com/upfiles/img/200712/2007127231137989.rar

相关帖子

沙发
zusen| | 2007-12-8 00:36 | 只看该作者

还是觉得汇编亲切

拍砖来了

多点应用  EQU  定义常量,多点用data定义变量

这样,当你编程时,要改变某些参数,就不用一个一个去改了

使用特权

评论回复
板凳
hotpower| | 2007-12-8 01:26 | 只看该作者

同意楼上...30h,31h以后回出问题的~~~

使用特权

评论回复
地板
ayb_ice| | 2007-12-8 07:55 | 只看该作者

变量没有必须绝对定位,应试交由编译器分配

使用特权

评论回复
5
xwj| | 2007-12-8 09:14 | 只看该作者

呵呵,LS几位正解

LZ要养成用定义寄存器、用宏定义、和利用自动分配的习惯哦,
不然以后再来看这个程序会很头疼的哦

使用特权

评论回复
6
xwj| | 2007-12-8 09:25 | 只看该作者

奇怪,LZ的这个标题我每次看到都会先看成“太阳..出来..晒砖

呵呵^_^

使用特权

评论回复
7
oufuqiang|  楼主 | 2007-12-8 09:35 | 只看该作者

定义寄存器、用宏定义、和利用自动分配

貌似这个方法我还不会也……学习中。
SFR? DATA?

使用特权

评论回复
8
zusen| | 2007-12-8 10:12 | 只看该作者

楼主这条程序还没有测试过吧

呵呵

加上按键去抖吧,否则会出问题

使用特权

评论回复
9
oufuqiang|  楼主 | 2007-12-8 10:33 | 只看该作者

按键没加去抖动,不过暂时没发现问题。

现在正在加串行通讯程序模块。也在做上位机。

使用特权

评论回复
10
hotpower| | 2007-12-8 10:40 | 只看该作者

2个很经典的串口反汇编程序注解及图示

1.很经典的P89V58RD2串口反汇编程序注解及图示 

http://blog.**/hotpower/58512/message.aspx


2.很经典的W77E58P串口反汇编程序注解及图示

http://blog.**/hotpower/58511/message.aspx

使用特权

评论回复
11
zusen| | 2007-12-8 10:48 | 只看该作者

楼主,你这条程序没加去抖不是没问题

而是 就算执行多次,结果也是一样,所以就看不出问题了

如果有一个按键 去设置秒数,每按一下,加一秒。而这个按键没加去抖的话,按一下,可能加了几秒了,呵呵

使用特权

评论回复
12
oufuqiang|  楼主 | 2007-12-8 19:30 | 只看该作者

什么叫“滚筒式”的串行发送程序?

不是很理解,给解释一下。

使用特权

评论回复
13
zusen| | 2007-12-8 20:00 | 只看该作者

呵呵,还是第一次听这个“名词”

从字义上去理解,应该是 理解为 循环 吧,就是说,缓冲从开始到结尾然后又回来开始

还请高手解一解,嘿嘿,中国的语言博大精深啊~~~~~

使用特权

评论回复
14
hotpower| | 2007-12-8 20:17 | 只看该作者

“滚筒式”---没见过洗衣机吧~~~就是环型缓冲区

使用特权

评论回复
15
oufuqiang|  楼主 | 2007-12-8 20:27 | 只看该作者

环形缓冲区,FIFO?

我这个小作品数据量不大,每个不同事件发送1个字节或1个字节+4个字节的时间数据给上位机,呵呵,应该不用那么复杂的缓冲区,另外,环形缓冲区是不是一直都要发送数据出去?

使用特权

评论回复
16
huangqi412| | 2007-12-9 18:26 | 只看该作者

汇编很亲切,

使用特权

评论回复
17
lamp| | 2007-12-9 18:32 | 只看该作者

如果收发都是FIFO的话

想不到原来自已一直用双滚筒洗衣机,哈哈...

使用特权

评论回复
18
hotpower| | 2007-12-9 22:05 | 只看该作者

滚筒洗衣机和FIFO有点区别~~~

它采用读写2组不同的指针跟踪.
如果写指针"滚筒"了1遍读指针不"滚筒"的话,数据将会自动丢失.

FIFO是先入先出的,写指针"滚"1次,读指针取出后写指针就退1次.

好象有点健身房的跑步机似的~~~暂且就把FIFO当"跑步机"吧~~~

所以滚筒洗衣机是"黑滚机",就像闭着眼的坦克一样~~~

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

106

主题

1429

帖子

20

粉丝