51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
51单片机c语言电子钟(已加入调时、闹铃、
整点报时功能)
效果图:
程序如下:
//51单片机c语言电子钟(已加入调时、闹铃、整点报时功能)
#include<reg51.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
/*七段共阴管显示定义*/
//此表为LED 的字模,共阴数码管0-9 -
uchar code dispcode[] =
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制/*定义并初始化变量*/
uchar seconde=0;//秒
uchar minite=0;//分
uchar hour=12; //时
uchar shi=0;//闹铃功能
uchar fen=0;
uchar bjcs;//报警次数
sbit P1_0=P1^0; //second 调整定义sbit P1_1=P1^1; //minite调整定义sbit P1_2=P1^2; //hour调整定义sbit P1_5=P1^5; //整点报时
sbit P1_3=P1^3; //闹铃功能,调整时间
sbit P1_6=P1^6; //调整时
sbit P1_7=P1^7; //调整分
sbit P1_4=P1^4; //关闭闹铃
/*函数声明*/
void delay(uint k ); //延时子程序
void time_pro( ); //时间处理子程序
void display( ); //显示子程序
void keyscan( ); //键盘扫描子程序
/*xx子程序*/
void delay (uint k){uchar j;
while((k--)!=0){for(j=0;j<125;j++)
{;}}}
/*时间处理子程序*/
void time_pro(void){if(seconde==60){seconde=0;
minite++;
if(minite==60){minite=0;
hour++;
if(hour==24){hour=0;}}}}
/*显示子程序*/
void display(void){if(P1_3==1){P2=0XFE; P0=dispcode[seconde%10];//秒个位delay
(1);
P2=0XFD;
P0=dispcode[seconde/10];//秒十位delay
(1);
P2=0XFB;
P0=dispcode[10];//间隔符-
delay
(1);
P2=0XF7;
P0=dispcode[minite%10];//分个位delay
(1);
P2=0XEF;
P0=dispcode[minite/10];//分十位delay
(1);
P2=0XDF;
P0=dispcode[10];//间隔符-
delay
(1);
P2=0XBF;
P0=dispcode[hour%10];//时个位
delay
(1);
P2=0X7F;
P0=dispcode[hour/10];//时十位
delay
(1);}}
/*键盘扫描子程序*/
void keyscan(void){if(P1_0==0)//秒位的调整{delay (30);
if(P1_0==0){seconde++;
if(seconde==60){seconde=0;}}
delay
(250);}if(P1_1==0)//分位的调整{delay
(30);
if(P1_1==0){minite++;
if(minite==60){minite=0;}}
delay
(250);}if(P1_2==0)//时位的调整{delay
(30);
if(P1_2==0){hour++;
if(hour==24){hour=0;}}
delay
(250);}}
/*整点报警*/
void zhengdian (void){if((seconde==0)&(minite==0))//整点报时{P1_5=0;
delay
(1000);
P1_5=1;}}
/*定时闹钟*/
void dingshi(void){if(P1_3==0)//按住P1_3BU不松,显示闹铃设置界面,分别按P1_
6、P1_7设置闹铃时间。
{
P2=0XFE;
P0=dispcode[0];//秒个位
delay
(1);
P2=0XFD;
P0=dispcode[0];//秒十位delay
(1);
P2=0XFB;
P0=dispcode[10];//间隔符- delay
(1);
P2=0XF7;
P0=dispcode[fen%10];//分个位delay
(1);
P2=0XEF;
P0=dispcode[fen/10];//分十位delay
(1);
P2=0XDF;
P0=dispcode[10];//间隔符- delay
(1);
P2=0XBF;
P0=dispcode[shi%10];//时个位
delay
(1);
P2=0X7F;
P0=dispcode[shi/10];//时十位
delay
(1);}if(P1_6==0)//设定时{delay
(30);
if(P1_6==0){shi++;
if(shi==24){shi=0;}}
delay
(250);}if(P1_7==0)//设定分{delay
(30);
if(P1_7==0){fen++;
if(fen==60){fen=0;}}
delay
(250);}if((hour==shi)&(minite==fen)&(seconde==0))//闹铃时间到,报警十次。
{for(bjcs=0;bjcs<10;bjcs++){P1_5=0;
delay
(500);
P1_5=1;
delay
(500);}}}/*主函数*/
void main(void){P1=0XFF;
TMOD = 0x11; //time0为定时器,方式1
TH0=0x3c; //预置计数初值,50ms
TL0=0xb0;
EA=1; //总xx开
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while
(1){keyscan(); //按键扫描
dingshi();//定时闹钟
zhengdian();//整点报时
display(); //显示时间}}
void timer0(void) interrupt 1 //定时器0方式1,中断一次{TH0=0x3c; //手动加载计数脉冲次数50msTL0=0xb0;
TMOD=0x11;
time_pro( ); //时间处理
mstcnt=0; //对计数单元的清零,重新开始计数}}。