BJSP-014_ -|五吏├甘孜体育馆
淘宝减肥药排行榜十强
只推淘宝安全有效的减肥药

当前位置:BJSP-014 > 减肥产品

BJSP-014

时间:2021-01-21 13:30  编辑:惠阳菜市场

BJSP-014

中州大学

信息工程学院

课程设计

【基于单片机的万年历】

专业:[计算机应用技术]

班级:[11计应班]

学生姓名:[XXXXXXXXXXXXXX]

指导教师:[刘爱荣老师]

完成时间:2013年6月5日

摘要

本文借助电路仿真软件Protues对基于STC89C52单片机的电子万年历的设计方法及仿真进行了全面的阐述。该电子万年历在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、LCD12864点阵液晶显示屏显示。STC89C52单片机是由深圳宏晶公司推出的,功耗小,电压可选用4~6V电压供电;DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。此外,该电子万年历还具有时间校准等功能。在软件方面,主要包括日历程序、时间调整程序,显示程序等。所有程序编写完成后,在Keil软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。

论文主要研究了液晶显示器LED及时钟芯片DS1302,温度传感器DS18B20与单片机之间的硬件互联及通信,对数种硬件连接方案进行了详尽的比较,在软件方面对日历算法也进行了论述。

研究结果表明,由于万年历的应用相当普遍,所以其设计的核心在于硬件成本的节约软件算法的优化,力求做到物美价廉,才能拥有更广阔的市场前景。

关键词:单片机;DS1302;LCD12864

Abstract

ThispapermainlydiscussthedesignandsimulationofelectroniccalenderbasedonSTC89C52withthehelpofProtues.Onthehardwareside,theelectroniccalendarusingSTC89C52microcontrollerasthemaincontrolcenter,clockprovidedbytheDS1302clockchip,1602LEDdotmatrixLCDdisplay.AtmelCorporationSTC89C52microcontrollerisproductedbyAtmelCorporation,lowpowerconsumption,voltagecanbeselected4V~6Vvoltagepowersupply;DS1302clockchip,launchedintheUnitedStateswithDALLASsmallcurrentchargingfunctionrealtimeclockchip,lowpowerconsumption,itcanbeyears,month,date,day,hour,minute,secondstime,alsohasaleapyearcompensationandotherfunctions,andDS1302longlife,smallerror;LEDdigitaldisplayisusedinLCDdisplaysthatcandisplayin,month,day,week,hours,minutes,secondsandotherinformation.Inaddition,theelectroniccalendarisalsoatimecalibrationfunctions.Intermsofsoftware,includingcalendarprogram,timetoadjustprocedures,displayprocedures.Allprogrammingiscomplete,theKeilsoftwaredebugging,makesurethereisnoproblem,intheProteussoftwareembeddedwithinthesimulatedMCU.

ThisarticlefocusonliquidcrystalscreenLCD12864andclockchipDS1302,temperaturesensorDS18B20whichconnectedandcommunicatedwithMicrocontroller.Severalsolutionswillalsocomparedwitheachother.Onsoftwareside,calendercalculationwillbediscussedaswell.

Theresultsareasfollows:aselectroniccalenderarewidelyusedinourdailylife.Itshould

bechipandconvenientsoastowinmoreprofit.

Keywords:Microcontroller,DS1302;DS18B20;LCD12864

目录

摘要2

Abstract3

绪论5

第一章功能描述7

1.1系统基本方案选择和认证7

1.1.1单片机芯片的选择7

1.1.2显示模块选择方案7

1.1.3时钟芯片的选择方案和认证7

1.1.4温度传感器的选择方案与认证8

1.1.5红外遥控器与红外接收管的选择9

1.2电路设计最终方案决定10

第二章系统的硬件设计与实现10

2.1主要单元电路的设计10

2.1.1单片机主控制模块的设计10

2.1.2单片机中断系统11

2.1.3DS1302工作原理及说明13

2.1.4LCD12864工作原理及说明15

2.1.5VS1838B红外模块原理及说明18

第三章硬件设计方案20

3.1系统硬件概述20

3.1.1设计思想20

3.1.2硬件电路图及说明21

第四章软件流程图22

4.1程序流程图22

4.1.1主程序框图22

4.1.2主程序流程图22

4.1.3时间调整流程图24

4.1.4子程序25

第五章系统测试25

5.1硬件测试25

5.2软件测试25

结束语26

参考文献27

网络支持27

附录:程序28

绪论

