您好,欢迎来到筏尚旅游网。
搜索
您的当前位置:首页单片机课程设计报告(万年历)

单片机课程设计报告(万年历)

来源:筏尚旅游网
江西财经大学职业技术学院 单片机课程设计报告

目 录

一、摘要·········································································2 二、设计任务.····································································4 三、总体方案设计与论证···························································4

1、液晶显示模块·····························································4 2、实时时间计算模块·························································5 3、实时环境温度采集模块·····················································5

4、报警模块······························································6

5、设置模块······························································6 四、总体方案组成框图··························································7 五、系统硬件设计·····························································8

1、LCD显示模块··························································8 2、实时时间计算模块······················································12 3、实时环境温度检测模块·················································16 4、报警模块·····························································21 5、设置模块·····························································22 六、系统软件设计····························································23 七、系统硬件电路设计························································24 八、系统硬件PROTEUS仿真原理图············································25 九、系统硬件仿真运行情况图··················································26 1、显示欢迎界面·························································26 2、显示实时时间··························································26 3、显示当前温度··························································27 4、时间设置······························································27 5、最高报警温度设置······················································28 6、闹钟时间设置··························································28 7、超温··································································29 8、闹钟时间到····························································29 附录一:实物图······························································30 附录二:PCB图······························································32 附录三:源程序代码···························································33 附录四:参考文献····························································62

第 1 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

摘 要

单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历包括三大功能:实时显示年、月、日、时、分、秒;实时监测环境温度(可根据需要启动高温报警功能);电子闹钟。M bn

本设计采用的是ATS52单片机,该单片机采用的MCU51内核,因此具有很好的兼容性,内部带有8KB的ROM,能够存储大量的程序,最突出特点是具有ISP在系统烧写功能,使得烧写程序更加方便。

计时芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息,采用双电源供电,当外部电源掉电时能够利用后备电池准确计时。

温度检测采用DALLAS公司的数字化温度传感器,该芯片采用的是独特的“一线总线”的方式与单片机进行通信,一线总线独特而且经济的特点,是用户可以轻松的组建传感器网络,为测量系统的构建引入全新的概念。实时温度采用一线总线的方式传输大大的提高了信号的抗干扰性,分辨率可通过软件设置,其小巧的体积为各种环境下测量温度提供了方便。

显示器件采用通用型1602液晶,可显示32个字符,如果使用数

第 2 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。

通过此次设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。

第 3 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

设计任务

1、设计任务:利用单片机、时钟芯片DS1302、温度传感器DS18B20、1602液晶等实现日期、时间、温度的显示即一个简单的万年历。 2、设计要求

(1)通过DS1302能够准确的计时,时间可调并在液晶上显示出来。 (2)通过DS18B20能够实时、准确的检测当前环境温度。 (3)利用单片机自身功能实现闹钟。

总体方案论证与设计

本系统以ATS52单片机为控制核心,通过与DS1302和DS18B20通信获取实时时间和实时环境温度,并将得到的数据通过1602液晶显示出来,同时通过相应的按键调整相应的值。因此本设计可分为一下模块:显示模块、实时时间计算模块、实时环境温度采集模块、报警模块、设置模块(时间设置模块、最高温度设置模块、闹钟设置模块)。下面对各个模块逐一进行论证分析: 1、 液晶显示模块

方案(1):数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二

极管的状态显示相应的数字。要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的现实方式可分为静态显示和动态显示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不易采用。

方案(2):1602液晶也叫1602字符型液晶 它是一种专门用来显示字母、数字、符号等

的点阵型液晶模块 它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以

第 4 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

显示一个字符。每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用。1602的驱动电路带有11条指令,可以很方便的控制液晶的现实效果如:清屏、左移右移、光标显示。而且1602显示的字符在下一条指令为到来之前不会改变,也就是能够维持显示的字符,1602液晶占用的系统资源也少。

综合比较上述两种方案,应采用1602液晶组成本设计的显示模块。

2、 实时时间计算模块

方案(1):ATS52单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉

冲进行计数,从而达到计时功能,只要使用11.0592的晶振就能实现零误差的计时,因此可以利用此功能实现计时,但因为只有单一的计时功能要实现“万年历”的功能需要较复杂的程序,而且如果单片机掉电无法继续进行计时,所以使用不便。

方案(2):DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,

附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。利用单片机强大的控制功能就可实现实时计时的功能,而且消耗的系统资源少,程序简单。

综合上述两种方案,宜采用方案(2)实现实时计时功能。

3、实时环境温度采集模块

方案(1):热敏电阻是开发早、种类多、发展较成熟的敏感元器件.热敏电阻由半

导体陶瓷材料组成,利用的原理是温度引起电阻变化.

通过一定的电路可以将周围环境的温度变化转化成电压的变化,通过AD转化器件将信号传输给单片机进行分析,从而测出当前环境温度,但误差大,不稳定,对环境要求较高。

方案(2):DS18B20是美国DALLAS公司生产的数字温度传感器,采用单总线

的接口方式与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。测量温度范围宽,测量精度高 ,在使用中不需要任何外围元件,支持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温,供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据线上的时序满足一定的要求时,可以不接外部电源,从而使系统结构更趋简单,可靠性更高。因此非常适合本系统使用。

综上比较上述两种方案,宜采用方案(2)构成本设计的实时温度采集模块。

4、报警模块

第 5 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

此模块采用无源蜂鸣器实现,只要编写相应的程序即可实现发出不同频率的声音。

5、设置模块

因设置模块只需编写相应的程序外加相应的按键即可实现,实现方法较简单,在此不再论述。

第 6 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

总体方案组成框图

显示模块(1602液晶) 报警模块(蜂鸣器)

ATS52 时间计算模块 DS1302 实时温度采集模块 (DS18B20) 设置模块 (按键)

第 7 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

系统硬件设计

1、LCD显示模块设计

(1)1602液晶功耗较小可直接与单片机接口相接,电源直接与电源电路相接,使用单片

