1、【单片机】c51数字时钟(带年月日显 示)00%8-3H 一 -hli.lljLiJInIQ. c V UM. B戸rr:馆 灵;-丄-S:T显示当前时间:9点58分34秒(第一个零表示闹钟未开启)冃 000 0030. TJ - TJ *IJ当前日期:10年4月六日摘要:本设计以单片机为核心,LED数码管动态扫描显示。采用矩阵式键盘输入 能任意修改当前时间日期和设定闹钟时间。 具有显示年月日(区分闰年和二月) 闹钟报警和整点报时功能说明系统的功能选择由7个按键完成。其中P3.0,P3.1分别对应调整当前时间的时和分,P3.2为外部中断0,控制闹钟功能的开启/关闭(开启时数码管第一位显示字母
2、c)P3.3用作外部中断1,当前时间的显示与闹铃时间显示切换,闹钟显示时按 P3.0,P3.1可进行闹钟时分的设定,此时,ledl灯灭。闹铃时间到切闹钟开关开 启时,闹铃响一分钟。P3.5P3.6P3.7对年月日进行调整(第一次按P3.5,就进入了年月日的显示,现 在就可对日期进行调整)。按 P3.1回到当前时间的显示状态。整点到时:报警对应小时的次数。程序如下:#in clude#i nclude#i nclude#defi ne uchar un sig ned char#defi ne uint un sig ned intuchar data keyvalue;/ 查到的键值uchar
3、 data keys;/转换出的数字uchar dis8;uchar codeSeg=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x67,0x40,0x00,0x39,0xf7;56sbit led_dua n=P2W;sbit led_wei=P2A7;sbit speaker=P2A3;sbit mini tek=P3A0;sbit hourk=P3A1;sbit p3_4=P3A4;sbit yeark=P3A5;sbit mon thk=P3A6;sbit dayk=P3A7;/ 0789-/段选通/位选通/蜂鸣器/分校正按键/小时校正按
4、键/年/月/日123灭灯 c nbit leap_year;bit dis_ nyr;bit cal_year=1;bit calculate=1; uchar data c_mi n; uchar data c_hou;/闰年标志位uchar data wei,i;/显示年月日与当前时间切换标志/闹钟分寄存单元/闹钟、小时寄存单元uchar data second;/ 秒uchar data minite;/ 分变量uchar data hour;/ 小时变量uchar data year,m on th,day; uchar data CNTA;uchar data speaker, nu
5、m; bit beep;bit r un;bit flash;bit clarm_switch;bit baoshi;sbit led仁 P1A6;sbit led2=P1A7;sbit P3_2=P3A2;sbit P3_3=P3A3; uint n,k;/*10微秒级延时*/ void delay_10us(uchar n) do _nop_();_nop_();_nop_();_nop_();_nop_();while(-n);/*毫秒级延时*/定义年月日变量/蜂鸣次数/整点报时标志/运行标志/灭灯标志/闹钟开关标志/报时开关标志/按键标识指示灯/运行标志指示灯void delay_ms
6、( uint n) do delay_10us(131);while(-n);/*当前时间转换*/clk_to_dis()dis0=seco nd%10;dis1=seco nd/10; if(flash)dis2=10;else dis2=11;dis3=mi nite%10;dis4=mi nite/10;dis 5=hour%10;dis6=hour/10;/*定时闹钟显示译码(用于七段码显示)*/clarm_to_dis() 一一disO=c_mi n%10;dis1=c_mi n/10;if(flash)dis2=10;/ 亮灯/灭灯else dis2=11;dis3=c_hou%1
7、0;dis4=c_hou/10;dis5=10;dis 6=13; 年月日显示译码*ny r_to_dis() 一一dis0=day%10;dis1=day/10;dis2=10;/ 显示 -dis3=mo nth%10;dis4=m on th/10;dis5=10;/ -dis6=year%10;dis7=year/10;/*主函数*/void mai n()P2=0xff;P仁 0XFF;p3_4=0;run=1;led2=0;/运行指示灯亮led仁1;flash=0x00;dis2=10;/第三位显示“wei=0x7f; /选通低位i=0;second=21;min ite=58;ho
8、ur=9;CNTA=0x00;year=10;mon th=4;day=5;clk_to_dis();TMOD=Ox11;TH0=15560/256;TL0=15560%256;TH1=0xfc;TL1=0x18;EA=1;PT0=1;EX0=1;/开中断;EX仁1;ET0=1;ET1=1;TR0=1;TR1=1;while(1)while(r un=1) clk_to_dis();if(calculate)if(mon th=1|m on th=3|m on th=5|m on th=7|m on th=8|m on th=10| mont h=12)day+;if(day31)day=0x
9、01;mo nth+;if(mon th=13)m on th=1;year+;cal_year=1;led仁0;/指示灯亮if(mon th=4 |mon th=6|m on th=9|m on th=11)day+;if(day30)day=0x01;mo nth+;led仁0;/指示灯亮if(mon th=2) if(leap_year=1)day+;if(day=30)day=1;else day+;if(day=29)day=1;while(cal_year) _if(yea叶2000)%400=0) leap_year=1;/ 被 400 整除为闰年else if(yea叶2000
10、)%100=0) leap_year=0; / 不能 被400整除 能被100整除 不是闰年elseif(yea叶2000)%4=0)leap_year=1; / 不能被 400、100 整除能被 4整除是闰年else leap_year=0;cal_year=0; _calculate=0;led1=1;while(!mi nitek)for(n=0; n1000; n+);if(!minitek=0)break;/ 延时防抖min ite+;second=0x00;led 仁0;for(n=0;n 20; n+)speaker=!speaker; delay_10us(50);/ 蜂鸣器响
11、if(mi nite=60)mi ni te=0x00;while(!minitek);/ 等待键松开led1=1;/显示灯while(!hourk)for(n=0 ;n 1000; n+); if(!hourk=0)break; hour+;second=0x00;led 仁0;/蜂鸣器响for(n=0; n30; n+) speaker=!speaker; delay_10us(30); _if(hour=24) hour=0x00; while(!hourk);led 1=1;while(!yeark)/yeark键复用进入年月日调整for(n=0; n1000; n+);if(!yea
12、rk=O)break;dis_ ny r=1;while(!yeark);while(dis_ nyr) nyr_to_dis();while(!yeark)for(n=0;n 1000; n+);if(!yeark=0)break;year+;led 仁0;for(n=0; n 30; n+)speaker=!speaker;delay_10us(30);/ 蜂鸣器响if(year+2000)%400=0) leap_year=1;/ 被400整除为闰年else if(yea叶2000)%100=0) leap_year=0;/不能被400整除 能被100整除 不是闰年elseif(yea叶
13、2000)%4=0)leap_year=1; / 不能被 400、100 整除能被 4整除是闰年else leap_year=0;while(!yeark);led仁1;while(!m on thk)for(n=0;n 1000; n+);if(!m on thk=0)break;mon th+;if(mon th=13)m on th=1;led 仁0;for(n=0; n 30; n+)speaker=!speaker;delay_10us(30);/ 蜂鸣器响while(!m on thk);led仁1;while(!dayk)for(n=0;n 31)day=0x01;led仁0;/
14、指示灯亮if(mon th=4 |mon th=6|m on th=9|m on th=11)day+;if(day30)day=0x01;led仁0;/指示灯亮if(mon th=2) if(leap_year=1)day+;if(day=30)day=1;else day+;if(day=29)day=1;led 仁0;for(n=0; n 30; n+)speaker=!speaker;delay_10us(30);/ 蜂鸣器响while(!dayk);led仁1;while(!hourk) for(n=0; n1000; n+);if(hourk) break;dis_ nyr=0;w
15、hile(!hourk);if(clarm_switch)dis7=12;/ 开启显示Celse dis7=11;/ 关闭 不显示dis 6=11;clk_to_dis(); if(clarm_switch)/闹铃时间到,指示灯闪烁 蜂鸣器长响if(c_m in=min ite&c_hou=hour)speaker, num=60;beep=1;while(beep& clarm_switch) _led仁!Ied1;delay_ms(100);clk_to_dis(); 一一led仁1;beep=0;while(run=0)/闹钟时间设定 clarm_to_dis();/while(!mi
16、nitek)for(n=0; n1000; n+);if(!minitek=0)break;/ 延时防抖c_mi n+;led 仁0;for(n=0;n 20; n+)speaker=!speaker; delay_10us(50);/ 蜂鸣器响if(c_m in=60)c_m in=0x00;while(!minitek);/ 等待键松开led1=1;/显示灯while(!hourk)for(n=0; n1000; n+);if(!hourk=0)break;c_hou+;led 仁0;for(n=0; n7)speaker_num=2*hour;/ 整点到设定报时次数 蜂鸣标志 置1bee
17、p=1;if(hour=24)hour=0; calculate*110点到,日期标志加一TR 1=1;定时器中断 T1*/timer1() in terrupt 3 using 3 TH1=0xfc;TL1=0x18;P0=0xff; led_wei=1; led_wei=0;P0=segdisi;led_dua n=1;led_dua n=0;P0=wei; led_wei=1;led_wei=0; if(+i=8)i=0; wei=_cror_(wei,1);外中断int_0() in terrupt 0/闹钟开关/开启显示/关闭不显示 开启第一位显示Cclarm_switch=!clarm_sw
到此这篇51单片机数字时钟代码(c51单片机数字时钟程序)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/qkl-szzc/42155.html