随着社会、科技的发展,人类得知时间,从观太阳、摆钟到现在电子钟,不断研究、创新。为了在观测时间的同时,能够了解其它与人类密切相关的信息,比如温度、星期、日期等,电子万年历诞生了,它集时间、日期、星期和温度功能于一身,具有读取方便、显示直观、功能多样、电路简洁等诸多优点,符合电子仪器仪表的发展趋势。伴随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。由其是单片机技术的应用产品已经走进了千家万户。电子万年历的出现给人们的生活带来的诸多方便,作为一种附加功能,现在越来越广泛的被应用于各种电子产品中,具有广阔的市场前景。

通过以往对工业自动化的相关课程学习和理解独立完成制作电子万年历的设计。电子万年历作为电子类小产品不仅是市场上的宠儿,也是是单片机设计培训中一个很实用的题目。因为这个课题有很好的开放性和可发挥性,对制作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。而且要求设计的电子万年历在操作上力求简洁,功能上尽量齐全,显示界面也要出色。所以,电子万年历制作无论从实用目的,还是从培养能力的角度来看都是很有价值的毕业设计课题。本电子万年历的设计在硬件方面主要采用STC89C52单片机作为主控核心,由DS1302时钟芯片提供时钟、1602LCM点阵液晶显示屏显示。STC89C52单片机是由Atmel公司推出的,功耗小,电压可选用4~6V电压供电[1];DS1302时钟芯片是美国DALLAS公司推出的具有涓细电流充电功能的低功耗实时时钟芯片,它可以对年、月、日、星期、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小;数字显示是采用的LED液晶显示屏来显示,可以同时显示年、月、日、星期、时、分、秒等信息。最后在老师同学的帮助以及自己的努力下完成了此次电子万年历的设计。

第一章功能描述1.1系统基本方案选择和认证1.1.1单片机芯片的选择

STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。STC89C52使用经典的MCS-51内核,但做了很多的改进使得芯片具有传统51单片机不具备的功能。在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32位I/O口线,看门狗定时器,内置4KBEEPROM,MAX810复位电路,3个16位定时器/计数器,4个外部中断,一个7向量4级中断结构(兼容传统51的5向量2级中断结构),全双工串行口。另外STC89C52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35MHz,6T/12T可选。[1]

1.1.2显示模块选择方案

LCD12864分为两种,带字库和不带字库的,个人比较喜欢不带字库的,因为显示汉字的时候可以选择自己喜欢的字体,而带字库的液晶,只能显示GB2312的宋体,当然了,也可以显示其他的字体,不过不是液晶本身字库中带的了,而是用图片的形式显示。

1.1.3时钟芯片的选择方案和认证

方案一:

直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。采用此种方案虽然可以减少时钟芯片的使用,节约成本,但是,实现的时间误差较大。所以不采用此方案。

方案二:

采用DS1302时钟芯片实现时钟,DS130是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力。主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768kHz晶振[4]。因此,本设计中采用DS1302提供时钟。

1.1.4温度传感器的选择方案与认证

方案一:

使用热敏电阻作为传感器,用热敏电阻与一个相应阻值电阻相串联分压,利用热敏电阻阻值随温度变化而变化的特性,采集这两个电阻变化的分压值,并进行A/D转换。此设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差[5]。

方案二:

采用数字式温度传感器DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低硬件成本,简化系统电路[6]。另外,数字式温度传感器还具有测量精度高、测量范围广等优点。因此,本设计DS18B20温度传感器作为温度采集模块。

1.1.5红外遥控器与红外接收管的选择

红外信号收发系统的典型电路如图1所示,红外接收电路通常被厂家集成在一个元件中,成为一体化红外接收头。内部电路包括红外监测二极管,放大器,限副器,带通滤波器,积分电路,比较器等。红外监测二极管监测到红外信号,然后把信号送到放大器和限幅器,限幅器把脉冲幅度控制在一定的水平,而不论红外发射器和接收器的距离远近。交流信号进入带通滤波器,带通滤波器可以通过30khz到60khz的负载波,通过解调电路和积分电路进入比较器,比较器输出高低电平,还原出发射端的信号波形。注意输出的高低电平和发射端是反相的,这样的目的是为了提高接收的灵敏度。

红外接收头的种类很多,引脚定义也不相同,一般都有三个引脚,包括供电脚,接地和信号输出脚。根据发射端调制载波的不同应选用相应解调频率的接收头。

  大体积红外接收头IRM38A引脚说明

红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。

