C单片机实现电子闹钟
- 格式:docx
- 大小:135.69 KB
- 文档页数:9
单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。
单片机时钟程序设计代码好的,由于你没有给出具体的单片机型号,下面是一个基于 51 单片机的时钟程序设计示例:```c#include <reg52.h>#include <stdio.h>#include <stdlib.h>#include <unistd.h>#include <string.h>// 定义变量char str[20];int i=0;int j=0;int k=0;int time=0;int flag=0;int h=0,m=0,s=0;void delay(int xms){int i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;time++;if(time==20){time=0;s++;if(s==60){s=0;m++;if(m==60){m=0;h++;}}}// 将时间数据转换为字符串sprintf(str," %02d:%02d:%02d",h,m,s);// 输出时间字符串for(i=0;i<16;i++){P0=str[i];delay(1000);}}void main(){// 初始化定时器 0 为 16 位定时器模式,计数初值为 50000 TMOD=0x01;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;while(1);}```该程序利用 51 单片机的定时器 0 来产生定时中断,每 20 次中断为 1 秒,通过对秒、分、时的累计来实现时钟功能。
在中断服务函数中,将当前时间转换为字符串,并通过循环输出到 P0 口。
电子时钟[摘要] 本设计是基于STC单片机的电子时钟技术,由STC12C5A16S2芯片和LCD1602液晶显示屏,DS18B20进行温度测量,辅以必要的的电路,构成一个单片机定时闹钟。
电子钟可采用数字电路实现,也可以采用单片机来完成.LCD显示“时”,“分”,LED闪动来做秒计数,定时时间到能发出警报声或者启动继电器,从而控制电器的启停。
现在是自动化高度发达的时代,特别是电子类产品都是靠内部的控制电路来实现对产品的控制,达到自动运行的目的,这就需要我们这里要做的设计中的电器元件及电路的支持。
在这次设计中主要是用STC12C5A16S2来进行定时,也结合着其他辅助电路实施控制,在定时的时候,按一下控制小时的键对小时加一;按一下控制分钟的键对分钟加一;到达预设的时间,此电路就会发出报警声音提示已经到点。
[关键词] 定时闹钟STC12C5A16S2 LCD1602Time clock[Abstract] The regular alarm clock designers design, by the microcontroller STC12C5A16S2 chip and LCD1602 display、 DS18B20 , combined with the necessary circuitry to form a single—chip timer alarm clock. Clock can be digital circuit,the microcontroller can also be used to complete。
LCD display "when”, "sub”,LED flash to do the second count, regular time to be able to sound an alarm or start relay to control the electrical start and stop. Now is the era of highly developed automation, especially electronic products are relying on the internal control circuitry to achieve control of the product to achieve the purpose of automatic operation, which requires us to do the design of electrical components and circuits to support 。
#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]=" 2012-08-17 MON"; //设定开始显示的时间uchar code table1[]=" 12:30:00";uchar code table2[7][3]= {{"MON"},{"TUE"},{"WED"},{"THU"},{"FRI"},{"SAT"},{"SUN"}};//定义二维字符数组sbit wr=P3^6; // 1602液晶的读/写端sbit dula=P2^6; // 数码管段选sbit wela=P2^7; // 数码管位选sbit lcden=P3^4; // 1602液晶使能端sbit lcdrs=P3^5; // 1602液晶命令/数据端sbit key1=P3^0; // 声明s4按键sbit key2=P3^1; // 声明s8按键sbit key3=P3^2; // 声明s12按键sbit key4=P3^3; // 声明s16按键sbit beep=P2^3; // 声明蜂鸣器sbit rd=P3^7; // 声明4个按键的公共端uchar num1,shi=12,fen=30,miao,yue=8,ri=17,shi1,fen1,miao1,keynum1,week; //定义时分秒变量uint nian=2012; //定义年变量void delayms(uint x){uint i,j;for(i=x;i>0;i--) //定义带参数延时函数for(j=110;j>0;j--);}void write_com(uchar com) //1602液晶写指令函数{ wr=0;lcdrs=0;P0=com;delayms(1);lcden=1;delayms(1);lcden=0;}void write_date(uchar date) //1602液晶写数据函数{ wr=0;lcdrs=1;P0=date;delayms(1);lcden=1;delayms(1);lcden=0;}void write_addate1(uchar add,uint date) //定义显示年的函数{ uint qian;uchar bai,shi,ge;qian=date/1000;bai=date%1000/100;shi=date%1000%100/10;ge=date%10;write_com(add+0x80);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge);}void write_addate2(uchar add,uchar date) //定义显示月、日、时、分、秒函数{uchar shi,ge;shi=date/10;ge=date%10;write_com(add+0x80);write_date(0x30+shi);write_date(0x30+ge);}void write_rq(uchar i) //定义显示星期的函数{ uchar x;for(x=0;x<3;x++){ write_date(table2[i][x]);delayms(1);}}void init () //定义初始化函数{dula=0; // 关闭数码管段、位选端wela=0;TMOD=0x01; // 定时器0工作方式为16位TH0=(65536-45872)/256; // 装初值TL0=(65536-45872)%256;EA=1; // 开总中断ET0=1; // 开定时器0中断write_com(0x38); // 设置16*2显示,5*7点阵,8位数据口write_com(0x06); // 写一个字符后地址指针加1write_com(0x0c); // 设置开显示,不显示光标write_com(0x01); // 显示清0,数据清0write_com(0x80); // 使指针指向第1行第1列}void keyscan() // 定义按键函数{uchar keynum;rd=0; //4个按键公共端为低电平if(key1==0) //s4按键被按下{ delayms(3); //去抖延时if(key1==0) //确认s4按键被按下,进入调时间模式{keynum++;while(!key1); //松手检测}if(keynum==1) //s4按下一次{ TR0=0; //关闭定时器0write_com(0x81); //指针指向第1行2列write_com(0x0f); //开启光标显示,光标闪烁}if(keynum==2){write_com(0x86); //光标跳到月份}if(keynum==3){write_com(0x89); //光标跳到日}if(keynum==4){write_com(0x8c); //光标跳到星期}if(keynum==5){write_com(0xc4); //光标跳到时}if(keynum==6){write_com(0xc7); //光标跳到分}if(keynum==7){write_com(0xca); //光标跳到秒}if(keynum==8){ keynum=0; //退出调时间模式TR0=1; //开启定时器0write_com(0x0c); //关闭光标显示}}if(keynum) //当进入调时间模式时{if(key2==0) //s8按键按下{delayms(3); //去抖延时if(key2==0){if(keynum==1){nian++; //s8每按下一次年份加1if(nian==10000) // 加满清0nian=0;write_addate1(1,nian); // 显示年份write_com(0x81); //写完数据指针指向年份原来位置}if(keynum==2){yue++; //s8每按下一次月份加1if(yue==13)yue=0; //加满清0write_addate2(6,yue); //显示月份write_com(0x86); //写完数据指针指向月份原来位置}if(keynum==3){ ri++;if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12) //1,3,5,7,8,10,12月有31天if(ri==32)//加满还原ri=1;if(yue==4||yue==6||yue==9||yue==11) //4,6,9,11月有30天if(ri==31)ri=1;if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0)) //闰年2月有30天if(ri==30)ri=1;if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0)) //非闰年2月有31天if(ri==29)ri=1;write_addate2(9,ri); //显示日write_com(0x89); //写完数据指针指向日原来位置}if(keynum==4){week++;//s8每按下一次星期加1if(week==7)//加满还原week=0;write_rq(week); //显示星期write_com(0x8c); //写完数据指针指向星期原来位置}if(keynum==5){shi++;//s8每按下一次时加1if(shi==24)shi=0;//加满还原write_addate2(0x44,shi); //显示时write_com(0xc4); //写完数据指针指向时原来位置}if(keynum==6){fen++;//s8每按下一次分加1if(fen==60)fen=0;//加满还原write_addate2(0x47,fen); //显示分write_com(0xc7);//写完数据指针指向分原来位置}if(keynum==7){miao++;//s8每按下一次秒加1if(miao==60)miao=0;//加满还原write_addate2(0x4a,miao);//显示秒write_com(0xca);//写完数据指针指向秒原来位置}while(!key2); //松手检测}}if(key3==0){delayms(3);if(key3==0){ //s12按下时减1if(keynum==1){nian--;if(nian==-1)nian=9999;write_addate1(1,nian);write_com(0x81);}if(keynum==2){ yue--;if(yue==-1)yue=12;write_addate2(6,yue);write_com(0x86);}if(keynum==3){ri--;if(ri==0){if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)ri=31;if(yue==4||yue==6||yue==9||yue==11)ri=30;if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))ri=29;if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))ri=28;}write_addate2(9,ri);write_com(0x89);}if(keynum==4){week--;if(week==-1)week=6;write_rq(week);write_com(0x8c);}if(keynum==5){shi--;if(shi==-1)shi=23;write_addate2(0x44,shi);write_com(0xc4);}if(keynum==6){fen--;if(fen==-1)fen=59;write_addate2(0x47,fen);write_com(0xc7);}if(keynum==7){miao--;if(miao==-1)miao=59;write_addate2(0x4a,miao);write_com(0xca);}while(!key3); //松手检测}}}if(key4==0) //s16被按下进入调闹钟模式{ delayms(3);if(key4==0){keynum1++;while(!key4);}if(keynum1==1){ write_com(0x01); //清屏,指针清0write_com(0xc6); //在时分之间显示“:”write_date(':');write_com(0xc9); //在分秒之间显示“:”write_date(':');write_com(0x0f); //开启光标write_com(0xc4); //光标指向时}if(keynum1==2){write_com(0xc7);//光标指向分}if(keynum1==3){write_com(0xca); //光标指向秒}if(keynum1==4){ keynum1=0;write_com(0x0c); //关闭光标}}if(keynum1){if(key2==0) //s8按下加1{delayms(3);if(key2==0){if(keynum1==1){shi1++;if(shi1==24)shi1=0;write_addate2(0x44,shi1);write_com(0xc4);}if(keynum1==2){fen1++;if(fen1==60)fen1=0;write_addate2(0x47,fen1);write_com(0xc7);}if(keynum1==3){miao1++;if(miao1==60)miao1=0;write_addate2(0x4a,miao1);write_com(0xca);}while(!key2);}}if(key3==0) //s12每按一次减1{delayms(3);if(key3==0){if(keynum1==1){shi1--;if(shi1==-1)shi1=23;write_addate2(0x44,shi1);write_com(0xc4);}if(keynum1==2){fen1--;if(fen1==-1)fen1=59;write_addate2(0x47,fen1);write_com(0xc7);}if(keynum1==3){miao1--;if(miao1==-1)miao1=59;write_addate2(0x4a,miao1);write_com(0xca);}while(!key3);//松手检测}}}}void main(){ uchar num;init();for(num=0;num<15;num++){ write_date(table[num]);delayms(5);} //显示初始时间write_com(0xc0);for(num=0;num<12;num++){ write_date(table1[num]);delayms(5);}TR0=1; //开启定时器0while(1){ if(shi==shi1&&fen==fen1&&miao==miao1) //闹钟到了蜂鸣器响beep=0;keyscan(); //扫描键盘}}void time() interrupt 1 //中断函数{TH0=(65536-45872)/256;TL0=(65536-45872)%256; //进入中断装初值num1++;if(num1==20) //一秒到了{ num1=0; //清0miao++;if(miao==60) //一分到了{ miao=0; fen++; }if(!keynum1) write_addate2(0x4a,miao); //当调闹钟模式按下时不显示当前时间if(fen==60){ fen=0;shi++;}if(!keynum1) write_addate2(0x47,fen); //当调闹钟模式按下时不显示当前时间if(shi==24){shi=0;ri++;week++;}if(!keynum1) write_addate2(0x44,shi); //当调闹钟模式按下时不显示当前时间if(yue==1||yue==3||yue==5||yue==7||yue==8||yue==10||yue==12)if(ri==32){ ri=1; y ue++; }if(yue==4||yue==6||yue==9||yue==11)if(ri==31){ ri=1; yue++; }if(yue==2&&((nian%4==0&&nian%100!=0)||nian%400==0))if(ri==30){ ri=1; yue++; }if(yue==2&&(nian%4!=0)||(nian%100==0&&nian%400!=0))if(ri==29){ ri=1; yue++; }if(!keynum1) write_addate2(9,ri);//当调闹钟模式按下时不显示当前时间if(week==7)week=0;if(!keynum1)//当调闹钟模式按下时不显示当前时间{ write_com(0x8c);write_rq(week);}if(yue==13){ yue=0;nian++;}if(!keynum1)//当调闹钟模式按下时不显示当前时间{write_addate2(6,yue);write_com(0x88);write_date('-');}if(nian==10000)nian=0;if(!keynum1){ write_addate1(1,nian);//当调闹钟模式按下时不显示当前时间write_com(0x85);write_date('-');}}}。
基于单片机电子闹钟的设计电子闹钟是一种基于单片机技术的智能设备,可以通过设置闹钟时间来提醒人们起床、上班或者进行其他活动。
本文将介绍基于单片机的电子闹钟的设计过程和实现功能。
首先,我们选择一款适合作为控制核心的单片机芯片。
常用的单片机有51系列和AVR系列,其中51系列的代表性芯片是STC89C52,AVR系列的代表性芯片是ATmega16、我们可以根据具体需求选择适合的芯片。
其次,我们需要设计电子闹钟的硬件电路。
主要包括时钟电路、显示电路、按键输入电路和报警电路。
时钟电路通过晶体振荡器产生准确的时钟信号,显示电路通过数码管或液晶屏显示时间等信息,按键输入电路用来设置闹钟和调整时间,报警电路则用来发出可听到的声音提醒。
在硬件设计完成之后,我们还需要编写单片机的软件程序。
首先,我们需要初始化各个硬件模块,包括时钟模块、IO口模块和定时器模块等。
然后,我们需要编写定时中断函数,用来更新显示时间。
接下来,我们需要编写按键处理函数,用来设置闹钟和调整时间。
最后,我们需要编写报警函数,通过发出蜂鸣器的声音来提醒。
设计的基本功能包括:设置时间、设置闹钟、调整时间、调整闹钟、报警功能等。
用户可以通过按键输入来设置时间和闹钟,并且可以通过按键调整时间和闹钟的设置。
当闹钟时间到达时,蜂鸣器会发出声音提醒用户。
同时,数码管或液晶屏会显示当前的时间。
为了提高闹钟的实用性,我们还可以添加一些其他功能。
例如,可以加入温湿度传感器来测量当前的环境温度和湿度,并在数码管或液晶屏上显示。
还可以加入闹铃音乐的选择功能,让用户可以选择自己喜欢的音乐作为报警铃声。
总之,基于单片机的电子闹钟设计涉及到硬件电路设计和软件程序编写两个方面。
通过合理设计硬件电路和编写完善的软件程序,可以实现各种实用的功能。
电子闹钟可以帮助人们准时起床、上班或进行其他活动,提高人们的时间管理能力和生活质量。
基于at89c51单片机的定时闹钟的设计本文介绍了基于AT89C51单片机的定时闹钟的设计。
文章将探讨设计目的和背景,并着重阐述定时闹钟的实现原理和功能。
本文档将介绍基于at89c51单片机的定时闹钟的硬件设计要点,包括电源、显示器、按键等组件选择和连接方式。
电源选择与连接在设计定时闹钟的硬件方案时,选择合适的电源是非常重要的。
以下是一些电源选择和连接的要点:使用稳定可靠的电源模块,例如直流电源模块,以确保单片机工作的稳定性。
将电源模块的正负极连接到at89c51单片机的VCC和GND引脚上。
注意电源的电压和电流要符合at89c51单片机的工作要求。
显示器选择与连接显示器是定时闹钟中显示时间和其他信息的重要组件。
以下是一些显示器选择和连接的要点:考虑使用液晶显示器 (LCD) 或数码管作为显示器,这些显示器可以清晰地显示数字和字符。
根据设计需求,选择合适的显示器尺寸和类型。
将显示器的控制引脚与at89c51单片机的相应引脚连接,以实现时间和信息的显示。
按键选择与连接按键是控制定时闹钟设置和功能的重要组件。
以下是一些按键选择和连接的要点:选择合适的按键类型,例如触摸按键或机械按键。
根据设计需求,确定所需的按键数量和布局。
将按键的引脚连接到at89c51单片机的GPIO引脚,以接收按键输入并实现相应的功能。
上述是基于at89c51单片机的定时闹钟的硬件设计要点,通过合理选择和连接电源、显示器和按键等组件,可以确保定时闹钟的稳定运行和正常功能。
本文将阐述基于at89c51单片机的定时闹钟的软件设计要点,包括如下内容:定时器的设置:使用at89c51单片机的定时器来实现定时功能,可以通过对定时器寄存器的设置来调整定时的时间间隔。
中断处理:在定时器到达设定的时间间隔时,通过中断处理来触发相应的操作。
可以通过设定中断优先级来确保定时器中断的可靠性。
闹钟功能的实现:通过软件算法和控制电路,将定时器和中断处理结合起来实现闹钟功能。
电子设计综合实验“基于STC89C52单片机的二十四小时语音数字闹钟设计”项目设计报告11设计任务与要求语音数字闹钟功能包括:计时功能、显示时间功能、校准时间功能、整点报时功能、闹钟功能。
2 设计思路2.1芯片选取1.单片机的选择采用STC89C52主芯片。
STC89C52是STC公司生产的一种低功耗、高性能微控制器,可用软件编程实现各种逻辑功能。
本身自带定时器和计时器,工作电压3.3-5.5v和电路其他器件相适应,具有断电保护功能,和时钟保持时间不间断相匹配。
并且其功耗低,体积小,成本低,可直接用串口下载,较为便利。
2.显示方案的选择采用LCD1602液晶显示屏。
液晶显示屏的显示功能强大,可显示大量文字,显示多样,功能扩展能力强,可不局限于单一时间显示,例如可以扩展年月显示。
稳定抗干扰能力强,清晰可见,且价格适中,对于本设计一个LCD显示屏足够实现所需功能。
3.时钟模块的选择采用DS1302时钟芯片实现时钟。
DS1302芯片是一种高性能、低功耗的实时时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,功能满足本设计要求,而且精度高,工作电压2.5V~5.5V范围内,与实验整体电路相适应。
4.语音模块采用NV020C语音芯片。
性能稳定,抗干扰能力强,无需外围电路外接电阻,电路简单,控制方便,价格便宜。
工作电压与电路整体电压范围一致,满足整点语音报时的功能需求。
且可进一步功能扩展。
2.2系统设计方案概述该设计包括电源模块、显示模块、按键模块、复位电路模块、时钟模块、语音模块、主控模块、闹铃模块。
整个系统以STC89C52单片机为核心器件,配合电阻电容晶振等器件,构成单片机的最小系统,其它的模块围绕着单片机最小系统展开。
其中包括,显示设备使用LCD1602液晶,可以同时显示时、分、秒等基本时间信息;时钟模块采用DS1302芯片,初始化之后,就会开始运行计算时间,单片机只需进行时间信息的读取即可。
一概述1.1 课程设计的目的和意义本文是利用AT89C51单片机结合七段显示器设计一个简易的定时闹铃时钟,可以放在计算机教室或是实验室中使用,由于用七段显示器显示数据,在夜晚或黑暗的场合中也可以使用。
可以设置现在的时间及显示闹铃设置时间,若时间到则发出一分钟闹铃响。
本课程设计主要用到AT89C51单片机定时器时间计时处理、按键扫描及七段显示器扫描的设计方法等等。
闹钟与我们的日常生活密不可分,通过闹钟的设计可以使我们进一步熟悉和掌握单片机的内部结构和工作原理,掌握单片机仿真软件Proteus的使用方法。
1.2 课程设计所需元件AT89C51×1,8255A×1 ,7SEG-MPX6-CC×1,AVX0402NPO33P×2,CRYSTAL×1,3WATT10K ×3,BUTTON×3,10WATT1K×8,74LS00×1,SOUNDER×1,MINRES300R×1,SW-SPDT×1。
1.3 设计任务在熟练掌握单片机及其仿真系统的使用方法的基础上,综合应用单片机原理,微机原理,微机接口技术等专业知识,设计采用一个AT89C51单片机控制的定时闹钟。
二系统总体方案及硬件设计2.1总体设计框图该数字定时闹钟是由AT89C51单片机控制的,采用24小时制计时。
基于单片机的数字定时闹钟在设计时需要解决三个方面的主要问题:一是LED显示模块的驱动和编程,二是有关单片机中定时器的使用,三是如何利用单片机的外中断实现时钟功能和运行模式的转化。
数字定时闹钟系统框图如图一所示,包括主电路和显示电路两大部分。
2.2 主电路主电路图如图三所示。
该电路使用P3端口的P3.0端口线实现整点报时功能;同样使用P3端口的P3.0端口实现闹钟功能。
整点报时信号用SOUNDER来模拟。
当整点时,P3.0端口所接的SOUNDER闹一分钟。
电子闹钟的制作方法
1.选材:
制作电子闹钟所需要的材料和元件有:
-面包板或通用孔径板
-15V直流电源适配器
-蜂鸣器或发声器
-4位7段数码管
-MAX7219驱动芯片
-STC89C52单片机(或其他型号)
-按键开关
-LCD1602液晶显示屏(可选)
-电阻、电容等小零件
2.原理设计:
电子闹钟的原理一般包括时间计时、闹钟功能和显示功能。
其中,时间计时可以使用单片机的定时器进行精确计时;闹钟功能通过按键开关设置闹钟时间,并在到达设定时间时触发蜂鸣器或发声器发出响声;显示功能可采用数码管和/或液晶显示屏进行时间显示。
3.电路搭建:
根据原理设计,将元件插入面包板或通用孔径板上,并根据电路图进行连线。
主要的连线包括单片机和其他各个元件之间的引脚连接。
注意按键开关和蜂鸣器等组件的引脚方向,以保证正确的接线。
4.程序编写:
使用C语言或汇编语言等编程语言,编写单片机控制程序。
主要的编程任务包括:
-初始化单片机和其他硬件设备
-设置定时器进行时间计时
-通过按键开关设置闹钟时间
-监测时间并在设定时间到达时触发蜂鸣器或发声器发出闹钟声音
-控制数码管或液晶显示屏显示时间
5.装配调试:
总结:
通过以上步骤,我们可以制作一个简单的电子闹钟。
当然,如果希望增加更多的功能,比如温湿度显示、倒计时功能等,可以根据需求进行电路和程序的扩展。
单片机闹钟制作的原理
单片机闹钟是一种基于单片机的电子设备,通过编程控制显示时钟时间并发出声音,用于提醒人们起床或做其他时间相关的活动。
单片机闹钟的原理主要包括以下几个步骤:
1. 时钟显示:单片机连接数码管或液晶显示屏,通过编程控制显示当前时间。
单片机内部有时钟源,可以获取时钟信号进行计时操作。
2. 时钟控制:通过编程设置时钟的时间,包括小时和分钟。
单片机可以通过按键或外部输入信号进行时间调整。
3. 闹钟设置:通过编程设置闹钟的时间,包括小时和分钟。
单片机与按键或外部输入信号连接,并进行判断是否到达闹钟时间。
4. 声音发出:当闹钟时间到达时,单片机通过输出端口控制蜂鸣器或扬声器发出声音进行提醒。
5. 电源管理:单片机需要外部供电,通常是通过电池或交流电适配器。
单片机可以进行电源管理,包括低功耗模式和电池电量检测等功能。
综上所述,单片机闹钟通过单片机对时间和闹钟进行控制,并通过显示屏和声音模块与人进行交互,实现了计时和提醒功能。
课程名称:单片机原理与接口技术实践
设计课题:基于MCS 51单片机实现电子闹钟功能(de)设计
学院:电子与信息工程学院
专业:通信工程
小组成员:
电子闹钟在科学技术高度发展(de)今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用.本文给出了一种基于MCS51单片机实现电子闹钟功能(de)设计方法,从而给人们带来更为方便(de)工作与生活.
一.电子闹钟简介
我们设计(de)电子闹钟是以MCS 51单片机中(de)计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置(de)时间点发出闹铃.
简易闹钟具有以下功能:
1.时钟能准确地走时,并可以通过数码管进行显示
2.复位后可以进行当前时间(de)设置
3.可以随意设置闹钟时间,闹钟会在设置时间响铃
整个系统(de)任务要求:
1)输入数字按键(de)功能.
保证数字(de)输入.
2)复位电路(de)功能.
所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);
3)显示电路(de)功能.
当输入数字时显示24小时时间功能.
4)闹铃功能
设置闹铃(de)时间后.能按设置好(de)时间准时闹铃.
二.系统方案(de)设计要求
根据以上各模块并结合显示屏(de)功能及元器件材料(de)情况,决定采用AT89C51为内核显示设计方案.
先进行系统(de)整体规划确定整个系统(de)功能,然后按照每个功能(de)具体要求,进行各个模块(de)实物设计并逐个调试,待全部通过后,进行整个系统(de)联调,最终实现一个完整(de)系统.
整个系统(de)设计步骤如下:
在单片机最小系统(de)基础上,完成按键电路和复位电路(de)设计.
完成显示电路、数字按键、单片机时钟电路.
Ⅰ硬件设计
系统硬件(de)设计可以根据系统(de)各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能(de)调度.
本系统涉及到(de)硬件模块有:按键电路、数码管显示电路、单片机时钟电路、蜂鸣器电路.
各部分实现功能如下:
按键电路:提供按键信号.
单片机时钟电路、复位电路:提供内部时钟.
数码管驱动显示电路:显示当前时间.
蜂鸣器电路:闹钟报时.
Ⅱ软件设计
本系统(de)软件部分主要完成功能:时分秒(de)进位算法处理、数码管(de)时间显示、时间调整设置、闹钟功能.
根据软件(de)功能划分软件设计模块结构,如下所示
其中各个模块具体任务如下:
按键驱动模块:对各个按键(de)功能进行相关(de)定义.
LED驱动模块:根据系统需要显示相应(de)数字时间;
时间处理模块:时、分、秒(de)进位算法处理
三.系统硬件电路(de)设计
1根据确定(de)硬件方案设计硬件框图,如下图所示:
2系统原理图(de)设计
系统总(de)硬件电路如下图所示
实际要用到5个按键,受空间限制仿真电路中只画出4个.
单片机管脚资源分配:
P0口为数码管段选信号输出口.
P3口为数码管位选信号输出口.
、、、、为键盘(de)输入信号.
为蜂鸣器信号(de)输出口.
下面分别介绍各个电路.
(1)数码管驱动及显示电路
本设计采用8位7段共阳极数码管用来显示时间.为了将时间在LED数码管上显示可采用动态显示法.通过对每位数码管(de)依次扫描,使对应数码管亮;同时向该数码管送对应(de)字码使其显示数字.由于数码管扫描周期很短,而且人眼有视觉暂留效应,所以数码管看起来总是亮(de)从而实现了数字(de)同时显示.
数码管主要包括位选和段选信号线.位选是用来选通数码管(de),只有位选信号有效该数码管才会亮并显示要现实(de)数字;段选是选择数码管7段(de)那一笔亮,从而显示不同(de)数字.
本设计中单片机P0口输出段选数据,P3口输出位选数据.
数码管与单片机相连(de)电路如下图所示:
电路中使用了芯片74ls245,该芯片用来驱动LED.其片选引脚要接地,使其一致为低电平,芯片一直可以工作.
(2)晶振电路
晶体以及电容C1、C2构成并联谐振电路,接在放大器(de)反馈回路中构成内
部单片机内部时钟.晶体可在之间任选,电容C1、C2(de)典型值为通常选择为30pF左右,这时对应(de)始终频率为12MHz.
单片机内部晶振电路图及连接电路如下:
(3)按键电路
本设计采用行列式按键电路,它由行线和列线组称成,按键位于行列(de)交叉点.一个44(de)行列结构可以构成一个16个按键(de)键盘,如下图所示.在按键数目较多(de)场合,行列式按键可以节省
很多(de)I/O口线.
按键(de)识别是通过扫描来实现(de).
单片机会依次扫描每一行和每一列,通过行
线和列线(de)电平高低即可判断哪个按键被
按下.
本设计中用到四个按键,、、、、,分别用于时间校准设置、定闹设置、秒分时切换、加1调整、减1调整.
按
键
与
单
片
机
相
连
电
路
如
下:由原理图可以明显看出,当按键未被按下时,对应引脚为高电平;按键被按下时为低电平.通过扫描即可辨别哪一个按键被按下.
本题画出(de)虽然是独立按键,但是内部驱动依然是行列式按键(de)驱动,这里只是为了画图方便.
(4)复位电路
当按下复位键时单片机进入复位状态,可以进行时间(de)设置等.
电路图如下所示:
四.系统软件部分(de)设计
本设计(de)软件系统用来配合硬件电路实现特定(de)功能.程序主要包含键盘扫描模块、时间处理模块、和数码管显示程序3大部分.
程序大致流程如下:
1.时间处理模块
单片机晶振频率为12MHz,一个机器周期等于12个振荡脉冲周期,因此机器时序频率是振荡频率(de)1/12,即1MHz,所以一个机器周期为1μs.
本设计用(de)是计时器0(de)方式1,对于方式1,计数个数M与计数初值N(de)关系为 M=2^16 –N,定时时间t与计数个数M和初值N(de)关系为 t = M 机器周期 =(2^16-N)时钟周期12.
计时过程中,秒sec等于60时清零,分min加一;分min等于60时清零,小时hour 加一;当小时大于24时,置为0.
时分秒(de)进位算法代码如下:
void timecontrol()
{
sec++;
if(sec==60) 码管显示模块
本设计中以P0口作为数码管(de)段选输出,P3口为位选信号输出.
由于所用数码管为共阳极连接,所以要点亮(de)数码管位选端为高电平1.
位选信号(de)I/O口声明
include<>
define uchar unsigned char
define uint unsigned int
sbit s1=P3^0; 盘扫描模块
首先要声明各个按键(de)功能以及对应(de)I/O口,然后驱动程序将对按键进行扫描以识别被按下(de)键.
按键对应I/O口声明
/k1设置时间,k2定时,k3时分秒选择,k4加数字,k5减数字./
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
sbit k5=P1^4;
键盘扫描以进行时间设置
void keyscan_settime() 他程序
(1)delay延时函数
void delayms(uint k) 结
通过本次课程设计,无论是从软件方面还是硬件方面我们都进一步学习和
巩固了程序(de)总体设计.在软件方面,进一步熟悉了各条指令(de)用法及功能,更加深刻地理解了定时器(de)原理.本次课程设计还让我们进一步熟悉了开发仿真软件keil、proteus等.编程、调试、仿真、运行每一步都是各种意想不到(de)问题,每次都会发现好多没有考虑到(de)方面,导致程序出现各种错误,有时这真(de)很让人烦,但是经过努力,最后问题解决时会有一种快乐和成就感.只有自己亲手去操作,才能把学到(de)知识真正变成自己(de).。