单片机-简易温度控制设计_第1页
单片机-简易温度控制设计_第2页
单片机-简易温度控制设计_第3页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、1 前言 错误!未定义书签1.1概述 错误!未定义书签1.2课题分析 错误!未定义书签1.3设计思路 错误!未定义书签For pers onal use only in study and research; not for commercial use2.硬件电路设计描述 错误!未定义书签。2.1系统的基本组成 错误!未定义书签2.2系统框图如下: 错误!未定义书签For pers onal use only in study and research; not for commercial use错误!未定义书签错误!未定义书签2.3温度控制模块原理图: 2.4系统原理图:3.软件设计流程

2、错误!未定义书签For pers onal use only in study and research; not for commercial use4.程序代码 错误!未定义书签。4.1延迟函数代码 错误!未定义书签4.2 LCD显示模块 错误!未定义书签For pers onal use only in study and research; not for commercial use4.3 A/D转换模块 错误!未定义书签4.4报警模块 错误!未定义书签4.5温度转换模块 错误!未定义书签For pers onal use only in study and research; no

3、t for commercial use4.6 主程序错误!未定义书签5.实习感想216.参考文献错误!未定义书签For pers onal use only in study and research; not for commercial use单片机硬件实习任务书一、设计题目简易温度控制器设计二、设计内容及目标利用实验仪,设计一个简易温度控制器,具体任务包括: 具有低温上电和高温断电功能; 利用按键进行温度上限和温度下限设置,并且实时显示温度到LED码管; 声音报警。温度检测采用热敏电阻。热敏电阻是利用半导体的电阻值随温度显著变化设计而成的, 它具有温度系数大、灵敏度咼、体积小、结构简单

4、、响应速度快、使用方便、寿命长等优点, 应用非常广泛。采用普通的热敏电阻,需要 A/D转换器。三、进度安排周次工作内容2.21-2.22题目安排,图书馆查相关资料2.23-2.26硬件设计,设计原理图和PCB图,搭建硬件电路,2.27软件总体设计2.28-3.2软件开发,并开始准备实习报告初稿3.3整体调试3.4在实习现场进行结果演示,答辩四、设计时间:2011年02月21日到2011年03月4日通信工程系指导教师:万军1前言1.1 概述现代信息技术的三大基础是信息采集控制 (即温控器技术 ) 、信息传输 (通信 技术)和信息处理 (计算机技术 ) 。温控器属于信息技术的前沿尖端产品,尤其是

5、温控器被广泛用于工农业生产、 科学研究和生活等领域, 数量日渐上升。 近百年 来,温控器的发展大致经历了以下二个阶段; (1) 模拟、集成温度控制器; (2) 智能数码温控器。 目前,国际上新型温控器正从模拟式向数字式、 由集成化向智 能化、网络化的方向发展。在 20 世纪 90 年代中期最早推出的智能温控器,采用的是 8 位 A/D 转换器, 其测温精度较低,分辨力只能达到 2C。目前,国外已相继推出多种高精度、高 分辨力的智能温度传感器,所用的是912位A/D转换器,分辨力一般可达0.5 0.0625 C。为了提高多通道智能温控器的转换速率,也有的芯片采用高速逐次逼 近式 A/D 转换器。

6、本设计的温度控制器是以单片机为核心的。单片微型计算机称为单片机,它 在一片芯片上集成了中央处理器、存储器、定时器 /计数器和各种输入输出设备 等接口部件。 采用单片机对温度进行控制不仅具有控制方便、 简单和灵活性大等 优点,而且可以大幅度提高被控温度的技术指标, 从而能够大大的提高产品的质 量和数量。1.2 课题分析 单片机控制系统由微机和工农业生产对象两部分组成,其中包括硬件电路和软件程序,整个控制系统是通过接口将计算机和生产过程中产生的温度联系起 来实现计算机对生产过程中的数据处理和控制。本文介绍了 MCS51 单片机对温度控制系统硬件接口和软件设计的基本思 想。包括单片机系统的程序设计、

