西华大学单片机课程设计之基于单片机与DS1302的数字闹钟_第1页
西华大学单片机课程设计之基于单片机与DS1302的数字闹钟_第2页
西华大学单片机课程设计之基于单片机与DS1302的数字闹钟_第3页
西华大学单片机课程设计之基于单片机与DS1302的数字闹钟_第4页
西华大学单片机课程设计之基于单片机与DS1302的数字闹钟_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、课程设计说明书 课 程 名 称: 单片机应用课程设计 课 程 代 码: 6003509 题 目: 数字闹钟的设计 学 生 姓 名: 学 号: 312011080307 年级/专业/班: 2011级机电2班 学院(直属系) : 机械工程与自动化学院 指 导 教 师: 张恕远 数字闹钟的设计摘要电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。本文对当前电子钟开发手段进行了比较

2、和分析,最终确定了采用单片机技术实现多功能电子时钟。本设计应用at89c52芯片作为核心,lcd1062进行显示,使用ds1302实时时钟日历芯片完成时钟/日历的基本功能。这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。关键词:电子时钟;多功能;at89c52;时钟日历目 录摘要i1、设计任务、目的、思路12、总体设计方案23、电路原理的设计33.1        

3、60;  ds1302原理及电路33.2           晶振电路33.3           复位电路原理及电路43.4        lcd1602原理及电路43.5         

4、0; ds18b20电路53.6           按键电路及功能53.7           蜂鸣器电路64、软件系统设计74.1          系统工作流程图74.2           软件系统构成

5、85、系统调试与结果96、课程设计体会107、参考文献11附录: 程序代码121、设计任务、目的、思路(1)任务用lcd显示出月、日、分、星期和温度,三四个按键可对时间进行校正,并能实现闹钟功能。(2)目的1、掌握电子时钟的基本工作方式。2、进一步熟悉ds1302及ds18b20芯片的特性。3、通过使用各基本指令,进一步熟练掌握单片机的编程和程序调试。(3)思路利用at89c52的特点及ds1302的特点,设计一种基于ds1302单片机控制,再利用lcd显示的数字钟。本系统硬件利用at89s52作为cpu进行总体控制,通过ds1302时钟芯片获取准确详细的时间(年、月、日、周、日、时、分、秒准

6、确时间),对时钟信号进行控制,同时利用液晶显示芯片lcd1602对时间进行准确显示年、月、日、周、日、时、分、秒。2、总体设计方案lcd1602液晶显示模块ds1302时钟模块at89c52单片机按键模块蜂鸣器模块晶振电路18b20温度模块复位电路根据系统设计的要求和设计思路,确定该系统的系统设计结构图。如图所示。硬件电路主要由at89c52单片机控制器单元、ds1302时钟电路、复位电路、ds18b20温度模块、按键模块、晶振电路、蜂鸣器模块、lcd1602液晶显示模块等构成。3、电路原理的设计3.1 ds1302原理及电路如下所示本设计使用的实时时钟电路芯片是美国dallas公司生产的一种

7、高性能、低功耗、带ram的实时时钟电路芯片ds1302。vcc1为后备电源,vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。ds1302由vcc1或vcc2两者中的较大 者供电;当vcc2大于vcc10.2v时,vcc2给ds1302供电;当vcc2小于vcc1时,ds1302由vcc1供电。x1和x2是振荡源,外接32.768khz晶振。rst非是复位/片选线,通过把rst非输 入驱动置高电平来启动所有的数据传送。图3.1-1图3.1-23.2 晶振电路如下at89s52在工作时需要外部提供时钟信号,因此,本设计选择在其18脚19脚之间接上12mhz的晶振,为单片机提供1s的

8、机器振荡周期。其电路连接图如图所示。在图中,电容器c3、c4起稳定振荡频率、快速起振的作用,其电容值一般在2050pf。图3.23.3 复位电路原理及电路如下在at89c52单片机中的振荡器运行时,rst非引脚上保持到少2个机器周期的高电平输入信号,复位过程即可完成。根据此原理,本设计采用上电复位和按键复位嵌套在系统中,增强了系统的实用性。图3.33.4 lcd1602原理及电路如下lcd1602液晶显示是一种专门用来显示字母、数字、符号等的点阵型液晶模块。它由若干个5x7或者5x11等点阵字符位组成,每个点阵字符位都可以显示一个字符,每位之间有一个点距的间隔,每行之间也有间隔,起到了字符间距

