电子万历设计与调试设计说明书.doc
课程设计说明书课程名称基于proteus的单片机项目时间教程设计题目 电子万年历设计与调试 专业 班级姓名 学号教师 职称系20年 月 日目 录第1章 方案论证与比较31.1控制器选择31.2显示设备选择41.3输入器件选择41.4温度传感器51.5时间控制芯片6第2章 仿真电路设计72.1控制系统框图72.2仿真电路设计72.3 主要元器件清单8第3章 软件程序设计103.1 液晶显示模块103.2 温度控制模块143.3 时间控制模块193.4 按键扫描模块23设计总结29参考文献30第1章 方案论证与比较以单片机为控制器设计的电子万年历单片机最小系统、利用温度传感器采集外界温度,利用时钟控制芯片进行时间控制,利用输入器件进行参数调整,并通过显示设备进行参数显示。1.1控制器选择方案一:AT89S52(图1-1)是ATMEL公司一款高性能8位单片机,兼容标准的MCS51指令系统级80C51引脚结构,片内含8K的可反复擦写的Flash只读存储器,256B的内部数据存储器,具有4个并行I/O口,1个全双工串行口, 3个16位的定时/计数器,6个中断源,2个中断优先级,广泛应用于各种控制系统中。 图1-1方案二:STC89C52RC(图1-2)是宏晶科技公司的一款高性能低功耗8位单片机,兼容标准的8051内核,片内含8K的可反复擦写的Flash只读存储器,256B的内部数据存储器,具有4个并行I/O口,1个全双工串行口, 3个16位的定时/计数器,6个中断源,2个中断优先级,广泛应用于各种控制系统中。 图1-2方案选择:二者在结构和功能上基本一样,与AT89S52相比,STC89C52RC具有更好的性价比,实用性好,因此选择STC89C52RC为控制器。1.2显示设备选择方案1:LED数码管(图1-3)是由LED发光二极管组合显示字符的显示器件。它使用了8个LED发光二极管,其中7个用于显示字符,1个用于显示小数点,故通常称为7段发光二极管。数码管静态显示特点是数码管恒定亮,亮度较高,显示某个数值,直到显示字符的编码改变为止。这种显示方式由于太占据I/O线,所以用于1个或较少数码管显示的场合。数码管动态显示特点是数码管轮流点亮,显示亮度不够,所以通常加驱动电路,由于此中显示方式可以节省I/O口,所以用于多个数码管显示的场合。 图1-3方案2:LCD液晶屏(如图1-4)是一种专门用于显示字母、数字、符号等ASCII码的显示器件。LCD1602是一种常用的字符型液晶显示器,控制器大部分为HD44780,接口标准为SIP16引脚,分电源、通讯数据和控制3部分。LCD1602芯片和背光电路工作电压与单片机兼容,可以很方便的与单片机连接。 图1-4方案选择:LED数码管占I/O线较多设计不方便,LCD1602可以显示跟多内容节省I/O口可以很方便的与单片机连接故选LCD1602液晶屏。 1.3输入器件选择方案1:独立按键(如图1-5)的使用较简单,其特点是每个按键单独占用一根I/O口线,每个按键不会影响其它I/O口线的状态。方案2:矩阵按键(如图1-6)采用行列式结构并按照矩阵形式排列,可以节省I/O口。 图1-5图1-6按键选择:由于电路需要按键功能较多所以选择独立按键更加方便。 1.4温度传感器 方案1:数字温度传感器(DS18 B20)(如图1-7)是DALLAS公司生产的1-Wire,即单总线器件,具有线路简单、体积小的特点。因此用它来组成一个测温系统,具有线路简单,在一根通信线可以接多个相同数字温度计的优点,十分方便。方案2:DS1621是DALLAS(如图1-8)公司生产的一种功能较强的数字式温度传感器和恒温控制器。与同系列的DS1620相比控制更为简单,接口与12C总线兼容,且可以使用一片控制器控制多达8片的DS1621,其数字温度输出达9位,精度为0.5。通过读取内部的计数值和用于温度补偿的每摄氏度计数值,利用公式计算还可提高温度值的精度。DS1621可工作在最低2.7V电压下,适用于低功耗应用系统。利用DS1621和一片51单片机即可构成一个简洁但功能强大的低电压温度测量控制系统 图1-7 图1-8 1.5时间控制芯片方案1时钟芯片DS12887是一个内嵌锂电池的并行通讯芯片,该器件提供完整的实时时钟/日历、定时闹钟,还包含三个可屏蔽中断(共用一个中断输出)以及可编程方波输出。DS12887内部还提供114字节静态RAM ,这些存储器是内部锂电池供电的,因此数据不会丢失。DS12C887对于少于31天的月份,其日期能够在月末自动调整,带有闰年的月份可以自动补偿。该器件可配置为24小时或12小时格式。精确的温度补偿电路用于监视的VCC状态。一旦检测到主电源失效,器件可自动切换到备用电源。支持Intel和Motorola模式。主要特点是:· RTC计算秒、分、时、星期、日、月、年信息,具有润年补偿,有效期至2099年; · 用二进制或BCD表示时间 ;· 具有AM、PM标示的12小时模式或24小时模式 ;· 可选择Intel或Motorola总线时序 ;· 内部包含128字节存储单元,其中114字节供用户自由使用;· 三路中断可分别通过软件屏蔽与检测 ;· 闹钟可设置为每秒一次至每星期一次 ;· 可编程的方波输出信号; · 自动电源失效检测和切换电路。方案2 DS1302是一种可编程的串行实时时钟芯片,内部具有实时时钟、日历和用户可用RAM,可计算2100年之前的秒、分、时、日、月、周、年,且对月末日期、闰年天数可自动调整,RAM容量为31×8bit,以SPI串行总线方式向单片机传送单字节或多字节的实时时间数据,当主电源断电时备用电源可继续保持时钟连续运行。方案选择:第2章 仿真电路设计2.1控制系统框图根据控制系统要求设计的电子万年历控制系统由单片机STC89S52RC构成的最小系统,由独立按键构成的按键扫描电路、由LCD1602构成的显示电路,由DS1302构成的时间控制电路以及由DS18B20构成的温度采集电路等,控制系统框图如图2-1所示。图2-1 控制系统框图2.2仿真电路设计设计的电子万年历仿真图如图2-2所示,其中单片机最小系统由单片机、时钟电路、复位电路和电源组成,按键扫描电路由选择、调整和确定三个独立按键构成,温度采集电路由单总线温度传感器DS18B20和上拉电阻组成,时钟控制电路由时间I²C总线协议的时钟芯片DS1302和晶振构成,液晶显示电路由LCD1602液晶和排阻以并行连接方式与单片机相连,滑动变阻器用来调节液晶显示亮度。图2-2 电子万年历仿真图2.3 主要元器件清单电子万年历元器件清单如表2-1所示:表2-1 电子万年历元器件清单序号元器件名称规格型号数量标号备注1单片机STC89S52RC1U1DIP封装2液晶LM016L1LCD1并行接口3按键四脚4功能控制4晶振12MHz1X1时钟电路532768Hz1X2时钟控制6电容30pF2C1 C2瓷片,时钟电路10uf1C3电解,复位电路7电阻10k1R1复位4.7k1R2上拉8温度传感器DS18B201U2温度采集9时钟控制芯片DS13021U3时间控制10排阻1K1RP1上拉电阻第3章 软件程序设计电子万年历程序采用自下而上的模块化编程方式,根据控制任务要求,将程序划分为主程序、液晶显示模块、温度采集模块、时间控制模块和按键扫描模块5个模块,其结构如图3-1所示:图3-1 程序结构图3.1 液晶显示模块液晶显示模块完成日期、时间和温度显示,主要有初始化函数、写命令函数、写数据函数和液晶显示函数4部分组成。(1)液晶写命令函数液晶写命令操作时序图如图3-2所示,由此设计的流程图如图3-3所示:图3-2 液晶写命令操作时序图(2)液晶写数据函数液晶写数据操作时序图如图3-4所示,由此设计的流程图如图3-5所示:图3-4 液晶写数据操作时序图 图3-3 写命令流程图 图3-5 写数据流程图(3)液晶初始化函数液晶初始化函数流程图如图3-6所示: 图3-6液晶显示函数流程图如图3-7所示: 图3-7 液晶显示模块程序清单如下:/*头文件及宏定义*/#include<reg52.h>#define uchar unsigned char/*变量声明及定义*/sbit RS=P22;sbit RW=P23;sbit E=P24;uchar lcd1="D: - - W: "uchar lcd2="T: : : T: "/*延时函数*/void delay()uchar x;for(x=100;x>0;x-);/*液晶写命令控制函数*/void lcd_com(uchar com)RS=0;/命令RW=0;/写操作E=1;/使能有效P0=com;/送命令E=0;/使能无效delay();/延时RW=1;/复位RS=1;/*液晶写数据控制函数*/void lcd_dat(uchar dat)RS=1;/数据RW=0;/写操作E=1;/使能有效P0=dat;/送数据E=0;/使能无效delay();/延时RW=1;/复位RS=1;/*液晶初始化控制函数*/void lcd_init()lcd_com(0x38);/模式设置lcd_com(0x0c);/显示设置lcd_com(0x01);/清屏lcd_com(0x06);/输入模式/*液晶显示控制函数*/void disp_lcd()uchar i;lcd_com(0x80); /第一行地址for(i=0;i<16;i+)lcd_dat(lcd1i);lcd_com(0xc0); /第二行地址for(i=0;i<16;i+)lcd_dat(lcd2i);3.2 温度控制模块温度控制模块包括DS18B20初始化函数、写字节函数、读字节函数、温度控制函数4个部分。(1)初始化函数DS18B20初始化时序图如图3-8所示,流程图如图3-9所示。图3-8图3-9 初始化流程图(2)写字节函数DS18B20写字节函数时序图如图3-10所示,流程图如图3-11所示。图3-10 写字节时序图图3-11 写字节流程图(2)读字节函数DS18B20读字节函数时序图如图3-12所示,流程图如图3-13所示。图3-12 写数据时序图图3-13 写数据流程图(4)温度控制函数温度控制函数流程图如图3-14所示。图3-13 写数据流程图温度控制程序头文件如下:#ifndef _DS18B20_H_#define _DS18B20_H_ void temperate();#endif温度控制程序清单如下:/*头文件及宏定义*/#include<reg51.h>#define uchar unsigned char/*变量声明及定义*/uchar t,value=0x00,0x00;bit s;sbit DQ=P17;extern uchar lcd2;/*延时控制函数*/void del(uchar t)/7usuchar i;for(i=t;i>0;i-);/*18B20初始化控制函数*/uchar init_18b20()uchar status;DQ=1;DQ=0;del(100);/700usDQ=1;del(5);/35usstatus=DQ;del(25);/175usDQ=1;del(30);/210usreturn status;/*读18B20控制函数*/uchar rd_18b20()uchar i,dat=0;for(i=0;i<8;i+)DQ=1;DQ=0;dat>>=1;DQ=1;if(DQ=1)dat|=0x80;del(5);/35usDQ=1;return dat;/*写18B20控制函数*/void wr_18b20(uchar dat)uchar i;DQ=1;for(i=0;i<8;i+)DQ=0;del(1);/7usDQ=dat&0x01;del(5);/35usDQ=1;dat>>=1;/*温度控制函数*/void temperate()init_18b20();wr_18b20(0xcc);wr_18b20(0x44);init_18b20();wr_18b20(0xcc);wr_18b20(0xbe);value0=rd_18b20();value1=rd_18b20();if(value1&0xf8)=0xf8)s=1;value0=value0+1; if(value0=0x00)value1=value1+1;elsevalue1=value1;elses=0;t=(value0>>4)|(value1<<4);if(s=1)lcd213='-'elselcd213=t/100+'0'lcd214=t%100/10+'0'lcd215=t%10+'0'3.3 时间控制模块时间控制模块包括读字节函数、写字节函数、读数据函数、写数据函数和初始化函数5部分组成。(1)读字节函数读字节操作时序图如图3-14所示,读字节函数流程图如图3-15所示:图3-14 读字节操作时序图 开始结束初始化写入1位数据CLK=1,CLK=0数据移位8位数据完成NY 图3-15 读字节函数流程图 (2)写字节函数写字节操作时序图如图3-16所示,读字节函数流程图如图3-17所示:图3-16 写字节操作时序图(3)读数据函数读数据函数流程图如图3-18所示:(4)写数据函数写数据函数流程图如图3-19所示: 图1-7 图1-8 图1-9(5)初始化函数初始化函数流程图如图3-20所示:时间控制模块头文件如下:#ifndef _1302_H_#define _1302_H_ #define uchar unsigned charvoid set_1302(uchar wei,uchar beet);void time();#endif时间控制模块程序清单如下:/*头文件及宏定义*/#include<reg52.h>#define uchar unsigned char#define uint unsigned int/*变量声明及定义*/sbit CLK=P10;sbit SDA=P11;sbit RST=P12;uchar *week="*","SUN","MON","TUS","WEN","THU","FRI","SAT"uchar datetime7;extern bit flag;extern uchar lcd1,lcd2;/*1302写数据控制函数*/void wr_1302(uchar dat)uchar i;for(i=0;i<8;i+)SDA=dat&0X01;CLK=1;CLK=0;dat>>=1;/*1302读数据控制函数*/uchar rd_1302()uchar i,b,t;for(i=0;i<8;i+)b>>=1;t=SDA;b|=t<<7;CLK=1;CLK=0;return b/16*10+b%16;/*读数据控制函数*/uchar rd_dat(uchar addr)uchar dat;RST=0;CLK=0;RST=1;wr_1302(addr);dat=rd_1302();CLK=1;RST=0;return dat;/*写数据控制函数*/void wr_dat(uchar add,uchar dat)RST=0;CLK=0;RST=1;wr_1302(add);CLK=0;wr_1302(dat);CLK=0;RST=0;/*时间数据写入控制函数*/void set_1302(uchar wei,uchar beet)wr_dat(0x8e,0x00);wr_dat(wei,beet);wr_dat(0x8e,0x80);/*时间控制函数*/void time()uchar i;if(flag=0)for(i=0;i<7;i+)datetimei=rd_dat(0x81+2*i);lcd113=*(weekdatetime5);lcd114=*(weekdatetime5+1);lcd115=*(weekdatetime5+2);lcd18=datetime3/10+'0'lcd19=datetime3%10+'0'lcd15=datetime4/10+'0'lcd16=datetime4%10+'0'lcd12=datetime6/10+'0'lcd13=datetime6%10+'0'lcd28=datetime0/10+'0'lcd29=datetime0%10+'0'lcd25=datetime1/10+'0'lcd26=datetime1%10+'0'lcd22=datetime2/10+'0'lcd23=datetime2%10+'0'3.4 按键扫描模块按键扫描模块包含延时消抖函数、按键处理函数、选择按键函数、调节按键函数和确定按键函数5个部分。(1)按键处理函数按键处理函数程序流程图如图3-22所示:图3-22 按键处理函数程序流程图(2)选择按键函数选择按键函数程序流程图如图3-23所示:(3)确定按键函数确定按键函数程序流程图如图3-24所示:图3-23 图 3-24(4)调节按键函数调节按键函数程序流程图如图3-25所示:图3-25按键处理模块头文件如下:#ifndef _KEY_H_#define _KEY_H_void key();#endif按键处理模块程序清单如下:/*头文件及宏定义*/#include<reg52.h>#include"1302.h"/*变量声明及定义*/#define uchar unsigned charuchar k,set,shi,fen,miao,day,month,w,year;bit flag;extern uchar lcd1,lcd2,*week;/*按键消抖函数*/void del()uchar i,j;for(i=0;i<10;i+)for(j=0;j<250;j+); /*选择按键控制函数*/void key_xuan()flag=1;set+;if(set=7)set=0;/*调节按键控制函数*/void key_tiao()if(set=0)year+;if(year=100)year=0;lcd12=year/10+'0'lcd13=year%10+'0'if(set=1)month+;if(month=13)month=1;lcd15=month/10+'0'lcd16=month%10+'0'if(set=2)day+;if(month=0)|(month=2)|(month=4)|(month=6)|(month=7)|(month=9)|(month=11)&&(day=32)day=1;if(month=3)|(month=5)|(month=8)|(month=10)&&(day=31)day=1;if(year%4=0)&&(month=2)&&(day=30)day=1;if(year%4!=0)&&(month=2)&&(day=29)day=1;lcd18=day/10+'0'lcd19=day%10+'0'if(set=3)w+;if(w=8)w=1;lcd113=*(weekw);lcd114=*(weekw+1);lcd115=*(weekw+2);if(set=4)shi+;if(shi=24)shi=0;lcd22=shi/10+'0'lcd23=shi%10+'0'if(set=5)fen+;if(fen=60)fen=0;lcd25=fen/10+'0'lcd26=fen%10+'0'if(set=6)miao+;if(miao=60)miao=0;lcd28=miao/10+'0'lcd29=miao%10+'0'/*确定按键控制函数*/void key_ding()set_1302(0x80,(miao/10)<<4)|(miao%10);set_1302(0x82,(fen/10)<<4)|(fen%10);set_1302(0x84,(shi/10)<<4)|(shi%10);set_1302(0x86,(day/10)<<4)|(day%10);set_1302(0x88,(month/10)<<4)|(month%10);set_1302(0x8A,w);set_1302(0x8c,(year/10)<<4)|(year%10);set=0;flag=0;/*按键识别控制函数*/void key()P3=0xff;if(P3&0x07)!=0x07)del();if(P3&0x07)!=0x07)flag=1;k=P3&0X07;while(P3&0x07)!=0x07);switch(k)case 0x06:key_xuan();break;case 0x05:key_tiao();break;case 0x03:key_ding();break;default: break;3.5 主函数程序主函数程序首先进行液晶初始化,然后调用温度采集程序、时间控制程序和液晶显示函数,其流程图如3-25所示:主函数程序清单如下:/*头文件及宏定义*/#include"lcd.h"#include"DS18B20.h"#include"1302.h"#include"key.h"/*主函数*/void main()lcd_init();while(1)temperate();time();disp_lcd();key();设计总结这学期我们选择了单片机这门课,从第一节课开始,我们就感觉到了这门课与其他的课有一些不同。单片机课程不仅是学习书本的内容,也需要从实验中掌握知识。这门课程确实让我们受到了很多的启发,并学到了很多的知识。 学习单片机,要掌握单片机指令系统中汇编语言各种基本语句的意义及汇编语言程序设计的基本知识和方法,以及单片机与其他设备相连接的输入输出中断等接口技术。使我们从硬件软件的结合上理论联系实际,提高动手能力,从而全面掌握单片机的应用。熟悉单片机的人都知道,要学好单片机可不是一件容易的事万事开头难、要勇敢迈出第一步知识点用到才学,不用的暂时丢一边。在学习这门课程时,我遇到过许多困难,这并不可怕,因为只要我们敢于面对,团结合作,就没有解决不了的问题。在焊接电路过程中,我们需要互接技巧,互相帮助、互相鼓励。在编写程序时候要虚心向同学和老师请教。总之,学习单片机这门课程,不仅学会了这门专业课的知识,还提高了我的自主学习能力,更让我的世界观、方法论有了深层的提高,谢谢老师对我的教诲,让我受益匪浅。参考文献1 彭伟.单片机C语言程序设计实训100例M.北京:电子工业出版社,2009.2 唐继贤.51单片机工程应用实例M.北京:北京航空航天大学出版社,2009.3 张靖武,周灵斌.单片机原理、应用与PROTEUS仿真M.北京:电子工业出版社,2008。4 曾一江.单片机原理与接口技术M.北京:科技出版社,2009。5 陈杰,黄鸿.传感与检测技术M.北京:高等教育出版社,2010。6 石生,韩肖宁.电路基本分析M.北京:高等教育出版社,2008。7 杨志忠,卫桦林.数字电子技术M.北京:高等教育出版社,2008。8 胡宴如,耿素艳.模拟电子技术M.北京:高等教育出版社,2008。9 张子红,马鸣霄,刘鑫等.Altium Designer6.6电路原理图与电路板设计教程M.北京:海军出版社,2009。