单片机时钟程序_第1页
单片机时钟程序_第2页
单片机时钟程序_第3页
单片机时钟程序_第4页
单片机时钟程序_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机电子时钟程序c51单片机 晶振为11.0592MHz#include<reg52.h>#define HOUR11#define HOUR00#define MIN12#define MIN08#define SEC12#define SEC00#define uint unsigned int#define ulint unsigned long int#define uchar unsigned charsbit dula=P2A6;sbit wela=P2A7;sbit beep=P2A3;int i;ulintsharp,second,count=0,sec0=SEC

2、0,sec1=SEC1,min0=MIN0,min1=MIN1,hour0=HOUR0,hour1=HOUR1;/秒计数全局变量uchar code segment=(0xfe,0xfd,0xfb,0xf7,0xef,0xdf;uchar code time=(0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;void delay(uint);/程序毫秒延时void beeper(uchar);/ 开蜂鸣器毫秒void init();/初始化函数void display();/从数码管上显示void counter();/计算进行过程中的时、分

3、、秒值void scan();/ 扫描键盘void main()(init();while(1)(scan();/扫描键盘看是否有键按下for(i=6;i>0;i-)/动态扫描6位数码管(display();/显示时、分、秒void init()(second=hour1*36000+hour0*3600+min1*600+min0*60+sec1*10+sec0;TMOD=0x01;TH0=(65536-46080)/256;TL0=(65536-46080)%256;EA=1;ET0=1;TR0=1;void delay(uint z)/程序毫秒延时(uint x=0,y=0;for

4、(x=z;x>0;x-)for(y=110;y>0;y-);void timer0() interrupt 1(TH0=(65536-46080)/256;TL0=(65536-46080)%256;count+;if(count=20)/判断是否到1秒(counter();/计算进行过程中的时、分、秒值if(sharp!=hour0) beeper(1000);/判断小时的值是否改变,变则启动蜂鸣器void beeper(uchar tt)(uchar t=tt;count=0;beep=0;/开蜂鸣器delay(t);beep=1;/关蜂鸣器void display()(P0=

5、0xff;/位消影(低电平选择位)送位选信号wela=1;P0=segmenti-1;wela=0;P0=0x00;/段消影(高电平选择段)送段选信号dula=1;switch(i)(case 6 : P0=timesec0; break;case 5 : P0=timesec1; break;case 4 : P0=timemin0; break;case 3 : P0=timemin1; break;case 2 : P0=timehour0; break;case 1 : P0=timehour1; break;delay(1);P0=0x00; /配合上面用于消隐dula=0;void

6、 counter()(second+;if(second=86400) second=0;count=0;sharp=hour0;/设置报时检测KEYsec0=second%10;sec1=(second%60-sec0)/10;min0=(second%3600-sec1*10-sec0)/60)%10;min1=(second%3600-sec1*10-sec0)/60-min0)/10;hour0=(second%36000-min1*600-min0*60-sec1*10-sec0)/3600;hour1=second/36000;void scan()(参考资料:我写的,在试验板上调

7、试成功,有问题加我QQ: 379176629 , 一起学习学习/*P1.0小时调整P1.1分种调整*/#include <reg51.h>#include <intrins.h>unsigned char data dis_digit;unsigned char key_s, key_v;unsigned char code dis_code11=0xc0,0xf9,0xa4,0xb0, / 0, 1,2, 3 0x99,0x92,0x82,0xf8,0x80,0x90, 0xff;/ 4, 5, 6, 7, 8, 9, offunsigned char data di

8、s_buf8;unsigned char data dis_index;unsigned char hour,min,sec;unsigned char sec100;sbit K1 = P1A0;sbit K2 = P1A1;bit scan_key();void proc_key();void inc_sec();void inc_min();void inc_hour();void display();void delayms(unsigned char ms);void main(void)P0 = 0xff;P2 = 0xff;TMOD = 0x11;/定时器0, 1工作模式1, 1

9、6位定时方式TH1 = 0xdc;TL1 = 0;TH0 = 0xFC;TL0 = 0x17;hour = 12;min = 00;sec = 00;sec100 = 0;dis_buf0 = dis_codehour / 10;/ 时十位dis_buf1 = dis_codehour % 10;/ 时个位dis_buf3 = dis_codemin / 10;/ 分十位dis_buf4 = dis_codemin % 10;/ 分个位dis_buf6 = dis_codesec / 10;/ 秒十位dis_buf7 = dis_codesec % 10;/ 秒个位dis_buf2 = 0xb

10、f;/ 显示"-"dis_buf5 = 0xbf;/ 显示"-"dis_digit = 0xfe;dis_index = 0;TCON = 0x01;IE = 0x8a;/ 使能 timer0,1 中断TR0 = 1;TR1 = 1;key_v = 0x03;while(1)(if(scan_key()(delayms(10);if(scan_key()(key_v = key_s;proc_key();bit scan_key()(key_s = 0x00;key_s |= K2;key_s <<= 1;key_s |= K1;return

11、(key_s A key_v);void proc_key()(EA = 0;if(key_v & 0x01) = 0)/ K1(inc_hour();else if(key_v & 0x02) = 0)/ K2(min+;if(min > 59)(min = 0;dis_buf3 = dis_codemin / 10;/ 分十位dis_buf4 = dis_codemin % 10;/ 分个位EA = 1;void timer0() interrupt 1/定时器0中断服务程序,用于数码管的动态扫描/ dis_index -显示索引,用于标识当前显示的数码管和缓冲区的偏

12、移量/ dis_digit -位选通值,传送到P2 口用于选通当前数码管的数值,如等于0xfe时,/ 选通P2.0 口数码管/ dis_buf -显于缓冲区基地址(TH0 = 0xFC;TL0 = 0x17;P2 = 0xff; /先关闭所有数码管P0 = dis_bufdis_index; / 显示代码传送到P0口P2 = dis_digit; /dis_digit = _crol_(dis_digit,1); /位选通值左移,下次中断时选通下一位数码管dis_index+; /dis_index &= 0x07;/ 8个数码管全部扫描完一遍之后,再回到第一个开始下一次扫描void

13、timer1() interrupt 3(TH1 = 0xdc;sec100+;if(sec100 >= 100)(sec100 = 0;inc_sec();void inc_sec()sec+;if(sec > 59)(sec = 0;inc_min();dis_buf6 = dis_codesec / 10;/ 秒十位dis_buf7 = dis_codesec % 10;/ 秒个位void inc_min()(min+;if(min > 59)(min = 0;inc_hour();dis_buf3 = dis_codemin / 10;/ 分十位dis_buf4 =

14、dis_codemin % 10;/ 分个位void inc_hour()(hour+;if(hour > 23)(hour = 0;if(hour > 9)dis_buf0 = dis_codehour / 10; / 时十位elsedis_buf0 = 0xff; /当小时的十位为 0时不显示dis_buf1 = dis_codehour % 10;/ 时个位void delayms(unsigned char ms)/延时子程序(unsigned char i;while(ms-)(for(i = 0; i < 120; i+);/P0 : LED数码管显示内容通过P1

15、 口从单片机传送到数码管/P1.2 P1.5 :数码管位选控制端口/P2.0 P2.3 :分别连接开关 K0 , K1 , K2 , K3通过不同的组合实现外部控制程序状态/P1.0 :蜂鸣器,倒计时完毕产生鸣响/P0.2 P0.5 :发光二极管,显示当前时钟状态/完整的源程序如下:/附程序源代码及注释#include <reg52.h>#include <absacc.h>#define uint unsigned int#define uchar unsigned char/*定义P2 口各管脚*/sbit K0=P2A2; / 按键定义sbit K1=P2A1;

16、/ 按键定义sbit K2=P2A0; / 按键定义sbit K3=P2A3; / 按键定义sbit D0=P1A5; / 位选定义sbit D1=P1A4; / 位选定义sbit D2=P1A3; / 位选定义sbit D3=P1A2; / 位选定义/*定义P1 口各管脚*/sbit beep=P1A0; /蜂鸣器sbit L0=P1A1; /状态指示定义sbit L1=P1A6; /状态指示定义sbit L2=P1A7; /状态指示定义uchar data BUFFER4=0,0,0,0;/显示缓冲区(,依次从低位到高位,共四位数码管uchar data CLOCK4=0,0,0,0;/存

17、放时钟时间(依次是百分秒,秒,分,时 )uchar data SECOND3=0,0,0;/存放秒表时间(依次时百分秒,秒,分))uchar data SEVER4=0,0,0,0;存放倒计时时间(依次是百分秒,秒,分,时)/*定义程序运行状态*/uchar data STATE=0;/*STATE=0;时钟运行*/*STATE=1;时钟分调整*/*STATE=2;未定义状态,可添加 */*STATE=3;时钟时调整*/*STATE=4;倒计时分调整*/*STATE=5;倒计时时调整*/*STATE=6;秒表 */*STATE=7;倒计时运行*/*定义辅助计时全局变量 */uchar m=60

18、;/*共阳数码管显示"0-9"和"-"*/uchar code TABLE=0x10,0xba,0x48,0x44,0x86,0x24,0x20,0x56,0x00,0x04,0xef;/*自定义子函数*/void display();显示函数void delay();/显示延时函数void intsvr();调整时间时加1子函数void delay10ms();延时函数/*主函数体*/void main(void) EA=1;ET0=1;开总中断源,开T0中断TMOD=0x61;/T1方式2计数,T0方式1计时TH0=-9460/256;TL0=-94

19、60%256;/初始化计数器初值TH1=0xff;TL1=0xff;T2CON=0;TH2=-9452/256;TL2=-9452%256;K0=1;K1=1;K2=1;/初始化控制状态位STATE=P2&0x07;for(;) switch(STATE) case 1:时钟分调整程序1IT0TR0=0;ET0=0;EX0=0;TR2=0; /关闭定时器,时钟停止运行,同时关闭外中断L1=0;L2=0;L0=1;intsvr();调用加1函数BUFFER0=CLOCK2%10;/数码管显示分钟个位BUFFER1=CLOCK2/10;/数码管显示分钟十位BUFFER2=10;/显示&qu

20、ot;-"BUFFER3=10;/显示"-"break;case 3:/时钟时调整程序TR0=0;ET0=0;EX0=0;TR2=0; /关闭定时器,时钟停止运行L1=0;L2=0;L0=1;intsvr();调用加1函数BUFFER0=CLOCK2%10;/数码管显示分钟个位BUFFER1=CLOCK2/10;/数码管显示分钟十位BUFFER2=CLOCK3%10;/数码管显示时钟个位BUFFER3=CLOCK3/10;/数码管显示时钟十位break;case 4:倒计时分钟调整程序|TR0=1;ET0=1;EX0=0;TR2=0; / 保持T0正常运行,即时钟

21、正常运行,同时关闭外 中断IT0L2=0;L1=0;intsvr();调用加1函数BUFFER0=SEVER2%10;/数码管显示分钟个位BUFFER1=SEVER2/10;/数码管显示分钟十位BUFFER2=10;/显示"-"BUFFER3=10;/显示"-"SECOND1=0;/秒表初始化为0SECOND2=0;break;case 5:倒计时时钟调整程序|TR0=1;ET0=1;EX0=0;TR2=0; / 保持T0正常运行,即时钟正常运行,同时关闭外中断IT0L2=0;L1=0;intsvr();调用加1子函数BUFFER0=SEVER2%10;

22、/数码管显示分钟个位BUFFER1=SEVER2/10;/数码管显示分钟十位BUFFER2=SEVER3%10;/数码管显示时钟个位BUFFER3=SEVER3/10;/数码管显示时钟十位SECOND1=0;/秒表初始化为0SECOND2=0;break;case 6:TR0=1;ET0=1;EX0=1;ET2=1;/ 保持T0正常运行,即时钟正常运行,同时开外中断IT0BUFFER0=SECOND1%10; /数码管显示秒表秒个位BUFFER1=SECOND1/10; /数码管显示秒表秒十位BUFFER2=SECOND2%10; /数码管显示秒表分个位BUFFER3=SECOND2/10;

23、/数码管显示秒表分十位break;case 7:TR0=1;ET0=1;EX0=0;ET2=1;/倒计时运行,同时时钟也正常运行,关闭外中断T0if(SEVER2=0)&&(SEVER3=0)/当预置时间(分,时)变为 0时,计时完毕beep=!beep;蜂鸣器响BUFFER0=10;/显示”一”BUFFER1=10;BUFFER2=10;BUFFER3=10;TR2=0;/关闭 T2elseTR2=1;/开启T2SECOND1=0;秒表时间初始化SECOND2=0;break;default:ET0=1;TR0=1;EX0=0;/开启T0 ,时钟运行,关闭外中断L1=1;L2

24、=1;/L3=1;BUFFER0=CLOCK2%10;/数码管显示分钟个位BUFFER1=CLOCK2/10;/数码管显示分钟十位BUFFER2=CLOCK3%10;/数码管显示时钟个位BUFFER3=CLOCK3/10;/数码管显示时钟十位K0=1;K1=1;K2=1;重新预置状态位display();/调用显示函数STATE=P2&0x07;/通过P2 口提取当前状态/*T0中断服务*/void time0(void) interrupt 1 using 1/T0中断函数TH0=-9460/256;计时器放入预置时间,大概10毫秒TL0=-9460%256;CLOCK0=CLOCK

25、0+1;一次中断加 1if(CLOCK0=50)/0.5 秒到LL0=!L0;/L0 取反if(CLOCK0=100)/1 秒到L0=!L0;/L0 取反CLOCK0=0;百分位清 0CLOCK1=CLOCK1+1;秒位加 1if(CLOCK1=60)/1 分钟到(CLOCK1=0;/秒位清0CLOCK2=CLOCK2+1;分位加1if(CLOCK2=60)/1小时到(CLOCK2=0;/分位清0CLOCK3=CLOCK3+1;时位加1if(CLOCK3=24)/24小时到(CLOCK3=0;/时位清0/*外中断IT0中断服务子函数*/void intsrl(void) interrupt 0

26、 using 1外中断IT0中断请求(TR2-1;开定时器T2if(K3-0)&&(SECOND1>-3)/K3再按下时且计时大过3时(TR2-0;ET2-0;/关闭T2/*定时器T2中断服务子函数*/void time1(void) interrupt 5 using 3/定时器T2中断请求(TF2-0;TH2-9452/256;/放入预置数TL2-9452%256;if(STATE-6)/秒表(SECOND0-SECOND0+1;/中断一次大概10msif(SECOND0-100)/1秒到(SECOND0-0;百分秒位清0SECOND1-SECOND1+1;秒位加1i

27、f(SECOND1-60)一分钟到(SECOND1-0;秒位清0SECOND2-SECOND2+1;分位加1if(SECOND2-60)一小时到(SECOND2-0;时位清0if(STATE=7)倒计时(if(SEVER3=0)小时位为0(if(SEVER2=0)分钟位为0(TR2=0;/关闭定时器T2|else|SEVER0=SEVER0+1;/百分秒位加if(SEVER0=50)/0.5秒到L1 = !L1;/L1取反if(SEVER0=100)/1秒到L1 = !L1;/L1取反SEVER0=0;/百分秒位清0SEVER1=-m;/秒位为59if(SEVER1=0)秒位为0m=60;秒位

28、初始化为60SEVER2=SEVER2-1;分位减1BUFFER0=SEVER1%10;/数码管显示秒钟个位BUFFER1=SEVER1/10;/数码管显示秒钟十位BUFFER2=(SEVER2-1)%10;/数码管显示分钟个位BUFFER3=(SEVER2-1)/10;数码管显示分钟十位else(if(SEVER2=0)分钟变为0H、SEVER0=0;百分秒清0SEVER1=60;秒位预置60SEVER2=60;分位预置60SEVER3=SEVER3-1;时位减 1 else ( SEVER0=SEVER0+1;百分秒加 1if(SEVER0=50)到 0.5 秒时( L1 = !L1;/L

29、1 取反 if(SEVER0=100)/1 秒到时( L1 = !L1;/L1 取反SEVER0=0;百分秒清 0SEVER1=SEVER1+1;/秒位加 1if(SEVER1=60)一分钟至 V| SEVER1=0;/秒位清 0SEVER2=SEVER2-1;分位减 1 BUFFER0=(SEVER2-1)%10;/数码管显示分钟个位BUFFER1=(SEVER2-1)/10;/数码管显示分钟十位BUFFER2=SEVER3%10;/数码管显示时钟个位BUFFER3=SEVER3/10;/数码管显示时钟十位/*加1子函数*/void intsvr(void)switch(STATE)判断当前

30、状态case 1:时钟分调整时匚if(K3=0)当建按下时delay10ms();延时,消除按键抖动if(K3=0) CLOCK2=CLOCK2+1; 分位加 1 if(CLOCK2=60) 到 60 时 CLOCK2=0;/分位清 0while(K3=0);break;case 3:时钟时调整if(K3=0)当键按下时delay10ms();延时,消除按键抖动if(K3=0)|CLOCK3=CLOCK3+1;时位加 1if(CLOCK3=24)/24 小时到CLOCK3=0;时位清 0|while(K3=0);|break;case 4:倒计时分调整if(K3=0)当键按下时delay10m

31、s();延时,消除按键抖动if(K3=0)=SEVER2=SEVER2+1; /倒计时分钟加 1 if(SEVER2=60) 到 60 时 SEVER2=0; 清 0while(K3=0);break;case 5:倒计时时调整if(K3=0)当键按下时_delay10ms();延时,消除按键抖动if(K3=0)SEVER3=SEVER3+1; /时位加 1if(SEVER3=24)到 24 时(SEVER3=0;/时位清 0while(K3=0);|break;/*数码管动态显示函数*/void display(void)动态显示函数(uchar disp;定义数码管的显示位D0=1;/ 关

32、 D0D1=1;/ 关 D1D2=1;/ 关 D2D3=0;/ 开 D3disp=BUFFER0;P0=TABLEdisp;/输入要显示数据delay();/显示延时函数D0=1;/ 关 D0D1=1;/ 关 D1D2=0;/ 开 D2D3=1;/ 关 D3disp=BUFFER1;P0=TABLEdisp;/输入要显示的数据delay();/显示延时函数D0=1;/ 关 D0D1=0;/ 开 D1D2=1;/ 关 D2D3=1;/ 关 D2disp=BUFFER2;P0=TABLEdisp;/输入要显示的数据delay();/显示延时函数D0=0;/ 开 D0D1=1;/ 关 D1D2=1;

33、/ 关 D2D3=1;/ 关 D3disp=BUFFER3;P0=TABLEdisp;/输入要显示数据delay();/显示延时函数/*延时函数*/void delay(void)(uchar k;for(k=0;k<=200;k+);void delay1ms(void)(uchar j,i;for(j=0;j<=10;j+)for(i=0;i<=200;i+);7. C语言源程序#include <AT89X51.H>unsigned char code dispcode=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71,0x00;unsigned char dispbi

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论