单片机课程设计电子万年历设计报告_第1页
单片机课程设计电子万年历设计报告_第2页
单片机课程设计电子万年历设计报告_第3页
单片机课程设计电子万年历设计报告_第4页
单片机课程设计电子万年历设计报告_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机课程设计课题:电子万年历设计系 别: 电气与电子工程系专 业: 电子信息工程姓 名: 学 号: 河南城建学院2011年 12 月 28 日成绩评定一、指导教师评语(根据学生设计报告质量、答辩情况及其平时表现综合评定)。二、评分评分项目设计报告评分答辩评分平时表现评分合 计 (100分)任务完成情 况(20分)课程设计报告质量(40分)表达情况(10分)回答问题情 况(10分)工作态度与纪律(10分)独立工作能力(10分)得分课程设计成绩评定班级 姓名 学号成绩: 分(折合等级 )指导教师签字 年 月 日目 录摘要abstract.1绪论(课题背景、概述、目的).12 设计要求与方案论述.

2、32.1设计要求.32.2创新要求 .32.3系统的方案选择.32.4 电路设计最终方案 .53 系统的硬件设计与实现.63.1电路设计框图.63.2 硬件设计原理概述.63.3 主要模块的设计.64系统的软件设计与实现.104.1程序流程框图.104.2程序的设计.105总结 .14参考文献 .15附录1硬件电路全图16附录2程序17摘 要本设计基于at89s51单片机,结合ds1302时钟芯片设计了一个数字万年历,显示部分用数码管动态显示,初始时间可由按键设置,此外还具有温度显示功能,掉电保护功能。万年历还具有节能模式,具有很强的实用性。关键词:单片机 万年历 数码管显示 温度abstra

3、ctthis paper is designed based on the at89s52 scm, combining ds1302 clock chip. display section is using digital tube dynamic display ; initial time can be set by the button ; in addition , it has the temperature display function and the power-off protected function. besides, it has energy saving mo

4、de;this calendar has strong digital tube display practicability.keywords:scm;calendar; digital tube display; temperature display1绪论1.1设计背景电子万年历是实现对年,月,日,时,分,秒数字显示的计时装置,广泛用于个人家庭,车站, 码头,办公室,银行大厅等场所,成为人们日常生活中的必需品。数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度远远超过老式钟表。钟表的数字化给人们生产生活带来了极大的方便,在此基础上完成的万年历精度高,功能易于扩展。可扩展成为诸

5、如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等电路。所有这些,都是以钟表数字化为基础的。因此,研究数字时钟及扩大其应用有着非常现实的意义。本设计就是数字时钟简单的扩展应用。万年历的设计过程在硬件与软件方面进行同步设计。1.2硬件部分硬件部分主要由at89s52单片机,led显示电路,以及调时按键电路等组成。在单片机的选择上使用at89s52单片机,该单片机适合于许多较为复杂控制应用场合。采用4-16译码器作为选择端,控制共阴数码管动态显示,结合时钟芯片ds1302和温度传感器18b20显示时间和温度。制作前在pr

6、oteus软件中嵌入单片机内进行仿真可以更好的进行硬件布局。1.3软件部分软件方面主要包括日历程序、时间调整程序,显示程序等。程序采用c语言编写,以便更简单地实现调整时间及阴历显示功能。所有程序编写完成后,在keil软件中进行调试,确定没有问题后,在proteus软件中嵌入单片机内进行仿真。2设计要求与方案论证2.1设计要求:2.1.1具有年、月、日、星期、时、分、秒等功能;2.1.2万年历具有闰月识别显示功能;2.1.3具备年、月、日、星期、时、分、秒校准功能;2.2 创新要求2.2.1万年历具有阴历显示功能;2.2.2 具有测量室内温度功能;2.3 系统基本方案选择和论证2.3.1单片机芯

7、片的选择方案和论证:方案一: 采用89c51芯片作为硬件核心,采用flash rom,内部具有4kb rom 存储空间,能于3v的超低压工作,而且与mcs-51系列单片机完全兼容,但是运用于电路设计中时由于不具备isp在线编程技术, 当在对电路进行调试时,由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。方案二: 采用at89s52,片内rom全都采用flash rom;能以3v的超底压工作;同时也与mcs-51系列单片机完全该芯片内部存储器为8kb rom 存储空间,同样具有89c51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的

8、错误修改或对程序的新增功能需要烧入程序时,不需要对芯片多次拔插,所以不会对芯片造成损坏。所以选择采用at89s52作为主控制系统.2.3.2 显示模块选择方案和论证:方案一: 采用led液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,但是价格昂贵,需要的接口线多,所以在此设计中不采用led液晶显示屏.方案二: 采用点阵式数码管显示,点阵式数码管是由八行八列的发光二极管组成,对于显示文字比较适合,如采用在显示数字显得太浪费,且价格也相对较高,所以也不用此种作为显示.方案三:采用led数码管动态扫描,led数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片

