电子万年台历的设计制作.doc_第1页
电子万年台历的设计制作.doc_第2页
电子万年台历的设计制作.doc_第3页
电子万年台历的设计制作.doc_第4页
电子万年台历的设计制作.doc_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

仪征技师学院 学生课程设计项目仪 征 技 师 学 院 课 程 设 计 报 告 项目名称:电子万年台历的设计制作指导老师; 朱 明 东 制 作 者:罗贞 李飞 李松 赵强 谢雪晨 吴业强 赵祥龙 韩恒志 马友友 所在系别: 电子信息系 班 级: 11电子高级班 摘 要随着科技与技术的发展,目前设计电子万年历的方法有多种,本设计介绍了一种基于stc89c52单片机设计万年历的方法。首先介绍了电路的工作原理、stc89c52单片机的性能和特点、并概述了用单片机实现万年历的硬件框图及软件实现方法。本设计以stc89c52单片机为核心,辅以必要的外围电路,设计了一个简易的万年历。实现了年、月、日、时间一起显示,并带有测温度和星期显示功能。该万年历具有硬件成本低、计时准确、调整时间容易等特点。在设计的软件平台是以protues7为仿真平台,使用c语言编程编写了该设计的应用软件;包括主程序模块、显示模块、温度测试模块、时钟模块。最后,实际制作了一台万年历产品,在实验室里进行了测试,结果表明该万年历的功能和指标达到了设计要求。关键词:万年历;单片机;液晶; ds1302芯片;18b20目 录1前言.41.1设计背景.41.2设计目的.41.3设计的主要内容和要求.41.3.1主要内容.41.3.2主要要求.52整体设计方案.52.1方案比较.52.1.1时钟电路.52.1.2显示部分.52.1.3测温部分.62.2实际方案.63硬件电路的设计.73.1单片机电路的设计.73.2实时时钟电路的设计.83.3独立键盘的设计.93.4显示部分的设计.104软件设计.104.1主程序设计.104.2键盘服务子程序设计.114.3 lcd显示子程序设计.125系统测试.13附录.14附录一.14附录二.146总结.151前言1.1设计背景万年历已成为人们日常生活中必不可少的必需品,广泛用于个人家庭以及办公室等公共场所,给人们的生活、学习、工作、娱乐带来极大的方便。由于数字集成电路技术的发展和采用了先进的石英技术,使万年历具有走时准确、性能稳定、携带方便等优点,它还用于计时、自动报时及自动控制等各个领域。尽管目前市场上已有现成的万年历集成电路芯片出售,价格便宜、使用也方便,但鉴于单片机的定时器功能也可以完成万年历电路的设计,因此进行万年历的设计是必要的。在这里我们将已学过的比较零散的数字电路的知识有机的、系统的联系起来用于实际,来培养我们的综合分析和设计电路、写程序、调试电路的能力。单片机具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。1.2设计目的 通过本研究性学习,进一步了解研究性学习的要求和写作过程,了解此类设计的研究方法,培养文献检索能力、创新能力、文字表达能力等。本设计主电路都采用目前流行的简单的典型电路接法,简单实用、稳定廉价。本设计可起到一个很好的教学目的和实验目的,对于认识pic单片机也有一定的好处,能更加熟悉单片机和其它芯片之间的通信。1.3 设计的主要内容和要求1.3.1主要内容1) mcs51单片机是由美国intel公司生产的一系列单片机的总称。单片机即集成在一块芯片上的计算机,集成了中央处理器cpu(central processing unit)、随机存储器ram(random access memory)、只读存储器(read only memory)、定时器/计数器以及i/o接口电路等主要计算机部件。采用精简指令集结构(risc)的高性价比嵌入式控制器,其总线结构采取数据总线和指令线分离独立的哈佛(harvard)结构。实时时钟芯片ds1302和温度传感芯片ds18b20都是dallas公司出产的,都采用单总线数据传送方式,所以我们先要弄懂单总线传送方式是一个什么样的传送方式。2)1602液晶芯片是一款常见的lcd液晶屏幕,对它的读写我们要注意读写时序,还有pic单片机速度比8051单片机要快,以前对1602写操作前不会检查忙否,但pic一定要确认1602不忙才进行写操作。1.3.2主要要求1) 设计要做到操作简单实用廉价;2) 要能显示秒、分、时、天、月、周、年、温度等信息,并能调整以上信息;3) 键盘控制调整时钟信息和显示要灵敏不能出现较大的延时,灵活,可移植性强,能够随时对电路进行改进;4) 可观性强,轻巧耐用。2 整体设计方案2.1方案比较2.1.1时钟电路方案一:使用单片机内部的定时器,实现时间的显示。方案二:使用时钟芯片ds1302。它是一种高性能、低功耗、带ram的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能。 考虑到软件的简单方便,以及时间稳定等因素。本设计采用方案二。2.1.2显示部分方案一:使用常用的数码管。方案二:使用液晶(1602)进行显示。由于使用数码管显示,硬件电路复杂,接线太多,并且显示效果不理想。所以本设计选择方案二。2.1.3测温电路方案一:使用半导体测温模块方案二:使用18b20测温虽然半导体测温模块测量温度精确,但由于它价格较高,考虑到此设计的成本,所以选着方案二。2.2 实际方案 为提高设计效率,使设计思路清晰,本设计拟将整个系统模块化。采用的整体设计方案如图2.1所示,整个系统由单片机1、显示电路2,独立键盘电路3、ds1302实时时钟电路4、复位电路等部分组成。图2.1 整体设计框图当电源开关打开后,系统电路初始化,一从ds1302实时时钟电路中读取一串时钟信息,二从ds18b20温度传感电路读取一串温度信息,然后单片机系统对采集到的数据进行变换和处理,再通过lcd显示出来,完成一次显示过程。然后,通过键盘设置准确时间并确认。独立键盘作为外部中断连接,当有键盘按下时,触发中断,进入中断服务子程序,子程序将会判断哪个键被按下了,有什么作用,要进行怎样的处理,本电路按键可进行时间的增减,以及确认和跳出功能。复位电路中,当复位键按下时,系统将重新初始化,并再按上面所述重新执行下来。3 硬件电路的设计3.1 单片机电路的设计主要元器件:stc89c52单片机,12mhz晶振、30pf电容、10k电阻、开关。stc89c52单片机是宏晶科技公司推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统8051单片机。hd版本和90c版本内部集成max810专用复位电路。其采用精简指令集结构(risc)的高性价比嵌入式控制器,其总线结构采取数据总线和指令线分离独立的哈佛(harvard)结构,哈佛结构是数据存储器与程序存储器独立编址,也就是两种存储器位于不同的逻辑空间里,使得它在执行一条指令的同时,就可以提取下一条指令,因此具有很高的流水处理速度。其高速度、低电压工作,低功耗,强大驱动能力,低价otp技术,体积小巧等都体现了单片机工业的新趋势;同时第三方开发的c语言开发工具,更使得研发工程师能够快速地开发升级产品, 满足市场不断变化的需求。其节约成本的最优化设计,适于用量大、档次低、价格敏感的产品4。stc89c51有40根接脚,每根接脚都有其特定功能。设计中以stc89c52单片机为主芯片,ds1302、ds18b20等为辅芯片,将结果在lcd上显示。具体总原理图如图3.1。图3.1 总原理图电路图图3.2 单片机电路图3.2 实时时钟电路的设计主要元器件:ds1302、电容、5k10k20k电阻。ds1302是dallas公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31字节静态ram,通过简单的串行接口与单片机进行通信。实时时钟/日历电路秒、分、时、日期、月、年的信息,时钟操作是二十四小时制的显示。ds1302与单片机之间能简单地采用同步串行的方式进行通信,需用到三个口线:(1) res(复位),(2) i/o(数据线),(3)sclk(串行时钟)。时钟ram的读/写数据以一个字节或多达31个字节的字符组方式通信。ds1302工作时功耗很低,保持数据和时钟信息时功率小于1mw。ds1302是由ds1202改进而来,vcc1为可编程涓流充电电源,附加七个字节存储器。实时时钟具有能计算2100年之前的秒、分、时、日期、星期、月、年的能力、还有闰年调整的能力,这就使本来要通过复杂的算法来计算出的星期的计算简单了许多。设计中我们要设计一个高稳定晶振电路,这里我们用二片电容和一个32.768mhz的晶振。具体电路连接如图3.3 所示。图3.3 实时时钟电路图3.3 独立键盘的设计 主要元器件:键盘、10千欧和100欧电阻、电源和地等等。键盘电路一般都是让端口检测低电平,有用扫描的方法检测哪个键有按下,也有用中断的方法检测。本设计中的独立键盘是前者,一般键盘可直接接地,但这里为了稳定起见,在挂键盘的端口用了个上拉电阻。具体电路连接如图3.4所示。图3.4 独立键盘电路图3.4显示部分的设计主要元件:电阻、滑动变阻器、1602液晶、电源和地等。液晶显示器是利用液晶经过处理后能够改变光线传输方向的特性,达到显示字符或者图形的目的。其特点是体积小、重量轻、功耗极低、显示内容丰富等特点,在单片机应用中有着日益广泛的应用。1602芯片主要用于显示时间和定时时间。1602芯片由点阵字符液晶显示器件和专用的行、列驱动器、控制及必要的链接件、结构件组装而成,可以显示数字和西文字符,但不能显示图形,已经可以满足本次设计的需要。1602型lcd可以显示2行16个字符,有8位数据总线d0d7和rs,r/w,en三个控制端口,工作电压为5v,并且具有字符对比度调节和背光功能。为了显示的稳定,本部分在液晶屏的数据线端口每个上面都连接了上拉电阻。现实电路中屏幕的背光电源也已经接上,使得显示更加清晰美观。其中第三引脚连接了一个10k的滑动变阻器,这样可以调节屏幕上显示信息的清晰度,最终使得此设计更加完善。具体电路如图3.5所示。图3.5 液晶显示电路4 软件设计4.1 主程序设计在主程序中,需要完成整体的功能构架并对各芯片的初始化,另外,在主程序模块中还需要设置定时器0,并对它们进行初始化。主程序一次循环流程图如图5.1所示。当打开电源开关时,各个模块初始化,然后显示固定在液晶上的用于美化显示的图形。之后读取温度信息,定时器0初始化,读取时间等信息,冒号闪烁,读取星期、农历信息,显示所有信息,结束一次循环。在实际运行时,显示完所有信息后,将返回到读取温度子函数前再往循环下执行。图4.1 主程序流程图4.2 键盘服务子程序设计在主程序中,进入键盘服务子程序后,开始扫描键盘情况,如果设置键没有键按下或是按下次数k=k%10=0,则本次扫描结束;若设置键按下次数k=k%10=1,则扫描加减键是否按下,若按下则可进行加减调节秒;若设置键按下次数k=k%10=2,则可通过加、减键调节分;若设置键按下次数k=k%10=3,则可通过加、减键调节时;若设置键按下次数k=k%10=4,则可通过加、减键调星期;若设置键按下次数k=k%10=5,则可通过加、减键调节天;若设置键按下次数k=k%10=6,则可通过加、减键调节月;若设置键按下次数k=k%10=7,则可通过加、减键调节年;设置键按下次数k=k%10=8,将回到初始显示界面。在次扫描过程中,如果检测到跳出键按下,则直接回到显示界面。图4.2 独立键盘服务流程图4.3 lcd显示子程序设计在lcd显示子程序中,初始化后,从lcd中读状态字,判断lcd是否忙状态,不是则可向lcd写控制命令,再写数据,即显示数据。 图4.3 lcd显示流程图5系统测试(1)测试原理:在系统设计中,以mcs-51单片机为核心的万年历,将18b20采集到的温度传送到单片机经过换算转化成对应的数值由液晶屏显示,同时将时钟芯片ds1302的信号送入单片机,经单片机处理后通过1602一起显示。以protues7为仿真平台,画出实物图,进行仿真操作。使用c语言编程编写了系统应用程序;包括主程序模块、显示模块、温度测试模块。(2)测试方法:以成功显示时间、日期、温度且可调为最终目的。首先,主要是在仿真软件中进行初步测试,检测电路的设计问题。然后在实物上,检测电路的焊接以及有没有错误连线等问题。(3)测试仪器:万用表,计算机。(4)测试结果:通过按键,实现其按键所对应的功能,并观察测试结果,对设计进一步的进行校正和对实现功能的可靠性的确认,并记录观察结果。本设计测试结果成功完成了设计要求,达到设计目的。附 录附录一 器材元件清单元件器材:lcd1602 一个 单片机stc89c52 一个 滑动变阻器 一个 ds1302 一个底座 一个万用版 若干电池 三个电池盒 一个晶振12mhz 一个18b20 一个 32768hz的晶振 一个 30pf的电容 二个 10k的电阻 若干 1k的电阻 若干 button按键 四个导线 若干焊锡 若干附录二 源程序#include #include /#include lcd1602.h/#include ds1302.h#define uint unsigned int#define uchar unsigned charsbit ds1302_clk = p17; /实时时钟时钟线引脚 sbit ds1302_io = p16; /实时时钟数据线引脚 sbit ds1302_rst = p15; /实时时钟复位线引脚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 = p20; /模式切换键sbit up = p21; /加法按钮sbit down = p22; /减法按钮sbit out = p23; /立刻跳出调整模式按钮sbit dq = p10; /温度传送数据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= p25;sbit lcdrw= p26;sbit lcden = p27;sfr dbport = 0x80;/p0=0x80,p1=0x90,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)lcden=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_setdisplay(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); /初始化lcdvoid lcd_initial()lcden=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_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 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#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; 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数据 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 ds1302_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 = (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&0x0f);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 + 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 = /;if(hide_daydatestring8 = time-day/10 + 0; time-datestring9 = time-day%10 + 0; else time-datestring8 = ; time-datestring9 = ; if(hide_weekweek%10 + 0; /星期的数据另外放到 week_value数组里,跟年,月,日的分开存放,因为等一下要在最后显示 else week_value0 = ; week_value1 = 0;time-datestring10 = 0; /字符串末尾加 0 ,判断结束字符void timetostr(systemtime *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-timestring3 = ; 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) /判断时钟芯片是否关闭 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 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 readonechar(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

温馨提示

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

评论

0/150

提交评论