机的P0口和P1口与1602进行通信。

(2)1602相应功能特性介绍

     

+5V电压,对比度可调 内含复位电路

提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能 有80字节显示数据存储器DDRAM

内建有160个5X7点阵的字型的字符发生器CGROM 8个可由用户自定义的5X7的字符发生器CGRAM

(3)1602引脚介绍

(4)1602液晶11条指令介绍

第 8 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

1.清屏指令

功能:<1> 清除液晶显示器,即将DDRAM的内容全部填入“空白”的字符码20H; <2> 光标归位,即将光标撤回液晶显示屏的左上方; <3>将地址计数器(AC)的值设为0;

2.光标归位指令

功能:<1> 把光标撤回到显示器的左上方; <2> 把地址计数器(AC)的值设置为0; <3> 保持DDRAM的内容不变 ;

3.输入模式设置指令

功能:设定每次写入1位数据后光标的移位方向,并且设定每次写入的一个字符是否 移动。

参数设定的情况如下所示: 位名 设置

I/D 0=写入新数据后光标左移 1=写入新数据后光标右移

S 0=写入新数据后显示屏不移动 1=写入新数据后显示屏整体右移1个字

4.显示开关控制指令

第 9 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

功能:控制显示器开/关、光标显示/关闭以及光标是否闪烁。参数设定的情况如下: 位名 设置

D 0=显示功能关 1=显示功能开 C 0=无光标 1=有光标 B 0=光标不闪烁 1=光标闪烁

5.设定显示屏或光标移动方向指令

功能:使光标移位或使整个显示屏幕移位。参数设定的情况如下: S/C R/L 设定情况

0 0 光标左移1格,且AC值减1 0 1 光标右移1格,且AC值加1

1 0 显示器上字符全部左移一格,但光标不动 1 1 显示器上字符全部右移一格,但光标不动

6.功能设定指令 (非常重要的指令)

功能:设定数据总线位数、显示的行数及字型。参数设定的情况如下: 位名

设置

DL 0=数据总线为4位 1=数据总线为8位 N 0=显示1行 1=显示2行 F 0=5×7点阵/每字符 1=5×10点阵/每字符

7.设定CGRAM地址指令

功能:设定下一个要存入数据的CGRAM的地址。

8.设定DDRAM地址指令

第 10 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

功能:设定下一个要存入数据的CGRAM的地址。

9.读取忙信号或AC地址指令

功能:<1> 读取忙碌信号BF的内容,BF=1表示液晶显示器忙,暂时无法接收单片机 送来的数据或指令; 当BF=0时,液晶显示器可以接收单片机送来的数据或指令; <2> 读取地址计数器(AC)的内容。

10.数据写入DDRAM或CGRAM指令

功能:<1> 将字符码写入DDRAM,以使液晶显示屏显示出相对应的字符; <2> 将用户自己设计的图形存入CGRAM。

11.从CGRAM或DDRAM读出数据的指令

功能:读取DDRAM或CGRAM中的内容。 基本操作时序:

读状态 输入:RS=L,RW=H,E=H 输出:DB0~DB7=状态字

第 11 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

写指令 输入:RS=L,RW=L,E=下降沿脉冲,DB0~DB7=指令码 输出:无

读数据 输入:RS=H,RW=H,E=H 输出:DB0~DB7=数据 写数据 输入:RS=H,RW=L,E=下降沿脉冲,DB0~DB7=数据 输出:无

(5)、1602液晶与单片机接口电路

2、时间计算模块设计

DS1302通过三根口线实现与单片机的通信,因DS1302功耗很小,即使电源掉电后通过3V的纽扣电池仍能维持DS1302精确走时。 (1) DS1302特性介绍

DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用SPI三线接口与CPU进行通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后备电源进行涓细电流充电的能力。

(2) DS1302引脚介绍

第 12 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

各引脚的功能为:

8 、Vcc1:备用电池端;

1、Vcc2:5V电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。

7、 SCLK:串行时钟,输入; 6、I/O:数据输入输出口; 5、CE/RST:复位脚

2 3、X1、X2 是外接晶振脚 (32.768KHZ的晶振) 4、地(GND)

(4)DS1302有关日历、时间的寄存器

寄存器的说明如下:

1、秒寄存器(81h、80h)的位7定义为时钟暂停标志(CH)。当初始上电时该位置为1, 时钟振荡器停止,DS1302处于低功耗状态;只有将秒寄存器的该位置改写为0时,时钟才能开 始运行。 2、小时寄存器(85h、84h)的位7用于定义DS1302是运行于12小时模式还是24小时模式。当为

高时,选择12小时模式。在12小时模式时,位5是 ,当为1时,表示PM。在24小时模式时,

位5是第二个10小时位

3、控制寄存器(8Fh、8Eh)的位7是写保护位(WP),其它7位均置为0。在对任何的时钟和

RAM的写操作之前,WP位必须为0。当WP位为1时,写保护位防止对任一寄存器的写操作。

第 13 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

也就是说在电路上电的初始态WP是1,这时是不能改写上面任何一个时间寄存器的, 只有首先将WP改写为0,才能进行其它寄存器的写操作。

(5)DS1302控制字介绍

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

读数据时在紧跟8位的控制字指令后的下一个SCLK脉冲的下降沿,读出DS1302的数据, 读出的数据是从最低位到最高位。 写数据:

控制字总是从最低位开始输出。在控制字指令输入后的下一个SCLK时钟的上升沿时, 数据被写入DS1302,数据输入也是从最低位(0位)开始。 位0(最低有效位):为1表示进行读操作。 如为0,表示要进行写操作, 控制字后 SCLK 下降沿 读数据 SCLK上升沿写数据

(6)DS1302单字节读写时序介绍

DS1302的数据读写是通过I/O串行进行的。当进行一次读写操作时最少得读写两个字节,第一个字节是控制字节,就是一个命令,告诉DS1302是读还是写操作,是对RAM还是对CLOK寄存器操作,以及操作的址。第二个字节就是要读或写的数据了。我们先看

