数码管倒计时
Posted 荆紫藤
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数码管倒计时相关的知识,希望对你有一定的参考价值。
//全部数码管计时
#include<reg52.h>
/**声明使能IO口
*/
sbit ADDR0=P1^0;
sbit ADDR1=P1^1;
sbit ADDR2=P1^2;
sbit ADDR3=P1^3;
sbit ENLED=P1^4;
/*声明数组存放数码管真值表
*/
unsigned char code LedChar[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};
/**数码管缓冲区
*/
unsigned char LedBuff[6]={
0xff,0xff,0xff,0xff,0xff,0xff
};
unsigned char i=0; //动态扫描的索引
unsigned int cnt=0;
void main(){
unsigned long sec=0; //记录经过秒书
EA=1; //使能总开关
ENLED=0; //使能U3,选择数码管
ADDR3=1; //使能38译码器的真值表
TMOD=0x01; //设置T0为模式1
TH0=0xfc; //味T0赋初值0xfc67,定时1ms
TL0=0x67;
ET0=1; // 使能T0中断
TR0=1; // 启动T0
while(1){
if(cnt >= 1000){ //判断T0是否溢出1000次(1000ms=1s)
cnt=0;
sec++;
//以下代码将sec按十进制从低到高一次提取并转换为数码管显示的字符
LedBuff[0]=LedChar[sec%10];
LedBuff[1]=LedChar[sec/10%10];
LedBuff[2]=LedChar[sec/100%10];
LedBuff[3]=LedChar[sec/1000%10];
LedBuff[4]=LedChar[sec/10000%10];
LedBuff[5]=LedChar[sec/100000%10];
}
}
}
/**定时器中断服务函数
*/
void interRuptTimer0()interrupt 1 {
//重新加载赋值
TH0= 0xfc;
TL0= 0x67;
cnt++; //中断次数加1
P0=0xFF; //显示消隐
switch(i){//调用相应数码管IO口显示
case 0: ADDR0=0; ADDR1=0; ADDR2=0; i++; P0=LedBuff[0];break;
case 1: ADDR0=1; ADDR1=0; ADDR2=0; i++; P0=LedBuff[1];break;
case 2: ADDR0=0; ADDR1=1; ADDR2=0; i++; P0=LedBuff[2];break;
case 3: ADDR0=1; ADDR1=1; ADDR2=0; i++; P0=LedBuff[3];break;
case 4: ADDR0=0; ADDR1=0; ADDR2=1; i++; P0=LedBuff[4];break;
case 5: ADDR0=1; ADDR1=0; ADDR2=1; i=0; P0=LedBuff[5];break;
default: break;
}
}
以上是关于数码管倒计时的主要内容,如果未能解决你的问题,请参考以下文章
怎样用51单片机实现累加计时和倒计时,并用六个共阴极数码管显示出来。用两个按键分别切换。
7段数码管倒计时,因为受turtle画笔速度限制,显示效果可能不如直接打印数字