毕业设计(论文)-基于单片机的水泥温度养护箱的设计

上传人:na****u 文档编号:56504695 上传时间:2022-02-21 格式:DOC 页数:40 大小:3.76MB
收藏 版权申诉 举报 下载
毕业设计(论文)-基于单片机的水泥温度养护箱的设计_第1页
第1页 / 共40页
毕业设计(论文)-基于单片机的水泥温度养护箱的设计_第2页
第2页 / 共40页
毕业设计(论文)-基于单片机的水泥温度养护箱的设计_第3页
第3页 / 共40页
资源描述:

《毕业设计(论文)-基于单片机的水泥温度养护箱的设计》由会员分享,可在线阅读,更多相关《毕业设计(论文)-基于单片机的水泥温度养护箱的设计(40页珍藏版)》请在装配图网上搜索。

1、 基于单片机的水泥养护箱温度检测仪的设计 第 40 页 共 40 页单片机原理及应用 课程设计说明书设计题目:水泥养护箱温度检测仪的设计学 院:工学院专 业:电气工程及其自动化设 计 者:学 号:指导老师:设计时间:2016年12月5日2016年12月25日单片机原理及应用课程设计任务书一、目的意义单片机原理及应用是高校工程专业的一门专业基础课,该门课程具有很强的实践性。通过课程的学习,使学生掌握基本概念、基本理论和基本技能,为今后从事相应的生产设计和科研工作打下一定的基础。因此,除课程的理论教学和实验教学外,单片机课程设计也是一个必要和重要的实践教学环节。通过课程设计,进一步培养学生理论联系

2、实际的能力,学会正确地分析工程实际问题,善于查阅参考文献,准确地选择相应的数据、参数,具备全面地解决实际问题的素质,同时课程设计也为今后的毕业设计打下基础。二、设计时间、地点、班级时间:第16、17周(二周)地点: 三教433 、426 班级: 14电气工程及其自动化第三组 三、设计内容(2)水泥养护箱温度检测仪的设计1、功能描述水泥养护箱是水泥企业必备的试验设备,其性能的优劣直接影响水泥检验结果的准确性设计,单片机控制的水泥养护箱温度检测仪,温度范围2035。控制要求:(1)系统每隔2秒钟采集一次温度值,正常情况下,由LCD显示器显示;(2)当温度达到35以上时,红色指示灯常亮,并伴有声音报

3、警,低于20时,黄色指示灯亮,也伴有声音报警;温度在2035之间时,绿色指示灯长亮;(可用三路LED灯代替)(3)可以通过串口将采集的温度实时数据送PC机显示;(4)设计温度加热电路;当温度低于20时,加热电路即开发板上继电器可以打开开始工作。2、设计要求:(1)、分析系统功能,选择单片机、温度传感器(热电偶)和功能模块;(2)、设计系统的硬件电路图;(3)、编写相应的软件,完成控制系统的控制要求;(4)、上机调试、完善程序;3、软件设计要求:可以用按键设置温度目标值,150ms扫描按键一次,用定时器0;200ms启动一次AD转换,用定时器1;且AD转换结果在AD中断服务程序中读出,读10次取

4、平均值并在LCD12864上显示,同时结果通过串口0发送到PC机。 目 录摘要21 总体设计方案21.1设计原理及相关说明21.2总体设计框图32 各芯片的设计及其调用42.1 STC90C516RD+单片机主控模块42.2 温度传感器(热电偶)52.2.1 热电偶的结构及工作原理62.3 AD转换模块72.3.1 PCF8591的基本特性72.3.2 引脚及接口说明72.3.3 24C02的基本特性82.3.4 24C02的引脚及接口说明82.4 LCD 12864B 液晶显示模块(带中文字库)92.4.1 带字库的12864的基本特性92.4.2 引脚及接口说明102.4.3 LCD128

