《电子钟设计报告.docx》由会员分享,可在线阅读,更多相关《电子钟设计报告.docx(35页珍藏版)》请在三一办公上搜索。
1、嵌入式系统设计导论电子钟设计报告学号:姓名:李刚摘要回看历史长河,从以前的沙漏到现在的电子钟,人们计时的工具伴随着社会的进步和科技的日新月异而更新着,我们不得不感叹人类的智慧!的确,电子钟是一种利用数字电路来实现时间的显示,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动等优点,因而得到广泛使用。随着人们生活环境的不断改善和美化,我们可以在很多场合看到电子钟。数字钟已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及车站、码头、剧场、办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使数字钟具有走时准确、性能稳定、携
2、带方便等优点,它还用于计时、自动报时及自动控制等各个领域。电子钟的唯一缺点是具有辐射,不过电子产品都是有辐射的,电子钟的辐射很小不会造成什么危害。别人设计的电子有可能不符合自己的风格,所以如果能自己亲自动手设计一个符合自己的风格的电子钟将会很有意义。这次的课程设计给了我一个机会。本设计是基于单片机进行的电子万年历设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。在硬件与软件设计时,没有良好的基础知识和实践经验会受到很大限制,每项功能实现时需要那种硬件,程序该如何编写,算法如何实现等,没有一定的基础就不可能很好的实现。具
3、体实现功能:可以准确显示年、月、日、时、分、秒;可以对时间进行设置;目录嵌入式系统设计导论1电子钟设计报告1摘要21 方案选择11.1 单片机芯片的选择方案11.2 显示模块选择方案11.3 时钟芯片的选择方案11.4 电路设计最终方案决定22 系统的硬件设计与实现32.1 电路设计框图32.2 系统硬件概述32.3 主要单元电路的设计及器件介绍33 系统的软件设计73.1 程序流程框图73.2 程序设计(见附录一)74 Proteus仿真84.1 Keil C51的使用介绍84.2 Proteus 的使用介绍84.3 Proteus仿真结果95 课程设计总结与体会126 参考文献137 附录
4、一147.1 Common.h头文件147.2 Main.c文件157.3 DS1302.c文件197.4 Lcd.c文件22 32 / 351 方案选择1.1 单片机芯片的选择方案方案一: 采用AT89C51芯片作为硬件核心,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二:采用AT89C52,AT89C52是一个低电压,高性能CMOS 8位单片机,片
5、内含8k bytes的可反复擦写的Flash只读程序存储器和256 bytes的随机存取数据存储器(RAM),器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器和Flash存储单元,功能强大的AT89C52单片机可为我们提供许多较复杂系统控制应用场合。硬件实体电路一般会采用功能和优点更为突出的AT89C52单片机。1.2 显示模块选择方案方案一:采用LED数码管动态扫描,LED数码管价格适中,但要显示比较多的数字时数码管的使用必然会增多,连线方面会很麻烦,编程上也会相应的复杂。考虑到效率的因素不采用数码管显示。方案二:采用点阵式数码管显
6、示,点阵式数码管是由八行八列的发光二极管组成,在很多场合可以看到这种显示方式,但是在电子钟显示时间这一块不适合,一来点阵显示文字上有优势,但显示数字存在一定的劣势,一来不够直观,二来显得有点浪费。综合考虑各种因素排除这种方案。方案三:采用LCD液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。与数码管显示相比,在直观程度和亮度清晰度上都存在很多优势,并且现在液晶显示已经成为主流,被人们普遍接受,符合大众的口味。虽然没学过液晶显示这一块,但查看相关资料应该可以把硬件电路图接好。1.3 时钟芯片的选择方案方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、
7、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大,所以不采用此方案。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片, 实时时钟可提供秒、分、时、日、星期、月和年,一个月小于31天时可以自动调整,且具有闰年补偿功能。计时更加准确,使用起来更加方便,与成本相比起来利大于弊,物超所值。1.4 电路设计最终方案决定综上各方案所述,对此次作品的方案选定: 采用AT89C52作为主控制系统; DS1302提供时钟;LCD液晶显示屏作为显示。2 系统的硬件设计与实现2.1 电路设计框图电路设计框图如图2-1所示:DS1302时钟模
8、块LCD液晶显示屏显示模块按键模块AT89C52主控制模 块图 212.2 系统硬件概述本电路是由AT89C52单片机为控制核心,驱动DS1302时钟提供年、月、日、时、分、秒,时间精确;显示模块采用LCD12864显示,直观、清晰、非常人性化;按键模块包含时间设置按钮,按键的操作符合人们的思维习惯,很容易进行设置。总的来说,硬件考虑的比较周全,尽量做到最好。2.3 主要单元电路的设计及器件介绍单片机主控制模块一、模块介绍单片机控制模块的核心是AT89C52,此外还包括它的供电电路、复位电路、时钟电路,它的模块图如图2-2所示图 22二 AT89C52的介绍AT89C52有40个引脚,32个外
9、部双向输入/输出(I/O)端口,同时内含2个外中断口,3个16位可编程定时计数器,2个全双工串行通信口,2个读写口线,AT89C52可以按照常规方法进行编程,但不可以在线编程(S系列的才支持在线编程)。其将通用的微处理器和Flash存储器结合在一起,特别是可反复擦写的Flash存储器可有效地降低开发成本。时钟电路模块一、模块介绍时钟电路模块的核心是DS1302,DS1302由Vcc1或Vcc2两者中的较大者供电。当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。当Vcc2小于Vcc1时,DS1302由Vcc1供电。X1和X2是振荡源,外接32.KHz晶振。RST是复位/片选线,通
10、过把RST输入驱动置高电平来启动所有的数据传送。RST输入有两种功能:首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据的传送手段。当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。如果在传送过程中RSTS置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。上电动行时,在Vcc大于等于2.5V之前,RST必须保持低电平。中有在SCLK 为低电平时,才能将RST置为高电平,I/O为串行数据输入端(双向)。SCLK始终是输入端。 图 23 DS1302的时钟电路 图 24 DS1302的管脚图二、DS1302的介绍(1) 时
11、钟芯片DS1302的工作原理:DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置 “0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图4所示。DS1302的控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0,位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表.2为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位
12、为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。(2) DS1302的控制字节:DS1302控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出(3) 数据输入输出(I/O)在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的
13、控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7。(4) DS1302的寄存器DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式。此外,DS1302 还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。 DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0HFDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的
14、RAM的31个字节,命令控制字为FEH(写)、FFH(读)。 显示模块一、模块介绍图2-5为LCD显示模块,液晶显示的连线需熟悉它的工作原理。图 25显示模块二、LCD12864的介绍LCD12864分为带字库和不带字库两种,带字库的在显示文本时更方便,不带字库的在显示图像时更有优势。LCD12864采用标准的20脚接口,各引脚接口说明如表所示:编号符号引脚说明编号符号引脚说明1VSS电源地11D4数据2VDD电源正极12D5数据3V0对比度亮度调整13D6数据4RS数据/命令选择14D7数据5R/W读/写选择15CS1选择右半屏6E使能信号16CS2选择左半屏7D0数据17RET复位8D1数
15、据18VOUTLCD驱动负电压9D2数据19LED+背光电源正极10D3数据20LED-背光电源地按键模块按键模块由3个按键组成,每个按键都有自己的功能。图 26按键模块3 系统的软件设计3.1 程序流程框图开始初始化 读日期、时间 显示日期、时间判断是否有按键按下执行按键程序是修改时间否图 313.2 程序设计(见附录一)4 Proteus仿真4.1 Keil C51的使用介绍由于程序的编写语言是C语言,所以只能在Keil C51软件上编写与编译,因此我们必须熟悉Keil C51.Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语
16、言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全windows界面。Keil C51的使用步骤如下:(1)驱动软件(2)新建工程(3)选择CPU(4)添加源程序文件(5)编写程序(6)设置开发环境参数(7)编译源程序,烧录文件编译成功后会生成HEX文件,该文件可以被载入并最终烧录到具体芯片中。本次设计用的是C语言,用C51编程有很多优点:(1)C51可管理内部寄存器和存储器,编程时,无须考虑不同存储器的寻址和数据类型等细节问题;(2)程序由若干函数组成,具有良好的模块化结构;(3)有丰富的子程序库可直接引用,
17、从而大大减少用户编程的工作量。4.2 Proteus 的使用介绍Proteus ISIS是英国Labcenter公司开发的电路分析与实物仿真软件。它运行于Windows操作系统上,可以仿真、分析(SPICE)各种模拟器件和集成电路。该软件的特点是:(1)全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。(2)具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232动态仿真、I2 C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。(3)目前支持的单片机类型有:ARM7系列、68000系列、8051
18、系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列以及各种外 围芯片。(4)支持大量的存储器和外围芯片。总之,该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真ARM、51、AVR、PIC。Proteus启动画面:如图4-1所示图 41Proteus启动画面4.3 Proteus仿真结果图4-2为调节秒钟:图 42图4-3为调节分钟: 图 43图4-4为调整时钟:图 44图4-5为调节年:图 45图4-6为调节月:图 46图4-7调节日期:图 47图4-8修改成功界面:图 48图4-9修改成功后显示界面:图 495 课程设计总结
19、与体会课程设计考验我们掌握的知识,包括单片机的基本知识、C语言或者汇编语言的程序编写、Keil C51的使用和Proteus的使用。另一方面也考验我们的动手能力和意志。课设过程中由于各种因素的影响我们不可能一帆风顺,我们需要一颗坚定的心再加上细心,这样才能克服种种困难,完成老师布置的任务。在设计过程中,我遇到问题首先想到的是从书本或者网上解决问题,一般的问题也总能解决。在遇到很难解决的问题时又会想到老师如果在身边多好啊,但是我知道老师也很忙,不能照顾到每个同学。后来我有难题就会去请教张辉其同学,在此感谢他。同时感谢陈老师平时的悉心教导,感谢学校和学院给我们这么一次课设的机会锻炼我们。6 参考文
20、献1侯玉宝编基于Proteus的51系列单片机设计与仿真电子工业出版社2秦实宏、徐春辉主编MCS-51单片机原理及应用华中科技大学出版社3陈正振 编 电子电路设计与制作 广西交通职业技术学院信息工程系 20074Proteus 仿真论坛7 附录一7.1 Common.h头文件#ifndef _COMMON_INCLUDED_#define _COMMON_INCLUDED_#define uchar unsigned char#define uint unsigned int#include /lcd12864函数extern void Delay_LCD(uint t); /5msexter
21、n void Delay_ms(uint t);extern void LCD_Read_busy();extern void LCD_Write_com(uchar com);extern void LCD_Write_date(uchar date);extern void LCD_Reset();extern void LCD_ON();extern void LCD_OFF();extern void INIT_LCD();extern void LCD_Write_byte(uchar xpos,uchar ypos,uchar byte);extern void LCD_Clear
22、();extern void LCD_Write_char(uchar xpos,uchar ypos,uchar *byte);extern void LCD_Write_char_16x16(uchar hz_xpos,uchar hz_ypos,uchar *hz_source_addr);extern void LCD_Write_char_8x16(uchar hz_xpos,uchar hz_ypos,uchar *hz_source_addr);extern void LCD_Write_char_8x8( uchar xpos , uchar ypos , uchar *hz_
23、source_addr);extern void LCD_Write_str_8x16(uchar x, uchar y, uchar num, uchar *str);extern void LCD_Write_num(uchar x, uchar y, uchar str);extern void LCD_Write_hanzi_str(uchar x, uchar y, uchar num, uchar *str);extern void LCD_Write_jiemian();extern void LCD_Write_Ds1302_shuju();extern void LCD_Wr
24、ite_qingsuru(void);extern void LCD_Write_riqi(uchar i);extern void LCD_Write_xiugaichenggong(void);/DS1302函数/读数据定义#define YEAR_R0x8D/读年数据; #define DAY_R0x8B/读星期数据; #define MONTH_R0x89/读月数据; #define DATE_R0x87/读日数据; #define HR_R0x85/读小时数据; #define MIN_R0x83/读分数据; #define SEC_R0x81/读秒数据; #define CONTR
25、OL_R0x8F/读制数据; #define TRICKLE_CHARGER_R0x91/读充电 制数据; #define CLOCK_BURST_R0xBF/读时充多字节数据; #define RAM_BURST_R0xFF/读RAM字符组数据; extern void Write_DS1302(uchar Command,uchar Value);extern uchar Read_DS1302(uchar Command);extern void Write_1302_time(uchar *time);extern void Read_1302_time(uchar time);ext
26、ern void Init_DS1302(void);#endif7.2 Main.c文件#include common.hsbit up=P30;sbit down=P31;sbit key_q=P32;void keyjpress();uchar Times_buffer6=0;void keyjpress();void KEY_up_down(uchar count);void main()INIT_LCD();LCD_Clear();Init_DS1302();LCD_Write_jiemian();while(1)LCD_Write_Ds1302_shuju();keyjpress(
27、);void keyjpress()/按键处理if(key_q = 0)Delay_ms(10);if(key_q = 0)uchar i = 6;while(key_q=0);/设定时间界面for(i=6;i!=255;i-)uchar high = 0, low = 0;if(i !=5)LCD_Clear();Times_bufferi=1;while(!key_q);while(key_q)LCD_Write_qingsuru();/显示请输入switch(i)case 6:LCD_Write_riqi(5);break;/年case 4:LCD_Write_riqi(4);break
28、;/月case 3:LCD_Write_riqi(3);break;/日case 2:LCD_Write_riqi(2);break;/时case 1:LCD_Write_riqi(1);break;/分case 0:LCD_Write_riqi(0);break;/秒default:break;high = Times_bufferi/10;low = Times_bufferi%10;LCD_Write_num(9,0,high);/显示值LCD_Write_num(10,0,low);KEY_up_down(i);Write_1302_time(Times_buffer);/使时间生效L
29、CD_Write_xiugaichenggong();Delay_ms(500);LCD_Clear();LCD_Write_jiemian();void KEY_up_down(uchar count) /加减键处理if(up=0)Delay_ms(10);if(up=0)while(!up);switch(count)case 0:/秒Times_buffer0+=1;if(Times_buffer059)Times_buffer0=0;break;case 1:/分Times_buffer1+=1;if(Times_buffer159)Times_buffer1=0;break;case
30、 2:/时Times_buffer2+=1;if(Times_buffer223)Times_buffer2=0;break;case 3:/日Times_buffer3+=1;if(Times_buffer331)Times_buffer3=1;break;case 4:/月Times_buffer4+=1;if(Times_buffer412)Times_buffer4=1;break;case 6:/年Times_buffer6+=1;if(Times_buffer699)Times_buffer6=0;break;if(down=0) /减键处理Delay_ms(10);if(down
31、=0)while(!down);switch(count)case 0:Times_buffer0-=1;if(Times_buffer0=255)Times_buffer0=59;break;case 1:Times_buffer1-=1;if(Times_buffer1=255)Times_buffer1=59;break;case 2:Times_buffer2-=1;if(Times_buffer2=255)Times_buffer2=23;break;case 3:Times_buffer3-=1;if(Times_buffer31)Times_buffer3=31;break;ca
32、se 4:Times_buffer4-=1;if(Times_buffer41)Times_buffer4=12;break;case 6:Times_buffer6-=1;if(Times_buffer6=255)Times_buffer6=99;break;7.3 DS1302.c文件#ifndef DS1302_H#define DS1302_H#include common.h/管脚定义sbitDS_IO = P26;sbitDS_CLK= P25;sbitDS_RST= P27;/设置时间,time0-time6数据存放顺序为:秒,分,时,日,月,星期,年unsigned char
33、Times7=00,58,15,15,5,1,11;/*函数名:void Write_DS1302(uchar Command,uchar Value)参数:Command=0写命令,Command=1写数据 ,Value要写入的值功能:向DS1302中写命令或数据返回:无*/void Write_DS1302(uchar Command,uchar Value)uchar i = 0;DS_RST = 0;DS_CLK = 0;DS_RST = 1;for(i = 0; i = 1;for(i = 0; i = 1;/*函数名:uchar Read_DS1302(uchar Command)
34、功能:读DS1302 中的数据或状态返回:读到的数据或状态值*/uchar Read_DS1302(uchar Command)uchar i = 0;uchar Value = 0;DS_RST = 0;DS_CLK = 0;DS_RST = 1;for(i = 0; i = 1;for(i = 0; i 8;i +)DS_CLK = 1;DS_CLK = 0;if(DS_IO)Value |= 0x01 i;DS_RST = 0;Value = (Value /16 * 10) + Value %16;return Value;/*函数名:void Write_1302_time(ucha
35、r *time)参数:time存储要设定时间的值功能:向Ds1302中写入设定时间值返回:无*/void Write_1302_time(uchar *time) uchar add=0x80; /地址add初值(秒),偶数地址为只写 uchar i; uchar timeBCD7; /用以存放time数据的BCD码值 uchar l,h; /单位变量,分别存放时间数据(8421BCD码)的低4位和高4位 for(i=0;i7;i+) /将时间数据转为BCD码放入timeBCD中 l=timei%10; h=timei/10; timeBCDi=h*16+l; Write_DS1302(0x8
36、e,0x00); /打开寄存器写入 for(i=0;i7;i+) Write_DS1302(add,timeBCDi); /将时间数据写入1302对应的寄存器 add+=2; /地址移动,确保地址为偶数 Write_DS1302(0x8e,0x80); /关闭写/*函数名:void Read_1302_time(uchar time)参数:time存储要设定时间的值功能:读取当前时间,存储到Time中返回:无 */void Read_1302_time(uchar time) uchar i; uchar add=0x81; /设置地址add初值(秒),奇数为只读 uchar l,h; /单位
37、变量,分别存放时间数据(8421BCD码)的低4位和高4位,用以进行十进制转换 for(i=0;i4)&0x0f; /h存放time的高4位,即十位 timei=h*10+l; /时间数据以十进制形式放进timei中 add+=2; /地址移动,确保地址为奇数 /*函数名:Init_DS1302(void)参数:无功能:初始化Ds1302返回:无*/void Init_DS1302(void)Write_DS1302(0x8E,0x00);/打开寄存器写入Write_DS1302(0x84,0x00);/设置24小时制Write_DS1302(0x90,0xA5);/启动充电功能Write_DS1302(0x8E,0x80);/关闭寄存器操作Write_1302_time(Times);/写时间同时启动时钟#endif7.4 Lcd.c文件#ifndef LCD_H#define LCD_H#include common.h/定义管脚#define DATA P0sbit RST=P10;