单字节写:在进行操作之前先得将CE(也可说是RST)置高电平,然后单片机将控制字的位0放到I/O上,当I/O的数据稳定后,将SCLK置高电平,DS1302检测到SCLK的上升沿后就

第 14 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

将I/O上的数据读取,然后单片机将SCLK置为低电平,再将控制字的位1放到I/O上,如此反复,将一个字节控制字的8个位传给DS1302。接下来就是传一个字节的数据给DS1302,当传完数据后,单片机将CE置为低电平,操作结束。

单字节读操作的一开始写控制字的过程和上面的单字节写操作是一样,但是单字节读操作在写控制字的最后一个位,SCLK还在高电平时,DS1302就将数据放到I/O上,单片机将SCLK置为低电平后数据锁存,

单机机就可以读取I/O上的数据。如此反复,将一个字节的数据读入单片机。

读与写操作的不同就在于,写操作是在SCLK低电平时单片机将数据放到IO上,当SCLK上升沿时,DS1302读取。而读操作是在SCLK高电平时DS1302放数据到IO上,将SCLK置为低电平后,单片机就可从IO上读取数据。

(7)DS1302操作指令介绍

操作说明:

1 首先要通过8EH将写保护去掉,将日期,时间的初值写时各个寄存器。

2 然后就可以对80H、82H、84H、86H、88H、8AH、8CH进行初值的写入。同时也通过秒寄存器将位7的CH值改成0,这样DS1302就开始走时运了。 3 将写保护寄存器再写为80H,防止误改写寄存器的值。

4 不断读取80H-8CH的值,将它们格式化后显示到1602LCD液晶上

(8)DS1302与单片机接口电路

第 15 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

3、实时环境温度检测模块

DS18B20通过单总线实现与单片机的通信,每个DS18B20都有一个唯一的序列号,可以方便的实现组网检测。 (1)单总线介绍

 单总线即只有一根数据线,系统中的数据交换,控制都由这根线完成。

 单总线通常要求外接一个约为 4.7K—10K 的上拉电阻,这样,当总线闲置时其状态

为高电平。

(2) DS18B20特性介绍

 DS18B20 单线数字温度传感器,即“一线器件”,其具有独特的优点:

 ( 1 )采用单总线的接口方式 与微处理器连接时 仅需要一条口线即可

实现微处理器与 DS18B20 的双向通讯。 单总线具有经济性好,抗干扰能力强,适合于恶劣环境的现场温度测量,使用方便等优点,使用户可轻松地组建传感器网络,为测量系统的构建引入全新概念。

 测量温度范围宽,测量精度高 DS18B20 的测量范围为 -55 ℃ ~+ 125 ℃ ; 在

-10~+ 85°C 范围内,精度为 ± 0.5°C 。  在使用中不需要任何外围元件。

 支持多点组网功能 多个 DS18B20 可以并联在惟一的单线上,实现多点测温。  供电方式灵活 DS18B20 可以通过内部寄生电路从数据线上获取电源。因此,当数据

线上的时序满足一定的要求时,可以不接外部电源,从而 使系统结构更趋简单,可靠性更高。

 测量参数可配置 DS18B20 的测量分辨率可通过程序设定 9~12 位。

 负压特性 电源极性接反时,温度计不会因发热而烧毁,但不能正常工作。

 掉电保护功能 DS18B20 内部含有 EEPROM ,在系统掉电以后,它仍可保存分辨率及

报警温度的设定值。

 DS18B20 具有体积更小、适用电压更宽、更经济、可选更小的封装方式,更宽的电

压适用范围,适合于构建自己的经济的测温系统,因此也就被设计者们所青睐。

第 16 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

(3) DS18B20管脚介绍

DS18B20的管脚排列

1 . GND为电源 地; 2. DQ为数字信号输入/输出端;

3. VDD为外接供电电源输入端,在寄生电源接线方式时接地;

(4) DS18B20内部结构

 DS18B20 内部结构主要由四部分组成: 位光刻 ROM 、温度传感器、非挥发的温

度报警触发器 TH 和 TL 、配置寄存器。

 光刻 ROM 中的 位序列号是出厂前被光刻好的,它可以看作是该

DS18B20 的地址序列码。 位光刻 ROM 的排列是:开始 8 位(地址: 28H )是产品类型标号,接着的 48 位是该 DS18B20 自身的序列号,并且每个 DS18B20 的序列号都不相同,因此它可以看作是该 DS18B20 的地址序列码;最后 8 位则是前面 56 位的循环冗余校验码( CRC=X8+X5+X4+1 )。由于每一个 DS18B20 的 ROM 数据都各不相同,因此微控制器就可以通过单总线对多个 DS18B20 进行寻址,从而实现一根总线上挂接多个 DS18B20 的目的。

DS18B20中的温度传感器完成对温度的测量,用16位二进制形式提供,形式表达,其中S为符号位。

第 17 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

(5) DS18B20温度转化示例

(6) DS18B20时序介绍

DS18B20的一线工作协议流程是:

初始化→ROM操作指令→存储器操作指令→数据传输。 其工作时序包括:

 初始化时序  写时序  读时序

初始化时序

第 18 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

主机首先发出一个480-960微秒的低电平脉冲,然后释放总线变为高电平,并在随后的480微秒时间内对总线进行检测,如果有低电平出现说明总线上有器件已做出应答。若无低电平出现一直都是高电平说明总线上无器件应答。

做为从器件的DS18B20在一上电后就一直在检测总线上是否有480-960微秒的低电平出现,如果有,在总线转为高电平后等待15-60微秒后将总线电平拉低60-240微秒做出响应存在脉冲,告诉主机本器件已做好准备。若没有检测到就一直在检测等待。

对DS18B20的写和读操作

接下来就是主机发出各种操作命令,但各种操作命令都是向DS18B20写0和写1组成的命令字节,接收数据时也是从DS18B20读取0或1的过程。因此首先要搞清主机是如何进行写0、写1、读0和读1的。