5、64液晶显示模块使用注意事项102.5 复位和晶振电路112.6 键盘接口与工作显示模块113 系统软件设计123.1 按键扫描程序123.2 LCD12864显示程序133.3 AD转换程序143.4 串口发送程序153.5 报警及温度调节程序164 调试174.1 调试步骤174.2 性能分析18附录1 系统电路原理图19附录2 实物调试图21附录3 程序清单23附录4 实物清单-38基于单片机的水泥养护箱温度检测仪设计作者:马晓晴 指导老师:吴敏(安徽农业大学工学院 14级电气工程及其自动化 )摘要:该设计是基于单片机的水泥养护箱温度检测系统,采用STC90C516RD+单片机作为主控制

6、器,具有温度采集、AD转换、按键设置、数据显示及传送和报警模块。不仅能实现将温度传感器采集到的模拟电压信号转换为数字信号,在LCD12864彩屏上显示,并将数据实时传送到PC机的功能,而且还能设置温度上限和温度下限,当实际温度超过温度上限时,启动报警装置,当实际温度低于温度下限时自动启动加热装置。具有实时、自动、智能等特点。 1 总体设计方案1.1设计原理及相关说明 单片机控制水泥养护箱的温度保持在20-35之间,因此采用PCF8591AD转换器将从温度传感器热电偶上采集的模拟电压信号转换成数字信号,通过反复实验找到电压与温度之间对应的函数关系,建立正确的数学模型,然后通过LCD12864将实

7、际测量温度显示出来,此时再通过程序设置温度上限和温度下限,当实际温度超过温度上限35时,实验箱亮红灯且发出警报声,当实际温度在正常温度范围内时,实验箱亮绿灯,当实际温度低于温度下限20时,实验箱亮黄灯,且发出警报声,此时连接加热电路的继电器开始工作。另外该系统还可通过串口将实时温度发送到PC机上,便于监控实验箱温度。图1为该系统的主流程图。 开始初始化按键扫描AD转换 LCD12864显示报警及温度调节串口发送结束 图1 程序主流程图 由于实验室热电偶试验台温度调试时温度很难降到20以下,因此在程序编写时将温度下限调整为35,温度上限调整为45;另外由于实验室开发板上没有黄色和绿色的LED灯,

8、因此在程序编写时,将其改为三个不同位置的红色LED灯,当实际温度超过45时,第一个红灯亮,当实际温度在允许温度范围内时,第二个红灯亮,当实际温度低于35时,第三个红灯亮;由于系统每隔2秒钟采集一次温度,并取10次平均值显示在LCD12864上,因此显示温度值波动较大,但总的实际温度变化趋势与理想变化趋势相符合。1.2总体设计框图水泥养护箱温度检测系统设计框图如图2所示:图2 水泥养护箱温度检测系统设计框图2 各芯片的设计及其调用2.1 STC90C516RD+单片机主控模块单片机的主控模块如图2,它以单片机STC90C516RD+为核心,STC90C516RD+系列单片机是宏晶科技推出的新一代

9、超强抗干扰/高速/低功耗单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可任意选择,内部集成MAX810专用复位电路,时钟频率在12MHZ以下时,复位脚可直接接地。其主要性能特点如下:增强型6时钟/机器周期,12时钟/机器周期8051CPU;工作电压:5.5V-3.8V(5V单片机)/3.8V-2.4V(3单片机);工作频率范围:0-40MHZ,相当于普通8051的0-80MHZ;用户应用程序空间4K/6K/7K/8K/10K/12K/13K/16K/32K/40K/48K/56K/61K/字节;片上集成 1280字节/512/256字节 RAM;通用I/O口(

10、35/39 个),复位后为: P1/P2/P3/P4 是准双向口/ 弱上拉(普通8051 传统I/O 口)P0口是开漏输出,作为总线扩展用时,不用加上拉电阻,作为I/O 口用时,需加上拉电阻;ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器 / 仿真器可通过串口(P3.0/P3.1)直接下载用户程序,8K 程序3 - 5 秒即可完成一片;EEPROM 功能;看门狗;内部集成MAX810专用复位电路,外部晶体12M以下时,可省外部复位电路,复位脚可直接接地;共3个16位定时器/计数器,其中定时器0还可以当成2个8位定时器使用;外部中断4路,下降沿中断或低电平触发中断,Power D

