1、单片机数字钟 C 程序 251 单片机的Proteus 实验C 语言源程序 /* 数字钟 C 语言程序 2008 年 5 月 */* 淮北煤师院 电子信息科学与技术专业 刘诚志 版权所有 */* 欢迎转载 欢迎改进 */* 2008 电子工作室 http:/ */* */*功能描述*/* 六位数码管 显示 HH.MM.SS(时分秒),MM.DD-W(月日-星期),闹钟定时时间 */* 按键 S5 依次选择调整时间-显示月日星期-调整月日星期-显示闹钟定时时间-调整闹钟定时*/* 按键 S2 依次选中时分秒(月日星期)数码管,S3 按键依次加 1,S4 按键依次减 1 */* 整点报时,闹钟
2、功能*#include#define uint unsigned int#define uchar unsigned charsbit dula=P26; /数码管段选sbit wela=P27; /数码管位选sbit fm=P23; /蜂鸣器sbit s2=P34; /s2 按键,设置调时sbit s3=P35; /s3 按键,加 1sbit s4=P36; /s4 按键,减 1sbit s5=P37; /s5 按键,切换显示sbit led1=P10;sbit led2=P11;sbit led3=P12;/sbit led4=P13;/sbit led5=P14;/sbit led6=P
3、15;/sbit led7=P16;/sbit led8=P17;uchar count;uchar sec,minu,hour,day,week,mon;uchar n_sec,n_minu,n_hour; uint year;uchar set_2=1,set_5=1;uchar hs,hg,mis,mig,ss,sg;uchar nhs,nhg,nms,nmg,nss=0,nsg=0;uchar ms,mg,ds,dg,w;uchar code table=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0X88,0X83,0XC6,0
4、XA1,0X8E,0X86,0xbf; /0F,-,共阳uchar code tableyi=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x40;/0-F,-,共阴uchar code table_d=0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef; /09 数组,带小数点uchar table1=31,31,29,31,30,31,30,31,31,30,31,30,31; /闰年uchar table2=31,31,28,
5、31,30,31,30,31,31,30,31,30,31; /非闰年void delay(uint); /延时函数void timer0(); /走时中断函数void jishi(); /计时函数void key_change(); /切换显示按键函数void key_set(); /设置时间按键函数void disp(uchar,uchar,uchar,uchar,uchar,uchar); /显示函数void zd_clock(); /整点报时函数void nz_clock(); /闹钟函数uchar incone(uchar); /加 1 函数uchar decone(uchar);
6、/减 1 函数void set_time(); /设置时间函数void set_clock(); /设置闹钟函数void set_mdw(); /设置月日星期函数void main() /主函数 EA=1;ET0=1;TR0=1;TMOD=0x01;TH0=0x4c; /50ms 初值 晶振 11.0592TL0=0x00;hour=23;minu=59;sec=49; /赋初值:11 点 59 分 0 秒n_hour=12;n_minu=56;n_sec=13; /闹钟赋初值 12 点 1 分 0 秒year=2008;mon=5;day=14;week=3;/年月日星期赋初值 2008 年
7、 5 月 11 日星期天;祝天下所有母亲节日快乐while(1)hs=hour/10; /时分秒 HH.MM.SShg=hour%10;mis=minu/10;mig=minu%10;ss=sec/10;sg=sec%10;ms=mon/10; /月日-星期 MM.DD.-Wmg=mon%10;ds=day/10;dg=day%10;w=week;nhs=n_hour/10; /闹钟定时 HH.MM.SSnhg=n_hour%10;nms=n_minu/10;nmg=n_minu%10;nss=n_sec/10;nsg=n_sec%10;key_change(); /s5 按键扫描key_se
8、t(); /s2 按键扫描set_time(); /设置时间set_mdw(); /设置月日星期set_clock(); /设置闹钟if(set_5=1) /正常走时显示disp(hs,hg,mis,mig,ss,sg);if(set_5=2) /设置时间,LED1 闪亮disp(hs,hg,mis,mig,ss,sg);if(sec%2=0)led2=1;led3=1;led1=led1; / else/ led1=1; if(set_5=3) /正常显示月日-星期disp(ms,mg,ds,dg,16,w);if(set_5=4) /设置月日-星期,LED2 闪亮disp(ms,mg,ds
9、,dg,16,w);if(sec%2=0)led1=1;led3=1;led2=led2; / else/ led2=1; if(set_5=5) /正常显示定时disp(nhs,nhg,nms,nmg,nss,nsg);if(set_5=6) /设置闹钟定时,LED3 闪亮disp(nhs,nhg,nms,nmg,nss,nsg);if(sec%2=0)led1=1;led2=1;led3=led3; / else/ led3=1; zd_clock(); /整点报时nz_clock(); /闹钟void timer0() interrupt 1 /50ms 中断函数TMOD=0x01;TH
10、0=0x4c; /50ms 初值 晶振 11.0592TL0=0x00;count+;if(count=20)count=0;sec+;jishi(); /调计时函数void jishi() /计时函数if(sec=60) sec=0;minu+;if(minu=60) minu=0;hour+;if(hour=24) hour=0;day+;week+;if(week=8)week=0;if(year%4=0mon+;if(mon=13)mon=0;year+;else /非闰年if(day=table2mon+1)day=0;mon+;if(mon=13)mon=0;year+;void
11、key_change() /s5 按键扫描 if(s5=0)delay(200);if(s5=0) set_5+;while(!s5);if(set_5=7)set_5=1;void key_set() /s2 按键扫描if(s2=0)delay(10);if(s2=0)set_2+;while(!s2);if(set_2=4)set_2=1;图为显示时间:零点 34 分 38 秒(图片右下角电脑系统显示时间 00:34)Proteus 仿真图 图片显示月日星期:05 月 14 日-星期四void disp(uchar a1,uchar a2,uchar a3,uchar a4,uchar a
12、5,uchar a6) /显示函数dula=0; P0=tablea1; /段码送 P0 口dula=1; /选定段选dula=0; /关段选wela=0; P0=0x01; /位选(第 1 个数码管)送 P0wela=1; /选定位选wela=0; /关位选delay(1); /延时一小会dula=0; P0=tablea2; /第 2 个数码管显示,带小数点dula=1;dula=0;P0=0x02;wela=1;wela=0;delay(1);dula=0;P0=tablea3; /第 3 个数码管显示dula=1;dula=0;wela=0;P0=0x04;wela=1;wela=0;
13、delay(1);P0=tablea4; /第 4 个数码管显示,带小数点dula=1;dula=0;P0=0x08;wela=1;wela=0;delay(1);dula=0; /第 5 个数码管显示P0=tablea5;dula=1;dula=0;wela=0;P0=0x10;wela=1;wela=0;delay(1);P0=tablea6; /第 6 个数码管显示dula=1;dula=0;P0=0x20;wela=1;wela=0;delay(1);void zd_clock() /整点报时函数if(minu=59delay(1);fm=1;delay(1);if(minu=59delay(1);fm=1;delay(1);void nz_clock() /闹钟函数if(hour=n_houri-)for(j=80;j0;j-);