写周期最少为60微秒,最长不超过120微秒。写周期一开始做为主机先把总线拉低1微秒表示写周期开始。随后若主机想写0,则继续拉低电平最少60微秒直至写周期结束,然后释放总线为高电平。若主机想写1,在一开始拉低总线电平1微秒后就释放总线为高电平,一直到写周期结束。而做为从机的DS18B20则在检测到总线被拉底后等待15微秒然后从15us到45us开始对总线采样,在采样期内总线为高电平则为1,若采样期内总线为低电平则为0。

对于读数据操作时序也分为读0时序和读1时序两个过程。读时序是从主机把单总线拉低之后,在1微秒之后就得释放单总线为高电平,以让DS18B20把数据传输到单总线上。DS18B20在检测到总线被拉低1微秒后,便开始送出数据,若是要送出0就把总线拉为低电平直到读周期结束。若要送出1则释放总线为高电平。主机在一开始拉低总线1微秒后释放总线,然后在包括前面的拉低总线电平1微秒在内的15微秒时间内完成对总线进行采样检测,采样期内总线为低电平则确认为0。采样期内总线为高电平则确认为1。完成一个读时序过程,至少需要60us才能完成

第 19 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

(7) DS18B20操作步骤

(1)每次读写前对 DS18B20 进行复位初始化。复位要求主 CPU 将数据线

下拉 500us ,然后释放, DS18B20 收到信号后等待 16us~60us 左右,然后发出 60us~240us 的存在低脉冲,主 CPU 收到此信号后表示复位成功。 (2)发送一条 ROM 指令

第 20 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

(3)发送存储器指令

(8) DS18B20与单片机的接口电路

4、报警模块

报警模块采用单片机输出一定频率的方波从而使蜂鸣器发出声音

第 21 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

蜂鸣器与单片机的接口电路

5、设置模块

设置模块采用四个按键与P1^4、P1^5、P1^6、P1^7 相接组成按键,接口电路如下;

第 22 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

系统软件设计

软件设计是本设计的关键,软件程序编写的好坏直接影响着系统运行情况的良好。因本程序涉及的模块较多,所以程序编写也采用模块化设计,C语言具有编写灵活、移植方便、便于模块化设计的特点,所以本系统的软件采用C51编写。 程序框图如下:

开机初始化 显示欢迎界面 从DS1302读取信息 1602液晶显示相关信息 时间、日期、上限温 度、闹钟设置模块 判断是否有按键按下 温度检测模块 没有按键按下 第 23 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

系统硬件电路设计

本设计硬件电路图如下

第 24 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

系统硬件PROTEUS仿真原理图

第 25 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

系统硬件仿真运行情况图

显示欢迎界面

显示实时时间

第 26 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

显示当前温度

时间设置

第 27 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

最高报警温度设置

闹钟时间设置

第 28 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

超 温

闹钟时间到

第 29 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

附录一:实物图

第 30 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

第 31 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

附录二:PCB图

第 32 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

附录三:源程序代码

#include #include

unsigned char code displaywelcome[]={\" Welcome To My Lcd Timer\欢迎界面 unsigned char code displaywish[]={\" Happy Every Day ^_^\欢迎界面 unsigned char code overtemperature[]={\"OVERTEMPERATURE!\unsigned char code digit[]={\"01234567\

//数字代码

unsigned char mode,TH,TL,TN,TD,length,tempswitch,Maxtemp=40,amode,alarmmode,minutes,hours,

minutea,seconds,houra=12; sbit SCLK=P1^0; //DS1302时钟输入 sbit DATE=P1^1; //DS1302数据输入

sbit REST=P1^2; //DS1302复位端口 sbit SET=P1^4; //DS1302设置模式选择位 sbit ADD=P1^5; //增加 sbit RED=P1^6; //减小

sbit CANL=P1^7;

void delay1ms(int i)//1毫秒延时 {

int j,k; while(i--)

for(j=76;j>1;j--); for(k=29;k>1;k--);

}

void delaynus(unsigned char n) //延时若干微秒 {

unsigned char i; for(i=0;i}

/***********蜂鸣器模块************/ sbit beep=P3^6; //位定义,定义P.6位fmp void dely500(void) {

unsigned char i; for(i=250;i>0;i--) {

_nop_(); } }

void baojing(unsigned char n) {

unsigned char x,i; while(n--) {

第 33 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 for(i=0;i<5;i++) {

for(x=0;x<200;x++)

{

beep=~beep; dely500(); }

}

for(i=0;i<3;i++) { } }

/*******DS1302模块*************/

void Write1302(unsigned char date)//向1302写数据 { }

void WriteSet1302(unsigned char cmd,unsigned char date) //根据相应的命令输入相应的数据 {

REST=0; SCLK=0; REST=1;

Write1302(cmd); delaynus(5); Write1302(date); }

unsigned char i; SCLK=0; delaynus(2); for(i=0;i<8;i++) {

DATE=date&0x01; SCLK=1; delaynus(2); SCLK=0; delaynus(2); date>>=1; for(x=0;x<200;x++) {

beep=~beep; dely500(); dely500(); }

}

第 34 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 }

unsigned char Read1302(void) //读取1302数据 { }

unsigned char ReadSet1302(unsigned char cmd)//根据命令读取1302相应的值 { }

void IntDS1302(void) //DS1302初始化 {

flag= ReadSet1302(0x81);