11、own模式可由外部中断低电平触发中断方式唤醒;通用异步串行口(UART),还可用定时器软件实现多个UART;工作温度范围:0-75/-40-+85;封装:LQFP-44,PDIP-40,PLCC-44。由图3可知,单片机的18和19管脚接时钟电路,19管脚接外部晶振和微调电容的一端,在片内它是振荡器倒相放大器的输入,18管脚接外部晶振和微调电容的另一端,在片内它是振荡器倒相放大器的输出,9引脚是复位输入端,接上电容、电阻及开关后构成上电复位电路。图3 主控制器 STC90C516RD+模块2.2 温度传感器(热电偶)温度传感器是指能感受温度并转换成可用输出信号的传感器。按测量方式可分为接触式和

12、非接触式,按照传感器材料及电子元件特性可分为热电阻和热电偶两大类。本文介绍是热电偶传感器,它能直接测量温度,并把温度信号转换成热电动势信号,通过电气仪表(二次仪表)转换成被测介质的温度。 图3 热电偶实物图2.2.1 热电偶的结构及工作原理热电偶工作原理是基于赛贝克效应,即两种不同成分的导体两端连接成回路,如两连接端温度不同,则在回路内产生热电流的物理现象。该系统采用的是K/E复合型热电偶,该热电偶的特点是:适宜在氧化性及惰性气体中连续使用,其热电势与温度的关系近似线性,价格便宜;1000以下耐氧化性良好;构造简单,使用方便,测量范围广,测量精度高。 图4 热电偶传感器的结构图 当热电偶采集到

13、热电势后,这个热电势的电压值通常都会比较小,为了方便测量,需将热电偶连接上放大电路。实验室的温度传感器实验模块内置了放大电路,将两个温度传感器实验模块连接在一起,构成两级电压放大电路,这样方便测出电压信号。图5所示为传感器与实验电路连接。 图5 传感器与实验电路连接图2.3 AD转换模块 图5 PCF8591 AD转换模块如图5所示,本设计采用PCF8951 AD转换与24C02 EEPROM模块实现温度的采集与转换,PCF8951是一个单片集成、单独供电、低功耗、8-bit CMOS数据获取器件。它具有4个模拟输入、1个模拟输出和1个串行I2C总线接口。24C02是一个1K/2K/4K/8K

14、/16K位串行COMS EEPROM,内部含有128/256/512/1024/2048 个8 位字节,CATALYST 公司的先进CMOS 技术实质上减少了器件的功耗。24C02有一个16 字节页写缓冲器,该器件通过I2C 总线接口进行操作有一个专门的写保护功能。2.3.1 PCF8591的基本特性: (1)PCF8591的操作电压范围2.5V-6V; (2)低待机电流; (3)通过I2C总线串行输入/输出; (4)PCF8591的采样率由I2C总线速率决定; (5)8-bit逐次逼近A/D转换器; (6)PCF8591内置跟踪保持电路; (7)PCF8591模拟电压范围从Vss到VDD;

15、(8)4个模拟输入可编程为单端型或差分输入。2.3.2 引脚及接口说明: PCF8591P的引脚图如图6所示。 图6 PCF8591P引脚图 接口说明:AIN0-AIN3:模拟信号输入端; A0-A3:引脚地址端; VDD,VSS:电源端,(2.5V-6V); SDA,SCL:I2C总线的数据线、时钟线; OSC:外部时钟输入端,内部时钟输出端; EXT:内部、外部时钟选择线,使用内部时钟时EXT接地; AGND:模拟信号地。2.3.3 24C02的基本特性: (1)与400KHz I2C总线兼容 ; (2)1.8V-6.0V工作电压范围; (3)低功耗COMS技术; (4)写保护功能:当WP