9、机连接时,占用的单片机口线少。所以采用了led数码管作为显示。2.3.3时钟芯片的选择方案和论证:方案一: 直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然减少芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。方案二: 采用ds1302时钟芯片实现时钟,ds1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的ram做为数据暂存区,工作电压2.5v5.5v范围内,2.5v时耗电小于300na.2.4 电路设计最终方案综上各方案所述,对此次作品的方案选定: 采用at89s5

10、2作为主控制系统; ds1302提供时钟;数字式温度传感器;led数码管动态扫描作为显示。3.系统的硬件设计与实现3.1 电路设计框图图2.1 电路设计框图3.2 系统硬件概述本电路是由at89s52单片机为控制核心,具有在线编程功能,低功耗,能在3v超低压工作;时钟电路由ds1302提供,它是一种高性能、低功耗、带ram的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5v5.5v。采用三线接口与cpu进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或ram数据。温度的采集由ds18b20构成;显示部份由17个数码管,74ls154译码器构

11、成。使用动态扫描显示方式对数字的显示。3.3 主要模块的设计3.3.1单片机主控制模块的设计 at89s52单片机为40引脚双列直插芯片,有四个i/o口p0,p1,p2,p3, mcs-51单片机共有4个8位的i/o口(p0、p1、p2、p3),每一条i/o线都能独立地作输出或输入。单片机的最小系统如下图所示,18引脚和19引脚接时钟电路,xtal1接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,xtal2接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出.第9引脚为复位输入端,接上电容,电阻及开关后够上电复位电路,20引脚为接地端,40引脚为电源端. 如图3.3.1

12、 所示图3.3.1 主控制系统3.3.2时钟电路模块的设计图3.3.2示出ds1302的引脚排列,其中vcc1为后备电源,vcc2为主电源。在主电源关闭的情况下,也能保持时钟的连续运行。ds1302由vcc1或vcc2两者中的较大者供电。当vcc2大于vcc1+0.2v时,vcc2给ds1302供电。当vcc2小于vcc1时,ds1302由vcc1供电。x1和x2是振荡源,外接32.khz晶振。rst是复位/片选线,通过把rst输入驱动置高电平来启动所有的数据传送。rst输入有两种功能:首先,rst接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,rst提供终止单字节或多字节数据的传送手段

13、。当rst为高电平时,所有的数据传送被初始化,允许对ds1302进行操作。如果在传送过程中rsts置为低电平,则会终止此次数据传送,i/o引脚变为高阻态。上电动行时,在vcc大于等于2.5v之前,rst必须保持低电平。中有在sclk 为低电平时,才能将rst置为高电平,i/o为串行数据输入端(双向)。sclk始终是输入端。图3.3.2 ds1302的引脚图3.3.3温度传感器模块图3.3.318b20的引脚图3.3.4显示模块的设计如图3.3.4所示,采用动态扫描显示,由17个数码管,4-16译码器74ls154接1k限流电阻接到共阴数码管的com端作为选通位码,每位选择相应的列,p0口输出数

