电子台历电子设计.doc

上传人:laozhun 文档编号:4150090 上传时间:2023-04-07 格式:DOC 页数:32 大小:845KB
返回 下载 相关 举报
电子台历电子设计.doc_第1页
第1页 / 共32页
电子台历电子设计.doc_第2页
第2页 / 共32页
电子台历电子设计.doc_第3页
第3页 / 共32页
电子台历电子设计.doc_第4页
第4页 / 共32页
电子台历电子设计.doc_第5页
第5页 / 共32页
点击查看更多>>
资源描述

《电子台历电子设计.doc》由会员分享,可在线阅读,更多相关《电子台历电子设计.doc(32页珍藏版)》请在三一办公上搜索。

1、2016年全国大学生电子设计竞赛电子台历( B 题)2016年6月3日摘要电子台历中需显示时间、日期、和温度等信息的校准使用四个按键,另外还需要显示星期几。根据项目要求,该系统选用AT89C52单片机作为处理器;使用DS1302作为时钟芯片,使用1602液晶显示模块。 目 录一、系统方案11、系统构造12、元器件的论证与选择2二、系统理论分析与计算21、电子台历的分析3(1)51单片机的最小系统3(2)ds1302的引脚分析3(3)液晶显示器的引脚分析3三、电路与程序设计41、电路的设计4(1)系统总体框图4(2)系统显示子系统框图与电路原理图4(3)系统按键子系统框图与电路原理图4(4)电源

2、42、程序的设计5(1)程序功能描述与设计思路5(2)程序流程图6四、测试方案与测试结果81、测试方案82、测试条件与仪器83、测试结果及分析9(1)测试结果(数据)9(2)测试分析与结论9五、结论与心得10六、参考文献11附录1:电路原理图12附录2:源程序13电子台历( B 题)【高职高专组】一、 系统方案1系统构造本系统主要由时钟模块,按键模块,数据处理模块 ,温度模块,下面介绍电子台历的元器件选择时钟模块 该模块采用ds1302时钟芯片,使用13.768kHz晶振,芯片自带时间存储器,单片机可从中直接读取,免去繁琐的计算。按键模块使用四个按键,其中两个作为左右选择和时间校准;一个作为功

3、能键,用于时间校准和闹铃输入;另外1个作为确认键,用于确认信息和返回。数据处理模块 数据处理模块采用AT89C52,信息汇集到单片机经单片机处理后再发送到其他设备,完成一个工作周期后再返回重复执行。 温度模块采用18d20,能够干净有效的获取温度,链接方便,利于使用。2.方案和论证 单片机芯片的选择方案和论证:方案一:采用89C51芯片作为硬件核心,采用FlashROM,内部具有4KBROM存储空间,能于3V的超低压工作,而且与MCS-51系列单片机完全兼容,但是运用于电路设计中时由于不具备ISP在线编程技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多

4、次拔插会对芯片造成一定的损坏。方案二:采用AT89C52,片内ROM全都采用FlashROM;能以3V的超底压工作;同时也与MCS-51系列单片机完全该芯片内部存储器为8KBROM,具有89C51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏,所以选择采用 AT89C52作为主控制系统。 显示模块选择方案和论证:方案一:采用LED液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。方案二:采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文

5、字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示。方案三:采用LED数码管动态扫描,LED数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。但是功能比较单一,且不能显示较多字符。 所以采用LED液晶显示屏。 时钟芯片的选择方案和论证:方案一:直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。方案二:采用DS1302时钟芯片实现时钟,DS1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以

6、及闰年补偿的年进行计数,而且精度高,位的RAM做为数据暂存区,工作电压2.5V5.5V范围内,2.5V时耗电小于300mA. 温度传感器的选择方案与论证:方案一:使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。方案二:采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以去除A/D模块,降低硬件成本,简化系统电路。另外,数字式