7、 输入输出接口设计、 温度控制电路的设计及键 盘显示电路的设计。1.3 设计思路此外整个控制系统可分为硬件电路设计和软件程序设计两大部分。 可分别对 它们进行分析设计。 当确定好自己的方案后, 就分模块进行软件和硬件的设计与 调试。当个模块都调试完毕后, 最后将所有模块组合在一起进行总调, 直到达到 理想的效果为止。2. 硬件电路设计描述2.1系统的基本组成本系统是由核心处理器模块、温度采集模块、 A/D转换模块、及控制执行模块 等组成。采用用80C51单片机作为控制核心,1206LCD显示,PCF8951作为模数 转换器,四个独立按键,以及温度控制模块。2.2系统框图如下:按键输入设置zLc

8、d显示温度及 最高、低温度2.3温度控制模块原理图:2.4系统原理图:HD情拢VCCUI'gneT DETECTAKO ATXAE<2U18VCCVCC OUTVKEFANDEKT 1OSDHE AflEAVCCP23P2QP21P22XIPIOMlP12P13X2vsaS&C<13SDB137DB236DB3-J5-DBJ34DB5S3D期32DB7芥貼2«RW2?E39DBOWDVOYSSVCC71 13. 软件设计流程主程序流程图如下:开始初始化倜各显示子程序调温度转換子程序*温度过限报警判断系统状态调整最咼 最低温度1 "r! !4. 程

9、序代码4.1 延迟函数代码/*delay.h*/#ifndef _DELAY_H_#define _DELAY_H_void DelayUs2x(unsigned char t); void DelayMs(unsigned char t);#endif/*delay.c*/#include "delay.h"void DelayUs2x(unsigned char t)while(-t);void DelayMs(unsigned char t)while(t-)/ 大致延时 1mSDelayUs2x(245);DelayUs2x(245);4.2 LCD 显示模块/*L

10、CD1602.h引脚定义如下: 1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK */#include<reg52.h> / 包含头文件 #include<intrins.h>#ifndef _1602_H_#define _1602_H_bit LCD_Check_Busy(void) ;void LCD_Write_Com(unsigned char com) ;void LCD_Write_Data(unsigned char Data) ;void LCD_Clear(void) ;void L

11、CD_Write_String(unsigned char x,unsigned char y,unsigned char *s) ;void LCD_Write_Char(unsigned char x,unsigned char y,unsigned char Data) ;void LCD_Init(void) ;void Lcd_User_Chr(void);#endif/*LCD1602显示模块子程序*/#include "1602.h"#include "delay.h"#define CHECK_BUSYsbit RS = P2A4;/ 定

12、义端口sbit RW =卩2人5;sbit EN = P2A6;#define RS_CLR RS=0#define RS_SET RS=1#define RW_CLR RW=0#define RW_SET RW=1#define EN_CLR EN=0#define EN_SET EN=1#define DataPort P0/*判忙函数 */bit LCD_Check_Busy(void) #ifdef CHECK_BUSYDataPort= 0xFF;RS_CLR;RW_SET;EN_CLR;_nop_();EN_SET;return (bit)(DataPort & 0x80)

13、;#elsereturn 0;#endif/*写入命令函数 */ void LCD_Write_Com(unsigned char com) while(LCD_Check_Busy(); /忙则等待RS_CLR;RW_CLR;EN_SET;DataPort= com;_nop_();EN_CLR;/*写入数据函数*/void LCD_Write_Data(unsigned char Data) while(LCD_Check_Busy(); / 忙则等待RS_SET;RW_CLR;EN_SET;DataPort= Data;_nop_();EN_CLR;/*清屏函数*/void LCD_Cl

