基于51单片机温度控制器_第1页
基于51单片机温度控制器_第2页
基于51单片机温度控制器_第3页
基于51单片机温度控制器_第4页
基于51单片机温度控制器_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

1、温度控制器本设计要求温度控制器实现以下基本功能:(1)数码管准确显示温度值,测量精度为0.5 ;(2)五个按键操作(设置温度,加键、复位);(3)可以温度设置,超过设定温度,继电器吸合(且蜂鸣器发出报警声)。Proteus仿真图程序清单仅供学习参考Main.c/*=说明:基于DS18b20的温度控制报警程序作者:kks创建时间:2013-03-18修改时间:=*/#include "config.h"#include "type.h"#include "DS18B20.h"/*=全局定义=*/static uint8 uKeyValu

2、e=0;/键值static uint16 unTemp=0;/读取的温度值 static uint8 uCnt=0;/定时器计数值bit b2msflag=0;/2ms时间标志位bit b2mskeyflag=0;/2ms标志,用于按键扫描bit b50msflag=0;uint8 uKeyCnt=0;/按键延时计数uint8 code SegTable=0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,/*不带小数点的断码表*/0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,/*带小数点的断

3、码表*/0xbf,0xff,0x86,0x88;/-,不显示,E,Ruint8 code BitTable=0xfe,0xfd,0xfb,0xf7;/位码uint8 DisBuff=0,0,0,0;/显示缓存区/*函数名:Delay250us*输入:无*输出:无*功能:蜂鸣器延时函数*/void Delay250us(void)uint8 j;for(j=28;j>0;j-) /250us基准延时程序 ; /*函数名:Init*输入:无*输出:无*功能:程序初始化*/void Init(void)P0=P1=P2=P3=0XFF;/IO口初始化TMOD=0x01;/定时器0方式1TH0=

4、0xf8;/定时2msTL0=0x30;ET0=1;EX0=1;EA=1;TR0=1;/*函数名:KeyHandle*输入:tem*输出:返回温度上下限设置值,上限最大值为90,下限为0*功能:按键处理程序*/uint8 KeyHandle(uint8 tem)if(KEYUP=0)uKeyCnt+;if(uKeyCnt>=2)/消抖uKeyCnt=0;if(KEYUP=0)tem+;if(tem>99)tem=0;while(!KEYUP);if(KEYDOWN=0)uKeyCnt+;if(uKeyCnt>=2)uKeyCnt=0;if(KEYDOWN=0)tem-;if(

5、tem=-1)tem=99;while(!KEYDOWN);if(KEYWRITE=0)uKeyCnt+;if(uKeyCnt>=2)uKeyCnt=0;if(KEYWRITE=0)CopyToEEPROM();/将上下限拷贝到E2PROMwhile(!KEYWRITE);return tem;/*函数名:Buzz*输入:无*输出:无*功能:蜂鸣器报警函数*/void Buzz(void)uint8 i;for(i=10;i>0;i-)BEEP=0;Delay250us();Delay250us();BEEP=1;Delay250us();BEEP=1;/*函数名:TemAlarm

6、*输入:无*输出:无*功能:温度报警检测*/void TemAlarm(void)if(unTemp>uTHigh*10)|(unTemp<uTLow*10)RELAY=0; /继电器动作Buzz(); /蜂鸣器报警elseRELAY=1; /继电器复位BEEP=1; /关闭蜂鸣器/*函数名:DispTem*输入:无*输出:无*功能:温度数码管显示*/void DisTem(void)uint8 i,j;for(i=30;i>0;i-)for(j=0;j<4;)P0=SegTableDisBuffj;P2=BitTablej;if(b2msflag)b2msflag=0