7、温度传感器还具有测量精度高、测量范围广等优点。电路设计最终方案决定综上各方案所述,对此次作品的方案选定:采用AT89C52作为主控制系统; DS1302提供时钟;数字式温度传感器;LED液晶显示器二、系统理论分析1、电子台历的分析 (1)51单片机的最小系统此最小系统中的电源供电模块的电源可以通过电脑的USB口供给,也可以使用外部稳定的5V电源供电模块供给。电源电路中接入了电源指示LED。Stc89系列的复位电路由按键复位和上电复位两部分组成。上电复位:通常在复位引脚RST上连接一个电容到VCC,再连接电阻到GND,由此形成一个RC充放电回路保证单片机在上电时RST脚上有足够时间的高电平复位,

8、随后回归到低电平进入正常工作状态,这个电阻和电容的典型值为10K和10uF。按键复位:按键复位就是在复位电容上并联一个开关,当开关按下时电容被放点、RST也被拉到高电平,而且由于电容的充电,会保持一段时间的高电平来使单片机复位。(2)ds1302的引脚分析X1,X2是32.768KHz晶振的引脚Vcc2是电源供电引脚,vcc1是3V纽扣电池的供电引脚;Sclk为与单片机串行通信的时钟引脚I/O为与单片机传送数据的引脚RTS是ds1302的复位引脚,低电平有效。(3)液晶显示器的引脚分析RT-1602采用标准的16脚接口,各引脚情况如下:第一脚:VSS,电源地第二脚:VDD,+5V电源第三脚:V

9、0,液晶显示偏压信号,一般加电位器调整第四脚:RS,数据、命令选择端,高电平时选择数据寄存器、低电平时选择指令寄存器。第五脚:R/W,读/写选择端,高电平时进行读操作,低电平时进行写操作。当RS和R/W共同为低电平时可以写入指令或者显示地址,当RS为低电平R/W为高电平时可以读忙信号,当RS为高电平R/W为低电平时可以写入数据。第六脚:E,端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。第7-14脚:D0D7,为8位双向数据线。第15脚:BLA,背光源正极第16脚:BLK,背光源负极三、电路与程序设计1、电路的设计(1)系统总体框图系统总体框图(2)系统显示子系统框图与电路原理图

10、(3)系统键扫子系统框图与电路原理图 (4)电源此最小系统中的电源供电模块的电源可以通过电脑的USB口供给,也可以使用外部稳定的5V电源供电模块供给。电源电路中接入了电源指示LED。2、程序的设计(1)程序功能描述与设计思路1、程序功能描述在液晶显示年,月,日,时,分,秒。1键用于模式调整,按一下改变一个模块值。B键用于按下2键后的+1。C键用于按下3键后的-1。D键用于确定改变值。到23时59分59秒时到0时0分0秒的自动进位。日期到一个月的自动进位1,满1年自动进位1。且可以显示温度,星期几。2、程序设计思路由平时使用的手机,电脑和手表的等携带的功能延伸过来的,并加上了对温度的显示,取消了

11、闹钟功能。(2)程序流程图1、主程序流程图2、中断子程序流程图四、测试方案与测试结果1、测试方案(1)硬件测试我们在焊接好电路之后因为原件引脚接错了,导致一两个元器件损坏,然后用万用表测试,发现有一些小问题。(2)软件仿真测试 软件仿真我们用的是Proteus仿真,仿真结果很好,如图可以显示现在的日期和时间,星期几以及温度(3)硬件软件联调 一开始因为元器件焊接有一点点的问题,导致只能点亮液晶显示屏不能显示任务的要求,后来更改了这些问题之后,液晶就可以正常显示了2、测试条件与仪器测试条件:检查多次,仿真电路和硬件电路必须与系统原理图完全相同,并且检查无误,硬件电路保证无虚焊。测试仪器:硬件用指

