绪论摘要:单片机是一种集成在电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计时器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的计算机系统。
、电子闹钟是采用数字电路实现对.时,分,秒.数字显示的计时装置,广泛用于个人家庭,车站, 码头办公室等公共场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。
诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。
数字钟已成为人们日常生活中:必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。
由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携带方便等优点,它还用于计时自动报时及自动控制的领域。
因此,研究数字钟及扩大其应用,有着非常现实的意义。
关键字:C52、单片机、定时闹钟、电子设计一.设计目的和要求1.1设计任务:设计一个可控制的定时闹钟。
1.2设计目的:1.了解定时闹钟的组成及工作原理。
2.进一步熟悉和掌握单片机的结构和工作原理。
1.3设计要求:A.基本要求:1).由晶振电路产生1HZ标准秒信号。
2).秒、分为00-59六十进制计数器。
3).时为00-23二十四进制计数器。
4).可手动校正:能分别进行秒、分、时的校正。
只要将开关置于手动位置,可分别对秒、分、时进行连续脉冲输入调整。
5).当时间到达闹钟设定时间时,蜂鸣器发出报警声。
B.提高要求:a).通过按钮快速切换闹钟显示。
b).通过计算机串口在PC上快速设定时间闹钟c).整点报时。
二.系统设计2.1硬件系统:2.1.1电源电路:电源是单片机系统的重要组成部分,它不仅为系统提供多路电压源,还直接影响到系统的技术指标和抗干扰性能。
AT89C51单片机和一般的数字芯片一样,都是5V电压供电,所以可以共用一个5V 电源。
另外,为了提高电源的稳定性,在离电源的最近处做好退耦处理,即用一个47UF和一个10UF电容,以滤去干扰,保证电源的稳定。
2.1.2 AT89C51单片机AT89C51是一种带4K字节闪存可编程可擦除只读存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。
使用时VCC接电源,GND接地。
P0-P3可作为输入或者输出端口。
RST接复位电路。
2.1.3时钟电路单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。
本系统中AT89C51单片机采用内部时钟方式。
最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHz~12MHz之间。
电容值无严格要求,但电容取值对振荡频率输出的稳定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。
单片机的时钟产生AT89C51、2.1.4数码管显示电路要同时使得6个数码管点亮,所需的IO口是很多的。
为了节省单片机的IO口,通常采用动态扫描的显示方法,将每个数码管的同名段连在一起,分6次向数码管写数据,每次对6个数码管写相同的数据,每次选通一个数码管,完成扫描,通过调整、缩短扫描的时间,由于人眼的视觉暂留作用,使得人们看起来就像同时显示一样,以达到动态显示的目的.2.2设计原理2.2.1 系统总体方案1)由于要显示数字时间,所以需要6位数码管。
2)时间的定时用时钟电路,修改时间和定时用手动按键控制,报警声通过喇叭发出。
3)AT89S52单片机加上外围器件(6个共阴数码管,限流电阻和一个蜂鸣器)和应用程序(KEIL编译软件),构成相应的应用系统。
2.2.2 系统设计方框图2.2.3 软件设计流程图1系统设计方框图三.实验结果和讨论在确立了编程设计的基本思路后,我们开始查找相关的编程资料,然后采用C语言对软件设计的要求进行编译。
一开始进展很慢,并且编程过程中出现个各种错误,经过大量时间的编译与完善,我们终于逐步完成定时闹钟的软件设计过程。
最终程序如下:#include<reg51.h>#define uint unsigned int#define uchar unsigned charuchar code shu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9uchar code shu2[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; //带小数点0~9uchar code wei[]={0xef,0xdf,0xbf,0x7f,0xf7,0xfb};//数码管位选码uchar x[]={0,0,0,0};uchar y[]={0,0,0,0,0,0};uint hour=12,min,sec,h=22,m=0;uint a,s1=1,s2=1,s3=0,i=0,status=0,num=0,class=0;bit flag=0;sbit P3_7=P3^7;void delay(uint t);voidkeyprint(unsigned char key);void display();void timer0();void sint()interrupt 4//串口中断,实现PC上快速设定时间与闹钟{s3++;s3=s3%4;if(RI&&s3==1){RI=0;hour=SBUF;}if(RI&&s3==2){RI=0;min=SBUF;}if(RI&&s3==3){RI=0;h=SBUF;}if(RI&&s3==0){RI=0;m=SBUF;}if(!TI)TI=0;}void delay(uint t) {uint i;while(t--)for(i=0;i<125;i++); }main(){uchar n;uchar input;n=0x0f;TMOD=0x21;TH0=(65536-5000)/256;TL0=(65536-5000)%256;TH1=0xfd;TL1=0xfd;SCON=0x50;PCON=0x00;TR1=1;IP=0x10;TR0=1;IE=0x92; //开定时器0,串口中断while(1) //键扫描程序{input=P2&0x0f;if(input!=0x0f&&s1==1){delay(10);s1=0;if(input!=0x0f&&s2==1){s2=0; //按住不放n = input; //n用来暂时存放键值}}if(input==0x0f&&s1==0){s1=1;s2=1;keyprint(n);n=0x0f;}if((hour==h&&min==m)||(h!=0&&min==0)) {if(sec==0)P3_7=0;if(sec==1)P3_7=1;if(sec==2)P3_7=0;if(sec==3)P3_7=1;if(sec==4)P3_7=0;if(sec==5)P3_7=1;}elseP3_7=1;if(h>=24)h=0;display();}}void keyprint(unsigned char key) //各个按键功能{if(key==0x0e){num++;if(num==1) {class=1;}if(num==2) {class=2;num=0;}}if(key==0x0d){status++;if(status>=5)status=0;}if(key==0x0b){if(status==1){if(min<59) min++;else {min=0;hour++;}}if(status==2){if(hour<23) hour++;else hour=0;}if(status==3){if(m<59) m++;else {m=0;h++;}}if(status==4){if(h<23) h++;else h=0;}}}void display()//数码管数值显示函数{uchar d=0;if(class==1||class==0){x[0]=hour/10; // 显示时的十位x[1]=hour%10; // 显示时的个位x[2]=min/10; // 显示分的十位x[3]=min%10; // 显示分的个位while(d<4){P2=wei[d];P0=shu[x[d]];delay(1);d++;}}else if(class==2){y[0]=h/10; // 显示时的十位y[1]=h%10; // 显示时的个位y[2]=m/10; // 显示分的十位y[3]=m%10; // 显示分的个位d=0;if(flag==0) // 每过0.5s小数点闪烁一次{while(d<4){P2=wei[d];P0=shu2[y[d]];delay(1);d++;}}else if(flag==1){while(d<4){P2=wei[d];P0=shu[y[d]];delay(1);d++;}}}}void timer0() interrupt 1 //定时器0方式1中断函数{uint count;TH0=(65536-5000)/256; // 定时器0设置初始值1ms中断初始值TL0=(65536-5000)%256;TR0=1;count++; //正常计时if(count>=100){flag=1;if(count>=200) // 定时1S 到,以下为时钟的正常走钟逻辑{flag=0;count=0;sec++;if(sec>= 60){sec=0;min++; //秒到60分加一,秒清零}if(min>= 60){min=0;hour++; //分到60时加一,分清零}if(hour>= 24){hour=0; //时到24立即变为0}}}}四.结论4.1本次课程设计的特点:本次课程设计对单片机这么课程的知识原理要求比较高,具有一定的编程要求。