16、为高电平时进入写保护状态; (5)页写缓冲器; (6)自定时擦写周期; (7)温度范围:商业级,工业级和汽车级;2.3.4 24C02的引脚及接口说明: 24C02的引脚图及接口说明如图7所示。 图7 24C02引脚及接口说明图2.4 LCD 12864B 液晶显示模块(带中文字库)如图7所示,本设计采用LCD 12864B 液晶显示模块,它属于点阵型液晶,可直接调用CGRAM中的字库,即DB定义即可,而不带中文字库的LCD12864则需要采用取模软件取模,相比较之下前者更加方便使用。2.4.1 带字库的12864的基本特性: (1)内置汉字字库,提供8192个1616点阵汉字(12864内部

17、有一个CGROM,内容掉电可以存储,所以汉字字库会存放在里面。满屏最多显示4*8=32个汉字)。(2)内置 128个168点阵ASCII字符(12864一次最多可以显示4*16=64个ASCII字符)。(3)通讯方式:串行、并口可选 (数据写入和读出可以是以串行的方式,也可以是以并行的方式。) 图8 LCD12864液晶显示模块2.4.2 引脚及接口说明 图9 12864接口说明图10 12864引脚说明2.4.3 LCD12864液晶显示模块使用注意事项: (1)欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码;(2)显示ASCII字符过程与显示中文字

18、符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置;(3)当字符编码为2字节时,应先写入高位字节,再写入低位字节;(4)当写入为数字时,应在数字后面加上0x30,将其转换成为基本指令;(5)模块在接收指令前,向处理器必须先确认模块内部处于非忙状态,即读取BF标志时BF需为“0”,方可接受新的指令。如果在送出一个指令前不检查BF标志,则在前一个指令和这个指令中间必须延迟一段较长的时间,即等待前一个指令确定执行完成。指令执行的时间请参考指令表中的指令执行时间说明;(6)“RE”为基本指令集与扩充指令集的选

19、择控制位。当变更“RE”后,以后的指令集将维持在最后的状态,除非再次变更“RE”位,否则使用相同指令集时,无需每次均重设“RE”位;2.5 复位和晶振电路 单片机的晶振电路通由一个晶振和两个电容组成,晶振频率的大小决定了单片机系统运行速度的快慢。每条指令都由一个或几个机器周期组成,1个机器周期等于12个晶振周期。复位是单片机的初始化操作,单片机在启动时都需要复位,以使CPU及系统各部件处于确定的初始状态,并从初态开始工作。51系列单片机的复位要求是RST上加高电平时间大于2个机器周期。 图11 晶振电路与复位电路模块2.6 键盘接口与工作显示模块键盘接口电路如图12,本次设计中,按键有3个,升

20、温键,降温键和确定键,每个按键各占用一根I/O线,各按键相互独立,彼此的工作状态互不影响,STC单片机自带上拉电阻因此无需外接上拉电阻。当进行目标温度设定时,由升温键和降温键控制目标温度数值的加减,当按下确定键时,LCD显示测量电压和测量温度,同时启动串口向PC机发送数据。当测量温度大于温度上限45摄氏度时,LED0亮,当温度小于温度下限35摄氏度时,LED2亮,当温度处于允许温度范围内时,LED1亮。其工作显示电路如图13所示。 图12 键盘接口电路 图13 工作状态显示电路图3 系统软件设计3.1 按键扫描程序 本系统对目标温度的设定采用三个按键设定,分别定义为加按键,减按键和确定按键,采

21、用定时器0,150ms扫描按键一次。在设定目标温度的过程中,温度值设定为浮点型,加按键按下则温度值个位加一,满十进位,减按键按下则温度值个位减一,满十借位,十分位和百分位始终保持0,即设定目标温度值始终为整数,温度设定完成后,按下确定键,此时开始显示实际测量温度值和测量电压值,同时启动串口将实际测量的温度值发送到PC机。按键扫描程序流程图如下图14所示:是是否否开始判断升温键 是否按下判断降温键 是否按下判断确定键 是否按下等待按键个位温度加1个位温度减1启动温度和 电压测量启动串口发送是 图14 按键扫描程序流程图 3.2 LCD12864显示程序LCD12864为带中文字库的彩屏,因此要想