9、和行间距的作用,正因为如此所以它不能很好地显示图形(用自定义cgram,显示效果也不好)。1602lcd是指显示的内容为16x2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在各种小系统中得到了更广泛的应用。本设计中使用的液晶显示模块是lcd1602。图3.43.5 ds18b20电路如下ds18b20,常用的温度传感器,具有体积小,硬件开销低,抗干扰能力强,精度高的特点。图3.53.6 按键电路如下图3.6按键功能说明:key0为时钟调节功能键,第一次按key0时,时间停止且光标在年处闪烁。第二次按key0时,光标在月处闪烁

10、。第三次按key0时,光标在日处闪烁。第四次按key0时,光标在星期处闪烁。第五次按key0时,光标在时处闪烁。第六次按key0时,光标在日处闪烁。第七次按key0时,光标在秒处闪烁。光标闪烁时可用key1增加相应的值或key2减少相应的值。第八次按key0时,保存了修改的时间值并返回显示时间。key3为闹钟功能键。第一次按key3时,进入闹钟设置页面,光标在闹钟开关处闪烁。第二次按key3时,光标在分处闪烁。第三次按key3时,光标在时处闪烁。光标闪烁时,同样可以用key1与key2修改相应的值。当闹钟响起时,1分钟后自动关闭。3.7 蜂鸣器电路如下图3.74、软件系统设计4.1、系统工作流

11、程图开始时间及lcd初始化键盘是否按下 y 设置时间(向ds1302写入)读取ds1302时间 nlcd显示时间蜂鸣器响闹钟是否开起及闹钟时间是否到 y 图4.1系统工作流程图4.2软件系统构成 软件系统包含引脚定义及变量申明、lcd显示部分、ds1302部分、键盘扫描部分、ds18b20温度部分、主函数等等。 lcd部分对不变的显示部分进行lcd初始化,将需要变化的部分分开显示,如将年、月、日、星期显示在第一行,将时、分、秒、温度、闹钟设置显示在第二行。 ds1302对将要显示的时间送入lcd进行显示,以及对调整后的时间进行接收存储计算及送入lcd重新显示。 键盘扫描部分对键盘进行扫描,修改

12、时间时按键使数据的改变而送入ds1302进行时间的修改,以及闹钟时间的修改。 ds18b20部分对硬件采集到的环境温度进行数据转换并送入lcd显示。5、系统调试与结果系统调试过程利用proteus绘制出相应硬件电路后进行仿真,出现液晶显示无法正常显示的问题。经过思考和查阅的资料发现at89c52的p0在进高电平时没有接上拉电阻导致lcd1602无法正常显示时间。修改电路后(p0口接上拉电阻)烧入程序后,程序正常运行,lcd1602准确的显示。用proteus仿真能够正确的现实时间,但烧入学习板出现乱码现实不能正常工作。经过反复检查及思考发现仿真软件上的硬件电路与学习板上的硬件电路不一致无法对应

13、起来。最后根据学习板的硬件电路修改相应程序及仿真软件上的硬件电路,最终现实了功能。系统调试结果:图5.16、课程设计体会本设计利用单片机at89c512控制串行实时时钟芯ds1302构成数字时钟电路,实现计时功能。该电路使用简单的三线接口,为单片机节省大量的接口资源,时钟芯片带有后备电池。该时钟功能强大,性能优越,能为很多领域,特别是对时钟工作的准确性和可靠性有较高要求。通过对电子时钟的设计的设计与制作,让我了解了电子时钟模块的编程思想,也让我明白了电子时钟的基本原理与设计理念,要设计一个电路必须先编好程序,用仿真软件测试成功后再得出结论。通过这次学习,让我对该软件有了更熟悉的了解,我们应该自

14、己动手,实际操作,才会有更深刻的理解。7、参考文献1 黄惟公单片机原理与应用技术:西安电子科大出版社20072 张毅刚mc-51单片机应用设计(二版):哈工大出版社 20053 宋戈. 黄鹤松. 51单片机应用开发范例大全:人民邮电出版社 20104 刘建清. 51单片机新颖实例非常入门与视频演练:电子工业出版社20125 郭天祥. 新概念51单片机c语言教程:电子工业出版社 2009附录:程序代码:#include<reg52.h>#define uchar unsigned char#define uint unsigned int/*-引脚定义-*/sbit rst=p35;