12、针式万用表,软件用Proteus。3、测试结果及分析(1)测试结果(数据)电路为通路,电压为5V。Proteus正常显示时间,日期,星期及温度。液晶为正常5V电压,且正常显示软件仿真的数据。(2)测试分析与结论根据上述测试数据,由此可以得出以下结论:1、硬件电路无虚焊。2、Proteus软件仿真无误。3、软件硬件联调无误,正常显示功能。综上所述,本设计达到设计要求。焊接工艺在焊接方面,我们是用的手工焊接,在手工焊接方面,我们主要按照以下几个步骤进行:a. 准备焊接:清洁被焊元件处的积尘及油污,再将被焊元器件周围的元器件左右掰一掰,让电烙铁头可以触到被焊元器件的焊锡处,以免烙铁头伸向焊接处时烫坏

13、其他元器件。在此期间,我们也要给烙铁预热,让温度达到250400 。焊接新的元器件时,应对元器件的引线镀锡。b. 加热焊接:将沾有少许焊锡和松香的电烙铁头接触被焊元器件约几秒钟。若是要拆下印刷板上的元器件,则待烙铁头加热后,用手或镊子轻轻拉动元器件,看是否可以取下。c. 清理焊接面:若所焊部位焊锡过多,可将烙铁头上的焊锡甩掉(注意不要烫伤皮肤,也不要甩到印刷电路板上!),用光烙锡头沾些焊锡出来。若焊点焊锡过少、不圆滑时,可以用电烙铁头蘸些焊锡对焊点进行补焊。d. 检查焊点:看焊点是否圆润、光亮、牢固,是否有与周围元器件连焊的现象。五、结论与心得这次实训,用了一周的时间,让我们受益匪浅,学习到了

14、很多课本上学不到的知识。这次实训初步完成了原本的要求。之前学习到的知识得到了进一步的巩固和提高,学到了不少新的东西,也学习到了作为一个团队应该做的事情,互相帮助的团队精神,相信在今后的工作和学习中会使我们终身受益。这次实训让我们的的学习能力得到了提高,完成了对于单片机程序的编写、PCB的设计、和硬件电路的设计等。当然在实训的过程中我们也遇到了很多的困难,但是通过查阅资料、问同学和老师帮助下,解决了困难,这无疑让我们对理论知识有了更深一步的认识与理解,也培养了我们的自学能力以及分析问题和解决问题的能力。感觉这次实训比较困难的地方是编写程序还有对电路的设计和布局,为了让电路板看起来比较美观,花了很

15、多的时间和精力,但是最后还是做好了,感觉看起来还是很不错。这次实训我们组受益匪浅,也让我们知道了,想要做好一件事情,要有耐心,不能浮躁,一步接着一步的做下去,才能做成功。六、参考文献1李泽中.C语言程序设计M.清华大学出版社,2010附录1:源程序#include #include /#include LCD1602.h/#include DS1302.h #define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P23; /实时时钟时钟线引脚 sbit DS1302_IO = P24; /实时时钟数据线引脚 s

16、bit DS1302_RST = P25; /实时时钟复位线引脚sbit wireless_1 = P30;sbit wireless_2 = P31;sbit wireless_3 = P32;sbit wireless_4 = P33;sbit ACC0 = ACC0;sbit ACC7 = ACC7;char hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; /秒,分,时到日,月,年位闪的计数sbit Set = P34; /模式切换键sbit Up = P35; /加法按钮sbit Down = P

17、36; /减法按钮sbit out = P37; /立刻跳出调整模式按钮sbit DQ = P27; /温度传送数据IO口char done,count,temp,flag,up_flag,down_flag;uchar temp_value; /温度值uchar TempBuffer5,week_value2;void show_time(); /液晶显示程序/*1602液晶显示部分子程序*/Port Definitions*sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn = P22;sfr DBPort = 0x90;/P0=0x80,P1=0x90,

18、P2=0xA0,P3=0xB0.数据端口/内部等待函数*unsigned char LCD_Wait(void)LcdRs=0;LcdRw=1;_nop_();LcdEn=1;_nop_(); LcdEn=0;return DBPort;/向LCD写入命令或数据*#define LCD_COMMAND0 / Command#define LCD_DATA1 / Data#define LCD_CLEAR_SCREEN0x01 / 清屏#define LCD_HOMING 0x02 / 光标返回原点void LCD_Write(bit style, unsigned char input)Lcd