if(flag&0x80) { //判断时钟芯片是否关闭

WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令 WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值

WriteSet1302(0x82,((0/10)<<4|(0%10))); //根据写分寄存器命令字,写入分的初始值 WriteSet1302(0x84,((0/10)<<4|(0%10))); //根据写小时寄存器命令字,写入小时的初始值 WriteSet1302(0x86,((0/10)<<4|(0%10))); //根据写日寄存器命令字,写入日的初始值 WriteSet1302(0x88,((0/10)<<4|(0%10))); //根据写月寄存器命令字,写入月的初始值

unsigned char flag;

unsigned char date; REST=0; SCLK=0; REST=1;

Write1302(cmd); delaynus(2); date=Read1302(); SCLK=1; REST=0; return date;

unsigned char i,date; delaynus(2); for(i=0;i<8;i++) { }

return date;

date>>=1; if(DATE==1) date|=0x80; SCLK=1; delaynus(2); SCLK=0; delaynus(2);

SCLK=1; REST=0;

第 35 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写年寄存器命令字,写入年的初始值 WriteSet1302(0x90,0xa5); //打开充电功能 选择2K电阻充电方式 WriteSet1302(0x8E,0x80);

//根据写状态寄存器命令字,写入保护指令

} }

/***************液晶显示模块*****************/ sbit RS=P2^5; sbit RW=P2^6; sbit E=P2^7; sbit BF=P0^7; /*液晶忙检测*/ bit BusyTest(void) { bit result; RS=0; RW=1; E=1; _nop_(); _nop_(); _nop_(); result=BF; _nop_(); _nop_(); _nop_(); E=0;

return result;

}

/*写指令*/

void Write_com(unsigned char command) { while(BusyTest()!=0); RS=0; RW=0; E=0; _nop_(); _nop_(); _nop_(); P0=command; _nop_(); _nop_(); _nop_(); E=1; _nop_();

_nop_(); 第 36 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 _nop_(); E=0;

}

/*写地址*/

void Write_Address(unsigned char address) { Write_com(address|0x80); delay1ms(1); }

/*写数据*/

void Write_Date(unsigned char date) { RS=1; RW=0; E=0; _nop_(); _nop_(); _nop_(); P0=date; _nop_(); _nop_(); _nop_(); E=1; _nop_(); _nop_(); _nop_(); E=0;

delay1ms(1);

}

/*初始化*/

void Lcd_Int(void) { Write_com(0x38); delay1ms(1); Write_com(0x38); delay1ms(1); Write_com(0x06); delay1ms(1); Write_com(0x0c); delay1ms(1); Write_com(0x01);

}

void displaymainpart(void)//显示液晶主要部分(不变化部分) {

第 37 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 Write_Address(0x01); delay1ms(1); Write_Date('D'); Write_Date('A'); Write_Date('T'); Write_Date('E'); Write_Date(':'); delay1ms(1);

Write_Address(0x0A); delay1ms(1); Write_Date('-'); Write_Address(0x0D); Write_Date('-'); Write_Address(0x42); Write_Date('T'); Write_Date('I'); Write_Date('M'); Write_Date('E'); Write_Date(':'); Write_Address(0x4A); Write_Date('-'); Write_Address(0x4D); Write_Date('-'); Write_Address(0x06); Write_Date('2'); Write_Date('0');

}

void display_Second(unsigned char second) //在液晶上显示秒 {

unsigned char i,j; i=second/10; j=second%10;

Write_Address(0x4E); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1);

}

void display_Minute(unsigned char minute) //在液晶上显示分 { unsigned char i,j; i=minute/10; j=minute%10;

Write_Address(0x4B);

Write_Date(digit[i]); 第 38 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 Write_Date(digit[j]); delay1ms(1);

}

void display_Hour(unsigned char hour) //在液晶上显示时 { unsigned char i,j; i=hour/10; j=hour%10;

Write_Address(0x48); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1);

}

void display_Day(unsigned char day) //在液晶上显示日 { unsigned char i,j; i=day/10; j=day%10;

Write_Address(0x0E); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); }

void display_Month(unsigned char month) //在液晶上显示月 { unsigned char i,j; i=month/10; j=month%10;

Write_Address(0x0B); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); }

void display_Year(unsigned char year) //在液晶上显示年 { unsigned char i,j; i=year/10; j=year%10;

Write_Address(0x08); Write_Date(digit[i]); Write_Date(digit[j]); delay1ms(1); }

void display_houra(unsigned char x) //闹钟小时部分显示

第 39 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 { unsigned char i,j; i=x/10; j=x%10;

Write_Address(0x44); Write_Date(digit[i]); Write_Date(digit[j]);

}

void display_minutea(unsigned char x)//闹钟分钟部分显示 { unsigned char i,j; i=x/10; j=x%10;

Write_Address(0x47); Write_Date(digit[i]); Write_Date(digit[j]); }

void display_Time(void) //显示实时时间 { unsigned char value,day,month,year; Write_com(0x0c);

value=ReadSet1302(0x81);

seconds=(((value&0x70)>>4)*10+(value&0x0f)); display_Second(seconds); value=ReadSet1302(0x83);

minutes=(((value&0x70)>>4)*10+(value&0x0f)); display_Minute(minutes); value=ReadSet1302(0x85);

hours=(((value&0x70)>>4)*10+(value&0x0f)); display_Hour(hours); value=ReadSet1302(0x87);

day=(((value&0x70)>>4)*10+(value&0x0f)); display_Day(day); value=ReadSet1302(0x);

month=(((value&0x70)>>4)*10+(value&0x0f)); display_Month(month); value=ReadSet1302(0x8D);

year=(((value&0xf0)>>4)*10+(value&0x0f)); display_Year(year); }

void displaystar(void) //显示欢迎界面 { unsigned char i,j;

Write_Address(0x0f);

第 40 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 while(displaywelcome[i]!='\\0') { Write_Date(displaywelcome[i]); i++;

delay1ms(1);

} i=0;

Write_Address(0x4f); while(displaywish[i]!='\\0') { Write_Date(displaywish[i]); i++;

delay1ms(1);

} j=40; while(j--) { Write_com(0x18);//循环左移 delay1ms(700);

}

Write_com(0x01); delay1ms(10);

}

void gbdisplay(unsigned char address) //时间调整时光标闪烁 { Write_Address(address); delay1ms(5); Write_com(0x0f); delay1ms(5);

}