红外发射器可从遥控器厂家定制,也可以自己用单片机的PWM产生,家庭遥控推荐使用红外发射管(L5IR4-45)的可产生37.91KHz的PWM,PWM占空比设置为1/3,通过简单的定时中断开关PWM,即可产生发射波形。在这次设计中选择HX1838接收管跟红外遥控模块

1.2电路设计最终方案决定

综上各模块的选择方案与论证,确定最后的主要硬件资源如下:采用STC89C52作为主控制系统;DS1302提供时钟;DS18B20作为数字式温度传感器;LCD12864液晶屏作为显示。HX1838作为红外接收器

第二章系统的硬件设计与实现2.1主要单元电路的设计2.1.1单片机主控制模块的设计

STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K在系统可编程Flash存储器。如图2.1.1所示

图2.1.1单片机最小系统

2.1.2单片机中断系统

在提及单片机的最小系统后,现对单片机的另一重要应用系统即中断系统做一个比较详细的介绍。

在CPU与外设交换信息时,存在着一个快速CPU与慢速的外设之间的矛盾。为解决这个问题,发展了中断的概念。单片机在某一时刻只能处理一个任务,当多个任务同时要求单片机处理时,这一要求应该怎么实现呢?通过中断可以实现多个任务的资源共享。所谓的中断就是,当CPU正在处理某项事务的时候,如果外界或者内部发生了紧急事件,要求CPU暂停正在处理工作而去处理这个紧急事件,待处理完后,再回到原来中断的地方,继续执行原来被中断的程序,这个过程称作中断。

从中断的定义我们可以看到中断应具备中断源、中断响应、中断返回这样三个要素。中断源发出中断请求,单片机对中断请求进行响应,当中断响应完成后应进行中断返回,返回被中断的地方继续执行原来被中断的程序。MCS-51单片机的中断源共有两类,它们分别是:外部中断和内部中断。外部中断0(INT0)来自P3.2引脚,通过外部中断0触发方式控制位IT0(TCON.0),来决定中断输入信号是低电平有效还是负跳变有效。一旦输入信号有效,便使IE0标志置一,向CPU申请中断;外部中断1(INT1)来自P3.3引脚,通过外部中断1触发方式控制位IT1(TCON.2),来决定中断输入信号是低电平有效还是负跳变有效。一旦输入信号有效,便使IE0标志置一,向CPU申请中断。内部中断有三个:TF0,TF1,RI或TI。TF0(TCON.5),片内定时/计数器T0溢出中断请求标志。当定时/计数器T0发生溢出时,置位TF0,并向CPU申请中断;TF1(TCON.7),片内定时/计数器T1溢出中断请求标志。当定时/计数器T1发生溢出时,置位TF1,并向CPU申请中断;RI(SCON.0)或TI(SCON.1),串行口中断请求标志。当串行口接收完一帧串行数据时置位RI或当串行口发送完一帧串行数据时置位TI,向CPU申请中断[10]。

MCS-51单片机为用户提供了四个专用寄存器,来控制单片机的中断系统。定时器控制寄存器(TCON),该寄存器用于保存外部中断请求以及定时器的计数溢出。进行字节操作时,寄存器地址为88H。按位操作时,各位的地址为88H~8FH,当CPU采样到INT0(或INT1)端出现有效中断请求时,IE0(IE1)位由硬件置“1”。当中断响应完成转向中断服务程序时,由硬件把IE0(或IE1)清零,当计数器产生计数溢出时,相应的溢出标志位由硬件置“1”。当转向中断服务时,再由硬件自动清“0”。计数溢出标志位的使用有两种情况:采用中断方式时,作中断请求标志位来使用;采用查询方式时,作查询状态位来使用;串行口控制寄存器(SCON),进行字节操作时,寄存器地址为98H。按位操作时,各位的地址为98H~9FH,当发送完一帧串行数据后,由硬件置“1”;在转向中断服务程序后,用软件清“0”,当接收完一帧串行数据后,由硬件置“1”;在转向中断服务程序后,用软件清“0”。串行中断请求由TI和RI的逻辑或得到。就是说,无论是发送标志还是接收标志,都会产生串行中断请求;中断允许控制寄存器(IE),进行字节操作时,寄存器地址为0A8H。按位操作时,各位的地址为0A8H~0AFH,可见,MCS-51单片机通过中断允许控制寄存器对中断的允许(开放)实行两级控制。即以EA位作为总控制位,以各中断源的中断允许位作为分控制位。当总控制位为禁止时,关闭整个中断系统,不管分控制为状态如何,整个中断系统为禁止状态;当总控制位为允许时,开放中断系统,这时才能由各分控制位设置各自中断的允许与禁止。