14、ear(void)LCD_Write_Com(0x01);DelayMs(5);/*写入字符串函数*/void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) if (y = 0)LCD_Write_Com(0x80 + x); / 表示第一行elseLCD_Write_Com(0xC0 + x); / 表示第二行while (*s)LCD_Write_Data( *s); s +;/*写入字符函数*/void LCD_Write_Char(unsigned char x,unsigned char y,un

15、signed char Data) if (y = 0)LCD_Write_Com(0x80 + x);elseLCD_Write_Com(0xC0 + x);LCD_Write_Data( Data);/*初始化函数*/void LCD_Init(void)/* 显示模式设置 */* 显示关闭 */* 显示清屏 */* 显示光标移动设置 */* 显示开及光标设置 */LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);DelayMs(5);LCD_Write_Com(0x38);L

16、CD_Write_Com(0x08);LCD_Write_Com(0x01);LCD_Write_Com(0x06);DelayMs(5);LCD_Write_Com(0x0C);/*设定二个自定义字符 ,LCD1602 中自定义字符的地址为 0x00-0x07, 即可定义 8 个字符这里我们设定把一个自定义字符放在0x00 位置( 000)另一个放在 0x01 位子( 001)*/ void Lcd_User_Chr(void) /第一个自定义字符D5D4D3(一般用LCD_Write_Com(0x40); /"01 000 000" 第1行地址(D7D6为地址设定命令形

17、式 为字符存放位置(0-7), D2D1D0为字符行地址(0-7)LCD_Write_Data(OxOO); /"XXX 11111" 第 1 行数据(D7D6D5 为 XXX,表示为任意数000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)LCD_Write_Com(0x41); /"01 000 001" 第 2 行地址LCD_Write_Data(0x04); /"XXX 10001"第 2 行数据LCD_Write_Com(0x42); /"01 000 010" 第 3 行地址LCD_Writ

18、e_Data(0x0e); /"XXX 10101"第 3 行数据LCD_Write_Com(0x43); /"01 000 011" 第 4 行地址LCD_Write_Data(0x0e); /"XXX 10001"第 4 行数据LCD_Write_Com(0x44); /"01 000 100" 第 5 行地址LCD_Write_Data(0x0e); /"XXX 11111"第 5 行数据LCD_Write_Com(0x45); /"01 000 101" 第 6 行地

19、址LCD_Write_Data(0x1f); /"XXX 01010" 第 6 行数据LCD_Write_Com(0x46); /"01 000 110" 第 7 行地址LCD_Write_Data(0x04); /"XXX 11111"第 7 行数据LCD_Write_Com(0x47); /"01 000 111" 第 8 行地址LCD_Write_Data(0x00); /"XXX 00000" 第 8 行数据/第二个自定义字符LCD_Write_Com(0x48); /"01

20、001 000" 第 1 行地址LCD_Write_Data(0x03); /"XXX 00001"第 1 行数据LCD_Write_Com(0x49); /"01 001 001" 第 2 行地址LCD_Write_Data(0x03); /"XXX 11011"第 2 行数据LCD_Write_Com(0x4a); /"01 001 010" 第 3 行地址LCD_Write_Data(0x00); /"XXX 11101"第 3 行数据LCD_Write_Com(0x4b); /

21、"01 001 011" 第 4 行地址LCD_Write_Data(0x00); /"XXX 11001"第 4 行数据LCD_Write_Com(0x4c); /"01 001 100" 第 5 行地址LCD_Write_Data(0x00); /"XXX 11101"第 5 行数据LCD_Write_Com(0x4d); /"01 001 101" 第 6 行地址LCD_Write_Data(0x00); /"XXX 11011"第 6 行数据LCD_Write_Com

22、(0x4e); /"01 001 110" 第 7 行地址LCD_Write_Data(0x00); /"XXX 00001"第 7 行数据LCD_Write_Com(0x4f); /"01 001 111" 第 8 行地址LCD_Write_Data(0x00); /"XXX 00000"第 8 行数据4.3 A/D转换模块/*IIC协议头文件*/ #ifndef _I2C_H#define _I2C_H#include <reg52.h>#include <intrins.h>/ 头文件

23、的包含#define _Nop()_nop_()/ 定义空指令/*启动总线void Start_I2c();-*/*结束总线-*/void Stop_I2c();/*字节数据传送函数*/void SendByte(unsigned char c);/*字节数据传送函数*/ unsigned char RcvByte();/*应答子函数*/void Ack_I2c(void);/*非应答子函数*/void NoAck_I2c(void);/*向无子地址器件发送字节数据函数 */ bit ISendByte(unsigned char sla,unsigned char c); /*向有子地址器件

24、发送多字节数据函数 */ bit ISendStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no); /*向无子地址器件读字节数据函数 */ bit IRcvByte(unsigned char sla,unsigned char *c); /*向有子地址器件读取多字节数据函数*/bit IRcvStr(unsigned char sla,unsigned char suba,unsigned char *s,unsigned char no); #endif/*AD模块子程序*/#include

25、"i2c.h"#include "delay.h"#define _Nop() _nop_() / 定义空指令bit ack; / 应答标志位sbit SDA=P2A1;sbit SCL=P2A0;/*启动总线*/void Start_I2c()SDA=1; /发送起始条件的数据信号_Nop();SCL=1;_Nop();/起始条件建立时间大于4.7us,延时_Nop();_Nop();_Nop();_Nop();SDA=0; /发送起始信号_Nop();/起始条件锁定时间大于4卩_Nop();_Nop();_Nop();_Nop();SCL=O; /钳

26、住I2C总线,准备发送或接收数据_Nop();_Nop();/*结束总线*/void Stop_I2c()SDA=0; / 发送结束条件的数据信号_Nop(); / 发送结束条件的时钟信号SCL=1; /结束条件建立时间大于4卩_Nop();_Nop();_Nop();_Nop();_Nop();SDA=1; /发送I2C总线结束信号_Nop();_Nop();_Nop();_Nop();/*字节数据传送函数*/void SendByte(unsigned char c)unsigned char BitCnt;for(BitCnt=0;BitCnt<8;BitCnt+) /要传送的数据

27、长度为 8 位 if(c<<BitCnt)&0x80)SDA=1; / 判断发送位else SDA=0;_Nop();SCL=1;/置时钟线为高,通知被控器开始接收数据位_Nop();_Nop();/保证时钟高电平周期大于 4卩_Nop();_Nop();_Nop();SCL=0;_Nop();_Nop();SDA=1;/8 位发送完后释放数据线,准备接收应答位_Nop();_Nop();SCL=1;_Nop();_Nop();_Nop(); if(SDA=1)ack=0;else ack=1;/ 判断是否接收到应答信号SCL=0;_Nop();_Nop();/*字节数据传

28、送函数*/unsigned char RcvByte()unsigned char retc;unsigned char BitCnt;retc=0;SDA=1; / 置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt+)_Nop();SCL=0;/ 置时钟线为低,准备接收数据位_Nop();_Nop();/ 时钟低电平周期大于 4.7us_Nop();_Nop();_Nop();SCL=1;/ 置时钟线为高使数据线上数据有效_Nop();_Nop();retc=retc<<1;retc 中if(SDA=1)retc=retc+1; / 读数据位 ,

