99
秒的,不用6个数码管,如果有需要帮你改下,
你那个设计的功能说的还不够明白。还有就是你那个数码管是怎么连的啊?共阴的还是共阳的,想当初做数码管显示时间,就花了3天的时间才把数码管点亮。
用AT89S52设计一个2位LED数码显示“秒表”,显示时间为00~99秒,每秒自动加一。另设计一个“开始”按键和一喊纯个“复位”按键,一个“暂停”按键和一个“快加”按键(每10ms快速加一)。
ORG
0000H
AJMP
MAIN
主程序入口地址
ORG
0003H
AJMP
ZHONGDUAN0
中断0入口地址
ORG
000BH
AJMP
DINGSHI
定时器T0入口地址
ORG
0013H
AJMP
ZHONGDUAN1
中断1入口地址
ORG
001BH
AJMP
DINGSHI1
定时器T1入口地址
ORG
0030H
//主程序:
MAIN:
MOV
TCON,#05H
主程序开始
外部中断跳变模式
MOV
TMOD,#11H
定时器0,1模式1
MOV
IE
,#8FH
开总中断,中断0,1,定时器0,1
MOV
DPTR,#TAB
MOV
R1
,#00H
MOV
R2
,#00H
MOV
R3
,#40
循环次数40
MOV
TL0
,#2CH
置初值,定时25MS
MOV
TH0
,#0CFH
MOV
TL1
,#78H
置初值,定时10MS
MOV
TH1
,#0ECH
CLR
TR0
关定时器
CLR
TR1
//暂停键K3,快加键K4程序
HERE:JB
P1.0,HERE
SHOW:CLR
TR1
CLR
TR0
ACALL
XIANSHI
KUAIJIA:JB
P1.2,KUAIJIA
等待P1.2为0
快加
CLR
TR0
SETB
TR1
HERE3:
JNB
P1.2,HERE3
AJMP
HERE
//外部中断INT0子程序-----计时按键K1子程序
ZHONGDUAN0:
SETB
TR0
计时按键
RETI
//外部中断INT1子程序----复位按键K2子程序
ZHONGDUAN1:CLR
TR0
复位按键
CLR
TR1
MOV
12H,#00H
MOV
11H,#00H
ACALL
XIANSHI
调用显示子程序
MOV
R1,#00H
MOV
R2,#00H
RETI
//加一子程序
JIA1:
INC
R1
加1子程序
CJNE
R1,#0AH
,LOOP
判断是否到表尾
MOV
R1,#00H
INC
R2
CJNE
R2,#0AH,LOOP
MOV
R2,#00H
LOOP:
MOV
12H,R1
重新赋值
MOV
11H,R2
RET
//显示子程序
XIANSHI:MOV
R7,#02H
2个数码管显示子程序
MOV
R0,#12H
LOOP5:
MOV
R6,#08H
8位喊渗扒2进郑昌制数
MOV
A
,@R0
MOVC
A
,@A+DPTR
LOOP6:
RLC
A
循环左移
CLR
P3.1
MOV
P3.0,C
SETB
P3.1
DJNZ
R6,LOOP6
DEC
R0
DJNZ
R7,LOOP5
RET
定时器T0子程序
DINGSHI:MOV
TL0,#2CH
定时子程序
MOV
TH0,#0CFH
DJNZ
R3,LOOP7
ACALL
JIA1
调用加1子程序
ACALL
XIANSHI
调用显示子程序
MOV
R3,#40
LOOP7:
RETI
定时器T1子程序
DINGSHI1:MOV
TL1,#78H
置初值,定时10MS
MOV
TH1,#0ECH
CLR
TR0
SETB
TR1
MOV
12H,R1
MOV
11H,R2
JNB
P1.0,SHOW
ACALL
JIA1
ACALL
XIANSHI
LOP7:
RETI
TAB:
DB
3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
ORG 0000H 跳转到地址0000H处开始执行START: MOV R0,#20 把十进制20放入R0
MOV R4,#99 99赋值给R4
LP0: MOV TMOD,#01H 配置定时器0工作定时模式且工作在16位模式(方式1)
MOV TH0,#3CH 定时器0 16位初始值高八位赋值#3CH
MOV TL0,#0B0H 定时器0 16位初始值低八位赋值#0B0H
MOV DPTR,#TABLE把表地址赋值给数据指针寄存器DPTR
SETB TR0 TR0置位,使能定时器0,
LP1:JBC TF0,LP2 JBC判断语句,如果位TF0=1,则跳转到LP2,并TF0清零(定时时间到)
ACALL DISP 调用DISP(显示)
AJMP LP1 跳转到LP1处执行
LP2:DJNZ R0,LP0 寄存器R0减一,如果R0≠0,则跳转到LP0(但R0=0时,1秒时间到)
CLR TR0 TR0清零,关闭定时器0
MOV R0,#20 赋值指令,把20赋值给R0
MOV A,R4 赋值指令,把R4的值付给A
CJNE A,#0,DEC1 判断指令,累加器A的值与#0比较,如果不相等,则跳转到DEC1
MOV R4,#99 赋值指令,吧常数99赋值给R4
AJMP JP1 跳转到JP1处执行
DEC1:DEC A 自减指令,累加器A的值减一
MOV R4,A 赋值指令把累加器A的值赋值给R4
JP1: ACALL DISP 调用DISP
AJMP LP0 跳转到LP0处执行
DISP:MOV A,R4 赋值指令
MOV B,#10 赋值指令,把10赋值给寄存器B
DIV AB 除法指令,A除以B,把商的值赋给A,余数存回B寄存器
MOV 20H,A 赋值指碰猜猛令,把A的值赋值给地址20H
MOV 21H,B 同上
MOV A,20H 把地址20H的值赋值给累加器A
MOVC A,@A+DPTR 查表指令,累加器A的值再加数据指针寄存器DPTR的值为其所指定地址,将该地址的内容赋值给累加器A
MOV P2,A 把查表得到的值(A)送到P2口
SETB P3.1 置位指令,P3.1置1;
LCALL DELAY 调用DELAY(延时)
CLR P3.1 清笑桥零指令,P3.1=0
MOV A,21H 赋值指令,把地址21H的值赋兆悔值给寄存器A
MOVC A,@A+DPTR查表指令,累加器A的值再加数据指针寄存器DPTR的值为其所指定地址,将该地址的内容赋值给累加器A
MOV P2,A
SETB P3.0 置位指令
LCALL DELAY 调用DELAY
CLR P3.0 清零指令
RET 返回 (返回到调用处)
DELAY:MOV R6,#10赋值指令(DELAY :到 RET结束为延时子程序
DL0: MOV R5,#50赋值指令
DJNZ R5,$ R5自减1,如果不等于0,则继续执行本条指令($表示不跳转)
DJNZ R6,DL0R6自减1,如果R6≠0,则跳转到DL0处执行
RET 返回调用处
TABLE: DB 0C0H,0F9H,0A4H,0B0H,99H 查询表,存放数码管显示编码值
DB 92H,82H,0F8H,80H,90H查询表,存放数码管显示编码值
END 程序结束
。。。好久没看51汇编了,建议你去熟悉51单片机的汇编指令,指令不复杂,重要的是要理解功能的实现原理,如果连怎么实现的都不理解的话,看懂了指令也是一头雾水。
计时方式:JBC TF0,LP2 这条指令是查询定时器0的指令,此段代码没有使用中断方式,而是用到了查询方式。
不理解你取消循环的意思,是一次99倒计时结束后就停止?
如果是一次99倒计时完后就停止的话,一种处理方法就是: AJMP JP1 跳转到JP1处执行这条指令改为:
LP3:LCALL DISP
AJMP LP3
此时就会死循环在这里,一直显示99;如果想显示00则把上一条的赋值指令改成:MOV R4,#0
即:
MOV R4,#0
LP3:LCALL DISP
AJMP LP3
好多种方法,这是其中的一种,好吧,又复习了一边51汇编。。。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)