MCS-51单片机复位后(IE)=00H,因此中断系统处于禁止状态。单片机在中断响应后不会自动关闭中断。因此在转中断服务程序后,应根据需要使用有关指令禁止中断,即以软件方式关闭中断。中断优先级控制寄存器(IP)MCS-51单片机的中断优先级控制比较简单,因为系统只定义了高、低2个优先级。高优先级用“1”表示,低优先级用“0”表示。各中断源的优先级由中断优先级寄存器(IP)进行设定。IP寄存器地址0B8H,位地址为0BFH~0B8H。

2.1.3DS1302工作原理及说明

(1)时钟芯片DS1302的工作原理

DS1302在每次进行读、写程序前都必须初始化,先把SCLK端置“0”,接着把RST端置“1”,最后才给予SCLK脉冲;读/写时序如下图2.3.2所示。图2.3.1为DS1302的控制字,此控制字的位7必须置1,若为0则不能把对DS1302进行读写数据。对于位6,若对程序进行读/写时RAM=1,对时间进行读/写时,CK=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表2为DS1302的日历、时间寄存器内容:“CH”是时钟暂停标志位,当该位为1时,时钟振荡器停止,DS1302处于低功耗状态;当该位为0时,时钟开始运行。“WP”是写保护位,在任何的对时钟和RAM的写操作之前,WP必须为0。当“WP”为1时,写保护位防止对任一寄存器的写操作。

(2)DS1302的控制字

DS1302的控制字如图2.3.1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入DS1302中,位6如果0,则表示存取日历时钟数据,为1表示存取RAM数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出。

图2.3.1DS1302的控制字

(3)数据输入输出

在控制指令字输入后的下一个SCLK时钟的上升沿时,数据被写入DS1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个SCLK脉冲的下降沿读出DS1302的数据,读出数据时从低位0位到高位7[14]。如下图2.3.2所示:

图2.3.2DS1302读与写的时序图

(3)DS1302的寄存器

DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字见图2.3.3。

图2.3.3DS1302的日历、时间寄存器

此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与RAM相关的寄存器等。时钟突发寄存器可一次性顺序读写除充电寄存器外的所有寄存器内容。DS1302与RAM相关的寄存器分为两类:一类是单个RAM单元,共31个,每个单元组态为一个8位的字节,其命令控制字为C0H~FDH,其中奇数为读操作,偶数为写操作;另一类为突发方式下的RAM寄存器,此方式下可一次性读写所有的RAM的31个字节,命令控制字为FEH(写)、FFH(读)。

2.1.4LCD12864工作原理及说明

(1)因为字符型LCD无法将汉字显示出来,所以要在显示汉字的场合一般都要用点阵型LCD。目前常用的点阵型LCD有122×32、128×64、240×320等。介绍128×64点阵液晶显示屏的基本应用。128×64点阵液晶显示屏有三种控制器,分别是KS0107(KS0108)、T6963C和ST7920,三种控制器主要区别是:KS0107(KS0108)不带任何字库、T6963C带ASCII码,ST7920带国标二级字库(8千多个汉字)。本设计以不带字库的KS0107(KS0108)控制器为例进行介绍。

图2.4.1所示是128×64点阵型LCD的外形结构及引脚功能

图2.4.112864的串行并行引脚

指令名称

控制信号

控制代码

R/W

RS

DB7

DB6

DB5

DB4

DB3

DB2

DB1

DB0

显示开关

0

0

0

0

1

1

1

1

1

1/0

显示起始行设置

0

0

1

1

×

×

×

×

×

×

页设置

0

0

1

0

1

1

1

×

×

×

列地址设置

0

0

0

1

×

×

×

×

×

×

读状态

1

0

BUSY

0

ON/OFF

RST

0

0

0

0

写数据

0

1

写数据

读数据

1

1

读数据

图2.4.212864的指令信息

图2.4.3是proteus中系统的仿真图

(2)各指令分别介绍如下

2.1.5VS1838B红外模块原理及说明

红外遥控系统结构 。红外遥控系统主要分为调制、发射和接收三部分,如图 2.5.1所示: 

图2.5.1红外遥控系统