19、En=0;LcdRs=style;LcdRw=0;_nop_();DBPort=input;_nop_();/注意顺序LcdEn=1;_nop_();/注意顺序LcdEn=0;_nop_();LCD_Wait();/设置显示模式*#define LCD_SHOW0x04 /显示开#define LCD_HIDE0x00 /显示关 #define LCD_CURSOR0x02 /显示光标#define LCD_NO_CURSOR0x00 /无光标 #define LCD_FLASH0x01 /光标闪动#define LCD_NO_FLASH0x00 /光标不闪动void LCD_SetDispl

20、ay(unsigned char DisplayMode)LCD_Write(LCD_COMMAND, 0x08|DisplayMode);/设置输入模式*#define LCD_AC_UP0x02#define LCD_AC_DOWN0x00 / default#define LCD_MOVE0x01 / 画面可平移#define LCD_NO_MOVE0x00 /defaultvoid LCD_SetInput(unsigned char InputMode)LCD_Write(LCD_COMMAND, 0x04|InputMode);/初始化LCD*void LCD_Initial()L

21、cdEn=0;LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); /AC递增, 画面不动/液晶字符输入的位置*void GotoXY(unsigned char x, unsigned char y)if(y=0)LCD_Write(LCD

22、_COMMAND,0x80|x);if(y=1)LCD_Write(LCD_COMMAND,0x80|(x-0x40);/将字符输出到液晶显示void Print(unsigned char *str)while(*str!=0)LCD_Write(LCD_DATA,*str);str+;/*DS1302时钟部分子程序*/typedef struct _SYSTEMTIME_unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char

23、 Month;unsigned char Year;unsigned char DateString11;unsigned char TimeString9;SYSTEMTIME;/定义的时间类型SYSTEMTIME CurrentTime;#define AM(X)X#define PM(X)(X+12) / 转成24小时制#define DS1302_SECOND0x80 /时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE0x82#define DS1302_HOUR0x84 #define DS1302_WEEK0x8A#define DS1302_DAY0x86

24、#define DS1302_MONTH0x88#define DS1302_YEAR0x8C void DS1302InputByte(unsigned char d) /实时时钟写入一字节(内部函数) unsigned char i; ACC = d; for(i=8; i0; i-) DS1302_IO = ACC0; /相当于汇编中的 RRC DS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC 1; unsigned char DS1302OutputByte(void) /实时时钟读取一字节(内部函数) unsigned char i; for(i=8

25、; i0; i-) ACC = ACC 1; /相当于汇编中的 RRC ACC7 = DS1302_IO; DS1302_CLK = 1; DS1302_CLK = 0; return(ACC); void Write1302(unsigned char ucAddr, unsigned char ucDa)/ucAddr: DS1302地址, ucData: 要写的数据 DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr); / 地址,命令 DS1302InputByte(ucDa); / 写1Byte

26、数据 DS1302_CLK = 1; DS1302_RST = 0; unsigned char Read1302(unsigned char ucAddr)/读取DS1302某地址的数据 unsigned char ucData; DS1302_RST = 0; DS1302_CLK = 0; DS1302_RST = 1; DS1302InputByte(ucAddr|0x01); / 地址,命令 ucData = DS1302OutputByte(); / 读1Byte数据 DS1302_CLK = 1; DS1302_RST = 0; return(ucData);void DS130

27、2_GetTime(SYSTEMTIME *Time) /获取时钟芯片的时钟数据到自定义的结构型数组unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time-Second = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time-Minute = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time-Hour