15、 /ds1302片选sbit dio=p34; /ds1302数据信号sbit sclk=p36; /ds1302时钟信号sbit acc7=acc7;sbit acc0=acc0;sbit lcd_e=p27; /液晶使能端sbit lcd_rs=p26; /液晶数据命令选择端sbit lcd_rw=p25; /液晶读写选择端sbit key0=p10; /功能键sbit key1=p11; /增大键sbit key2=p12; /减小键sbit key3=p13;/闹钟调节按键sbit beep=p33;/蜂鸣器sbit dq=p37; /18b20温度输入输出端 void initial

16、_1302(); /初始化1302uchar read_1302(uchar addr); /读1302 void write_1302(uchar addr,uchar date);/写1302uint temp;/定义整型的温度数据float f_temp; /定义浮点型的温度数据char hour,minute,second,week,day,month,year,tem;unsigned char num,num1,flag;bit alarmon,alarmoff;uchar xx,yy;unsigned char clkhh=0,clkmm=0,clkflag,clkvalue;u

17、nsigned char str1="20 - - "unsigned char str2=" : : . c "unsigned char str3="alarm : "void delay(uchar z);/延时函数void lcd_write_com(uchar com);/lcd写函数void lcd_write_data(uchar date);/lcd写数据void lcd_write_sfm(uchar addr,uchar date);/lcd写时分秒void lcd_write_nyr(uchar addr,uch

18、ar date);/lcd写年月日void lcd_write_week(uchar week);/lcd写星期void lcd_initial();/lcd初始化void lcd_write_temp(uchar addr,uchar temp);/lcd写温度void keyscan();/键盘扫描void dis_temp(uint t);void tempchange(void);void tempwritebyte(uchar dat);uchar tempread(void);bit tempreadbit(void);void dsreset(void);uint get_tem

19、p();/获取温度/*主函数*/ void main() lcd_initial(); /液晶初始化 initial_1302(); /ds1302初始化 dsreset(); while(1) keyscan(); /按键扫描if(flag=0) /当标志位为0,允许读取ds1302数据,将数据送入液晶显示 second=read_1302(0x81); lcd_write_sfm(6,second); minute=read_1302(0x83); lcd_write_sfm(3,minute); hour=read_1302(0x85); lcd_write_sfm(0,hour); w

