原创 99~0倒计时程序

2009-5-24 16:46 4305 4 4 分类: MCU/ 嵌入式

;程序名: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);
}

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条