22、在LCD上显示中文字符,则首先要定义一个code数组,将要显示的内容存放到数组里,在显示中文字符时要先用LCD12864_SetWindow()函数设定显示字符的位置坐标,本系统中程序设定中文字符为第一行显示“设定温度:”,第三行显示“测量温度:”,第四行显示“测量电压:”,而数字变量皆为四位数字,并设定在两位数字之间添加小数点以此来显示浮点型小数,因此本设计在LCD显示之前先定义了片外可读写数组xdata,以便于将测量数据和按键调节数据存放其中,并在数组显示完成一次后清零,以避免出现乱码显示的现象。 NY开始LCD12864初始化置显示行初值,显示指针指向第一行待显示数据送入缓冲区预设数据显

23、示在指定区域中调整指针,指向LCD下一行显示结束否?结束 图16 LCD12864 显示程序流程图3.3 AD转换程序 将热电偶采集到的电压信号接到PCF8591P的AIN1口,启动I2C总线,这时程序中的接收函数开始接受数据,并设置一个变量i,使其循环十次,每次测得的温度值都与前一个相加得到sum,再将sum/10的值赋值给变量temp,即读10次取平均值,保证数据的稳定性,减小误差。为了使数据更加准确,通过反复实验测量,得到热电偶检测到的电压值与温度显示值存在的单值对应关系,转换过后显示在LCD12864上,其AD转换流程图如下所示。 开始AD初始化启动I2C总线发送字节数据AIN1口读取

