在清翔51单片机上实现闹钟以及24h显示程序
此程序过长时间运作可能会造成一定的误差
#include<reg52.h>
#define uchar unsigned char
/*sbit*/
sbit dula = P2^6;
sbit wela = P2^7;
sbit beep = P2^3;
/*声明变量*/
uchar count1,Second=40,Minute=2,Hour=21;
uchar code SMGwei[] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
uchar code SMGduan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/*声明函数*/
void time0init(); //定时器0 50ms
void time1init(); //定时器1 1ms
void display(uchar,uchar,uchar); //数码管显示
void naozhong(uchar,uchar,uchar);
void main()
{
time0init();/*time0和time1初始化*/
time1init();
while(1); //等待中断
}
void time0init()//50ms //定时器0初始化,开启中断
{
TR0 = 1;
TMOD |= 0x01;
TH0 = 0x4c;
TL0 = 0x00;
EA = 1;
ET0 = 1;
}
void time1init()//1ms //定时器1初始化,开启中断
{
TR1 = 1;
TMOD |= 0X10;
TH1 = 0x0FC;
TL1 = 0x66;
EA = 1;
ET1 = 1;
}
void display(uchar num,uchar Minute,uchar Hour)
{
static uchar wei; //局部静态变量
P0 = 0xff;
wela = 1;
P0 = SMGwei[wei];
wela = 0;
switch(wei)
{
case 0: dula = 1; P0 = SMGduan[Hour/10]; dula =0; break; /*小时*/
case 1: dula = 1; P0 = SMGduan[Hour%10]; dula =0; break;
case 2: dula = 1; P0 = 0x40; dula =0; break;
case 3: dula = 1; P0 = SMGduan[Minute/10]; dula =0; break;
case 4: dula = 1; P0 = SMGduan[Minute%10]; dula =0; break; /*分钟*/
case 5: dula = 1; P0 = 0x40; dula =0; break;
case 6: dula = 1; P0 = SMGduan[num/10]; dula =0; break; /*秒*/
case 7: dula = 1; P0 = SMGduan[num%10]; dula =0; break;
}
wei++;
if(wei ==8)
{
wei = 0;
}
}
void time1() interrupt 3
{
TF1 = 0;
TH1 = 0x0FC;
TL1 = 0x66;
display(Second,Minute,Hour);
naozhong(Second,Minute,Hour);
}
void time0() interrupt 1
{
TF0 = 0;
TH0 = 0x4c;
TL0 = 0x00;
count1++;
if(count1 == 20)
{
count1 = 0;
Second++;
P1 = ~P1;
if(Second == 60)
{
Second = 0;
Minute++;
if(Minute == 60)
{
Minute = 0;
Hour++;
if(Hour == 24)
{
Hour = 0;
}
}
}
}
}
void naozhong(uchar Second,uchar Minute,uchar Hour)//可以在此设置闹钟
{
if(Hour == 21 &&(Minute<=4 && Minute>=3))
{
beep = 0; //闹钟开启
}
}
- 为什么定时器1设定的中断时间是1ms?
一开始设置的是5ms扫描数码管显示以及闹钟,但发现5ms会导致8个数码管显示时会导致数码管显示问题,实际上1ms也会导致一点拖影,但人眼基本分辨不出
码主为一个初学者,刚学习到C语言的迭代就开始搞单片机,代码可能写的有点拖沓,见谅!