基于51单片机的时钟设计
程序员文章站
2022-06-08 19:58:01
...
今天小刚做了一个基于51单片机的时钟,本来想把数码管显示动态扫描放到定时器1的中断里到但是,一按按键,就卡住了,效果不是很理想。所以就放弃了这种方案。不过最后也实现了功能。
以下是程序代码
4个按键功能:
1.切换
2.时间+
3.时间-
4.清零
注意TMOD |=0x01的使用!
最后,大家一起加油吧!.jpg
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit du=P2^6;
sbit wei=P2^7;
sbit key_s2=P3^0;
sbit key_s3=P3^1;
sbit key_s4=P3^2;
sbit key_s5=P3^3;
uchar code duantabel[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管断显示
uchar code weitabel[]={0xfe,0xfd,0xfb,0xf7};
static uchar m,i,miao,fen,fenge,fenshi,miaoge,miaoshi,timer,shi,shishi,shige,flag;
void delay(uint z)//延时1ms
{
uchar x,y;
for(x=z;x>0;x--)
for(y=114;y>0;y--);
}
void display1()//数码管显示函数1,显示分钟和秒钟
{
miaoge=miao%10;
miaoshi=miao/10;
fenge=fen%10;
fenshi=fen/10;
P0=0Xff;//清除段码,防止之前段码影响
wei=1;
P0=0xfe;
wei=0;
du=1;
P0=duantabel[fenshi];
du=0;
delay(2);
P0=0Xff;//清除段码,防止之前段码影响
wei=1;
P0=0xfd;
wei=0;
du=1;
P0=duantabel[fenge];
du=0;
delay(2);
P0=0Xff;//清除段码,防止之前段码影响
wei=1;
P0=0xfb;
wei=0;
du=1;
P0=duantabel[miaoshi];
du=0;
delay(2);
P0=0Xff;//清除段码,防止之前段码影响
wei=1;
P0=0xf7;
wei=0;
du=1;
P0=duantabel[miaoge];
du=0;
delay(2);
}
void display2()//数码管显示函数显示小时和分钟
{
fenge=fen%10;
fenshi=fen/10;
shige=shi%10;
shishi=shi/10;
P0=0Xff;//清除段码,防止之前段码影响
wei=1;
P0=0xfe;
wei=0;
du=1;
P0=duantabel[shishi];
du=0;
delay(2);
P0=0Xff;//清除段码,防止之前段码影响
wei=1;
P0=0xfd;
wei=0;
du=1;
P0=duantabel[shige];
du=0;
delay(2);
P0=0Xff;//清除段码,防止之前段码影响
wei=1;
P0=0xfb;
wei=0;
du=1;
P0=duantabel[fenshi];
du=0;
delay(2);
P0=0Xff;//清除段码,防止之前段码影响
wei=1;
P0=0xf7;
wei=0;
du=1;
P0=duantabel[fenge];
du=0;
delay(2);
}
void timer0Init()//定时器定时
{
TR0=1;
TMOD |= 0X01;
TH0=0X2c;//定时器赋初值50ms
TL0=0X15;
}
//void timer1Init()//开定时器中断1
//{
// TMOD |= 0x10; //定时器16为计数工作模式
// TH1 =0xFC;
// TL1 =0xFF; //5ms
// EA = 1; //开总中断
// ET1 = 1; //开定时器1中断
// TR1 = 1;//启动定时器1
//}
void main()
{
timer0Init();
// timer1Init();
while(1)
{
if(TF0==1)
{
TF0=0;
TH0=0X2c;//定时器赋初值50ms
TL0=0X15;
m++;
}
if(m>15)
{
m=0;
miao++;
}
if(miao>=60)
{
miao=0;
fen++;
}
if(fen>=60)
{
fen=0;
shi++;
}
if(shi>=24)
{
miao=0;
fen=0;
shi=0;
}
if(flag%2==0)
{
display1();
}
else
{
display2();
}
if(key_s2==0)//先检测,消抖,检测,执行,松手检测
{
delay(20);//按键消抖
if(key_s2==0)
{
flag++;
while(!key_s2);//松手检测
}
}
if(key_s3==0)//先检测,消抖,检测,执行,松手检测
{
delay(20);//按键消抖
if(key_s3==0)
{
miao++;
while(!key_s3);//松手检测
}
}
if(key_s4==0)//先检测,消抖,检测,执行,松手检测
{
delay(20);//按键消抖
if(key_s4==0)
{
miao=miao-1;
while(!key_s4);//松手检测
}
}
if(key_s5==0)//先检测,消抖,检测,执行,松手检测
{
delay(20);//按键消抖
if(key_s5==0)
{
miao=0;
fen=0;
shi=0;
while(!key_s5);//松手检测
}
}
}
}
//void timer1() interrupt 3
//{
// TH1 =0xFC;
// TL1 =0x17; //5ms 模式1非自动重装需要手动重装
//
// if(flag%2==0)
// {
// display1();
// }
// else
// {
// display2();
// }
//}
上一篇: 基于51单片机的电子时钟
下一篇: Hibernate 一级缓存的陷阱