;程序名:99~0倒计时程序
;程序功能:用P1口和P3.0、P3.1口实现动态显示,完成99~0的倒计时功能
;作者:POLO
ORG 00H
AJMP MAIN
ORG 0BH
AJMP T0_SEVER
ORG 30H
MAIN:;主程序
MOV P1,#00H
CLR P3.0
CLR P3.1
CLR 00H;初始化显示,关显示
MOV R0,#99;装初值
MOV R1,#00H;显示低位
MOV R2,#00H;显示高位
MOV DPTR,#TABLE;LED显示段位码首地址
MOV TMOD,#01H;T0定时方式1
MOV IE,#82H;开T0中断
MOV TL0,#LOW(65536-5000)
MOV TH0,#HIGH(65536-5000);装定时初值,定时5ms
SETB TR0;启动定时器
LOOP:
MOV A,R0
MOV B,#10
DIV AB
MOV R1,B;显示低位暂存
MOV R2,A;显示高位暂存
ACALL DELAY1S;调用1s延时子程序
DJNZ R0,LOOP;判断倒计时是否完毕
AJMP MAIN;循环执行
DELAY1S:;延时1s子程序
MOV R7,#20
DEL1:
MOV R6,#100
DEL2:
MOV R5,#248
DJNZ R5,$
DJNZ R6,DEL2
DJNZ R7,DEL1
RET
T0_SEVER:;中断服务子程序
JB 00H,LOOP1;判断显示标志位
SETB P3.0
CLR P3.1
MOV A,R1
MOVC A,@A+DPTR
MOV P1,A;显示低位
SETB 00H;置显示标志位
AJMP RETURN
LOOP1:
CLR P3.0
SETB P3.1
MOV A,R2
MOVC A,@A+DPTR
MOV P1,A;显示高位
CLR 00H;清显示标志位
RETURN:
MOV TL0,#LOW(65536-5000)
MOV TH0,#HIGH(65536-5000);重装定时器初值
RETI
TABLE:;LED显示段码表
DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH
END
C51代码的程序实时性不好,时间不准,望指出问题。
/*程序名:99~0倒计时程序*/
/*程序功能:用P1口和P3.0、P3.1口实现动态显示,完成99~0的倒计时功能*/
/*作者:严峥晖*/
#include<at89x51.h>
typedef unsigned char uchar;
uchar code led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
bit bdata flag="0";
uchar data high_dis,low_dis;
void delay(void)//延时子函数
{
uchar i,j,k;
for(i=0;i<=20;i++)
for(j=0;j<=100;j++)
for(k=0;k<=248;k++);
}
void init(void)//初始化函数
{
P1=0x00;
P3_0=0;
P3_1=0;
IE="0x82";
TMOD="0x01";
TL0=(65536-5000)%256;
TH0=(65536-5000)/256;
TR0=1;
}
void calc(uchar time)//计算显示高低位
{
high_dis=time/10;
low_dis=time%10;
}
void sever_t0(void) interrupt 1//中断服务子程序
{
if(flag==0)
{
P3_0=1;
P3_1=0;
P1=led[low_dis];
flag=~flag;
}
else
{
P3_0=0;
P3_1=1;
P1=led[high_dis];
flag=~flag;
}
TL0=(65536-5000)%256;
TH0=(65536-5000)/256;
}
int main(void)//主函数
{
uchar i="99";
init();
do
{
calc(i);
delay();
i--;
}
while(i>=0);
}
文章评论(0条评论)
登录后参与讨论