void displaymaxt(unsigned char x) //显示最大温度 { unsigned char i,j,k; Write_com(0x0c); delay1ms(2);

Write_Address(0x44); i=x/100; j=x/10; k=x%10;

Write_Date(digit[i]); Write_Date(digit[j]); Write_Date(digit[k]); }

/*****************时间调整部分*********************/

第 41 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 void hourset(void) { unsigned char timevalue,hour; delay1ms(500);

//防止多次触发

WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302 //调时

timevalue=ReadSet1302(0x85); //读取此时的数值 hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f)); while(1) {

if(ADD==0) { delay1ms(50); if(ADD==0) { hour++; delay1ms(300); while(ADD==0);

}

}

if(RED==0) { delay1ms(50); if(RED==0) { hour--; delay1ms(300); if(hour==0) hour=23; while(RED==0); }

}

timevalue=(((hour)/10)<<4|(hour%10)); WriteSet1302(0x84,timevalue); delay1ms(1); display_Hour(hour); Write_Address(0x49); delay1ms(5);

if(hour>=24) hour=0; delay1ms(5); if(CANL==0) { mode=0;

Write_com(0x0c);

break; 第 42 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 }

if(SET==0) break;

}

WriteSet1302(0x8e,0x80);

}

void minuteset(void)

//调分

{ unsigned char timevalue,minute; delay1ms(500);

WriteSet1302(0x8e,0x00); timevalue=ReadSet1302(0x83);

minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { minute++;

if(minute>=60) timevalue=0; while(ADD==0);

}

}

if(RED==0) { delay1ms(10); if(RED==0) { minute--; delay1ms(300);

if(minute==0) minute=59; while(RED==0); }

}

timevalue=((minute/10)<<4|(minute%10)); WriteSet1302(0x82,timevalue); delay1ms(1);

display_Minute(minute); Write_Address(0x4c); delay1ms(5);

if(minute>=60) minute=0; delay1ms(5);

if(CANL==0)

第 43 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 { mode=0;

Write_com(0x0c); break;

}

if(SET==0) break;

}

WriteSet1302(0x8e,0x80);

}

void secondset(void)

//秒归零

{ unsigned char second; delay1ms(500);

WriteSet1302(0x8e,0x00); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { second=0;

WriteSet1302(0x80,0x00); while(ADD==0);

}

}

delay1ms(1);

display_Second(second); Write_Address(0x4f); delay1ms(5); if(CANL==0) { mode=0;

Write_com(0x0c); break; }

if(SET==0) break;

}

WriteSet1302(0x8e,0x80);

}

void yearset(void)

//调年

{ unsigned char datevalue,year;

delay1ms(500);

第 44 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x8d);

year=(((datevalue&0x70)>>4)*10+(datevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { year++; while(ADD==0);

}

}

if(RED==0) { delay1ms(10); if(RED==0) { year--; delay1ms(300); while(RED==0); }

}

datevalue=((year/10)<<4|(year%10)); WriteSet1302(0x8c,datevalue); delay1ms(5); display_Year(year); delay1ms(5);

Write_Address(0x09); delay1ms(5); if(CANL==0) { mode=0;

Write_com(0x0c); break; }

if(SET==0) break;

}

WriteSet1302(0x8e,0x80);

}

void monthset(void)

{

unsigned char datevalue,month;

//调月

第 45 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 delay1ms(500);

WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x);

month=(((datevalue&0x70)>>4)*10+(datevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { month++;

if(month>12) month=1; while(ADD==0);

}

}

if(RED==0) { delay1ms(10); if(RED==0) { month--; delay1ms(300);

if(month==0) month=12; while(RED==0); }

}

datevalue=((month/10)<<4|(month%10)); WriteSet1302(0x88,datevalue); delay1ms(1);

display_Month(month); Write_Address(0x0c); delay1ms(5); if(CANL==0) { mode=0;

Write_com(0x0c); break; }

if(SET==0) break;

}

WriteSet1302(0x8e,0x80);

}

void dayset(void)

//调日

第 46 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 { unsigned char datevalue,day; delay1ms(500);

WriteSet1302(0x8e,0x00); datevalue=ReadSet1302(0x87);

day=(((datevalue&0x70)>>4)*10+(datevalue&0x0f)); while(1) { if(ADD==0) { delay1ms(10); if(ADD==0) { day++;

if(day>31) day=1; while(ADD==0);

}

}

if(RED==0) { delay1ms(10); if(RED==0) { day--;

delay1ms(300); if(day==0) day=31; while(RED==0); }

}

datevalue=((day/10)<<4|(day%10)); WriteSet1302(0x86,datevalue); delay1ms(1);

display_Day(day); Write_Address(0x0f); delay1ms(5); if(CANL==0) { mode=0;

Write_com(0x0c); break;

}

if(SET==0) break;

}

WriteSet1302(0x8e,0x80);

第 47 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 }

void alarmhourset(void) //闹钟小时调整 { unsigned char value;

value=houra;

while(1) { if(ADD==0) { delay1ms(20); if(ADD==0) { Write_com(0x0c); delay1ms(5); value++;

if(value>23) value=0; while(ADD==0);

}

}

if(RED==0) { delay1ms(20); if(RED==0) { value--;

if(value==0) value=23; while(RED==0); }

}

houra=value;

display_houra(houra); gbdisplay(0x45); if(CANL==0) { delay1ms(500); break;

}

}

}

void alarmminuteset(void) //闹钟分钟调整 {

while(1) {

if(ADD==0) 第 48 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 }

void TimeSet(void) //时间调整函数 {

