1、目 录一、设计内容及要求3 二、 设计方案 3 三、硬件系统设计 4 四、软件系统设计7 五、系统调试 9 六、结论 10 参考文献 附录一 (原理图、线路板图) 附录二 (代码清单,包含注释)七、教师评语 11 一、 设计内容及要求(1)、基于单片机的C语言为基础进行软件设计,通过1602液晶为载体来显示数据,设计一个电子万年历;(2)、要求可以实现年,月,日,周,时,分,秒的显示及调节(3)、可以进行闹钟设置。二、设计方案(1)、单片机芯片的选择方案一、采用AT89S52,片内ROM全都采用Flash ROM:能以3V的超低电压工作;同时也与MCS-51系列单片机以该芯片内部存储器为8Kb
2、 ROM存储空间同样具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入功能时,不需对芯片进行多次拔插,所以不会对芯片造成损坏。方案二、采用89C51作为硬件核心,采用Flash ROM,内部具有4Kb ROM存储空间,而且与CMS-51系列单片机兼容。但是不具备ISP在线编程技术,当对电路调试时,由于程序的错误修改或对程序的新增功能需要烧入功能时,对芯片的多次拔插会造成芯片的损坏。所以选择了AT89S52作为主控制系统。(2)、显示模块的选择方案一、采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示文字,图形,显示多样,清晰可
3、见,而其体积较小,使用方便,可以使电路更加简洁,所以选择了液晶显示器。应实习要求选择LCD1602液晶即可。方案二、采用点阵式数码管显示,点阵式数码管是有八行八列的发光二极管组成,对于显示文字比较合适,如采用显示数字有些太浪费,而且费用也较高。所以选用LCD1602液晶显示。(3)、时钟芯片的选择 方案一、采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对时,分,秒,日,周,月,年进行计数,而其精度高工作电压2.5V5.5V范围内,2.5V时耗电小于300nA。方案二、直接采用单片机定时计数器提供秒信号,程序来实现年月日周时分秒计数,采用此种设计虽然减少了芯片的
4、使用,成本低.但是实现时间误差较大。所以选择了DS1302时钟芯片。总结上述: 方案的选定:采用AT89S52作为主控制系统;LCD1602液晶显示器作为显示设备;DS1302作为提供时钟电路。三、硬件系统设计(1)、系统硬件概述本电路是由AT89S52单片机为控制核心,具有在线编程功能,低功耗,能在3V超低电压工作,时钟电路由DS1302提供,它是一种高性能,低功耗,带RAM的实时时钟电路,它可以对年月周日时分秒进行计时,工作电压为2.2V5.5V。采用三线接口和CPU进行同步通信,并可采用突发方式一次传送多字节的时钟信号或RAM数据。DS1302内部有一个31*8的用于临时存放数据的RAM
5、寄存器。可产生年月日周时分秒,具有使用寿命长,精度高和低功耗等特点。同时具有掉电保存功能。显示部分由LCD1602来实现。(2)、电路设计框图(3)、主要电路模块设计1、单片机主控制模块AT89S52单片机为40引脚双列直插芯片,有4个I/O口P0 P1 P2 P3,MCS-51单片机共有4个8位的I/O口(P0 P1 P2 P3),每一条I/O线都能做独立的输入或输出。单片机的最小系统如图所示(见附录一),18引脚和19引脚接时钟电路,XTAL1接外部晶振和微调电容的一端,在片内它是振荡器倒向放大器的输入,XTAL2接外部晶振和微调电容的另一端,在片内它是振荡器倒向放大器的输出,第九引脚为复
6、位输入端,接上电容,电阻及开关后能够构成复位上电电路,20引脚为接地端,40引脚为电源端。2、时钟电路模块如图所示DS1302的引脚排列及其与单片机的连接图(见附录一),其中VCC1为电池,VCC2为主电源,在主电源关闭的情况下,也能保证时钟的连续运行。DS1302由VCC1或VCC2中较大的提供电源,当VCC2大于VCC1+0.2V时,VCC2给DS1302供电,当VCC2小于VCC1时,DS1302由VCC1供电。X1和X2是震荡源,外接32.768KHZ的晶振。RST是复位/片选线,通过把RST输入驱动置高平来启动所有数据传输。当RST为高电平时,所有数据传输被初始化,允许对DS1302
7、进行操作。如果RST被置低电平,则会终止此次数据传输,I/O变为高阻态。上电时当VCC大于等于2.5V前,RST必须保持低电平。I/O为串行数据输入端(双向)。SCLK始终是输入端。3、显示模块显示模块是一个十分重要的模块,它使人们读时间更加直观,在连接的时候需要进行很多的考虑,第三个引脚是亮暗调节引脚,可以接个可调电阻,显示模块的各个引脚连接:单片机的P1.0P1.7分别驱动液晶的AD0到AD7口:单片机的P2.5P2.6P2.7分别接1602的RS、RW、EN口,Vcc接高电平,Vss接地。(1602连接图见附录一)4、控制模块(键盘扫苗) 如果万年历长时间使用或其它情况下导致时间复位,就
8、需要重新来设定时间,这时候就需要用键盘来实现调节,按键功能:S1:功能切换键;S2加键;S3减键;S4:闹钟调节;S5:闹钟停止响铃;四、 软件系统设计开始flag=3flag=2flag=1功能键按下 进入日调整功能键按下 进入月调整时+1时-1分+1分-1减键k1加键k1等待按键功能键按下 进入时调整减键k2加键k1等待按键功能键按下 进入分调整flag=4flag=1flag=1功能键按下 跳出时间调整程序 执行主程序星期+1星期-1减键k2加键k1等待按键功能键按下 进入星期调整年+1年-1减键k2加键k1等待按键功能键按下 进入年调整日+1日-1减键k2加键k1等待按键月+1月-1减
9、键k2加键k1等待按键(程序见附录二)五、 系统调试电子万年历电路系统虽然简单,但在调试过程中,还是会从硬件和软件这些方面找到一些值得注意的问题,它们对系统能正常工作产生了非常重要的影响,回想这些问题大部分都是可以避免的。1、 硬件调试(1) 测试1602液晶时背光很暗,写进去的信息不能显示出来,后来经过调节与1602连接的电位器可以增强背光,同时让写进去的信息清晰的显示在液晶上(2) 把程序下进单片机后,时分秒不能正常显示,而且总是显示85,仔细检查程序过后发现没有错误,而且找不到程序中让其显示85的地方,所以认为硬件方面出了问题,经过,换了一个ds1302芯片后,显示结果正常。2、 软件调
10、试(1) 从1302中读数据时,1302的读写寄存器弄混了,导致不能正常走时,后来查了一下1302寄存器的功能,重新修改程序后现象正确。(2) 在用ds1302时,程序中用中断来读取ds1302的数据,此时液晶能正常走时,但是在后续调试按键程序的时候,发现程序一旦进入中断,就会不停的从1302中读取数据,按键不起作用,所以改变了以前的编程思想,把中断去掉,改用标志位来判定,在主函数中直接读取1302的数据,改正完后按键调试正常。六、结论本次课程设计让我们体验到了电子产品设计的乐趣,更重要的是在软硬件这两个方面都得到了锻炼,制作了自己画的首个PCB板,并且PCB板未出现任何连线错误,省去了很多调
11、试硬件的时间,软件方面更加熟练了对51单片机的编程,能对各I/O口进行操作,同时还了解了ds1302时钟芯片的功能,对其内部各个寄存器有了一定的认识,还有LCD1602液晶,掌握了其各个管脚的作用和功能,可以熟练的对其进行编程。总之,这次课程设计让我们学到了不少专业方面的知识和技能,在整个课程设计中还要感谢老师对我们的指导和帮助,让我们能及时发现自身出现的一些问题。七、附录单片机最小系统DS1302时钟模块显示模块控制模块程序:#include#define uchar unsigned char#define uint unsigned intsbit rs=P24;sbit rw=P25;
12、sbit en=P26;sbit s1=P00;sbit s2=P01;sbit s3=P02;sbit s4=P03;sbit s5=P04;sbit beep=P05;sbit ACC0=ACC0;sbit ACC7=ACC7;sbit IO=P34;sbit RST=P35;sbit SCLK=P27;uchar i,slnum,shi,fen,miao,ri,yue,nian,week,flag,s2num,miao1,fen1,shi1;uchar table43;uchar code table= 2011/06/09 ;uchar code table1= 00:00:00 al
13、arm ;void delay(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);/* 液晶初始化及其子程序 */void write_com(uchar com)rs=0;rw=0;en=0;P1=com;delay(5);en=1;delay(5);en=0;void write_date(uchar date)rs=1;rw=0;en=0;P1=date;delay(5);en=1;delay(5);en=0;void init()en=0;write_com(0x38);write_com(0x0c);write_com(0x06);writ
14、e_com(0x01);write_com(0x80);for(i=0;i17;i+)write_date(tablei);delay(5);write_com(0x80+0x40);for(i=0;i0;i-)IO=ACC0;SCLK=0;SCLK=1;ACC=ACC1;uchar read_byte()RST=1;for(i=8;i0;i-)ACC7=IO;SCLK=1;SCLK=0;ACC=ACC1;return(ACC);void write_1302(uchar add,uchar dat)RST=0;SCLK=0;RST=1;write_byte(add);write_byte(d
15、at);SCLK=1;RST=0;uchar read_1302(uchar add)uchar temp;RST=0;SCLK=0;RST=1;write_byte(add);temp=read_byte();SCLK=1;RST=0;return(temp);/*进制转换,BCD转十进制*/uchar BCD_Decimal(uchar bcd)uchar Decimal;Decimal=bcd4;return(Decimal=Decimal*10+(bcd&0x0F);/* ds1302初始化 */void ds1302_init()RST=0;SCLK=0;write_1302(0x8
16、e,0x00);write_1302(0x8e,0x80);/* 向液晶写入年月日时分秒及星期 */void write_sfm(uchar add,uchar dat)uchar shi,ge;ge=dat%10;shi=dat/10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);void write_nyr(uchar add,uchar dat)uchar shi,ge;ge=dat%10;shi=dat/10;write_com(0x80+add);write_date(0x30+shi);write
17、_date(0x30+ge);void write_week(uchar week) write_com(0x80+0x0c);switch(week)case 1:write_date(M); write_date(O); write_date(N); break;case 2:write_date(T); write_date(U); write_date(E); break;case 3:write_date(W); write_date(E); write_date(D); break;case 4:write_date(T); write_date(H); write_date(U)
18、; break; case 5:write_date(F); write_date(R); write_date(I); break;case 6:write_date(S); write_date(A); write_date(T); break;case 7:write_date(S); write_date(U); write_date(N); break;void keyscan()uchar temp;if(s1=0)delay(5);if(s1=0)while(!s1);flag+;if(flag=1) /分write_com(0x80+0x40+4);write_com(0x0f
19、);temp=(fen)/10*16+(fen)%10;write_1302(0x8e,0x00);write_1302(0x82,0x80|temp);write_1302(0x8e,0x80);if(flag=2) /时write_com(0x80+0x40+1);if(flag=3)/星期write_com(0x80+12);if(flag=4)/日write_com(0x80+9);if(flag=5)/月write_com(0x80+6);if(flag=6)/年write_com(0x80+3); if(flag=7)write_com(0x80+0x40+10);if(flag=
20、8)flag=0; write_com(0x0c);if(flag!=0)if(s2=0)delay(5);if(s2=0)while(!s2);if(flag=1)fen+;if(fen=60)fen=0;write_sfm(4,fen);temp=(fen)/10*16+(fen)%10;write_1302(0x8e,0x00);write_1302(0x82,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+4);if(flag=2)shi+;if(shi=24)shi=0;write_sfm(1,shi);temp=(shi)/10*16
21、+(shi)%10;write_1302(0x8e,0x00);write_1302(0x84,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+1);if(flag=3)week+;if(week=8)week=1;write_week(week);temp=(week)/10*16+(week)%10;write_1302(0x8e,0x00);write_1302(0x8a,temp);write_1302(0x8e,0x80);write_com(0x80+12);if(flag=4)ri+;if(ri=32)ri=1;write_nyr(
22、9,ri);temp=(ri)/10*16+(ri)%10;write_1302(0x8e,0x00);write_1302(0x86,temp);write_1302(0x8e,0x80);write_com(0x80+9);if(flag=5)yue+;if(yue=13)yue=1;write_nyr(6,yue);temp=(yue)/10*16+(yue)%10;write_1302(0x8e,0x00);write_1302(0x88,temp);write_1302(0x8e,0x80);write_com(0x80+6);if(flag=6)nian+;if(nian=100)
23、nian=0;write_nyr(3,nian);temp=(nian)/10*16+(nian)%10;write_1302(0x8e,0x00);write_1302(0x8c,temp);write_1302(0x8e,0x80);write_com(0x80+3);if(s3=0)delay(5);if(s3=0)while(!s3);if(flag=1)fen-;if(fen=-1)fen=59;write_sfm(4,fen);temp=(fen)/10*16+(fen)%10;write_1302(0x8e,0x00);write_1302(0x82,temp);write_13
24、02(0x8e,0x80);write_com(0x80+0x40+4);if(flag=2)shi-;if(shi=-1)shi=59;write_sfm(1,shi);temp=(shi)/10*16+(shi)%10;write_1302(0x8e,0x00);write_1302(0x84,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+1);if(flag=3)week-;if(week=0)week=7;write_week(week);temp=(week)/10*16+(week)%10;write_1302(0x8e,0x00)
25、;write_1302(0x8a,temp);write_1302(0x8e,0x80);write_com(0x80+12);if(flag=4)ri-;if(ri=0)ri=31;write_nyr(9,ri);temp=(ri)/10*16+(ri)%10;write_1302(0x8e,0x00);write_1302(0x86,temp);write_1302(0x8e,0x80);write_com(0x80+9);if(flag=5)yue-;if(yue=0)yue=12;write_nyr(6,yue);temp=(yue)/10*16+(yue)%10;write_1302
26、(0x8e,0x00);write_1302(0x88,temp);write_1302(0x8e,0x80);write_com(0x80+6);if(flag=6)nian-;if(nian=-1)nian=99;write_nyr(3,nian);temp=(nian)/10*16+(nian)%10;write_1302(0x8e,0x00);write_1302(0x8c,temp);write_1302(0x8e,0x80);write_com(0x80+3);if(s4=0)delay(5);if(s4=0)s2num+;while(!s4);if(flag=7)if(s2num
27、=1)write_com(0x38); /清屏write_com(0x0c);write_com(0x80+0x40); /第?行,显示时分秒 for(i=0;i10;i+)write_date(table1i);delay(5); if(s2num=2) /左移到秒write_com(0x80+0x40+7);write_com(0x0f);if(s2num=3) /左移到分write_com(0x80+0x40+4);if(s2num=4) /左移到时 write_com(0x80+0x40+1);if(s2num=5)flag=0;init(); read_1302();table40=
28、miao1;table41=fen1;table42=shi1;if(s2num!=0)if(s2=0)delay(50);if(s2=0)while(!s2);if(s2num=2)miao1+;if(miao1=60)miao1=0;write_sfm(7,miao1);temp=(miao1)/10*16+(miao1)%10;write_1302(0x8e,0x00);write_1302(0x80,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+7);if(s2num=3)fen1+;if(fen1=60)fen1=0;write_sf
29、m(4,fen1);temp=(fen1)/10*16+(fen1)%10;write_1302(0x8e,0x00);write_1302(0x80,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+4);if(s2num=4)shi1+;if(shi1=24)shi1=0;write_sfm(1,shi1);temp=(shi1)/10*16+(shi1)%10;write_1302(0x8e,0x00);write_1302(0x80,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+1);if(
30、s3=0)delay(50);if(s3=0)while(!s3);if(s2num=2)miao1-;if(miao1=-1)miao1=59;write_sfm(7,miao1);temp=(miao1)/10*16+(miao1)%10;write_1302(0x8e,0x00);write_1302(0x80,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+7);if(s2num=3)fen1-;if(fen1=-1)fen1=59;write_sfm(4,fen1);temp=(fen1)/10*16+(fen1)%10;write_1
31、302(0x8e,0x00);write_1302(0x80,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+4);if(s2num=4)shi1-;if(shi1=-1)shi1=23;write_sfm(1,shi1);temp=(shi1)/10*16+(shi1)%10;write_1302(0x8e,0x00);write_1302(0x80,temp);write_1302(0x8e,0x80);write_com(0x80+0x40+1);void main()init();ds1302_init();while(1)keyscan
32、();if(flag=0)miao=BCD_Decimal(read_1302(0x81);fen=BCD_Decimal(read_1302(0x83);shi=BCD_Decimal(read_1302(0x85);ri=BCD_Decimal(read_1302(0x87);yue=BCD_Decimal(read_1302(0x89);nian=BCD_Decimal(read_1302(0x8d);week=BCD_Decimal(read_1302(0x8b);write_sfm(7,miao);write_sfm(4,fen);write_sfm(1,shi);write_nyr(9,ri);write_nyr(6,yue);write_nyr(3,nian);write_week(week);if(fen=table41&shi=table42&miao=table40)beep=0;if(s5=0)delay(5);if(s5=0)while(!s5);beep=1;教师评语:文档来源网络,版权归原作者。如有侵权,请告知,我看到会立刻处理。