7、;P2=0xff;j+;/*函数名:CopyToDisBuff*输入:tem*输出:无*功能:将温度数据写入显示缓存区*/void CopyToDisBuff(uint16 tem)DisBuff0=sign;DisBuff1=tem/100;DisBuff2=tem%100/10+10;DisBuff3=tem%10;/*函数名:Error*输入:无*输出:无*功能:若无DS18b20或其故障,显示ERR*/void Error(void)DisBuff0=21; /不显示DisBuff1=22; /EDisBuff2=23; /RDisBuff3=23; /R /*函数名:SoftRese

8、t*输入:无*输出:无*功能:单片机软件复位*/void SoftReset(void)(void(code*)(void)0x0000)(); /函数指针reset指向地址0/*函数名:main*输入:无*输出:无*功能:主函数,程序入口*/void main(void)Init();if(Reset18b20()GetFromEEPROM();/读取温度上下限值unTemp=ReadTem();/读取温度uTHigh=uTemHigh;/将上下限值复制到临时存储区uTLow=uTemLow;elseError();while(Reset18b20()=0)DisTem();SoftRese

9、t(); /软件复位while(1)DisTem(); /调用显示switch(uKeyValue)case 0:if(b50msflag)b50msflag=0;unTemp=ReadTem(); /读取温度CopyToDisBuff(unTemp); /更新显示缓存区TemAlarm(); /温度报警检测break;case 1:if(b2mskeyflag)b2mskeyflag=0;uTHigh=KeyHandle(uTHigh); /设置温度上限CopyToDisBuff(uTHigh*10);/更新显示缓存区break;case 2:if(b2mskeyflag)b2mskeyfl

10、ag=0;uTLow=KeyHandle(uTLow); /设置温度下限CopyToDisBuff(uTLow*10);/更新显示缓存区break;default:uKeyValue=0;break;/*函数名:Timer0ISR*输入:无*输出:无*功能:T0中断服务函数*/void Timer0ISR(void) interrupt 1 using 1TH0=0xf8;/重赋初值TL0=0x30;b2msflag=1;/2ms时间标志b2mskeyflag=1;uCnt+;if(uCnt>=25)uCnt=0;b50msflag=1;/*函数名:INT0ISR*输入:无*输出:无*功

11、能:INT0中断服务函数*/void INT0ISR(void) interrupt 0 using 0uKeyValue+;if(uKeyValue>=3)uKeyValue=0;Config.H/*=说明:硬件配置信息作者:kks创建时间:2012-09-03修改时间:2013-03-18=*/#ifndef _CONFIG_H_#define _CONFIG_H_#include <reg52.h>/*独立按键*/sbit KEYUP=P14;/加sbit KEYDOWN=P15;/减sbit KEYWRITE=P16;/写入/*蜂鸣器*/sbit BEEP=P36;/

12、*继电器*/sbit RELAY=P37;/*DS18B20信号线*/sbit QS=P33;#endifType.h/*=说明:数据类型定义作者:kks创建时间:2012-09-03修改时间:2013-03-18=*/#ifndef _TYPE_H_#define _TYPE_H_/*= 整型数据类型=*/typedef unsigned charuint8;typedef unsigned intuint16;typedef unsigned longuint32;typedef charint8;typedef intint16;typedef longint32;typedefunsi

13、gned charWPARAM;typedef unsigned charLPARAM;/*= 枚举数据类型=*/typedef enumFALSE,TRUEBOOL;#endifDS18b20.h#ifndef _DS18B20_H_#define _DS18B20_H_#ifndef _DS18B20_C_#define _EXTERN#endif/*=全局定义=*/*=全局变量=*/#ifdef _EXTERNextern uint8 uTemHigh;/温度上限extern uint8 uTemLow;/温度下限extern uint8 uTHigh;extern uint8 uTLo

14、w;extern uint8 sign;/符号位#undef _EXTERN#endif/*=全局函数=*/bit Reset18b20(void);uint8 Rbyte18b20(void);void Wbyte18b20(uint8 dat);uint16 ReadTem(void);void CopyToEEPROM(void);void GetFromEEPROM(void);#endifDS18B20.c/*=说明:DS18B20驱动程序作者:kks创建时间:2012-03-19优化时间:2013-03-20=*/#define _DS18B20_C_#include <in

15、trins.h>#include "config.h"#include "type.h"#include "DS18B20.h"uint8 uTemHigh=0;/温度上限uint8 uTemLow=0;/温度下限uint8 uTHigh=0;/温度上限临时存储uint8 uTLow=0;/温度下限临时存储uint8 sign=0xff;/用来判断暂存器的高5位是否为负float f_temp=0;/定义浮点型的温度数据/*函数名:Delay15us*输入:uint16 t*输出:无*功能:单位为15us延时函数,延时时间=15

16、(1+t)us*/void Delay15us(uint16 t)uint16 i;for(i=t;i>0;i-)_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();/*函数名:Reset18b20*输入:无*输出:1-复位成功,0-复位失败*功能:复位DS18b20,检测DS18b20工作是否正常*/bit Reset18b20(void)bit rest=1;QS=1;/QS复位Delay15us(1);/延时30usQS=0;/拉低总线Delay15us(32);/延时495usQS=1;/释放总线Delay15us(4);/延

17、时15-60us,rest=QS;/记录DS返回的状态Delay15us(15);/延时240us后,释放总线QS=1;return (rest);/返回复位结果/*函数名:Wbyte18b20*输入:dat-待写字节数据*输出:无*功能:DS18b20写一字节数据*/void Wbyte18b20(uint8 dat)uint8 i;for(i=8;i>0;i-)QS=0;/拉低总线,产生写时序_nop_(); _nop_();/至少延时1usQS=dat&0x01;/从最低位写起Delay15us(3);/延时60usQS=1;/释放总线dat>>=1;/数据右移

18、一位,准备写下一位/*函数名:Rbyte18b20*输入:无*输出:dat-读出数据*功能:DS18b20读一字节数据*/uint8 Rbyte18b20(void)uint8 i,dat=0;for(i=8;i>0;i-)dat>>=1;QS=0;/产生读时序_nop_(); _nop_();/至少延时1usQS=1;/释放总线_nop_(); _nop_(); _nop_(); _nop_();/延时4us后读数据if(QS)dat |=0x80;Delay15us(3);/延时60usreturn dat;/*函数名:ReadTem*输入:无*输出:temp-读出温度*

19、功能:读取温度*/uint16 ReadTem(void)uint8 TL=0,TH=0;uint16 temp=0;/温度数据/*=开始转换=*/if(Reset18b20()/总线复位Wbyte18b20(0xcc);/写跳过读ROM指令Wbyte18b20(0x44);/写温度转换指令Delay15us(15);/稍作延时/*=读取温度=*/if(Reset18b20()/总线复位Wbyte18b20(0xcc);/写跳过读ROM指令Wbyte18b20(0xbe);/读暂存器,读内部RAM中9字节的温度数据TL=Rbyte18b20();/读低8位TH=Rbyte18b20();/读高8位uTemHigh=Rbyte18b20();/读温度上限uTemLow=Rbyte18b20();/读温度下限Reset18b20();/复位,终止读temp=TH;temp<<=8;/左移八位temp=te

温馨提示

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

评论

0/150

提交评论