14、据再接9013三极管送达数码管。图3.3.4显示模块4.系统的软件设计4.1程序流程框图图4.1程序流程框图4.2 子程序的设计4.2.1 读、写ds1302子程序unsigned char ds1302outputbyte(void) /实时时钟读取一字节(内部函数)void ds1302inputbyte(unsigned char d) /实时时钟写入一字节(内部函数)unsigned char read1302(unsigned char ucaddr)/读取ds1302某地址的数据void write1302(unsigned char ucaddr, unsigned char u

15、cda)/ucaddr: ds1302地址, ucdata: 要写的数据void write1302(unsigned char ucaddr, unsigned char ucda)write1302(0x8e,0x00) ;/允许写入write1302(0x8c,num) ;/写入yearwrite1302(0x8e,0x80) ;/禁止写操作4.2.2 读18b20子程序/读取温度unsigned char readtemperature(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;init_ds18b20();w

16、riteonechar(0xcc); / 跳过读序号列号的操作writeonechar(0x44); / 启动温度转换delay_18b20(200);init_ds18b20();writeonechar(0xcc); /跳过读序号列号的操作 writeonechar(0xbe); /读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=readonechar();b=readonechar();b4;t=b;return(t);4.2.3 显示模块子程序void display()/年 p2=0xf0; p0=seg2; delay(1);4.2.4按键子程序图4.2.4按键子程序流程图

17、5 总结在整个设计过程中,发挥团队精神,分工合作,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。较好的完成了作品。达到了预期的目的,在最初的设计中,相互学习、相互讨论、研究,完了最初的设想。在电路焊接时虽然没什么大问题,但从中也知道了焊接在整个作品中的重要性,电路工程量大,不能心急,一个个慢慢来不能急于求成。对电路的设计、布局要先有一个好的构思,才显得电路板美观、大方。程序编写中,由于思路不清晰,开始时遇到了很多的问题,经过静下心来思考,和同组员的讨论,理清了思路。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我们的耐心,做什么事都在有耐心。致谢:

18、 感谢学院给我们提供了一个展现自己的舞台,给我们一次难得煅炼的机会,使得我们的动手能力和专业技能都有了很大的提高。感谢给我帮助的老师和同学,在你们的帮助下我才能完成这次设计。参考文献1.张齐,朱宁西 单片机系统设计与开发 华南理工大学 电子机械出版社.20082.陈正振 电子电路设计与制作 广西交通职业技术学院信息工程系.20073.张友德,赵志英,涂时亮 单片微型机 复旦大学复旦大学出版社.2006 4.谭浩强. c程序设计(第三版).北京:清华大学出版社.20055.谭浩强. c程序设计题解与上机指导(第三版).北京:清华大学出版社.20056.徐慧 林锐 c语言实例解析精粹 .武汉:华中

19、理工大学出版社.19967.戴建鹏译 c语言大全(第三版) .北京:电子工业大学出版社.19948.杨恢先,黄辉先 单片机原理及应用 人民邮电出版社.2006附录1硬件电路全图附录2程序#include#define uchar unsigned char#define uint unsigned intsbit ds1302_clk = p11; /实时时钟时钟线引脚 sbit ds1302_io = p10; /实时时钟数据线引脚 sbit ds1302_rst = p12; /实时时钟复位线引脚sbit dq = p14 ; /18b20接口sbit mode=p34;sbit inc=

20、p35;sbit dec=p36;sbit power=p37;sbit week_wei=p15; /星期位选sbit encode=p16; /译码器使能sbit acc0 = acc0;/累加器位定义sbit acc7 = acc7;uchar code seg=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f;uchar temp,year,month,date,hour,minute,second,week,position;bit flag;/开关显示标志/*延时ms*/ void delay(uint z)uint x,y;for

21、(x=z;x0;x-)for(y=112;y0;y-);/* *ds1302驱动程序*/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

22、; 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数据 d

23、s1302_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_i

24、nit()if(read1302(0xc1) != 0xf0) write1302(0x8e,0x00) ;/允许写操作write1302(0xc0,0xf0) ; /写入初始化标志,系统上电后检测此标志,即此子函数只会在第一次初始化一次。/*时间初始值*/write1302(0x8c,0x10) ;/年write1302(0x88,0x04) ;/月write1302(0x86,0x06) ;/日write1302(0x84,0x22) ;/时write1302(0x82,0x59) ;/分write1302(0x80,0x55) ;/秒write1302(0x90,0xa4) ;/充电wr

25、ite1302(0x8e,0x80) ;/禁止写操作 /* *ds18b20驱动程序*/*/void delay_18b20(unsigned int i)/延时函数 while(i-);/*/18b20初始化函数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(10); x=dq; /稍做延时后 如果x=0则初始化成功 x=1则初始化失

26、败 delay_18b20(5);/读一个字节unsigned char readonechar(void)unsigned char i=0;unsigned char dat = 0;for (i=8;i0;i-) dq = 0; / 给脉冲信号 dat=1; dq = 1; / 给脉冲信号 if(dq) dat|=0x80; delay_18b20(5); return(dat);/写一个字节void writeonechar(unsigned char dat) unsigned char i=0; for (i=8; i0; i-) dq = 0; dq = dat&0x01; de

27、lay_18b20(5); dq = 1; dat=1; delay_18b20(5);/读取温度unsigned char readtemperature(void)unsigned char a=0;unsigned char b=0;unsigned char t=0;init_ds18b20();writeonechar(0xcc); / 跳过读序号列号的操作writeonechar(0x44); / 启动温度转换delay_18b20(200);init_ds18b20();writeonechar(0xcc); /跳过读序号列号的操作 writeonechar(0xbe); /读取

28、温度寄存器等(共可读9个寄存器) 前两个就是温度a=readonechar();b=readonechar();b4;t=b;return(t);/*/void display()/年 p2=0xf0; p0=seg2; delay(1); p2=0xf1; p0=seg0; delay(1); p2=0xf2; p0=segyear/16; delay(1); p2=0xf3; p0=segyear%16; delay(1);/month p2=0xf4; p0=segmonth/16; delay(1); p2=0xf5; p0=segmonth%16; delay(1); /date p

29、2=0xf6; p0=segdate/16; delay(1); p2=0xf7; p0=segdate%16; delay(1); /hour p2=0xf8; p0=seghour/16; delay(1); p2=0xf9; p0=seghour%16; delay(1); /minute p2=0xfa; p0=segminute/16; delay(1); p2=0xfb; p0=segminute%16; delay(1); /second p2=0xfc; p0=segsecond/16; delay(1); p2=0xfd; p0=segsecond%16; delay(1);

30、 /temp p2=0xfe; p0=segtemp/10; delay(1); p2=0xff; p0=segtemp%10; delay(1); /week encode=1; week_wei=0; p0=segweek; delay(1); encode=0; week_wei=1; p0=0;void set() if(mode=0) delay(5); if(mode=0) position+; if(position=7) position=0; while(!mode); /再次确认是否松开,松开就跳出while语句 / if(position=1) /year int num

31、; if(inc=0) delay(5); if(inc=0) num=read1302(0x8d); num=(num/16)*10+num%16; num+; if(num=99) num=0; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write1302(0x8c,num) ;/写入year write1302(0x8e,0x80) ;/禁止写操作 while(!inc); /再次确认是否松开,松开就跳出while语句 / else if(dec=0) delay(5); if(dec=0) num=read1302(0x8d

32、); num=(num/16)*10+num%16; num-; if(num=-1) num=99; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write1302(0x8c,num) ;/写入year write1302(0x8e,0x80) ;/禁止写操作 while(!dec); /再次确认是否松开,松开就跳出while语句 /year=read1302(0x8d); /年 p2=0xf0;p0=seg2;delay(4);p2=0xf1;p0=seg0;delay(4);p2=0xf2;p0=segyear/16;delay

33、(4);p2=0xf3;p0=segyear%16;delay(4); / /*/else if(position=2) /month int num; if(inc=0) delay(5); if(inc=0) num=read1302(0x89); num=(num/16)*10+num%16; num+; if(num=13) num=1; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write1302(0x88,num) ;/写入month write1302(0x8e,0x80) ;/禁止写操作 while(!inc); /

34、再次确认是否松开,松开就跳出while语句 / else if(dec=0) delay(5); if(dec=0) num=read1302(0x89); num=(num/16)*10+num%16; num-; if(num=0) num=12; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write1302(0x88,num) ;/写入month write1302(0x8e,0x80) ;/禁止写操作 while(!dec); /再次确认是否松开,松开就跳出while语句 /month=read1302(0x89); /mo

35、nth p2=0xf4; p0=segmonth/16; delay(8); p2=0xf5; p0=segmonth%16; delay(8); / /*/else if(position=3) /date int num; if(inc=0) delay(5); if(inc=0) num=read1302(0x87); num=(num/16)*10+num%16; num+; if(num=32) num=1; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write1302(0x86,num) ;/写入date write13

36、02(0x8e,0x80) ;/禁止写操作 while(!inc); /再次确认是否松开,松开就跳出while语句 / else if(dec=0) delay(5); if(dec=0) num=read1302(0x87); num=(num/16)*10+num%16; num-; if(num=0) num=31; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write1302(0x86,num) ;/写入date write1302(0x8e,0x80) ;/禁止写操作 while(!dec); /再次确认是否松开,松开就跳

37、出while语句 /date=read1302(0x87); /date p2=0xf6; p0=segdate/16; delay(8); p2=0xf7; p0=segdate%16; delay(8); / /*/else if(position=4) /hour int num; if(inc=0) delay(5); if(inc=0) num=read1302(0x85); num=(num/16)*10+num%16; num+; if(num=24) num=0; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write

38、1302(0x84,num) ;/写入hour write1302(0x8e,0x80) ;/禁止写操作 while(!inc); /再次确认是否松开,松开就跳出while语句 / else if(dec=0) delay(5); if(dec=0) num=read1302(0x85); num=(num/16)*10+num%16; num-; if(num=-1) num=23; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write1302(0x84,num) ;/写入hour write1302(0x8e,0x80) ;/禁

39、止写操作 while(!dec); /再次确认是否松开,松开就跳出while语句 /hour=read1302(0x85); p2=0xf8; p0=seghour/16; delay(8); p2=0xf9; p0=seghour%16; delay(8); / /*/else if(position=5) /minute int num; if(inc=0) delay(5); if(inc=0) num=read1302(0x83); num=(num/16)*10+num%16; num+; if(num=60) num=0; num=(num/10)*16+num%10; write1302(0x8e,0x00) ;/允许写入 write1302(0x82,num) ;/写入minute write1302(0x8e,0x80) ;/禁止写操作 while(!inc);

温馨提示

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

评论

0/150

提交评论