温度控制器Word下载.docx
《温度控制器Word下载.docx》由会员分享,可在线阅读,更多相关《温度控制器Word下载.docx(25页珍藏版)》请在冰点文库上搜索。
![温度控制器Word下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/4/77d540e2-0c53-4e2b-a943-0ae435981447/77d540e2-0c53-4e2b-a943-0ae4359814471.gif)
#defineTMPortP2_3//DS1820DataPortunsignedcharcodeLEDDis[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0xBF};
//0-9的LED笔划,0xFF为空,0xF7为负号
staticunsignedcharbdataStateREG;
//可位寻址的状态寄存器
sbitDS1820ON=StateREG^0;
//DS1820是否存在
sbitSetTF=StateREG^1;
//是否是在温度设置状态
sbitKeySETDown=StateREG^2;
//是否已按过SET键标识
sbitPowTF=StateREG^3;
//电源电源标识
sbitKeyTF=StateREG^4;
//键盘是否允许
sbitKeySETDowning=StateREG^5;
//SET是否正在按下
staticunsignedcharbdataTLV_at_0x0029;
//温度变量高低位
staticunsignedcharbdataTHV_at_0x0028;
staticsignedcharTMV;
//转换后的温度值
staticunsignedcharKeyV,TempKeyV;
//键值
staticsignedcharTMRomV_at_0x0027;
//高温限制
staticsignedcharTMSetV_at_0x0026;
//温度设定值
staticunsignedcharKSDNum;
//SET键连按时的采集次数
staticunsignedcharIntNum,IntNum2,IntNum3;
//中断发生次数,IntNum用于SET长按检测,IntNum2用于设定状态时LED闪烁
staticsignedcharLED_One,LED_Two,LED_Three;
//LED的显示位LED_One为十位,LED_Two为个位
voidmain(void)
{
voidInitDS1820(void);
//定义函数
voidROMDS1820(void);
voidTMVDS1820(void);
voidTMRDS1820(void);
voidTMWDS1820(void);
voidTMREDS1820(void);
voidTMERDS1820(void);
voidReadDS1820(void);
voidWriteDS1820(void);
voidDelay_510(void);
voidDelay_110(void);
voidDelay_10ms(void);
voidDelay_4s(void);
voidV2ToV(void);
StateREG=0;
//初始化变量
SetTF=1;
PowTF=1;
//关电源
THV=0;
TLV=0;
TMV=0;
KeyV=0;
TempKeyV=0;
KSDNum=0;
IntNum=0;
IntNum2=0;
IntNum3=0;
LED_One=0;
LED_Two=0;
InitDS1820();
//初始化
ROMDS1820();
//跳过ROM
TMERDS1820();
//E2PRAM中温度上限值调入RAM
TMRDS1820();
//读出温度指令
ReadDS1820();
//读出温度值和上限值
TMSetV=TMRomV;
//拷贝保存在DS18B20ROM里的上限值到TMSetV
EA=1;
//允许CPU中断
ET0=1;
//定时器0中断打开
TMOD=0x1;
//设定时器0为模式1,16位模式
TH0=0xB1;
TL0=0xDF;
//设定时值为20000us(20ms)
TR0=1;
//开始定时
while
(1);
}
//定时器0中断外理中键扫描和显示
voidKeyAndDis_Time0(void)interrupt1using2
{0=0xB1;
//设定时值为20000us(20ms)
LEDPort=0xFF;
if(!
Key_UKeyV=1;
(!
Key_DOWN)
KeyV=2;
if(!
Key_SET)
KeyV=3;
//KeySETDowning=0;
//清除
if(KeyV!
=0)//有键按下
{
Delay_10ms();
//延时防抖按下10ms再测
if(!
Key_UP)
TempKeyV=1;
TempKeyV=2;
TempKeyV=3;
if(KeyV==TempKeyV)//两次值相等为确定接下了键
if(KeyV==3)//按下SET键,如在SET状态就退出,否则进入
//KeySETDowning=1;
//表明SET正在按下
PowTF=0;
//电源标识开
if(!
KeyTF)
if(SetTF)
{
SetTF=0;
//标识位标识退出设定
InitDS1820();
ROMDS1820();
TMWDS1820();
//写温度上限指令
WriteDS1820();
//写温度上限到DS18B20ROM
InitDS1820();
ROMDS1820();
TMREDS1820();
//温度上限值COPY回E2PRAM
}
else
SetTF=1;
KeySETDown)//没有第一次按下SET时,KeySETDown标识置1
KeySETDown=1;
else
KSDNum=KSDNum+1;
//前一秒内有按过SET则开始计数
}
if(SetTF)//在SET状态下
if((KeyV==1)&
&
KeyTF))
TMSetV=TMSetV+1;
//上调温度
if((KeyV==2)&
TMSetV=TMSetV-1;
//下调温度
if(TMSetV<
=-55)//限制温度上下限
TMSetV=-55;
if(TMSetV>
=125)
TMSetV=125;
if((!
KeyTF)&
(IntNum3==0))KeyTF=1;
//当键盘处于可用时,锁定
if(KeySETDown)//在2秒内按下了SET则计中断发生次数用于长按SET时计时用
IntNum=IntNum+1;
if(IntNum>
55)//中断发生了55次时(大约1.2秒)75为1.5秒左右
IntNum=0;
KeySETDown=0;
if(KSDNum==55)//如一直长按了SET1.2秒左右
RelayOutPort=1;
//关闭继电器输出
PowTF=1;
//电源标识关
LEDOneC=0;
LEDTwoC=0;
LEDThreeC=0;
LEDPort=0xBF;
//显示"
--"
Delay_4s();
//延时
LEDOneC=1;
LEDTwoC=1;
//关显示
LEDThreeC=1;
IntNum=0;
IntNum2=0;
IntNum3=0;
KSDNum=0;
KeyV=0;
TempKeyV=0;
//清空变量准备下次键扫描
PowTF)
InitDS1820();
ROMDS1820();
TMVDS1820();
//温度转换指令
Delay_510();
//延时等待转换完成
TMRDS1820();
ReadDS1820();
//读出温度值
V2ToV();
//转换显示值
if(TMV>
TMSetV)//根据采集到的温度值控制继电器
RelayOutPort=0;
}
{
}
if(SetTF)IntNum2=IntNum2+1;
//用于闪烁计数
if(IntNum2>
50)IntNum2=0;
if(KeyTF)IntNum3=IntNum3+1;
//用于防止按键连按
if(IntNum3>
25)
{
IntNum3=0;
KeyTF=0;
}
if((SetTF)&
(IntNum2<
25))gotoInitEnd;
//计数在后半段时显示
LEDPort=LED_One;
//显示十位数
LEDPort=LED_Two
//显示个位数
InitEnd:
;
voidV2ToV(void)//数值转换
TLV=TLV>
>
4;
THV=THV<
<
//读出的高低位数值移位
TMV=TLV|THV;
//合并高低位放入TM为实际温度值
Sign=0;
if(SetTF||!
Sign=TMSetV>
7;
//取符号
Sign=TMV>
if(Sign)
if(SetTF||!
LED_One=(~(TMSetV-1))/10;
//SET状态下显示设定值
LED_Two=((~(TMSetV-1))-LED_One*10)/10;
else
LED_One=(~TMV)/100;
//LED_Two=((~TMV)-LED_One*100)/10;
LED_Three=(~TMV)-LED_One*100-LED_Two*10;
{
LED_One=(TMSetV)/10;
//SET状态下显示设定值
LED_Two=(TMSetV-LED_One*10)/10
}
LED_One=(TMV)/10;
//
LED_Two=(TMV-LED_One*10)/10;
voidInitDS1820(void)//初始化DS1820
四、各部分电路设计
4.1温度测量及设置报警温度电路
温度测量主要依靠DS18B20传感器,该传感器耐磨耐碰,体积小,比较抗干扰,使用方便,封装多种多样,适用于各种狭小空间的温度测量以及控制。
与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。
4.1.1DS18B20的性能特点
(1)独特的单线接口仅需要一个端口引脚进行通信;
(2)多个DS18B20可以并联在唯一的三线上,实现多点组网功能;
(3)无须外接部件;
(4)可通过数据供电,电压范围为3.0—5.5V;
(5)零待机功耗;
(6)温度以9或12位数字量读出;
(7)用户可定义的非易失性温度报警设置;
(8)报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
(9)负电压特性,电源极性接反时,温度计不会因发热而烧坏,但不能正常工作..
4.1.2DS18B20与单片机的接口电路
DS18B20可以采用两种方式供电,一种是采用电源供电方式,此时DS18B20的1脚接地,2脚作为信号线,3脚接电源,另一种是寄生电源方式。
单片机端口接单总线,为保证在有效的DS18B20时钟周期内提供足够的电流,可用一个MOSFET管来完成对总线的上拉。
当DS18B20处于写存储器操作和温度A/D转换操作时,总线上必须有强的上拉。
温度/℃
二进制
十六进制表示
+125
0000011111010000
07D0H
+85
0000010101010000
0550H
+25.0625
0000000110010001
0191H
+10.125
0000000010100010
00A2H
+0.5
0000000000001000
0008H
0000000000000000
0000H
—0.5
1111111111111000
FFF8H
—10.125
1111111101011110
FF5EH
—25.0625
1111111001101111
FE6FH
—55
1111110010010000
FC90H
表1DS18B20温度与测得值对应表
上拉开始时间最大为10μs。
采用寄生电源供电方式时VDD和GND端均接地。
由于单线制只有一根线,因此发送接口必须是三态的。
下边是设置报警温度以及温度测量的电路部分的图:
图3设置报警温度以及温度测量的电路部分
4.2稳压电路
7805集成稳压器的典型应用电路如下图4所示,这是一个输出正5V直流电压的稳压电源电路。
IC采用集成稳压器7805,C1、C2分别为输入端和输出端滤波电容,RL为负载电阻。
图47805稳压电路
4.3报警指示电路
在此,我们用到了继电器,下方的三极管是用来控制继电器,三极管型号为NPN9014,当输入高电平,NPN饱和导通,从而使继电器导通从而使开关吸合,当达到报警温度时,三极管给的低电平从而使红色LED灯亮,以此报警,低于此温度时继电器吸合,变为绿灯,正常。
报警指示电路如下图5:
图5报警电路
4.4单片机控制及显示电路
4.4.110引脚数码管
两位共阳数码管:
图6数码管
将数码管正对着自己,dp在右下角。
从上边一行引脚开始,从左至右依次为:
a,b,1位选,2位选,f;
下边一行从左至右依次为:
c,dp,e,d,g。
4.5单片机STC89C52RC
STC89C52RC单片机是宏晶科技推出的新一代高速、低功耗、超强抗干扰的单片机,指令代码完全兼容传统80c51单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
4.5.1单片机STC89C52RC的主要特性
1.增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.。
2.工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)。
3.工作频率范围:
0~40MHz,相当于普通8051的0~80MHz,频率可达48MHz。
4.用户应用程序空间为8K字节。
5.片上集成512字节RAM。
6.通用I/O口(32个)复位后为:
P1/P2/P3/P4是准双向口,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
7.ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片。
8.具有EEPROM功能。
9.具有看门狗功能。
10.共3个16位定时器/计数器,即定时器T0、T1、T2。
11.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外中断低电平触发中断方式唤醒。
12.通用异步串行口(UART),还可用定时器软件实现多个UART。
13.工作温度范围:
-40~+85℃(工业级)/0~75℃(商业级)
14.PDIP封装。
4.5.2STC89C52RC单片机的工作模式
掉电模式:
典型功耗<
0.1μA,可由外部中断唤醒,中断返回后,继续执行原程序。
空闲模式:
典型功耗2mA典型功耗。
正常工作模式:
典型功耗4Ma~7mA典型功耗。
掉电模式可由外部中断唤醒,适用于水表、气表等电池供电系统及便携设备。
4.5.3STC89C52RC引脚功能说明
VCC(40引脚):
电源电压。
VSS(20引脚):
接地。
P0端口(P0.0~P0.7P0.7,39~32引脚):
P0口是一个漏极开路的8位双向I/O口。
作为输出端口,每个引脚能驱动8TTL负载,对端口P0写入每个引脚能驱动写入“1”时,可以作为高阻抗输入。
在访问外部程序和数据存储器时在访问外部程序和数据存储器时,P0口也可以提供低8位地址和8位数据的复用总线位数据的复用总线。
此时,P0内部上拉电阻有效。
在FlashROM编在程时,P0端口接收指令字节端口接收指令字节;
而在校验程序时,则输出指令字节则输出指令字节。
验证时,要求外上拉电阻。
P1端口(P1.0~P1.7,1~8引脚):
P1口是一个内部上拉电阻的8位双向I/O口。
P1的输出缓冲器可驱动(吸收或者输出电流方式)4TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电位,这是可用作输入口。
P1口作输入口使用时,因为有内部上拉电阻,那些被外部拉低的引脚会输出一个电流(I)。
此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体参见下表:
在对FlashROM编程和程序校验时,P1接收低8位表XXP1.0和P1.1引脚复用功能。
P2端口(P2.0~P2.7,21~28引脚):
P2口是一个带上拉电阻的8位双向I/O端口。
P2的输出缓冲器可以驱动(吸收或输出电流方式)4TTL输入。
对端口写入1时,通过内部的上拉电阻把端口拉到高电平,这时可用作输入口。
P2作为输入口使用时,因为有内部的上拉电阻,那些被外部信号拉低的引脚会输出一个电流(I)。
在访问外部程序存储器和16