29、接收的数据位放入 _Nop();_Nop();SCL=0;_Nop();_Nop();return(retc);/*非应答子函数*/void NoAck_I2c(void) SDA=1;_Nop();_Nop();_Nop();SCL=1;_Nop();_Nop();/时钟低电平周期大于 4卩_Nop();_Nop();_Nop();SCL=0;/ 清时钟线,钳住 I2C 总线以便继续接收_Nop();_Nop();4.4 报警模块#include<reg52.h> / 包含头文件sbit SPK=P2A3 ;/ 定义喇叭端口void DelayUs2xo(unsigned cha

30、r t)while(-t);void DelayMso(unsigned char t)while(t-)/ 大致延时 1mSDelayUs2xo(245);DelayUs2xo(245);/*喇叭程序函数*/laba()DelayMso(1); / 发出大约 500Hz 的方波 频率越大声音越尖 SPK=!SPK;4.5 温度转换模块#include<reg52.h> / 包含头文件sbit SPK=P2A3 ;/ 定义喇叭端口void DelayUs2xo(unsigned char t)while(-t);void DelayMso(unsigned char t)while

31、(t-)/ 大致延时 1mSDelayUs2xo(245);DelayUs2xo(245);/*喇叭程序函数 */ laba()DelayMso(1); / 发出大约 500Hz 的方波 频率越大声音越尖 SPK=!SPK;4.6 主程序/*简易温度控制器设计 */ #include<reg52.h> / 包含头文件 #include<stdio.h>/#include "18b20.h"#include "1602.h"#include "delay.h"#include "laba.h"

