单片机简易温度控制设计.docx
- 文档编号:6814328
- 上传时间:2023-01-10
- 格式:DOCX
- 页数:25
- 大小:107.71KB
单片机简易温度控制设计.docx
《单片机简易温度控制设计.docx》由会员分享,可在线阅读,更多相关《单片机简易温度控制设计.docx(25页珍藏版)》请在冰豆网上搜索。
单片机简易温度控制设计
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
Forpersonaluseonlyinstudyandresearch;notforcommercialuse
单片机硬件实习任务书
一、设计题目
简易温度控制器设计
二、设计内容及目标
利用实验仪,设计一个简易温度控制器,具体任务包括:
①具有低温上电和高温断电功能;
②利用按键进行温度上限和温度下限设置,并且实时显示温度到LED数码管;
③声音报警。
温度检测采用热敏电阻。
热敏电阻是利用半导体的电阻值随温度显著变化设计而成的,它具有温度系数大、灵敏度高、体积小、结构简单、响应速度快、使用方便、寿命长等优点,应用非常广泛。
采用普通的热敏电阻,需要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概述
现代信息技术的三大基础是信息采集控制(即温控器技术)、信息传输(通信技术)和信息处理(计算机技术)。
温控器属于信息技术的前沿尖端产品,尤其是温控器被广泛用于工农业生产、科学研究和生活等领域,数量日渐上升。
近百年来,温控器的发展大致经历了以下二个阶段;
(1)模拟、集成温度控制器;
(2)智能数码温控器。
目前,国际上新型温控器正从模拟式向数字式、由集成化向智能化、网络化的方向发展。
在20世纪90年代中期最早推出的智能温控器,采用的是8位A/D转换器,其测温精度较低,分辨力只能达到2℃。
目前,国外已相继推出多种高精度、高分辨力的智能温度传感器,所用的是9~12位A/D转换器,分辨力一般可达0.5~0.0625℃。
为了提高多通道智能温控器的转换速率,也有的芯片采用高速逐次逼近式A/D转换器。
本设计的温度控制器是以单片机为核心的。
单片微型计算机称为单片机,它在一片芯片上集成了中央处理器、存储器、定时器/计数器和各种输入输出设备等接口部件。
采用单片机对温度进行控制不仅具有控制方便、简单和灵活性大等优点,而且可以大幅度提高被控温度的技术指标,从而能够大大的提高产品的质量和数量。
1.2课题分析
单片机控制系统由微机和工农业生产对象两部分组成,其中包括硬件电路和软件程序,整个控制系统是通过接口将计算机和生产过程中产生的温度联系起来实现计算机对生产过程中的数据处理和控制。
本文介绍了MCS—51单片机对温度控制系统硬件接口和软件设计的基本思想。
包括单片机系统的程序设计、输入输出接口设计、温度控制电路的设计及键盘显示电路的设计。
1.3设计思路
此外整个控制系统可分为硬件电路设计和软件程序设计两大部分。
可分别对它们进行分析设计。
当确定好自己的方案后,就分模块进行软件和硬件的设计与调试。
当个模块都调试完毕后,最后将所有模块组合在一起进行总调,直到达到理想的效果为止。
2.硬件电路设计描述
2.1系统的基本组成
本系统是由核心处理器模块、温度采集模块、A/D转换模块、及控制执行模块等组成。
采用用80C51单片机作为控制核心,1206LCD显示,PCF8951作为模数转换器,四个独立按键,以及温度控制模块。
2.2系统框图如下:
Lcd显示温度及最高、低温度
按键输入设置
单片机89c51
温度控制加热降温保温模块
高温报警模块
PCF8951
2.3温度控制模块原理图:
2.4系统原理图:
3.软件设计流程
主程序流程图如下:
调整最高最低温度
初始化
4.程序代码
4.1延迟函数代码
/*delay.h*/
#ifndef__DELAY_H__
#define__DELAY_H__
voidDelayUs2x(unsignedchart);
voidDelayMs(unsignedchart);
#endif
/*delay.c*/
#include"delay.h"
voidDelayUs2x(unsignedchart)
{
while(--t);
}
voidDelayMs(unsignedchart)
{
while(t--)
{
//大致延时1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
4.2LCD显示模块
/*-----------------------------------------------
LCD1602.h
引脚定义如下:
1-VSS2-VDD3-V04-RS5-R/W6-E7-14DB0-DB715-BLA16-BLK
------------------------------------------------*/
#include
#ifndef__1602_H__
#define__1602_H__
bitLCD_Check_Busy(void);
voidLCD_Write_Com(unsignedcharcom);
voidLCD_Write_Data(unsignedcharData);
voidLCD_Clear(void);
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s);
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData);
voidLCD_Init(void);
voidLcd_User_Chr(void);
#endif
/*-----------------------------------------------
LCD1602显示模块子程序
------------------------------------------------*/
#include"1602.h"
#include"delay.h"
#defineCHECK_BUSY
sbitRS=P2^4;//定义端口
sbitRW=P2^5;
sbitEN=P2^6;
#defineRS_CLRRS=0
#defineRS_SETRS=1
#defineRW_CLRRW=0
#defineRW_SETRW=1
#defineEN_CLREN=0
#defineEN_SETEN=1
#defineDataPortP0
/*------------------------------------------------
判忙函数
------------------------------------------------*/
bitLCD_Check_Busy(void)
{
#ifdefCHECK_BUSY
DataPort=0xFF;
RS_CLR;
RW_SET;
EN_CLR;
_nop_();
EN_SET;
return(bit)(DataPort&0x80);
#else
return0;
#endif
}
/*------------------------------------------------
写入命令函数
---------------------------------------------*/
voidLCD_Write_Com(unsignedcharcom)
{
while(LCD_Check_Busy());//忙则等待
RS_CLR;
RW_CLR;
EN_SET;
DataPort=com;
_nop_();
EN_CLR;
}
/*------------------------------------------------
写入数据函数
------------------------------------------------*/
voidLCD_Write_Data(unsignedcharData)
{
while(LCD_Check_Busy());//忙则等待
RS_SET;
RW_CLR;
EN_SET;
DataPort=Data;
_nop_();
EN_CLR;
}
/*------------------------------------------------
清屏函数
------------------------------------------------*/
voidLCD_Clear(void)
{
LCD_Write_Com(0x01);
DelayMs(5);
}
/*------------------------------------------------
写入字符串函数
------------------------------------------------*/
voidLCD_Write_String(unsignedcharx,unsignedchary,unsignedchar*s)
{
if(y==0)
{
LCD_Write_Com(0x80+x);//表示第一行
}
else
{
LCD_Write_Com(0xC0+x);//表示第二行
}
while(*s)
{
LCD_Write_Data(*s);
s++;
}
}
/*------------------------------------------------
写入字符函数
------------------------------------------------*/
voidLCD_Write_Char(unsignedcharx,unsignedchary,unsignedcharData)
{
if(y==0)
{
LCD_Write_Com(0x80+x);
}
else
{
LCD_Write_Com(0xC0+x);
}
LCD_Write_Data(Data);
}
/*------------------------------------------------
初始化函数
------------------------------------------------*/
voidLCD_Init(void)
{
LCD_Write_Com(0x38);/*显示模式设置*/
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
DelayMs(5);
LCD_Write_Com(0x38);
LCD_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)
------------------------------------------------*/
voidLcd_User_Chr(void)
{//第一个自定义字符
LCD_Write_Com(0x40);//"01000000"第1行地址(D7D6为地址设定命令形式D5D4D3为字符存放位置(0--7),D2D1D0为字符行地址(0--7))
LCD_Write_Data(0x00);//"XXX11111"第1行数据(D7D6D5为XXX,表示为任意数(一般用000),D4D3D2D1D0为字符行数据(1-点亮,0-熄灭)
LCD_Write_Com(0x41);//"01000001"第2行地址
LCD_Write_Data(0x04);//"XXX10001"第2行数据
LCD_Write_Com(0x42);//"01000010"第3行地址
LCD_Write_Data(0x0e);//"XXX10101"第3行数据
LCD_Write_Com(0x43);//"01000011"第4行地址
LCD_Write_Data(0x0e);//"XXX10001"第4行数据
LCD_Write_Com(0x44);//"01000100"第5行地址
LCD_Write_Data(0x0e);//"XXX11111"第5行数据
LCD_Write_Com(0x45);//"01000101"第6行地址
LCD_Write_Data(0x1f);//"XXX01010"第6行数据
LCD_Write_Com(0x46);//"01000110"第7行地址
LCD_Write_Data(0x04);//"XXX11111"第7行数据
LCD_Write_Com(0x47);//"01000111"第8行地址
LCD_Write_Data(0x00);//"XXX00000"第8行数据
//第二个自定义字符
LCD_Write_Com(0x48);//"01001000"第1行地址
LCD_Write_Data(0x03);//"XXX00001"第1行数据
LCD_Write_Com(0x49);//"01001001"第2行地址
LCD_Write_Data(0x03);//"XXX11011"第2行数据
LCD_Write_Com(0x4a);//"01001010"第3行地址
LCD_Write_Data(0x00);//"XXX11101"第3行数据
LCD_Write_Com(0x4b);//"01001011"第4行地址
LCD_Write_Data(0x00);//"XXX11001"第4行数据
LCD_Write_Com(0x4c);//"01001100"第5行地址
LCD_Write_Data(0x00);//"XXX11101"第5行数据
LCD_Write_Com(0x4d);//"01001101"第6行地址
LCD_Write_Data(0x00);//"XXX11011"第6行数据
LCD_Write_Com(0x4e);//"01001110"第7行地址
LCD_Write_Data(0x00);//"XXX00001"第7行数据
LCD_Write_Com(0x4f);//"01001111"第8行地址
LCD_Write_Data(0x00);//"XXX00000"第8行数据
}
4.3A/D转换模块
/*-----------------------------------------------
IIC协议头文件
------------------------------------------------*/
#ifndef__I2C_H__
#define__I2C_H__
#include
#include
#define_Nop()_nop_()//定义空指令
/*------------------------------------------------
启动总线
------------------------------------------------*/
voidStart_I2c();
/*------------------------------------------------
结束总线
------------------------------------------------*/
voidStop_I2c();
/*----------------------------------------------------------------
字节数据传送函数
------------------------------------------------------------------*/
voidSendByte(unsignedcharc);
/*----------------------------------------------------------------
字节数据传送函数
------------------------------------------------------------------*/
unsignedcharRcvByte();
/*----------------------------------------------------------------
应答子函数
----------------------------------------------------------------*/
voidAck_I2c(void);
/*----------------------------------------------------------------
非应答子函数
----------------------------------------------------------------*/
voidNoAck_I2c(void);
/*----------------------------------------------------------------
向无子地址器件发送字节数据函数
----------------------------------------------------------------*/
bitISendByte(unsignedcharsla,unsignedcharc);
/*----------------------------------------------------------------
向有子地址器件发送多字节数据函数
----------------------------------------------------------------*/
bitISendStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno);
/*----------------------------------------------------------------
向无子地址器件读字节数据函数
----------------------------------------------------------------*/
bitIRcvByte(unsignedcharsla,unsignedchar*c);
/*----------------------------------------------------------------
向有子地址器件读取多字节数据函数
----------------------------------------------------------------*/
bitIRcvStr(unsignedcharsla,unsignedcharsuba,unsignedchar*s,unsignedcharno);
#endif
/*-----------------------------------------------
AD模块子程序
------------------------------------------------*/
#include"i2c.h"
#include"delay.h"
#define_Nop()_nop_()//定义空指令
bitack;//应答标志位
sbitSDA=P2^1;
sbitSCL=P2^0;
/*------------------------------------------------
启动总线
------------------------------------------------*/
voidStart_I2c()
{
SDA=1;//发送起始条件的数据信号
_Nop();
SCL=1;
_Nop();//起始条件建立时间大于4.7us,延时
_Nop();
_Nop();
_Nop();
_Nop();
SDA=0;//发送起始信号
_Nop();//起始条件锁定时间大于4μ
_Nop();
_Nop();
_Nop
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 简易 温度 控制 设计