#include <reg52.h>
#define wu P0 //显示数字
#define wei P2 //4个显示屏
#define uchar unsigned char
#define uint unsigned int
sbit led1=P1^0;
uchar num;
uint m=0,s=1598;//四位数要用int型
uchar a,b,c,d,k=0,j,k;
sbit fm=P2^3;//定义蜂鸣器
unsigned char code weiyu[]={0x1f,0x2f,0x4f,0x8f}; //代码与P2对应做位处理,显示相应的位
/*可改成sbit wei1=P2^4
sbit wei2=P2^5
sbit wei3=P2^6
sbit wei4=P2^7
*/
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴极数码管码表
void delay(unsigned char xms)//延迟方法
{
for(j=xms;j>0;j--)
for(k=125;k>0;k--);
}
void display1(uchar wei1,uchar shu) //数码管显示
{
wei=0xff;//关掉所有:1111 1111
P0=table[shu];
wei=wei&weiyu[wei1]; //1000 1111 & 1111 1111
delay(5);
}
void display(uchar a,uchar b,uchar c,uchar d) // 一次显示三位数码管方法
{
display1(3,a); //显示个位数字
display1(2,b); //显示十位数字
display1(1,c); //显示百位数字
display1(0,d); //显示千位
}
void time_init()
{
TMOD=0x01;//定时器T0选择工作方式1
ET0=1;//打开定时器T0中断
TR0=1;//启动定时器T0
EA=1;//全局中断打开
TH0=0x4c;//设置初始值,定时50ms
TL0=0x00;
}
void main()
{
time_init();//调用定时器方法
while(1)//无限循环
{
//数字一秒间隔 递减:
if(m==20) //20*50ms=1000ms=1s
{
m=0; //m计数等于20次(1秒)后重新计零
s--; //一秒后数字倒数一位
}
a=s%1000%100%10; //个位,
b=s%1000%100/10; //十分位
c=s%1000/100 ; //百分位
d=s/1000; //千分位
display(a,b,c,d);//显示三位数
if(s==0)//如果倒计时结束
{
TR0=0;//关闭定时器T0
fm=0;//蜂鸣器响起
}
if(num==40)//小灯间隔40*50ms=2000ms=2s闪
{
num=0;
led1=~led1;
}
}
}
void TO_TIMER () interrupt 1//定时器中断,处理定时器函数
{
/*TH0=(65536-45872)/256; //晶振为11.052Hz
TL0=(65536-45872)%256; */
TH0=0x4c;//设置初始值,定时50ms
TL0=0x00;
m++; //数字计时
num++; //小灯计时
}
51基础——数码管四位倒计时
最新推荐文章于 2024-05-24 15:17:35 发布