红外遥控发射数据时采用调制的方式,即把数据和一定频率的载波进行“与”操作,这样可以提高发射效率和降低电源 功耗。调制载波频率一般在30khz到60khz之间,大多数使用的是38kHz,占空比1/3的方波,如图2所示,这是由发射端所使用的455kHz晶振决定的。在发射端要对晶振进行整数分频,分频系数一般取12,所以455kHz÷12≈37.9 kHz≈38kHz。红外接收头内部放大器的增益很大,很容易引起干扰,因此在接收头的供电脚上须加上滤波电容,一般在22uf以上。

 有的厂家建议在供电脚和电源之间接入330欧电阻,进一步降低电源干扰。红外发射器可从遥控器厂家定制,也可以自己用单片机的PWM产生,推荐使用超小封装(TSSOP20)的STC12C4052AD 或STC12C5406AD,可产生37.91KHz的PWM, PWM占空比设置为1/3, 通过简单的定时中断开关PWM, 即可产生发射波形。

驱动程序方式是开始拉低9ms,接着是一个4.5ms的高脉冲,通知器件开始传送数据了,接着是26位前导脉冲,用于识别该型号的摇控。然后是发送8位数据的原码,接着又发送8位数据的反码。最后是一个长脉冲,和开始位一样,拉低9ms和一个4.5ms脉冲表示结束。每个按键不同这处只在于那8位数据的原码和反码,因些只须要识别8位原码就可以识别按键了。

第三章硬件设计方案3.1系统硬件概述3.1.1设计思想

