1、数字钟报告数字钟报告一 电子钟方案方案1:单片机定时 可通过51系列的单片机两个内部的16位定时器/计数器实现时钟计数。这两个计数器都是由8位的特殊RAM单元组成的,最大计数量程是65536。定时器是单片机的内部晶振经过12分频后获得的一个脉冲源,并以它作为计数器信号的实现。方案2:专用时钟芯片 DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒分时日日期.月年的信息,每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式.DS1302 与单
2、片机之间能简单地采用同步串行的方式进行通信.双电源管脚用于主电源和备份电源供应Vcc1,为可编程涓流充电电源附加七个字节存储器. 方案选择:由于直接用单片机内部定时器作为时钟计数比较不准确,同编制日历软件复杂,不能提供准确的时间计量,而DS1302能够提供准确的年、月、日等信息,但没有此芯片,因此只能用单片机内部的定时器。2单片机选型:AT89C52 ATMEL公司生产的低电压,高性能CMOS 8位单片机片内含8K byTES的可反复擦写的只读程序存储器(PEROM)和256 byTES 的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度,与标准MCS-51指令系统及8052 产品
3、引脚兼容,片内置通用8位中央处理器(CPU )和FLASH由存储单元,与Mcs-51产品指令和引脚完全兼容。二 系统硬件设计(1)显示电路:器材限制,因此采用数码管显示。1.数码管显示2.液晶屏显示(2)显示闹钟:时钟显闹时,所有发光二极管发亮。(3)复位电路:在上电或复位过程中,控制CPU的复位状态:这段时间内让CPU保持复位状态,而不是一上电或刚复位完毕就工作,防止CPU发出错误的指令、执行错误操作,也可以提高电磁兼容性能。无论用户使用哪种类型的单片机,总要涉及到单片机复位电路的设计。而单片机复位电路设计的好坏,直接影响到整个系统工作的可靠性。方式一,手动按钮复位方式二,上电复位 特例:积
4、分型上电复位(4)振荡电路:(5)键盘:方式1.独立键盘 方式2.矩形键盘:(6)总电路图:方案一:程序:#include /包含头文件#define uint unsigned int /宏定义#define uchar unsigned char /宏定义sbit P20=P20; /定义位变量sbit P21=P21;sbit P22=P22;sbit P23=P23;sbit P24=P24;sbit P25=P25;uchar code table=0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x40,0x79,0x24,0x3
5、0,0x19,0x12,0x02,0x78,0x00,0x10; /数码管显视代码uchar s,f,m,s1,s2,f1,f2,aa,bb,cc,ns,nf,n1,n2,n3,n4; /定义全局变量void delay(uint z) /延时函数 uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);void display(uchar a,uchar b,uchar c,uchar d); /声明显示函数uchar tiaoshi(uchar bb); /声明调时子函数uchar tiaofen(uchar cc); /声明调分子函数void main() s
6、=0; f=0; m=57; ns=10; nf=10; TMOD=0x01; /设置定时器0为工作方式1 TH0=(65536-50000)/256; /赋予高四位初值 TL0=(65536-50000)%256; /赋予低四位初值 EA=1; /开总中断 ET0=1; /开定时器0中断 TR0=1; /启动定时器0 while(1) if(aa=12) aa=0; m+; if(m=60) m=0; f+; if(f=60) f=0; s+; if(s=24) s=0; if(P20=0) /进入调时程序 delay(5); if(P20=0) s=tiaoshi(s); f=tiaofe
7、n(f); if(P25=0) /进入调闹钟程序 delay(5); if(P25=0) while(P25!=1) ns=tiaoshi(ns); nf=tiaofen(nf); n1=ns/10; n2=ns%10; n3=nf/10; n4=nf%10; display(n1,n2,n3,n4); if(s=ns&f=nf) P1=0x00; /到闹钟指定时间时所有发光二极管发亮 else P1=0xff; s1=s/10; s2=s%10; f1=f/10; f2=f%10;display(s1,s2,f1,f2); void time() interrupt 1 /中断函数 TH0=
8、(65536-50000)/256; TL0=(65536-50000)%256; aa+;void display(uchar a,uchar b,uchar c,uchar d) /显示函数 P0=tablea;P3=0x01;delay(5); P0=0xff; P0=tableb+10;P3=0x02;delay(5);P0=0xff; P0=tablec;P3=0x04;delay(5);P0=0xff; P0=tabled;P3=0x08;delay(5);P0=0xff;uchar tiaoshi(uchar bb) /调时函数 if(P21=0) delay(5); if(P2
9、1=0) if(P23=0) delay(70); if(P23=0) bb+; if(bb=24) bb=0; if(P24=0) delay(70); if(P24=0) bb-; if(bb=-1) bb=23; return bb;uchar tiaofen(uchar cc) /调分函数 if(P22=0) delay(5); if(P22=0) if(P23=0) delay(70); if(P23=0) cc+; if(cc=60) cc=0; if(P24=0) delay(70); if(P24=0) cc-; if(cc=-1) cc=59; return cc;方案二#i
10、nclude /包含头文件#include /包含头文件#define uchar unsigned char /数据类型定义uchar n=31; /定义月份天数变量并初始化uchar ms=0; /定义毫秒变量并初始化uchar h1=0,m1=0,s1=0; /定义计时时、分、秒变量并初始化uchar h2=0,m2=1,s2=1; /定义定时时、分、秒变量并初始化 uchar year=7,month=9,day=8; /定义年、月、日变量并初始化uchar wday=6; /定义星期变量并初始化uchar *h=&h1,*m=&m1,*s=&s1; /定义显视位变量并初始化uchar
11、 *p; /定义调节指针uchar k1=0,k2=0,k3=0,k4=0,k5=0; /定义控制变量并初始化uchar counter=0; /定义铃声节拍变量并初始化uchar count=0; /定义铃声音符变量并初始化sbit sound=P10; /定义铃声输出位uchar a8=1,2,3,4,5,6,7; /定义显视输出位数组并初始化uchar code tt12=0x3f,0x06,0x5b,0x4f,0x66,0x6d, 0x7d,0x07,0x7f,0x6f,0x40,0x00; /数码管显视代码uchar code array= 0x18, 0x30, 0x1C, 0x1
12、0, 0x20, 0x40, 0x1C, 0x10, 0x18, 0x10, 0x20, 0x10, 0x1C, 0x10, 0x18, 0x40, 0x1C, 0x20, 0x20, 0x20, 0x1C, 0x20, 0x18, 0x20, 0x20, 0x80, 0xFF, 0x00, 0x20, 0x30, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0x20, 0x20, 0x20, 0x1C, 0x10, 0x18, 0x20, 0x15, 0x20, 0x1C, 0xff, ; /arrayi=0x00 代表歌曲演唱完毕 /arrayi=0
13、xff 代表是休止符uchar leap(uchar year) /判断是否闰年并返回二月份的天数year+=2000; /闰年返回29,平年返回28 if(year%4=0) if(year%100=0) if(year%400=0) return 29; else return 28; else return 29; else return 28;uchar mon(uchar month) /计算并返回每个月的天数 switch(month) case 1: case 3: case 5: case 7: case 8: case 10: case 12:return 31;break;
14、 /1,3,5,7,8,10,12月每月31天 case 4: case 6: case 9: case 11:return 30;break; /4,6,9,11月每月30天 case 2: return leap(year);break;/返回二月份的天数 default:break; void music(void) /铃声音乐 功 能:音乐节拍控制 counter+; /节拍次数计数 if(counter=arraycount+1) /节拍次数判断 count+=2; /音符变换 counter=0; /清0节拍数 if(count=192) /判断是否唱完一曲 count=0; /返
15、回第一个音符 void timer1(void)interrupt 1 using 1 /音调设置 功 能:音乐频率设置 sound=sound; /铃声输出 TH0=(0xffff-30*arraycount)8; /音频设置 TL0=(0xffff-30*arraycount)&0xff; void timer3(void) interrupt 3 using 3 /计时中断 功 能:中断计时 TH1=0xd8; /计数器初值重载 TL1=0xef; /定义单位节拍的延时大小为10ms if(k5)music(); /调用闹铃音乐lns else TR0=0; /达到所设闹铃时间长度关铃声
16、 if(+ms=100) /计时一秒钟 ms=0; if(+s1=60) /计时一分钟 s1=0; if(+m1=60) /计时一小时 m1=0; if(+h1=24) /计时一天n=mon(month); /取每月的天数if(+dayn) /计时一个月 day=1; if(+month12)/计时一年 month=1; year+; if(+wday6)/星期计数 wday=0; k5-; /闹铃时间长度倒记时 if(h1=h2&m1=m2) /判断是否到定时时刻 TR0=1; /开铃声中断lns k5=s2; /设置闹铃时间长度 void d3(void) /显示输出 uchar sel=
17、0x80,i ; /定义sel为位选通变量并初使化 if(k2) /判断是否处于调时状态 if(k2=4)a0=a1=a4=a6=a7=10; /星期显示设置 if(k1&(k3-=0) k3=255; /设置位调节闪烁初值 for(i=0;i200) /判断是否闪烁 if (k1=1&(i=6|i=7)P2=0xff; /时位闪烁 else if(k1=2&(i=3|i=4)P2=0xff; /分位闪烁 else if(k1=3&(i=0|i=1)P2=0xff; /秒位闪烁 else P2=sel; /非闪烁状态 else P2=sel; /非闪烁状态 sel=sel1; /显示位移位 v
18、oid d2(void) / 功 能:循环调用 while(1) a0=*s%10; /给显示数组赋值 a1=*s/10; a2=10; a3=*m%10; a4=*m/10; a5=10; a6=*h%10; a7=*h/10; d3(); /调用显示输出函数 void d1(void) /功 能:中断设置 TMOD=0x11; TH1=0xff; TH0=0xff; TL1=0xff; TL0=0xff; IE=0x8f; TR1=1;IT0=1; IT1=1; IP=0x02; void main () /功 能:程序入口,调用功能子函数d1(); /调用中断位设置函数 d2();voi
19、d d5(void) /显示菜单调节函数 switch(k2) case 1:h=&h1; m=&m1; s=&s1; break; /菜单1:显示时钟时间 case 2:h=&h2; m=&m2; s=&s2; break; /菜单2:显示定时时刻 case 3:h=&year;m=&month;s=&day; break; /菜单3:显示日历年月日 case 4:h=&wday;m=&wday; s=&wday;break; /菜单4:显示星期0-6 default:k2=0;h=&h1;m=&m1;s=&s1; break; /复位显示 void d7(void) /调节限制函数 if(k2=1|k2=2) /计时与定时限制 if (k1=1&*p=24) *p=0; /小时限制 else if(*p=60) *p=0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1