display_Time(); if(SET==0) {

delay1ms(10); if(SET==0) {

mode++; delay1ms(20); switch(mode) {

case(1):{gbdisplay(0x48);hourset(); delay1ms(500);} break; case(2):{gbdisplay(0x4c);minuteset();delay1ms(500);} break; case(3):{gbdisplay(0x4f);secondset();delay1ms(500);} break; case(4):{gbdisplay(0x09);yearset();delay1ms(500);} break;

{ }

if(RED==0) { }

display_minutea(minutea); gbdisplay(0x48); if(CANL==0) { }

delay1ms(500); break; delay1ms(20); if(RED==0) { }

minutea--;

if(minutea==0) minutea=59; while(RED==0) ; delay1ms(20); if(ADD==0) { }

minutea++;

if(minutea>59) minutea=0; while(ADD==0) ;

}

第 49 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 case(5):{gbdisplay(0x0c);monthset();delay1ms(500);} break; case(6):{gbdisplay(0x0f);dayset();delay1ms(500);} break;

}

if(mode==7) mode=0;

}

}

}

/***************显示温度模块********************/

unsigned char code displayexplain[]={\"Digit thermometer\unsigned char code displayerror[]={\"DS18B20 ERROR\unsigned char code displayerror1[]={\"PLEASE CHECK \unsigned char code displaypart1[]={\"WenDu:\unsigned char code displaypart2[]={\"Cent\unsigned char flag;

/**********************操作DS18B20模块***************************/ sbit DQ=P3^3; unsigned char time;

/**********************DS18B20初始化****************************/ bit IntDS18B20(void) { bit temp; DQ=1;

for(time=0;time<2;time++); DQ=0;

for(time=0;time<200;time++); DQ=1;

for(time=0;time<10;time++); temp=DQ;

for(time=0;time<200;time++); return temp; }

/**************************读DS18B20**********************/ unsigned char ReadDS18B20(void) { unsigned char i; unsigned char dat; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0; _nop_(); DQ=1;

for(time=0;time<2;time++); 第 50 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 dat>>=1; if(DQ==1) dat=dat|0x80; else

dat=dat|0x00; for(time=0;time<10;time++);

}

return dat;

}

/*********************向DS18B20写数据**************************/ void WriteDS18B20(unsigned char date) { unsigned char i; for(i=0;i<8;i++) { DQ=1; _nop_(); DQ=0;

DQ=date&0x01;

for(time=0;time<10;time++); DQ=1;

for(time=0;time<1;time++);

date>>=1;

}

for(time=0;time<4;time++); }

/*******************为读取温度做好准备************************/ void ReadyreadDS18B20(void) { IntDS18B20(); WriteDS18B20(0XCC); WriteDS18B20(0X44); delay1ms(200); IntDS18B20(); WriteDS18B20(0XCC); WriteDS18B20(0XBE);

}

/*************在1602液晶上显示相关信息模块**********************/ /****************当未检测到DS18B20时显示信息模块****************/ void Display_Error(void) {

unsigned char i=0; 第 51 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 Write_Address(0x00);

while(displayerror[i]!='\\0') { Write_Date(displayerror[i]); i++;

delay1ms(100);

}

delay1ms(5); i=0;

Write_Address(0x40);

while(displayerror1[i]!='\\0') { Write_Date(displayerror1[i]); i++;

delay1ms(100);

}

delay1ms(3000) ;

}

/*************温度显示模块****************/ void Display_Explain(void) { unsigned char i=0; Write_Address(0x00); delay1ms(5);

while(displayexplain[i]!='\\0') { Write_Date(displayexplain[i]); i++;

delay1ms(5); } i=0;

Write_Address(0x40);

while(displaypart1[i]!='\\0') { Write_Date(displaypart1[i]); i++;

delay1ms(5);

} i=0;

Write_Address(0x4C);

while(displaypart2[i]!='\\0') { Write_Date(displaypart2[i]);

i++;

第 52 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 }

/*********************显示温度整数部分*************************/ }

Write_Address(0x49); Write_Date('.'); delay1ms(5);

delay1ms(5);

void Display_Integer(unsigned char x) { unsigned char i,j,k; i=x/100; j=x%100/10; k=x%10;

Write_Address(0x46);

if(flag==1) Write_Date('-'); Write_Date(digit[i]); Write_Date(digit[j]); Write_Date(digit[k]); delay1ms(50) ; }

/************显示温度小数部分*********************/ void Display_Decimal(unsigned char x) { Write_Address(0x4A); delay1ms(5);

Write_Date(digit[x]); delay1ms(50);

}

void displayovert(void) { unsigned char i; Write_com(0x01); delay1ms(10); Write_Address(0x03); delay1ms(10); Write_Date('W'); Write_Date('A');

Write_Date('R'); Write_Date('N'); Write_Date('I'); Write_Date('N'); Write_Date('G'); Write_Date('!');

Write_Address(0x40); 第 53 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 while(overtemperature[i]!='\\0') { Write_Date(overtemperature[i]); i++;

delay1ms(10);

}

}

/*******************温度主函数********************/ void Temperature(void) { unsigned char i; delay1ms(5); if(IntDS18B20()!=0) Display_Error();

else { delay1ms(1); Write_com(0x01); delay1ms(5); Display_Explain();

for(length=50;length>0;length--) { for(i=0;i<6;i++) { flag=0;

ReadyreadDS18B20(); TL=ReadDS18B20(); TH=ReadDS18B20(); if((TH&0XF8)!=0X00) { flag=1; TL=~TL; TH=~TH; TL+=1;

if(TL>255) TH+=1; TN=TH*16+TL/16; TD=(TL%16)*10/16;

}

TN=TH*16+TL/16; TD=(TL%16)*10/16; Display_Integer(TN); Display_Decimal(TD); delay1ms(10);

}

if(tempswitch==1)

第 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 { if(TN>=Maxtemp) { Write_Address(0x03); delay1ms(5); displayovert(); while(1) { baojing(1); if(CANL==0) { Write_com(0x01); delay1ms(5); break;

}

}

}

}

if(CANL==0) break;

}

}

}

void tempset(void) { if(ADD==0) { delay1ms(10); if(ADD==0) { Maxtemp++; while(ADD==0);

}

}

if(RED==0) { delay1ms(10); if(RED==0) { Maxtemp--; while(RED==0); }

}

}