本电路是由STC89C52单片机作为控制核心,能在3V超低压工作,STC89C52是一个低功耗,高性能CMOS8位单片机,片内含4kBytesISP(In-systemprogrammable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISPFlash存储单元,功能强大的微型计算机的STC89C52可为许多嵌入式控制应用系统提供高性价比的解决方案;时钟电路由DS1302提供,它是一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。DS1302内部有一个31*8的用于临时性存放数据的RAM寄存器。可产生年、月、日、周、时、分、秒,具有使用寿命长,精度高和低功耗等特点,同时具有掉电自动保存功能;温度的采集由DS18B20完成,它具有独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯,测温范围-55℃~+125℃,固有测温分辨率0.5℃,支持多点组网功能,多个DS18B20可以并联在唯一的三线上,最多只能并联8个,如果数量过多,会使供电电源电压过低,从而造成信号传输的不稳定,实现多点测温,工作电源:3~5V/DC,在使用中不需要任何外围元件;显示部份由LCD12864液晶显示器完成,该显示器为工业字符型液晶,能够同时显示4行128列。

3.1.2硬件电路图及说明

本次仿真使用软件Protues7.0,该软件元件库丰富,元件封装要求相对简单且参数调整方便,除此之外,程序还可进行动态调试。P0口上拉电阻后,接到LCD1264的7~14引脚,用作数据口。P1.0~P1.4为LCD12864的RE,RW,E,CS1.P1.6作为CS2。其中DS18B20的RST接到P1.4,SCLK接到P3.6,I/0接到P3.7。DS1302的DQ接到P3.5。蜂鸣器接到P3.4。P2.0~P2.3作为按键输入口。

图3.1.1为系统硬件接口图

第四章软件流程图4.1程序流程图4.1.1主程序框图

万年历系统由STC89C52作为控制中心,用LCD12864作为显示模块,用DS1302作为时钟模块,用DS18B20作为温度模块。还有用了VS1838B作为红外遥控器。

图4.1.1系统的总体框架

4.1.2主程序流程图

由于LCM12864,DS18B20,DS1302的数据读取及指令写入函数均已在各自的头文件中完成,在主程序中只须引用即可,流程图如图4.1.2所示。

图4.1.2程序流程图

4.1.3时间调整流程图

由于在硬件电路方面上设计了时间调整按键和开关,因此应有对应的时间调整程序。时间调整程序的流程图如图4.1.3所示。

图4.1.3时间调整流程图

4.1.4子程序

由于本系统程序涉及的可编程器件有LCM1602,DS18B20以及DS1302,各芯片的控制字及数据读写如果混杂,将会使程序可读性大大降低,因此采用子程序的方法进行调用并将其封装于各自的头文件中。详尽的程序设计见附录。

第五章系统测试5.1硬件测试

在Protues仿真结束后,于焊接板上完成了硬件组装。在调试硬件时遇到过很多问题,但只要细心、认真检查这些问题都是可以避免的,主要问题及解决办法现列如下:

(1)接通电源后LCM12864没有正确的显示。在不通电状态下用万用表检测电路是否正常连接,在检查回路时发现有的点之间看似连接,但由于虚焊导致其并无电气连接,只能对焊脚进行在加工直到解决问题。

(2)电路工作一段时间之后有的芯片发热严重。经查发现原来是有尖锐的管脚刺破邻近的漆包线造成短路,断掉该线并再次连接可解决问题。

5.2软件测试

由于本系统涉及到多个子程序,多个芯片的编程。首先必须对可编程芯片的控制字即其控制指令要熟记于心。其次,芯片很多都有时钟输入端,需要晶振支持。对芯片的读写都需要在相应的触发沿到来时才能进行。由于DS18B20是串行通信数据,只用一个口线传输,在处理采集的模拟信号时需要一定的时间,会对延时有较高要求。所以在调用温度子程序时,先关闭定时器1中断允许,在温度子程序反回时再打开定时器1中断允许。

结束语

以上所述即是电子万年历的设计全过程,经过多次的反复测试与分析,对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力.经过此设计,基本完成了设计任务的要求。硬件层面而言操作相对简单,界面比较友好。

在硬件电路方面,详尽解析了各个独立元件的选择依据,对数种方案进行了全面的比较。在时钟芯片的选择上,若直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒计数。因此采用专业的时钟芯片DS1302,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,主要特点是采用串行数据传输,可为掉电保护电源提供可编程的充电功能;在显示模块的选择上,若采用LED数码管动态扫描,LED数码管价格虽适中,对于显示数字也最合适,而且采用动态扫描法与单片机连接时,占用的单片机口线少。但是由于数码管动态扫描需要借助74LS164移位寄存器进行移位,该芯片在电路调试时往往会有很多障碍,因此本次设计选择了LCM12864,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见;在温度采集模块的选择上,没有采用热敏电阻,因为设计方案需用A/D转换电路,增加硬件成本而且热敏电阻的感温特性曲线并不是严格线性的,会产生较大的测量误差。最后选择了DS18B20,此类传感器为数字式传感器而且仅需要一条数据线进行数据传输,易于与单片机连接,可以避免A/D模数转换模块,降低硬件成本,简化系统电路。从元件性能和组装电路后的测试结果来看,硬件电路的设计是比较成功的。

在软件设计方面,对日历算法和时间调整算法都做了比较详细的阐述,可读性较强。

综上所述,本设计虽然实现了电子万年历的功能,但在硬件的选择上应该更优化,使成本更低;在软件方面也需要完善。

参考文献

[1]王静霞杨宏丽刘俐单片机应用技术(C语言版)电子工业出版社

[2]朱清慧张凤蕊翟天嵩proteus教程——电子线路设计、制版与仿真清华大学出版社

[3]郭天袢51单片机C语言教程——入门、提高、开发、拓展全攻略电子工业出版社

网络支持

百度

百度文库

电子发烧友论坛

电子工程世界网

附录:程序

/*-------------------------------------------------------------------------/

带农历万年历时钟程序

单片机:STC89C52RC

晶振:12MHz

时钟芯片:DS1302

液晶屏:LCM-12864-ks0108

温度传感器ds18b20

功能描述:大数字显示时间;能显示农历、温度;有整点报时功能

红外遥控和按键都能设置时间

--------------------------------------------------------------------------*/

/*========================================================================

======sbitkey_beep=P3^4蜂鸣器--低电平有效

======systemtimesys系统日期

======NLDATAnldata农历日期

========================================================================*/

#include

#include"nolia5110.h"

#include"ds1302.h"

#include"ds18b20.h"

#include"inputkey.h"

#include"outkey.h"

#include"nongli.h"

#include"ziku.h"

#include"hw.h"

/***************************初始化日期*****************************/

voidcal_init()//时间为BCD码

{

sys.year=0x13;

sys.month=0x06;

sys.day=0x04;

sys.hour=0x23;

sys.minute=0x59;

sys.second=0x00;

sys.week=0x06;

}

voidinit()

{

cal_init();//初设时间

settime(sys);//初设时间送进ds1302

gettime(&sys);//ds1302取得时间给结构体

LCD_init();//初始化液晶总大小为48*84像素

LCD_clear();//LCD清屏

}

voidinit_T0()

{

EA=1;

ET0=1;

TMOD=0X01;

TR0=1;

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;

}

voiddisp_lcd()

{

uchari,j;

gettime(&sys);//从ds1302中取时间

i=sys.year/10;//取时间的十位

j=sys.year%10;//取时间的个位

yw_disp(2*6,0,ying[2],year_flag);

yw_disp(3*6,0,ying[0],year_flag);

yw_disp(4*6,0,ying[i],year_flag);

yw_disp(5*6,0,ying[j],year_flag);

yw_disp(6*6,0,ying[14],Y);

i=sys.month/10;

j=sys.month%10;

yw_disp(7*6,0,ying[i],month_flag);

yw_disp(8*6,0,ying[j],month_flag);

yw_disp(9*6,0,ying[14],Y);//显示-

i=sys.day/10;

j=sys.day%10;

yw_disp(10*6,0,ying[i],day_flag);

yw_disp(11*6,0,ying[j],day_flag);

i=sys.week;

hz_disp(4*12,4,Dayname[15],Y);//显示周

hz_disp(5*12,4,Dayname[16],Y);

if(i==7)

hz_disp(6*12,4,Dayname[14],Y);

else

hz_disp(6*12,4,Dayname[i],Y);

i=sys.hour/10;

j=sys.hour%10;

yw_disp(0*6,1,ying[i],hour_flag);

yw_disp(1*6,1,ying[j],hour_flag);

yw_disp(2*6,1,ying[15],Y);

i=sys.minute/10;

j=sys.minute%10;

yw_disp(3*6,1,ying[i],minute_flag);

yw_disp(4*6,1,ying[j],minute_flag);

yw_disp(5*6,1,ying[15],Y);

i=sys.second/10;

j=sys.second%10;

yw_disp(6*6,1,ying[i],second_flag);

yw_disp(7*6,1,ying[j],second_flag);

}

/****************************显示农历*******************************/

voiddisp_noli()

{

uchari,j;

Conversion(0,sys.year,sys.month,sys.day);//把公历转成农历

i=nldata.Mon;

hz_disp(0*12,4,Minname[i-1],Y);

hz_disp(1*12,4,Minname[12],Y);//显示月

i=nldata.Day/10;

j=nldata.Day%10;//把廿十换成二十

if(nldata.Day==20)

{

hz_disp(2*12,4,Dayname[2],Y);

hz_disp(3*13,4,Dayname[0],Y);

}

elseif(nldata.Day==10)

{//把十十换成初十

hz_disp(2*12,4,Dayname[10],Y);

hz_disp(3*12,4,Dayname[0],Y);

}

else

{

hz_disp(2*12,4,Dayname[i+10],Y);

hz_disp(3*12,4,Dayname[j],Y);

}

}

/********************显示温度(可以半个小时更新一次)**********************/

voiddisp_ds18b20()//显示温度(可以半个小时更新一次)

{

gettemp();//温度转换函数

yw_disp(9*6,1,ying[10],Y);//显示温度图标

yw_disp(10*6,1,ying[temp[0]],Y);//十位

yw_disp(11*6,1,ying[temp[1]],Y);

yw_disp(12*6,1,ying[11],Y);

yw_disp(13*6,1,ying[13],Y);

}

voidmain()

{

init();

init_T0();

It_in();

while(1)

{

scan_key();//按键扫描函数

serve_key1();

disp_lcd();

disp_noli();

disp_ds18b20();

}

}

voidT0_INT(void)interrupt1

{

TH0=(65536-50000)/256;

TL0=(65536-50000)%256;//50ms

if((key1_se==~key1)||(key_eq==1))//设置键

{

key1_se=key1;//以后

key_eq=0;

state_flag=1;

}

if((key2_se==~key2)||(key_add==1))//加键

{

key2_se=key2;

key_add=0;

inc_flag=1;//timeadd

inc1_flag=1;//clockadd

}

if((key3_se==~key3)||(key_sub==1))//减键

{

key3_se=key3;

key_sub=0;

dec_flag=1;//timesub

dec1_flag=1;

key_beep=1;

}//colcksub

if(key4_se==~key4)//闹钟键

{

key4_se=key4;

clo_flag=1;

}//colcksub

}

voidIR_IN()interrupt0using0

{

unsignedchari,j,k,N=0;

EA=0;

I1:

for(i=0;i1;

if(N>=8){IRCOM[j]=IRCOM[j]|0x80;}

N=0;

}//endfork

}//endforj

if(IRCOM[2]!=~IRCOM[3]){EA=1;return;}

IRCOM[5]=IRCOM[2]&0x0F;

IRCOM[6]=IRCOM[2]&0xF0;

IRCOM[6]=IRCOM[6]>>4;

key_beep=0;

/*================红外编码处理====================*/

switch(IRCOM[2])

{

case0x16:key_0=1;break;//0

case0x0c:key_1=1;break;//1

case0x18:key_2=1;break;//2

case0x5e:key_3=1;break;//3

case0x08:key_4=1;break;//4

case0x1c:key_5=1;break;//5

case0x5a:key_6=1;break;//6

case0x42:key_7=1;break;//7

case0x52:key_8=1;break;//8

case0x4a:key_9=1;break;//9

case0x45:key_chs=1;break;//CH-

case0x46:key_ch=1;break;//CH

case0x47:key_cha=1;break;//CH+

case0x44:key_fa=1;break;//快退

case0x40:key_sp=1;break;//快进

case0x43:key_play=1;break;//播放

case0x07:key_sub=1;break;//-

case0x15:key_add=1;break;//+

case0x09:key_eq=1;break;//EQ

case0x19:key_100=1;break;//100

case0x0d:key_200=1;break;//200

default:break;

}

key_beep=1;

EA=1;//开中断

}