20、eek=read_1302(0x8b); lcd_write_week(week); day=read_1302(0x87); lcd_write_nyr(8,day); month=read_1302(0x89); lcd_write_nyr(5,month); year=read_1302(0x8d); lcd_write_nyr(2,year); tempchange(); dis_temp(get_temp(); /*lcd1602*/void delay(uchar z) /1602de延时函数 unsigned char x,y; for(x=z;x>0;x-) for(y=

21、110;y>0;y-);void lcd_write_com(uchar com) /1602写函数 lcd_rs=0; lcd_rw=0; lcd_e=1; p0=com; delay(5); lcd_e=0;void lcd_write_data(uchar date) /1602写数据 lcd_rs=1; lcd_rw=0; lcd_e=1; p0=date; delay(5); lcd_e=0;void lcd_write_sfm(uchar addr,uchar date) /lcd写时分秒 unsigned char shi,ge; shi=date/10; ge=date%

22、10; lcd_write_com(0x80+0x40+addr); lcd_write_data(0x30+shi); lcd_write_data(0x30+ge); void lcd_write_nyr(unsigned char addr,unsigned char date)/lcd写年月日 char shi,ge; shi=date/10; ge=date%10; lcd_write_com(0x80+addr); lcd_write_data(0x30+shi); lcd_write_data(0x30+ge);void lcd_write_clk(unsigned char a

23、ddr,unsigned char date)/lcd写闹钟 char shi,ge; shi=date/10; ge=date%10; lcd_write_com(0x80+0x40+addr); lcd_write_data(0x30+shi); lcd_write_data(0x30+ge);void lcd_write_week(uchar week)/lcd写星期 lcd_write_com(0x80+11); switch(week) case 1: lcd_write_data('s');delay(5); lcd_write_data('u');

24、delay(5); lcd_write_data('n');break; case 2: lcd_write_data('m');delay(5); lcd_write_data('o');delay(5); lcd_write_data('n');break; case 3: lcd_write_data('t');delay(5); lcd_write_data('u');delay(5); lcd_write_data('e');break; case 4: lcd_write

25、_data('w');delay(5); lcd_write_data('e');delay(5); lcd_write_data('d');break; case 5: lcd_write_data('t');delay(5); lcd_write_data('h');delay(5); lcd_write_data('u');break; case 6: lcd_write_data('f');delay(5); lcd_write_data('r');delay

26、(5); lcd_write_data('i');break; case 7: lcd_write_data('s');delay(5); lcd_write_data('a');delay(5); lcd_write_data('t');break; void lcd_write_temp(uchar addr,uchar temp)/lcd写温度 lcd_write_com(0x80+0x40+addr); lcd_write_data(0x30+temp);void clk_initial(uchar addr,uchar

27、clknum)/闹钟初始化uchar i;char shi,ge; shi=clknum/10; ge=clknum%10;lcd_write_com(0x38); lcd_write_com(0x0c); lcd_write_com(0x06);lcd_write_com(0x80);lcd_write_com(0x80+0x40);/液晶第二行显示for(i=0;i<16;i+) lcd_write_data(str3i); delay(5);lcd_write_com(0x80+0x40+addr);lcd_write_data(shi/10+0x30);lcd_write_dat

28、a(ge%10+0x30);void lcd_initial()/lcd初始化 unsigned char i;lcd_write_com(0x38); lcd_write_com(0x0c); lcd_write_com(0x06);lcd_write_com(0x80);for(i=0;i<16;i+)/液晶第一行显示 lcd_write_data(str1i); delay(5);lcd_write_com(0x80+0x40);/液晶第二行显示for(i=0;i<16;i+) lcd_write_data(str2i); delay(5);/*1302*/void writ

29、e_1302(uchar addr,uchar date)/向1302写数据 unsigned char i; rst=0; sclk=0; rst=1; for(i=8;i>0;i-) sclk=0; acc=addr; dio=acc0; addr>>=1; sclk=1; for(i=8;i>0;i-) sclk=0; acc=date; dio=acc0; date>>=1; sclk=1; rst=0;unsigned char read_1302(unsigned char addr)/从1302读数据 unsigned char i,date1

30、,date2; rst=0; sclk=0; rst=1; for(i=8;i>0;i-) sclk=0; acc=addr; dio=acc0; addr>>=1; sclk=1; for(i=8;i>0;i-) acc7=dio; sclk=1; acc>>=1; sclk=0; rst=0; date1=acc; date2=date1/16; date1=date1%16; date1=date1+date2*10; return(date1) ;void initial_1302()/初始化1302 write_1302(0x80,read_130

31、2(0x81)&0x7f); /启动ds1302 0x80写秒地址/*键盘扫描部分*/void keyscan() if(key0=0)/确认功能键按下 delay(20); if(key0=0)/去抖 while(!key0);/释放 num+; switch(num) case 1: flag=1; /修改时间,禁止从ds1302读数据 lcd_write_com(0x0f); /光标开始闪烁 lcd_write_com(0x80+3);/第一次按下,光标定位到年位置 break; case 2: lcd_write_com(0x80+6);/第二次按下,光标定位到月位置 brea

32、k; case 3: lcd_write_com(0x80+9);/第三次按下,光标定位到日位置 break; case 4: lcd_write_com(0x80+13);/第四次按下,光标定位到星期位置 break; case 5: lcd_write_com(0x80+0x40+1);/第五次按下,光标定位到时位置 break; case 6: lcd_write_com(0x80+0x40+4);/第六次按下,光标定位到分位置 break; case 7:lcd_write_com(0x80+0x40+7);/第七次按下,光标定位到秒位 break; case 8: num=0;/第八

33、次按下,记录清零 lcd_write_com(0x0c);/不显示光标 write_1302(0x8e,0x00); /允许写操作 0x8e写保护 write_1302(0x80,(second/10*16)+second%10);/将调节后的秒写入ds1302 write_1302(0x82,(minute/10*16)+minute%10);/将调节后的分写入ds1302 write_1302(0x84,(hour/10*16)+hour%10);/将调节后的时写入ds1302 write_1302(0x8a,(week/10*16)+week%10);/将调节后的星期写入ds1302 w

34、rite_1302(0x86,(day/10*16)+day%10);/将调节后的日写入ds1302 write_1302(0x88,(month/10*16)+month%10);/将调节后的月写入ds1302 write_1302(0x8c,(year/10*16)+year%10);/将调节后的年写入ds1302 write_1302(0x8e,0x80); /开写保护 flag=0; /时间修改完毕,允许液晶从ds1302读数据 break; if(num!=0) if(key1=0)/确认增大键按下 delay(20); if(key1=0)/增大键确实按下 while(!key1)

35、;switch(num) case 1:year+;/调节年 if(year=100)year=0; lcd_write_nyr(2,year);/将调节后的年送入液晶显示 lcd_write_com(0x80+3);/光标回到指定处break; case 2: month+;/调节月 if(month=13)month=0; lcd_write_nyr(5,month);/将调节后的月送入液晶显示 lcd_write_com(0x80+6);/光标回到指定处break; case 3: day+;/调节日 if(day=32)day=0; lcd_write_nyr(8,day);/将调节后

36、的日送入液晶显示 lcd_write_com(0x80+9);/光标回到指定处 break; case 4: week+; if(week=8)week=0; lcd_write_week(week);/将调节后的星期送入液晶显示 lcd_write_com(0x80+13);/光标回到指定处 break; case 5: hour+; if(hour=24)hour=0; lcd_write_sfm(0,hour);/将调节后的小时送入液晶显示 lcd_write_com(0x80+0x40+1);/光标回到指定处 break; case 6: minute+; if(minute=60)m

37、inute=0; lcd_write_sfm(3,minute);/将调节后的分送入液晶显示 lcd_write_com(0x80+0x40+4);/光标回到指定处 break; case 7: second+; if(second=60)second=0; lcd_write_sfm(6,second);/将调节后的秒送入液晶显示 lcd_write_com(0x80+0x40+7);/光标回到指定处 break;default:break; if(key2=0)/确认减小键按下 delay(20); if(key2=0)/减小键确实按下 while(!key2);switch(num) c

38、ase 1: year-;/调节年 if(year=-1)year=99; lcd_write_nyr(2,year); lcd_write_com(0x80+3); break; case 2: month-;/调节月 if(month=-1)month=12; lcd_write_nyr(5,month); lcd_write_com(0x80+6); break; case 3: day-;/调节日 if(day=-1)day=31; lcd_write_nyr(8,day); lcd_write_com(0x80+9); break; case 4: week-;/调节星期 if(we

39、ek=0)week=7; lcd_write_week(week); lcd_write_com(0x80+13); break; case 5: hour-;/调节时 if(hour=-1)hour=23; lcd_write_sfm(0,hour); lcd_write_com(0x80+0x40+1); break; case 6: minute-;/调节分 if(minute=-1)minute=59; lcd_write_sfm(3,minute); lcd_write_com(0x80+0x40+4); break; case 7: second-;/调节秒 if(second=-

40、1)second=59; lcd_write_sfm(6,second); lcd_write_com(0x80+0x40+7); break; default:break; /*闹钟部分*/ if(key3=0)/闹钟调节键delay(20);if(key3=0)while(!key3);num1+; switch(num1) case 1: clk_initial(6,clkhh); clk_initial(9,clkmm); flag=1; lcd_write_com(0x0f); /光标开始闪烁 lcd_write_com(0x80+0x40+12);/第一次按/下,光标定位到闹钟开关

41、位置 break; case 2: lcd_write_com(0x80+0x40+10);/第二次按下,/光标定位到闹钟分钟位置 break; case 3: lcd_write_com(0x80+0x40+7);/第二次按下,/光标定位到闹钟分钟位置 break; case 4: num1=0; lcd_write_com(0x0c); lcd_initial(); flag=0; break; if(num1!=0) if(key1=0)/确认增大键按下 delay(20); if(key1=0)/增大键确实按下 while(!key1);switch(num1)case 1: clkf

42、lag+; switch(clkflag) case 1:clkvalue=1; lcd_write_data('o'); lcd_write_data('n'); lcd_write_data(' ');lcd_write_com(0x80+0x40+12);break; case 2:clkvalue=0; clkflag=0;lcd_write_data('o');lcd_write_data('f');lcd_write_data('f');lcd_write_com(0x80+0x40+12);break; ;break;case 3: clkhh+;if(clkhh=24)clkhh=0;lcd_write_clk(6,clkhh);lcd_write_com(0x80+0x40+7);/光标回到指定处break; case 2: clkmm+;if(clkmm=60)clkmm=0;lcd_write_clk(9,clkmm);lcd_write_com(0x80+0x40+10);/光标回到指定处break; default:break;

温馨提示

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

评论

0/150

提交评论