标题:
基于单片机6个数码管显示的数字钟程序
[打印本页]
作者:
L.G.E
时间:
2022-4-8 23:57
标题:
基于单片机6个数码管显示的数字钟程序
这是我上个月写的,因为第一次写所以挑了个简单的数字钟练下手。
附件里包含代码和仿真图。
屏幕截图 2022-04-08 235205.png
(62.79 KB, 下载次数: 50)
下载附件
2022-4-8 23:57 上传
单片机源程序如下:
#include<reg51.h>
sbit no_off = P1^0; //该按键用于暂停计时,设置时间
sbit select = P1^1; //该按键选择调秒,分钟,还是调小时,上电默认选择秒
sbit add = P1^2; //该按键往上调
sbit sub = P1^3; //该按键往下调
sbit set = P1^4; //该按键用于设置闹钟
sbit led = P3^1; //设置了闹钟,该指示灯亮,否则不亮
sbit beep = P3^7; //用于设置闹钟
unsigned char state = 0; //匹配选择调秒、调分或者调时的状态
unsigned char hour = 0;
unsigned char min = 0;
unsigned char sec = 0;
unsigned char set_hour=0;
unsigned char set_min=0;
unsigned char count = 0;
unsigned char num=0; //该变量用来设置led闪烁,定时时间到,led闪烁1秒钟
unsigned char disp[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管字形码
void delay(unsigned int k);
void scan(void);
void alarm(void);
void display(void);
void main(void)
{
TMOD=0x11;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
TH1=(65535-500)/256;
TL1=(65535-500)%256;
EA=1;
ET0=1;
ET1=1;
TR0=1;
TR1=0;
led=1;
while(1)
{
scan();
display();
}
}
void delay(unsigned int k) //延时
{
unsigned int i;
for(i=0;i<k;i++);
}
void scan(void) //按键扫描
{
if(no_off==0)
{
delay(1200);
if(no_off==0) {TR0=~TR0;}
while(!no_off);
}
if(select==0)
{
delay(1200);
if(select==0)
{
state++;
if(state==3) state=0;
}
while(!select);
}
if(add==0)
{
delay(1200);
if(add==0)
{
switch(state)
{
case 0:{ sec++; if(sec==60) sec=0;break;}
case 1:{ min++; if(min==60) min=0;break;}
case 2:{ hour++; if(hour==24) hour=0;break;}
default : ;
}
}
while(!add);
}
if(sub==0)
{
delay(1200);
if(sub==0)
{
switch(state)
{
case 0:{ sec--; if(sec==255) sec=59;break;}
case 1:{ min--; if(min==255) min=59;break;}
case 2:{ hour--; if(hour==255) hour=23;break;}
default : ;
}
}
while(!sub);
}
if(set==0)
{
delay(1200); //消抖
if(set==0)
{
led=~led;
set_hour=hour; //设置闹钟的小时
set_min=min; //设置闹钟的分钟
while(!set); //等待按键释放
}
}
}
void display(void) //数码管扫描显示函数
{
unsigned char i;
for(i=0;i<6;i++)
{
switch(i)
{
case 0: {P0=disp[hour/10];P2=0x01;break;}
case 1: {P0=disp[hour%10];P2=0x02;break;}
case 2: {P0=disp[min/10];P2=0x04;break;}
case 3: {P0=disp[min%10];P2=0x08;break;}
case 4: {P0=disp[sec/10];P2=0x10;break;}
case 5: {P0=disp[sec%10];P2=0x20;break;}
}
delay(200);
P0=0xff; //消隐
}
}
void time(void) interrupt 1 //定时1s
{
EA=0;TR0=0;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
count++;
if(count==20)
{
count=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hour++;
if(hour==24)
{
hour=0;
}
}
}
}
if((min==set_min)&&(hour==set_hour)&&(led==0)&&(TR0=1)) TR1=1; //时间到,闹钟响
if((min==set_min+1)&&(hour==set_hour)) {TR1=0;led=1;} //闹钟响一分钟后关闭,同时关闭指示灯
EA=1;TR0=1;
}
void alarm() interrupt 3 //闹钟响应
{
EA=0;TR1=0;
TH1=(65535-500)/256;
TL1=(65535-500)%256;
beep=~beep;
num++;
if(num==250)
{
num=0;
led=~led; //led灯闪烁
}
EA=1;TR1=1;
}
复制代码
Keil代码下载:
数字钟.zip
(92.47 KB, 下载次数: 31)
2022-3-31 18:39 上传
点击文件名下载附件
动态显示、中断
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1