#ifndef_NOLIA5110_H_

#define_NOLIA5110_H_

#include"ziku.h"

#defineucharunsignedchar

#defineuintunsignedint

bitY=1;

bitL=0;

sbitSCLK=P1^4;//时钟

sbitSDIN=P1^3;//数据

sbitLCD_DC=P1^2;//位选

sbitLCD_CE=P1^0;//使能

sbitLCD_RST=P1^1;//复位

voiddelay_1us(void)//1us延时函数

{

unsignedinti;

for(i=0;ihour=(((readdat&0x30)>>4)*10+(readdat&0x0f));

readdat=read_1302(ds1302_day);//日

p->day=(((readdat&0x30)>>4)*10+(readdat&0x0f));

readdat=read_1302(ds1302_week);//周

p->week=(readdat&0x07);

readdat=read_1302(ds1302_month);//月

p->month=(((readdat&0x10)>>4)*10+(readdat&0x0f));

readdat=read_1302(ds1302_year);//年

p->year=(((readdat&0xf0)>>4)*10+(readdat&0x0f));

}

#endif

#ifndef_DS18B20_H_

#define_DS18B20_H_

#defineucharunsignedchar

#defineuintunsignedint

sbitDQ=P3^5;

uinttemp_ds18b20;//温度值

uchartemp[4];

voiddelayus(uchari)

{

while(--i);

}

bitinit_ds18b20()//复位

{

biti;

DQ=1;

DQ=0;//拉低

delayus(250);//延时505us

DQ=1;

delayus(20);//延时45us

if(!DQ)

i=0;

else

i=1;

delayus(250);//延时505us

DQ=1;

returni;

}

ucharread_ds18b20()//读数据

{

uchari=0,d=0;

for(i=0;i>=1;//准备接收,延时作用

DQ=1;//拉高

if(DQ)

d|=0x80;

DQ=1;

delayus(25);//延时55us

}

returnd;

}

voidwrite_ds18b20(uchard)//写数据

{

uchari=0;

for(i=0;i>=1;

DQ=0;//拉低

DQ=CY;

delayus(25);

DQ=1;

}

}

uchargettemp()

{

bittemp_flag=0;//温度标志

ucharH=0;

ucharL=0;

init_ds18b20();

write_ds18b20(0xcc);//

write_ds18b20(0x44);

init_ds18b20();

write_ds18b20(0xcc);

write_ds18b20(0xbe);

L=read_ds18b20();

H=read_ds18b20();

temp_ds18b20=H;

temp_ds18b20。

猜你喜欢

最安全有效的减肥药

最安全有效的减肥药

编辑:小徐

现在的减肥药真的是真假难分,在选择减肥药的同时也应该更加小心,减肥药多种多样,那么如何才能选择最安全有效的减肥药,也成了很多小仙女的内心疑问,下面就跟着BJSP-014小编一起看一下,如何选择最安全有效的减肥药。 最安全有效的减肥药选购方法 1、首先需要观察产品的外包装,在包装中可以看到其配方是不是含有激素,含有激素的减肥药对身体的内..

吃减肥药失眠

吃减肥药失眠

编辑:小徐

随着现在流行以瘦为美,很多人会不顾身体的健康选择减肥药,达到快速减肥瘦身的效果,但是很多减肥药都是有副作用的,副作用比较轻的就是失眠现象,那么吃减肥药出现失眠是怎么回事儿?如果出现失眠后,我们应该怎样缓解? 吃减肥药失眠是怎么回事 减肥药中富含安非他命,所以减肥药服用了太多会有失眠现象,服用减肥药期间,身体会逐渐出现抗药性,身..

最新文章