void Maxtempset(void) //高温报警设置

第 55 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 { Write_com(0x01); delay1ms(10); Write_Address(0x03); delay1ms(10); Write_Date('T'); Write_Date('E'); Write_Date('M'); Write_Date('P'); Write_Address(0x09); Write_Date('S'); Write_Date('E'); Write_Date('T'); Write_Address(0x40); Write_Date('M'); Write_Date('A'); Write_Date('X'); Write_Date(':'); while(1) { if(SET==0) { delay1ms(20); if(SET==0) { Write_Address(0x4e); Write_com(0x0f); while(1) { if(ADD==0) { delay1ms(20); if(ADD==0) { Write_Address(0x4b); delay1ms(5); Write_Date('O'); Write_Date('N'); Write_Date(' '); tempswitch=1;

}

}

if(RED==0)

{

第 56 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 delay1ms(20); if(RED==0) { Write_Address(0x4b); Write_Date('O'); Write_Date('F'); Write_Date('F'); tempswitch=0;

}

}

if(CANL==0) { delay1ms(500); break; }

}

}

}

if(tempswitch==1) { Write_Address(0x4b); Write_Date('O'); Write_Date('N'); Write_Date(' '); tempset();

displaymaxt(Maxtemp); if(CANL==0) {

Write_com(0x01); displaymainpart(); break;

}

}

if(tempswitch==0) { Write_com(0x0c); Write_Address(0x4b); Write_Date('O'); Write_Date('F'); Write_Date('F'); }

if(CANL==0) {

Write_com(0x01); 第 57 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 displaymainpart(); break;

}

}

}

void alarmswitchset(void) { while(1) { if(ADD==0) { delay1ms(100); if(ADD==0) { alarmmode=1;

Write_Address(0x4c); Write_Date('O'); Write_Date('N'); Write_Date(' ');

}

}

if(RED==0) { alarmmode=0;

Write_Address(0x4c); Write_Date('O'); Write_Date('F'); Write_Date('F'); }

if(CANL==0) { delay1ms(500); break; }

}

}

/**************** 设置模块 ******************/ void Set(void) { if(SET==0) { delay1ms(10); if(SET==0)

{ 第 58 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 Write_Address(0x40); Write_Date('T'); Write_com(0x0f); delay1ms(1000); Write_com(0x0c); while(1) { TimeSet(); if(ADD==0) {

delay1ms(20); if(ADD==0) { Write_com(0x01); Write_Address(0x00); delay1ms(5); Write_Date('S'); delay1ms(10); Maxtempset();

}

}

if(RED==0) { delay1ms(20); if(RED==0) { Write_com(0x01); delay1ms(5);

Write_Address(0x02); Write_Date('A'); Write_Date('L'); Write_Date('A'); Write_Date('R'); Write_Date('M'); Write_Address(0x09); Write_Date('S'); Write_Date('E'); Write_Date('T'); Write_Address(0x46); Write_Date('-'); display_houra(houra); display_minutea(minutea); if(alarmmode==1)

{ 第 59 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告

}

if(alarmmode==0) { } while(1) {

if(SET==0) {

delay1ms(100); if(SET==0) {

amode++; switch(amode) {

Write_Address(0x4c); Write_Date('O'); Write_Date('F'); Write_Date('F');

Write_Address(0x4c); Write_Date('O'); Write_Date('N'); Write_Date(' ');

case(1):{gbdisplay(0x45);alarmhourset();Write_com(0x0c);delay1ms(500);} break; case(2):{gbdisplay(0x48);alarmminuteset();Write_com(0x0c);delay1ms(500);} break; case(3):{gbdisplay(0x4c);alarmswitchset();Write_com(0x0c);delay1ms(500);} break;

}

if(CANL==0) {

Write_Address(0x40); Write_Date(' '); Write_com(0x0c); }

}

}

if(CANL==0) { }

Write_com(0x01); delay1ms(5); displaymainpart(); break; }

if(amode==4) amode=0; }

第 60 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 break;

}

}

}

}

}

/***************主函数**********************/ void main() { IE=0X82; //打开定时中断 TMOD=0X01; //选择定时器0工作在方式1 TR0=0;

//启动定时器0

IntDS1302(); //初始化DS1302 delay1ms(1); Lcd_Int();

//1602液晶初始化

delay1ms(2); displaystar(); //显示欢迎界面

displaymainpart(); //显示主要部分(不变化)

while(1) { display_Time( ); Set( ); if(ADD==0) { Write_com(0x01); delay1ms(5); Temperature(); Write_com(0x01); displaymainpart();

}

if((hours==houra)&&(minutes==minutea)&&(seconds==0)) { if(alarmmode==1) { Write_com(0x01); delay1ms(5);

Write_Address(0x03); Write_Date('T'); Write_Date('I'); Write_Date('M'); Write_Date('E'); Write_Address(0x08);

Write_Date('U'); 第 61 页 共 62 页

江西财经大学职业技术学院 单片机课程设计报告 }

}

}

}

Write_Date('P'); Write_Date('!'); delay1ms(5); while(1) { }

baojing(1); if(CANL==0) { }

Write_com(0x01); delay1ms(5); displaymainpart(); break;

附录四:参考文献

【1】.张靖武.周灵彬.单片机原理、应用与PROTEUS仿真; 【2】.江志红.51单片机技术与应用系统开发案例精选; 【3】.周润景.基于PROTEUS的51单片机设计与仿真; 【4】.王守中.51单片机开发入门与典型实例; 【5】.张齐.朱宁西.单片机系统设计与开发; 【6】.周立功单片机开发网 【7】.天津锐志单片机开发网

【8】.维纳电子DS18B20温度传感器中文PDF资料 【9】.ATMEL公司ATS52单片机中文PDF资料;

【10】.长沙太阳人电子有限公司通用型1602液晶PDF资料

第 62 页 共 62 页

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- efsc.cn 版权所有 赣ICP备2024042792号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务