32、#include "wendu.h"#include "i2c.h"#define KeyPort P1 / 定义按键端口sbit LED =P2A2;/LED 端口sbit hot =P2A7;加热模块端口bit ReadTempFlag;/定义读时间标志 void Init_Timer0(void);/ 定时器初始化 un sig ned char KeySca n( void);/ 键盘扫描/*串口通讯初始化 */void UART_Init(void)SCON = 0x50;TMOD |= 0x20;TH1 = 0xFD;TR1 = 1;/EA

33、= 1;/ES = 1;TI=1;/*主函数*/ SCON: 模式 1, 8-bit UART, 使能接收/ TMOD: timer 1, mode 2, 8-bit 重装/ TH1: 重装值 9600 波特率 晶振 11.0592MHz/ TR1: timer 1 打开/ 打开总中断/ 打开串口中断void main (void)int tempH=60,tempL=50; float temp,temperature; unsigned char TempFlag=0;char displaytemp16,num;/ 定义显示区域临时存储数组 LCD_Init();DelayMs(20);

34、 LCD_Clear();Init_Timer0();UART_Init(); Lcd_User_Chr();while (1) num=KeyScan(); switch(num)case 1:if(tempH<127)tempH+;break;/ 初始化液晶/ 延时有助于稳定/ 清屏/ 写入自定义字符 / 主循环case 2:if(tempH>-55)tempH-;break; case 3:if(tempL<127)tempL+;break;case 4:if(tempL>-55)tempL-;break;default:break;sprintf(display

35、temp,"H.%3d L.%3d ",tempH,tempL); LCD_Write_String(0,1,displaytemp);/ 显示第二行 if(ReadTempFlag=1)ReadTempFlag=0;temp=wendu();temperature=temp*1.00000 ; if(temp>tempH)TempFlag=1; / 高于高温标志else if(temp<tempL)TempFlag=2; / 低于低温标志 elseTempFlag=0; / 正常显示标志sprintf(displaytemp,"Temp %6.0f

36、",temperature);/ 打印温度值 LCD_Write_String(0,0,displaytemp);/ 显示第一行 LCD_Write_Char(13,0,0x01);/ 写入温度右上角点 LCD_Write_Char(14,0,'C'); / 写入字符 CLED=1;/hot=1; switch(TempFlag)case 1:laba();break;case 2:LED=0;break; default:break;/*定时器初始化子程序*/void Init_Timer0(void)TMOD |= 0x01;受影响/ 使用模式 1, 16 位定时

37、器,使用 "|" 符号可以在使用多个定时器时不/TH0=0x00;/TL0=0x00;EA=1;ET0=1;TR0=1;/*/ 给定初值/ 总中断打开/ 定时器中断打开 / 定时器开关打开定时器中断子程序*/void Timer0_isr(void) interrupt 1 static unsigned int num;TH0=(65536-2000)/256;TL0=(65536-2000)%256; num+;if(num=400) / 重新赋值 2msnum=0;ReadTempFlag=1; /读标志位置 1 /*按键扫描函数,返回扫描键值 */ unsigned char KeyScan(

温馨提示

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

评论

0/150

提交评论