28、= (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time-Day = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time-Week = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time-Month = (ReadValue&0x70)4)*10 + (ReadValue&0x

29、0F);ReadValue = Read1302(DS1302_YEAR);Time-Year = (ReadValue&0x70)4)*10 + (ReadValue&0x0F);void DateToStr(SYSTEMTIME *Time) /将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString if(hide_year2) /这里的if,else语句都是判断位闪烁,2就不显示,输出字符串为 2007/07/22 Time-DateString0 = 2; Time-DateString1 = 0; Time-DateString2 = Time-Year/10

30、 + 0; Time-DateString3 = Time-Year%10 + 0; else Time-DateString0 = ; Time-DateString1 = ; Time-DateString2 = ; Time-DateString3 = ;Time-DateString4 = /;if(hide_monthDateString5 = Time-Month/10 + 0; Time-DateString6 = Time-Month%10 + 0; else Time-DateString5 = ; Time-DateString6 = ; Time-DateString7

31、= /;if(hide_dayDateString8 = Time-Day/10 + 0; Time-DateString9 = Time-Day%10 + 0; else Time-DateString8 = ; Time-DateString9 = ; if(hide_weekWeek%10-1 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ; week_value1 = 0;Time-DateString10 = 0; /字符串末尾加 0 ,判断结束字符void TimeToStr(SYS

32、TEMTIME *Time) /将时,分,秒数据转换成液晶显示字符放到数组 TimeString; if(hide_hourTimeString0 = Time-Hour/10 + 0; Time-TimeString1 = Time-Hour%10 + 0; else Time-TimeString0 = ; Time-TimeString1 = ;Time-TimeString2 = :; if(hide_minTimeString3 = Time-Minute/10 + 0; Time-TimeString4 = Time-Minute%10 + 0; else Time-TimeStr

33、ing3 = ; Time-TimeString4 = ; Time-TimeString5 = :; if(hide_secTimeString6 = Time-Second/10 + 0; Time-TimeString7 = Time-Second%10 + 0; else Time-TimeString6 = ; Time-TimeString7 = ; Time-DateString8 = 0;void Initial_DS1302(void) /时钟芯片初始化 unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80)

34、/判断时钟芯片是否关闭 Write1302(0x8e,0x00); /写入允许Write1302(0x8c,0x07); /以下写入初始化时间 日期:07/07/25.星期: 3. 时间: 23:59:55Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); /禁止写入/*ds18b20子程序*/*ds18b20延迟子函数(晶振12MHz )*/ void

35、 delay_18B20(unsigned int i)while(i-);/*ds18b20初始化函数*/void Init_DS18B20(void) unsigned char x=0; DQ = 1; /DQ复位 delay_18B20(8); /稍做延时 DQ = 0; /单片机将DQ拉低 delay_18B20(80); /精确延时 大于 480us DQ = 1; /拉高总线 delay_18B20(14); x=DQ; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay_18B20(20);/*ds18b20读一个字节*/ unsigned char Read

36、OneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DQ = 0; / 给脉冲信号 dat=1; DQ = 1; / 给脉冲信号 if(DQ) dat|=0x80; delay_18B20(4); return(dat);/*ds18b20写一个字节*/ void WriteOneChar(uchar dat) unsigned char i=0; for (i=8; i0; i-) DQ = 0; DQ = dat&0x01; delay_18B20(5); DQ = 1; dat=1; /*读取ds18b20当前温度*/void Rea

37、dTemp(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;Init_DS18B20();WriteOneChar(0xCC); / 跳过读序号列号的操作WriteOneChar(0x44); / 启动温度转换delay_18B20(100); / this message is wery importantInit_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度delay_18B20(100);a=ReadOneChar(); /读取温度值低位b=ReadOneChar(); /读取温度值高位temp_value=b4; void temp_to_str() /温度数据转换成液晶字符显示 TempBuffer0=temp_value/10+0; /十位 TempBuffer1=temp_value%10+0; /个位 TempBuffer2=0xdf; /温度符号 TempBuffer3=C; TempBuffer4=0;void Delay1ms(unsigned int count)unsigned int i,j;for(i=0;ico

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 办公文档 > 其他范文


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号