单片机的倒计时程序

单片机的倒计时程序,第1张

//工程名称:99秒倒计时//功能描述:程序开睁芦始显示99秒等待开始倒计时,当再次按下开关后计时//停止,当再按下开关后计时//复位实际上是单片机复位,重新开始!//通过悉搭带本程序新的认识: 1.BCD数码管的使用 2.十进制到BCD码转化  //3.C51的等待按键作用//2. temp=99i=temp/10j=temp%10i=(i<<4)dis=i+jP0=dis//3.while(sw==1){}// 判按下,下则出 while(sw==0){}//判松开// ,开则出#includesbit sw=P3^5//定义开关main(){ unsigned char temp,disunsigned int i,j,k,t// P0=0x88//初试时检测数码管是否正常// for(k=0k<40000k++)temp=99i=temp/10j=temp%10i=(i<<4)dis=i+jP0=dis//启动是显示99while(sw==1){}// 判按下,枝罩下则出while(sw==0){}//判松开 ,开则出 第一次按开关for(t=0t<5t++)//循环来减{for(k=0k<30000k++)temp--i=temp/10j=temp%10i=(i<<4)dis=i+jP0=disfor(k=0k<30000k++)if(sw==0) break// while(sw==1){}// while(sw==1){}// break}while(sw==1){}// 判按下,下则出while(sw==0){}//判松开 ,开则出 第一次按开关while(sw==1){}// 判按下,下则出while(sw==0){}//判松开 ,开则出 第一次按开关

我做的只要两个数码管显示

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汇编。。。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8264614.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-14
下一篇 2023-04-14

发表评论

登录后才能评论

评论列表(0条)

保存