单片机实现温度控制电路.docx
- 文档编号:24315781
- 上传时间:2023-05-26
- 格式:DOCX
- 页数:22
- 大小:179.39KB
单片机实现温度控制电路.docx
《单片机实现温度控制电路.docx》由会员分享,可在线阅读,更多相关《单片机实现温度控制电路.docx(22页珍藏版)》请在冰豆网上搜索。
单片机实现温度控制电路
目录
1.概述………………………………………………............1
1.1设计需求分析……………………………………………………1
1.2单片机实现温度控制电路目的…………………………………1
2.课程设计内容………………………………………………..1
2.1设计方案原理分析....................................1
2.2硬件设计............................................2
2.3软件设计............................................3
2.4调校过程............................................17
3.总结…………………………………………………………..17
1概述
单片微型计算机简称单片机,是典型的嵌入式微控制器(MicrocontrollerUnit),常用英文字母的缩写MCU表示单片机,单片机又称单片微控制器,它不是完成某一个逻辑功能的芯片,而是把一个计算机系统集成到一个芯片上。
相当于一个微型的计算机,和计算机相比,单片机只缺少了I/O设备。
概括的讲:
一块芯片就成了一台计算机。
它的体积小、质量轻、价格便宜、为学习、应用和开发提供了便利条件。
同时,学习使用单片机是了解计算机原理与结构的最佳选择。
它最早是被用在工业控制领域。
由于单片机在工业控制领域的广泛应用,单片机由芯片内仅有CPU的专用处理器发展而来。
最早的设计理念是通过将大量外围设备和CPU集成在一个芯片中,使计算机系统更小,更容易集成进复杂的而对体积要求严格的控制设备当中。
现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!
单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
1.1课程设计需求分析
单片机在工业控制领域的广泛应用,现代人类生活中所用的几乎每件电子和机械产品中都会集成有单片机。
手机、电话、计算器、家用电器、电子玩具、掌上电脑以及鼠标等电脑配件中都配有1-2部单片机。
汽车上一般配备40多部单片机,复杂的工业控制系统上甚至可能有数百台单片机在同时工作!
单片机的数量不仅远超过PC机和其他计算的总和,甚至比人类的数量还要多。
1.2单片机实现温度控制电路目的
(1).熟练掌握使用c语言编写相关程序。
(2).能够熟练画出相关硬件电路。
(3).掌握pc机与单片机通讯的编程方法。
(4).掌握单片机软件硬件调试技术。
(5).掌握单片机控制LCD显示方法。
2课程设计内容
2.1设计方案原理分析
温度设计电路主要由以下几部分组成,DS18B20及其开关电路,控制器单片机89c52,扫描驱动电路,数码管LED,报警电路,电源电路组成。
温度设计组成框图
温度传感器从测试点采集温度,把温度转换成电压,温度传感器输出电压的大小随温度高低的变化而变化。
单片机89C52是温度测量电路的控制核心,它将采集到的数字温度电压值,经过计算处理,得到相应的温度值,经扫描驱动送到LED显示器以数字形式显示测量温度。
报警温度控制电路用于在不同应用中灵活设定报警温度,在超过设定范围时,报警电路进行报警。
2.2硬件设计
硬件设计电路图如下:
DS18B20温度传感器工作原理:
DS18B20温度传感器能直接读出被测温度,并根据实际要求通过简单的编程实习9-12位的数字值读数方式。
DS18B20的主要特性
1.1、适应电压范围更宽,电压范围:
3.0~5.5V,在寄生电源方式下可由数据线供电
1.2、独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯
1.3、DS18B20支持多点组网功能,多个DS18B20可以并联在唯一的三线上,实现组网多点测温
1.4、DS18B20在使用中不需要任何外围元件,全部传感元件及转换电路集成在形如一只三极管的集成电路内
1.5、温范围-55℃~+125℃,在-10~+85℃时精度为±0.5℃
1.6、可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃,可实现高精度测温
1.7、在9位分辨率时最多在93.75ms内把温度转换为数字,12位分辨率时最多在750ms内把温度值转换为数字,速度更快
1.8、测量结果直接输出数字温度信号,以"一线总线"串行传送给CPU,同时可传送CRC校验码,具有极强的抗干扰纠错能力
1.9、负压特性:
电源极性接反时,芯片不会因发热而烧毁,但不能正常工作。
DS18B20内部结构主要由四部分组成:
64位光刻ROM、温度传感器、非挥发的温度报警触发器TH和TL、配置寄存器。
2.3软件设计
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序等。
温度主程序流程图
读出子程序流程图
温度转换命令子程序
计算温度子程序流程图
详细程序:
#include
#include
unsignedcharcodedigit[10]={"0123456789"};//定义字符数组显示数字
unsignedcharcodeError[]={"Error!
Check!
"};//说明没有检测到DS18B20
unsignedcharcodewd[10]={"1030"};
unsignedchart1;
unsignedchart2;
sbits1=P1^0;
sbits2=P1^1;
sbitjdq=P2^3;
sbitsound=P2^4;
/*******************************************************************************
以下是对液晶模块的操作程序
*******************************************************************************/
sbitRS=P2^0;//寄存器选择位,将RS位定义为P2.0引脚
sbitRW=P2^1;//读写选择位,将RW位定义为P2.1引脚
sbitE=P2^2;//使能信号位,将E位定义为P2.2引脚
sbitBF=P0^7;//忙碌标志位,,将BF位定义为P0.7引脚
/*****************************************************
函数功能:
延时1ms
(3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
***************************************************/
voiddelay1ms()
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++)
;
}
/*****************************************************
函数功能:
延时若干毫秒
入口参数:
n
***************************************************/
voiddelaynms(unsignedcharn)
{
unsignedchari;
for(i=0;i delay1ms(); } /***************************************************** 函数功能: 判断液晶模块的忙碌状态 返回值: result。 result=1,忙碌;result=0,不忙 ***************************************************/ bitBusyTest(void) { bitresult; RS=0;//根据规定,RS为低电平,RW为高电平时,可以读状态 RW=1; E=1;//E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=BF;//将忙碌标志电平赋给result E=0;//将E恢复低电平 returnresult; } /***************************************************** 函数功能: 将模式设置指令或显示地址写入液晶模块 入口参数: dictate ***************************************************/ voidWriteInstruction(unsignedchardictate) { while(BusyTest()==1);//如果忙就等待 RS=0;//根据规定,RS和R/W同时为低电平时,可以写入指令 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" _nop_(); _nop_();//空操作两个机器周期,给硬件反应时间 P0=dictate;//将数据送入P0口,即写入指令或地址 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 指定字符显示的实际地址 入口参数: x ***************************************************/ voidWriteAddress(unsignedcharx) { WriteInstruction(x|0x80);//显示位置的确定方法规定为"80H+地址码x" } /***************************************************** 函数功能: 将数据(字符的标准ASCII码)写入液晶模块 入口参数: y(为字符常量) ***************************************************/ voidWriteData(unsignedchary) { while(BusyTest()==1); RS=1;//RS为高电平,RW为低电平时,可以写入数据 RW=0; E=0;//E置低电平(根据表8-6,写指令时,E为高脉冲, //就是让E从0到1发生正跳变,所以应先置"0" P0=y;//将数据送入P0口,即将数据写入液晶模块 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=1;//E置高电平 _nop_(); _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 E=0;//当E由高电平跳变成低电平时,液晶模块开始执行命令 } /***************************************************** 函数功能: 对LCD的显示模式进行初始化设置 ***************************************************/ voidLcdInitiate(void) { delaynms(15);//延时15ms,首次写指令时应给LCD一段较长的反应时间 WriteInstruction(0x38);//显示模式设置: 16×2显示,5×7点阵,8位数据接口 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38); delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x38);//连续三次,确保初始化成功 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x0c);//显示模式设置: 显示开,无光标,光标不闪烁 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x06);//显示模式设置: 光标右移,字符不移 delaynms(5);//延时5ms ,给硬件一点反应时间 WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除 delaynms(5);//延时5ms ,给硬件一点反应时间 } /************************************************************************ 以下是DS18B20的操作程序 ************************************************************************/ sbitDQ=P3^3; unsignedchartime;//设置全局变量,专门用于严格延时 /***************************************************** 函数功能: 将DS18B20传感器初始化,读取应答信号 出口参数: flag ***************************************************/ bitInit_DS18B20(void) { bitflag;//储存DS18B20是否存在的标志,flag=0,表示存在;flag=1,表示不存在 DQ=1;//先将数据线拉高 for(time=0;time<2;time++)//略微延时约6微秒 ; DQ=0;//再将数据线从高拉低,要求保持480~960us for(time=0;time<200;time++)//略微延时约600微秒 ;//以向DS18B20发出一持续480~960us的低电平复位脉冲 DQ=1;//释放数据线(将数据线拉高) for(time=0;time<10;time++) ;//延时约30us(释放总线后需等待15~60us让DS18B20输出存在脉冲) flag=DQ;//让单片机检测是否输出了存在脉冲(DQ=0表示存在) for(time=0;time<200;time++)//延时足够长时间,等待存在脉冲输出完毕 ; return(flag);//返回检测成功标志 } /***************************************************** 函数功能: 从DS18B20读取一个字节数据 出口参数: dat ***************************************************/ unsignedcharReadOneChar(void) { unsignedchari=0; unsignedchardat;//储存读出的一个字节数据 for(i=0;i<8;i++) { DQ=1;//先将数据线拉高 _nop_();//等待一个机器周期 DQ=0;//单片机从DS18B20读书据时,将数据线从高拉低即启动读时序 dat>>=1; _nop_();//等待一个机器周期 DQ=1;//将数据线"人为"拉高,为单片机检测DS18B20的输出电平作准备 for(time=0;time<2;time++) ;//延时约6us,使主机在15us内采样 if(DQ==1) dat|=0x80;//如果读到的数据是1,则将1存入dat else dat|=0x00;//如果读到的数据是0,则将0存入dat //将单片机检测到的电平信号DQ存入r[i] for(time=0;time<8;time++) ;//延时3us,两个读时序之间必须有大于1us的恢复期 } return(dat);//返回读出的十进制数据 } /***************************************************** 函数功能: 向DS18B20写入一个字节数据 入口参数: dat ***************************************************/ WriteOneChar(unsignedchardat) { unsignedchari=0; for(i=0;i<8;i++) { DQ=1;//先将数据线拉高 _nop_();//等待一个机器周期 DQ=0;//将数据线从高拉低时即启动写时序 DQ=dat&0x01;//利用与运算取出要写的某位二进制数据, //并将其送到数据线上等待DS18B20采样 for(time=0;time<10;time++) ;//延时约30us,DS18B20在拉低后的约15~60us期间从数据线上采样 DQ=1;//释放数据线 for(time=0;time<1;time++) ;//延时3us,两个写时序间至少需要1us的恢复期 dat>>=1;//将dat中的各二进制位数据右移1位 } for(time=0;time<4;time++) ;//稍作延时,给硬件一点反应时间 } /****************************************************************************** 以下是与温度有关的显示设置 ******************************************************************************/ /***************************************************** 函数功能: 显示没有检测到DS18B20 ***************************************************/ voiddisplay_error(void) { unsignedchari; WriteAddress(0x00);//写显示地址,将在第1行第1列开始显示 i=0;//从第一个字符开始显示 while(Error[i]! ='\0')//只要没有写到结束标志,就继续写 { WriteData(Error[i]);//将字符常量写入LCD i++;//指向下一个字符 delaynms(100);//延时100ms较长时间,以看清关于显示的说明 } while (1)//进入死循环,等待查明原因 ; } /***************************************************** 函数功能: 显示温度的小数点 ***************************************************/ voiddisplay_dot(void) { WriteAddress(0x09);//写显示地址,将在第2行第10列开始显示 WriteData('.');//将小数点的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示温度的整数部分 入口参数: x ***************************************************/ voiddisplay_temp1(unsignedcharx) { unsignedcharj,k,l;//j,k,l分别储存温度的百位、十位和个位 j=x/100;//取百位 k=(x%100)/10;//取十位 l=x%10;//取个位 WriteAddress(0x06);//写显示地址,将在第2行第7列开始显示 WriteData(digit[j]);//将百位数字的字符常量写入LCD WriteData(digit[k]);//将十位数字的字符常量写入LCD WriteData(digit[l]);//将个位数字的字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 显示温度的小数数部分 入口参数: x ***************************************************/ voiddisplay_temp2(unsignedcharx) { WriteAddress(0x0a);//写显示地址,将在第2行第11列开始显示 WriteData(digit[x]);//将小数部分的第一位数字字符常量写入LCD delaynms(50);//延时1ms给硬件一点反应时间 } /***************************************************** 函数功能: 做好读温度的准备 ***************************************************/ voidReadyReadTemp(void) { Init_DS18B20();//将DS18B20初始化 WriteOneChar(0xCC);//跳过读序号列号的操作
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 实现 温度 控制电路