24、数据启动AD转换,读10次取平均值结束If(flagstart=1)是否 图17 AD转换程序流程图3.4 串口发送程序 当设定完目标温度按下确定键时,开始测量标志位flagstart置1,此时启动串口发送,将接收到是数据放入到寄存器中,串口显示按照从低位到高位显示的顺序,因此先发送低位,串口发送程序流程图如下所示:开始if((flagstart=1)启动串口发送将接收到的数据放入到寄存器等待发送完成串口初始化 图18 串口发送程序流程图3.5 报警及温度调节程序 将继电器连接到单片机P3.3口,将蜂鸣器连接到单片机P3.5口,将LED0,LED1和LED2分别接在单片机P3.0,P3.7和P

25、3.6口,当测量温度小于温度下限35摄氏度时,P3.3口置0,继电器开始工作,启动加热电路,P3.5口不断取反,蜂鸣器发出蜂鸣声,此时LED1常亮,当测量温度大于温度上限45摄氏度时,蜂鸣器发出蜂鸣声,此时LED0常亮,当测量温度在35摄氏度到45摄氏度之间时,LED2常亮。其程序流程图如下图所示: 开始判断温度是否正常Y指示灯2常亮N判断温度是否高于温度范围Y指示灯0常亮,且蜂鸣器报警N指示灯LED1常亮,蜂鸣器报警,继电器打开结束 图19 报警及温度调节程序流程图4 调试4.1 调试步骤(1)题目拿到手后,对 LCD12864 的用法及功能并不怎么熟悉,因为在学习单片机课程的过程中,大部分

26、都是采用数码管或者LCD1602来做显示模块,很少涉及到LCD12864,只知道在显示之前要先设定显示的位置。(2)在学习了单片机例程中的“LCD12864显示汉字”这个例程以及搜集了大量资料之后,开始自己在例程的基础上改写,但是由于例程采用的是不带字库的LCD,而实验室提供的为带中文字库的LCD彩屏,两种LCD的引脚分布以及功能不太一样,不带字库的分为两个片选区,CS1和CS2,要采用取模软件将要显示的字符先写入数组中,而带字库的则只需调用即可,因此在初次调试的过程中,因为没有弄清楚带字库与不带字库显示的原理,所以经常黑屏或者乱码。(3)在后期彩屏调试的过程中,发现静态的数组即“设定温度”“

27、测量温度”等这些数组可以正常显示,而动态的变量则总是出现乱码,例如在按键设置目标温度时,加按键或减按键按下之后屏幕开始出现乱码,经过老师的指导,终于找到了问题的关键所在,我在设定用于存放数据的数组时,设定为code型,即只读型,因此只能显示静态的数组,于是我将存放按键设定目标温度以及测量温度和测量电压这些变量的数组设置为xdata型,并在显示函数中,在其后加上0x30,将数字转换成为基本指令,数组显示完成一次后清零,避免了再次出现乱码的现象。(4)在显示测量温度时,数据的小数位及个位变化速度太快,以至于出现数据显示模糊的现象,因此我在AD读取数据的函数中加入了延时函数,delay(900),发

28、现显示数据明显清晰和稳定,但是由于延时太久,再加上单片机开发板自身的硬件的问题,导致蜂鸣器不够响,只能凑近才能听到“嘟嘟”的响声。(5)在编写程序时,题目要求温度范围为20-35,低于20时亮黄灯,高于35时亮红灯,正常温度范围内时亮绿灯,但是由于实验室开着空调,试验台的热电偶在温度升上去之后再降到20以下的速度非常慢,因此为了便于测试我将允许温度的范围修改为35-45,另外由于实验室提供的单片机开发板上没有黄色和绿色的LED灯,因此我将不同颜色的灯改成不同位置的灯来表示实验箱的工作状态。(6)在矫正电压与温度的单值对应关系时,发现LCD显示的测量温度总比试验台显示的温度稍微之后,在调节了试验

29、台的放大增益后,发现总的温度变化的趋势是一致的,但是LCD显示的温度值上下波动较大,仔细思考过后发现,是由于按照题目要求显示的温度是AD读取10次的平均值,因此LCD显示的温度较试验台显示的温度波动较大,于是我将10次平均值修改为直接读取显示,对比调试后发现不取平均值比取平均值波动要小,但是按照题目要求,我将程序依旧写为10次取平均值。(7)在串口发送数据到PC机的过程中,起初调试时,串口助手中的文本格式总是出现乱码,请教同学后发现,在发送文本到PC机上时,在程序中要写成汉字相对应的ASCII代码,并按照从低位到高位的顺序传送,在PC机上的文本格式下才能显示正确的汉字。(8)另外在编写AD转换

30、模块的程序时,题目要求采用定时器1每200ms启动一次AD转换,但是调试过程中发现如果对AD采用中断溢出则屏幕就会出现乱码,不能正常显示,由于课程设计时间有限,于是放弃了这一环节的设置,并将定时器1应用到串口上。(9)在这次的单片机课程设计中,我学会了LCD12864,AD转换以及串口的使用,并深刻意识到了理论与实践相结合的重要性,也从中体会到了许多乐趣,日后我将在课余时间多学习单片机的相关知识,来提高自己的专业技能。 4.2 性能分析 将程序烧入单片机后,开机显示“设定温度:00.00”,“测量温度:”和“测量电压:”,按下K1(升温键),设定温度个位加1,将其设定为“设定温度:40.00”

31、,按下K3(确定键),开始显示测量温度和测量电压,即LCD12864界面变为“设定温度:40.00”,“测量温度:xx.xx”,“测量电压:xx.xx”,此时打开PC机上的串口调试助手,将波特率设置为4800,打开文本格式,即可看到实时测量的温度。当测量温度小于35时,单片机开发板上右边最下面的LED灯亮,继电器开始工作加热电路开启,且蜂鸣器开始发出蜂鸣声;当测量温度大于35小于45时,开发板上右边中间的LED灯亮,继电器和蜂鸣器均停止工作;当测量温度大于45时,开发板上右边最上面的LED灯亮,蜂鸣器发出蜂鸣声。LCD显示10次平均值的结果,因此显示温度上下波动较大,但是总体变化趋势与实验台保

32、持一致,蜂鸣器声音较小,且PC机上显示的汉字“摄氏度”偶尔会出现乱码,所以本设计仍有许多需要改进的地方,请老师多多指教!附录1 系统电路原理图附录2 实物调试图 开机显示:测量温度高于45时:测量温度在35到45之间时:测量温度低于35时:附录3 程序清单主程序:#include#includelcd12864.h#include #includetemp.hunsigned char code CharCode=设定温度: ; /第一行显示“设定温度”unsigned char xdata setdata=0,0,0,0,0,0; /用于存放设定温度值 按键可调unsigned char c

33、ode tempmeasure=测量温度: ; /第三行显示“测量温度”第三行unsigned char xdata datas=0,0,0,0,0,0; /用于存放测量的温度值unsigned char code voltemeasure=测量电压: ; /第四行显示“测量电压“第四行unsigned char xdata volt=0,0,0,0,0,0; /用于存放测量的电压值sbit key_up=P10; /升温键 K1sbit key_dowm=P11; /降温键 K2 sbit confir=P12; /确定键 K3 sbit beep=P35; /蜂鸣器 sbit led0=P

34、30; /亮灯显示 温度过高时常亮sbit led1=P37; /温度过低时常亮sbit led2=P36; /温度正常时常亮sbit jidianqi=P33; /继电器uchar count=0; /设置定时器变量uchar flagstart; /确定按键按下标志位int set; /用于设定温度用 数组直接加减不行uchar CNCHAR6 = 摄氏度;void LcdDisplay(int); / 函数申明void UsartConfiguration();void tx_init();*void main()unsigned char i,j,y; tx_init(); /定时器初

35、始化 UsartConfiguration(); /初始化串口LCD12864_Init(); /12864初始化 while(1)LCD12864_SetWindow(0,0); /顶行显示while(CharCodei!=0)LCD12864_WriteData(CharCodei); /显示汉字i+;LCD12864_SetWindow(2,0); /第三行显示while(tempmeasurej!=0)LCD12864_WriteData(tempmeasurej); /显示汉字j+;LCD12864_SetWindow(3,0); /第四行显示while(voltemeasurey!

36、=0)LCD12864_WriteData(voltemeasurey); /显示汉字 电压y+; while(1) LcdDisplay(ReadTemp(); /12864显示温度 *void keyset(void) /按键设定温度值 key_up=1; if(!key_up) /如果温度加的按键按下 delay(100); /延时100MS用于消抖if(!key_up)set+; /个位温度值加1 if(!key_dowm) /如果温度加的按键按下 delay(100); /延时10MS用于消抖if(!key_dowm) /减法到0时,出现错误,需要逐级判断才行 set-; /个位温度

37、值减1 if(!confir) /如果启动测量按键按下 delay(100); /延时消抖 if(!confir) flagstart=1; /开始测量标志位 *void LcdDisplay(int temp) /lcd显示 此处temp类型应该与ReaTemp返回值类型一致,否则可能会出错int voltes; unsigned char i,t,s,a; /这些变量都是用于循环显示,用完后要清零 float tp,sets; /用于整型变量和浮点型变量转换 keyset(); /按键先扫描一次 /显示设定温度sets=set;set=1.00*sets;setdata4 = 0+0x30

38、; /百分位 直接显示0setdata3 = 0+0x30; /十分位 直接显示0setdata2=0x2e ; /加一个小数点setdata0 = (set % 100 / 10)+0x30; /十位setdata1 = (set % 10)+0x30; /个位 第一个动的LCD12864_SetWindow(0,5); /第一行第六位显示 设定温度数据while(setdataa!=0) /直到显示完数组内容LCD12864_WriteData(setdataa); /显示数据a+;a=0; /a到3时候,清零,后面持续循环使用if(flagstart)if(temp0.0) /当温度值为

39、负数 tp=temp; /将int型temp转化为float型tp voltes=0.95*tp; /电压,便于找电压与温度关系式 temp=tp*10.00; /将温度对应的电压放大10倍进行采集 ,可以提高灵敏度 temp=voltes*2.15+7.00; / 电压与温度关系 datas0 = (temp % 10000 / 1000)+0x30; /十位 测量温度datas1 = (temp % 1000 / 100)+0x30; /个位datas2=0x2e ; /加一个小数点datas3 = (temp % 100 / 10)+0x30; /十分位datas4 = (temp %

40、10)+0x30; /百分位 *显示测量温度*LCD12864_SetWindow(2,5); /第三行第六位显示while(datast!=0) /直到显示完数组内容LCD12864_WriteData(datast); /显示数据t+;t=0; /t到3时候,清零,后面持续循环使用*报警及调节温度程序*if(temp4500) /温度高于45时,led0灯常亮,蜂鸣器响led0=0;beep=beep; else led0=1;if(temp3500&temp4500) /温度在35和45之间,led2常亮led2=0;delay(50);else led2=1;*显示测量电压*volt0

41、 = (voltes % 10000 / 1000)+0x30; /十位volt1 = (voltes % 1000 / 100)+0x30; /个位volt2=0x2e ; /加一个小数点volt3 = (voltes % 100 / 10)+0x30; /十分位volt4 = (voltes % 10)+0x30; /百分位LCD12864_SetWindow(3,5); /第四行第六位显示 测量电压显示while(volts!=0) /直到显示完数组内容LCD12864_WriteData(volts); /显示数据s+;s=0; /s到3时候,清零,后面持续循环使用 *串口显示*SBU

42、F = 0+(temp % 10000 / 1000); /将接收到的数据放入到发送寄存器while (!TI); /等待发送数据完成TI = 0;SBUF = 0+(temp % 1000 / 100); /将接收到的数据放入到发送寄存器while (!TI); /等待发送数据完成TI = 0;SBUF = .; /将接收到的数据放入到发送寄存器while (!TI);/等待发送数据完成TI = 0;SBUF = 0+(temp % 100 / 10); /将接收到的数据放入到发送寄存器while (!TI); /等待发送数据完成TI = 0;SBUF = 0+(temp % 10); /将

43、接收到的数据放入到发送寄存器while (!TI); /等待发送数据完成TI = 0;for(i=0; i6; i+) /在串口中显示 摄氏度 汉字 SBUF = CNCHARi; /将接收到的数据放入到发送寄存器while (!TI); /等待发送数据完成 TI = 0; *void UsartConfiguration() /设置串口SCON=0X50;/设置为工作方式1 TMOD=0X22;/设置计数器工作方式2 PCON=0X80;/波特率加倍TH1=0XF3;/计数器初始值设置,注意波特率是4800的TL1=0XF3;TR1=1;/打开计数器*void tx_init() /定时器初

44、始化TMOD=0x01; /采用定时器0方式1EA=1;ET0=1;TR0=1;TH0=0xec; /初值5000usTL0=0x78;void tx_init0()interrupt 1TH0=0xec;TL0=0x78;count+;if(count=30) /150ms扫描一次按键keyset();delay(50);AD转换程序:*AD转换*#include#includetemp.h#include #define PCF8591 0x90 /PCF8591 地址#define uchar unsigned char#define uint unsigned intunsigned

45、int D32;void delay(uchar z) /简单延时函数uchar x,y; for(x=110;x0;x-) for(y=z;y0;y-);/*DAC 变换, 转化函数 */bit DACconversion(unsigned char sla,unsigned char c, unsigned char Val) Start_I2c(); /启动总线 SendByte(sla); /发送器件地址 if(ack=0)return(0); SendByte(c); /发送控制字节 if(ack=0)return(0); SendByte(Val); /发送DAC的数值 if(ac

46、k=0)return(0); Stop_I2c(); /结束总线 return(1);/*ADC发送字节命令数据函数 */bit ISendByte(unsigned char sla,unsigned char c) Start_I2c(); /启动总线 SendByte(sla); /发送器件地址 if(ack=0)return(0); SendByte(c); /发送数据 if(ack=0)return(0); Stop_I2c(); /结束总线 return(1);/*ADC读字节数据函数 */unsigned char IRcvByte(unsigned char sla) unsi

47、gned char c; Start_I2c(); /启动总线 SendByte(sla+1); /发送器件地址 if(ack=0)return(0); c=RcvByte(); /读取数据0 delay(900); Ack_I2c(1); /发送非就答位 Stop_I2c(); /结束总线 return(c);/*/int ReadTemp() int temp,i;int sum=0; /*以下AD-DA处理*/ ISendByte(PCF8591,0x41); temp=IRcvByte(PCF8591)*2; /ADC0 模数转换1 放大2倍显示 for(i=0;i10;i+) sum+=temp; temp=sum/10.0; return temp; /关系式在后面写I2C程序:/*I2C总线的驱动程序*/#include#include #include #define NOP() _nop_() /* 定义空指令 */#define _Nop() _nop_() /*定义空指令*/sbit SCL=P21; /I2C 时钟 sbit SDA=P20; /I2C 数据 bit ack; /*应答标志位*/*

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!