电加热炉温度控制系统设计说明

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

目录
1意义与要求 (1)
1.1实际意义 (1)
1.2技术要求 (1)
2设计容及步骤 (1)
2.1方案设计 (1)
2.2详细设计 (2)
2.2.1 主要硬件介绍 (2)
2.2.2 电路设计方法 (3)
2.2.3绘制流程图 (6)
2.2.4程序设计 (7)
2.3调试和仿真 (7)
3结果分析 (8)
4课程设计心得体会 (9)
参考文献 (10)
附录 (11)
电加热炉温度控制系统设计
1意义与要求
1.1实际意义
在现实生活当中,很多场合需要对温度进行智能控制,日常生活中最常见的要算空调和冰箱了,他们都能根据环境实时情况,结合人为的设定,对温度进行智能控制。

工业生产中的电加热炉温度监控系统和培养基的温度监控系统都是计算机控制系统的典型应用。

通过这次课程设计,我们将自己动手设计一个小型的计算机控制系统,目的在于将理论结合实践以加深我们对课本知识的理解。

1.2技术要求
要求利用所学过的知识设计一个温度控制系统,并用软件仿真。

功能要求如
下:
(1)能够利用温度传感器检测环境中的实时温度;
(2)能对所要求的温度进行设定;
(3)将传感器检测到得实时温度与设定值相比较,当环境中的温度高于或低于所设定的温度时,系统会自动做出相应的动作来改变这一状况,使系统温度始终保持在设定的温度值。

2设计容及步骤
2.1方案设计
要想达到技术要求的容,少不了以下几种器件:单片机、温度传感器、LCD 显示屏、直流电动机等。

其中单片机用作主控制器,控制其他器件的工作和处理数据;温度
传感器用来检测环境中的实时温度,并将检测值送到单片机中进行数值对比;LCD显示屏用来显示温度、时间的数字值;直流电动机用来表示电加热炉的工作情况,转动表示电加热炉通电加热,停止转动表示电加热炉断电停止加热。

整体思路是这样的:首先我们通过按键设定所需要的温度值,然后利用温度传感器检测电加热炉的实时加热温度,并送至单片机与设定值进行比较。

若检测值小于设定值,则无任何动作,电加热炉继续导通加热;若检测值大于设定值,则单片机控制光电耦合器导通,继电器动作,电加热炉断电停止加热。

一旦炉温低于设定值,单片机又控制光电耦合器断开,继电器开关分离,电加热炉开始导通加热。

这个过程中所设定的温度值和传感器检测到得温度值都要在LCD显示屏
上显示出来,以方便操作人员观察。

另外,还可以加上时钟模块,以方便计时。

这个设计思路相对比较简单,利用所学过的知识容易实现,加上光电耦合器用于隔离强电和弱电,比较安全,正好符合我们自动化专业用弱电控制强电的目的,正所谓学以致用。

2.2详细设计
221主要硬件介绍
1 •单片机
这里选用AT89C5仲片机作为控制系统的处理器。

AT89C51是一种带4K字节闪存可编程可擦除只读存储器的低电压、高性能CMOS 8位微处理器。

2 •温度传感器
温度传感器有很多种型号,这里我选用DS18B20温度传感器。

数字温度
传感器DS18B2C具有独特的单总线接口方式,支持多节点,使分布式温度传感器设计大为简化。

测温时无需任何外围原件,可以通过数据线直接供电,具有超低功耗工作方式。

测温围为-55到+125摄氏度,可直接将温度转换值以16位二进制数字码的方式串行输出,因此特别适合单线多点温度测量系统。

由于传输的是串行数据,可以不需要放大器和A/D 转换器,因而这种测温方式大大提高了各种温度测控系统的可靠性,降低了成本,缩小了体积。

3 •开关器件
由于单片机与电动机之间需要用开关器件连接,并且前者用弱电控制,
后者由强电控制,这就尤其需要注意安全问题。

于是我想到了在课本中学
过的高性能安全开关器件光电耦合器。

光电耦合器是由一个发光器件和和
一个光电转换器件组成,这里所用的光电耦合器OPTOCOUPLER-NP是由一
个发光二极管和一个光敏晶体管所组成。

当发光二极管发光,就会使得光敏晶体管导通,继电器通电动作,将开关吸合,电动机回路断开。

222电路设计方法
1 •显示部分电路
显示电路截图如下图所示
图2.1显示部分电路图
这里我选用LCDLM016L液晶显示屏作为系统的显示器件,如图所示,LCDLM016L 采用标准的16脚接口,仿真时隐藏了背光正极和背光负极两个引脚。

它通过D0-D78位数据端来与单片机进行数据和指令传输,这里我们将它与单片机的P0 口连接。

在显示屏上显示的容包括设定的温度值SET传感器检测到的环境温度
SA以及时钟,这个时钟是可以调整的,这样方便工作人员在对系统进行操作时有一个时间概念。

U2
ri .o P17 ATB9C51 <TEXT>
2 •温度检测电路
温度传感器与单片机的连接情况如下图所示
VCC
DQ
GND
3
■21.0 12
• •
1
DS18B20
<TEXT>
图2.2温度检测电路图
温度传感器18B20将检测到的环境实时温度进行A/D转换和放大,然
后串行送入单片机P1.7 口,便于单片机将此数值与设定的温度值进行比较,然后先做出相应反应。

在仿真时,我们只能通过按18B20上的加减按钮来
调节实时温度,是一个模拟的过程。

3.键盘电路
键盘电路如下图所示。

这里减排设计得比较简单,“ MS'键是切换调整对象的,调整对象包括
时、分、温度设定值三项,“ +”键是向上加调整对象的值,“一”键是向下
减调整对象的值,“ON/OFF键是打开和关闭系统自动调节功能的开关键。

图2.3键盘电路图
4 •电气开关及工作电路
电器开关及工作电路如下图所示
a
.g
k


OPTOCOUPLER-NPN . 丁閃》
图2.4电气开关及工作电路图
如图所示,光电耦合器1脚接电源,2脚接单片机P3.7脚。

工作过程用以下三个阶段来描述:
(1)单片机将温度传感器送入的值与设定值进行比较,若送入值小于设定值,则P3.7脚保持高电平,这样发光二极管不发光,光敏晶体管保持高阻态,继电器也不会工作,电动机和灯泡维持导通,相当于电炉继续加
热,指示灯亮;
(2)一旦送入值比设定值大,单片机将会控制P3.7脚变为低电平,发光二极管导通发光,光敏晶体管受光照影响导通,继而继电器工作,电
磁铁将单刀双掷开关吸向左端,使电动机和灯泡同时停止工作,这就相当于电炉断电,停止加热;
(3)电炉短路一段时间后,必然导致炉温降低,而温度传感器DS18B20
在不间断地检测炉温,当检测值低于设定值后,单片机又控制P3.7脚恢复
高电平,光电耦合器恢复高阻态,继电器断电,单刀双掷开关被弹回右端,
电动机和灯泡又开始工作,这相当于电炉从新开始加热。

223绘制流程图
P!rUU JU.
EX
F 皿
PSXA'S PESAn
-D P9J1FMD
曲」 E JI W L 二
Fa 二 Tni
J
CTJTPT
Pl-*-
J
IP' Ji EJI RR
224程序设计
由于整个程序工程量比较大,我采用模块化设计方法来设计这个程序。

首先定义在后面将会用到的变量,不可能一次定义准确,所以边定义边补 充。

然后编写子函数,包括
LCM 初始化子函数、显示指定坐标的一个字符
子函数、ds18b20初始化函数、ds18b20延迟子函数、读取 ds18b20当前温 度子函数、液晶显示子函数、键盘扫描子函数、设定工作模式子函数、按 键加法子函数、按键减法子函数、 24C02读写驱动程序、定时器 t0中断子
函数等子程序,最后是主函数。

2.3调试和仿真
在Keil 软件中编写完程序后,编译生成.Hex 文件,单片机可以执行.Hex 文件。


Protues 软件中,给单片机加载所生成的
.Hex 文件,按下运行按
钮,系统开始仿真。

系统仿真截图如下图所示。

图2.5系统仿真图(一)
上一是当温度采样值小于设定值,电热炉处于工作状态时的仿真截图 以下这是当温度采样值高于设定值后,系统自动做出反应,使电热炉断电 停止工作的仿真截图。

« > cw JFTEE
F riQU^
—B5!3Bi07—
5ET 沽眈并熄仁河 E 单!
tiu Ec^EaEEo
RP1
LCD1-
U H EIB.
U2
o u J 3 a a nKnKEEnP
图2.6系统
3结果分析
由以上仿真结果可以知道,此次的设计基本成功。

当采样温度低于设 定值的时候,系统不会对电热炉做出相应动作,电热炉保持加热。

一旦采 样温度高于设定值,系统就会做出反应,使电加热炉断电停止加热。

当温 度降下来后,系统又会自动控制电加热炉重新开始加热。

系统的反应速度 也是十分精确的,会在很短的时间作出相应动作。

另外,由于在电路中加 入了 EPROM24CQ2使得该系统具有掉电保护功能,来电后自动恢复正常工 作。

除此之外,该系统还有一个比较实用的小功能一电子钟,这样的话工 作人员可以利用它准确掌握系统已经工作的时间,也就是说可以把它当做 一个定时器来用。

在安全保护方面,该系统也有相当不错的表现,由于使 用了光电耦合器和就电磁继电器,将强电部分和弱电部分充分隔离,十分 安全。

综合以上分析,该系统的设计十分成功。

4课程设计心得体会
一个星期很快就过去了,计算机控制技术课程设计也告一段落。

本次课程设 计,我的题目是《设计一个电加热炉温度控制系统》。

说到电加热炉,我们都比 较熟悉,在日常生活中我们经常用到,特别是冬天用它来煮火锅。

我们也会发现
这样一个问题,一般的电加
抵匸也n
J
1
陆•亦
PC H Mi T
RM 霍
N.i*M3
PJ jtfTT" ki 」j?rr H*ffU FUiTi P 』#4IT"
kTBlJ-
p 沾
P2 Pl.T
• •耐
醤毒一畫
言一寺募一義
幕寺一oilier -<TCXT^
R±T
ST
•o# ”
P2
Ptj
"I ■I
•I
-L£E>1
LI4-H
fiy .
HL1.
IJ *- >Tr >t
A
-IDiT"
r»R- -inn f ■*
-imr tm-
-inn
i
璧鼻 1-1 -TT>1h
热炉是没有温度自动控制的,当温度上升到我们需要的程度时,它仍然继续加热,这不仅会影响到加热效果,还会造成电能的浪费。

那么就有必要设计一种能自动调节炉温的系统,把它应用到日常生活中,将会给人们带来极大的方便。

在设计的过程中,我也遇到一些麻烦,比如说怎样来实现电动机回路的自动通断调节、怎样来实现时钟的调整等等,这些问题都令我十分棘手。

通过去图书馆查阅相关资料和上网搜索各硬件的原理以及应用,我最终都一一解决了这些问题。

由于我们是三个同学做同一个题目,在设计过程中,我们遇到困难的时候也经常相互讨论,相互请教,最终一起解决问题,在此也感谢我的“战友”们。

总的来说,此次课程设计的过程比较轻松,从拿到问题到彻底解决问题,这是一个令人振奋并享受的过程。

经过去图书馆大量的查阅书籍,我也学到了很多在课本上没有的知识,收获颇丰。

这段过程让我懂得了一个道理,那就是学生要学的绝对不该仅仅是课本上的东西,有些东西只有走进图书馆,你才可能学习到。

也只有这样,我们才能成为一个见多识广、渊博的人。

参考文献
[1] 于海生•微型计算机控制技术•清华大学,2004
[2] 谭浩强.C程序设计(第三版)•清华大学,2006
[3] 戴焯•传感与检测技术•理工大学,2006
[4] 毅刚.单片机原理及应用.高等教育,2003
⑸柯节成•简明电子元件器件手册•高等教育,2005
忙检测标志定义P0 口为LCD 通讯端口 语音报警地址
//红色
指示灯
//白色
指示灯
//绿色
指示灯
//时钟
调整
//时钟

附录
系统的完整程序如下:
/***********************************************************
电加热炉温度控制系统
问题描述:当温控开关打开时,若测得环境温度大于设定温度,则继电器 吸合,电加热炉停止工作;若测得环境温度小于设定温度,贝U 继电器释放, 电加热炉继续工作。

***********************************************************/
#in clude<reg51.h> #in clude< intrin s.h> #in elude <absacc.h> #defi ne uchar un sig ned char #defi ne uint un sig ned int #defi ne BUSY 0x80 //lcd
#defi ne DATAPORT P0
//
#defi ne PLAYE_ADDR XBYTE[0XBFFF] // sbit RED_ALARM=P1A 0; sbit WRITE_ALARM=P1A1; sbit GREEN_ALARM=P"2; sbit BLUE_ALARM=P1A3; sbit P1_4=P1A4; sbit P1_5=P1A5; sbit P1_6=P1A6; sbit DQ = P1A7; sbit LCM_RS=P2A0; sbit LCM_RW=P2A1; sbit LCM_EN=P2A2; sbit sda=P2A3; //IO
sbit scl=P2A4; sbit ad_busy=P3A2; sbit RECLED_EOC=P3A5; sbit OUT=P3A7;
写指令到ICM 子函数 写数据到 LCM 子函数
//键盘扫描子程序
void WriteComma ndLCM(uchar WCLCM,uchar BusyC); // void WriteDataLCM(uchar WDLCM);
//
void DisplayO neChar(uchar X,uchar Y,uchar DData) // 子函

void DisplayListChar(uchar X,uchar Y,uchar code *DData);〃
串字符子函数
void ini t_timer0(void); void displayfu n1(void); void displayfu n2(void); void displayfu n3(void); void displayfu n4 (void); void keysca n( void ); void set_adj(void); void in c_key(void); void dec_key(void);
void delay_18B20(unsigned int i); void In it_DS18B20(void); uchar ReadO neChar(void);
void Write On eChar( un sig ned char dat); void ReadTemperature(void); void ad0809(void); void playalarm(void);
uchar ad_data;
uchar seconde; uchar min ite; uchar hour; uchar mstc nt=O; uchar temp1,temp2,temp; uchar t,set; uchar K; bit ON_OFF=0; bit outflag; bit write=0; uchar code str0[]={"--- : : --- "}; uchar code str1[]={"SET: C SA: . C"}; void delay_LCM(ui nt); void ini tLCM( void);
void lcd_wait(void);
//ad 采样值存储 //定义并初始化时钟变量
//温度显示变量
//LCD 延时子程序 //LCD 初始化子程序 //LCD 检测忙子程序
/*********
选中指令寄存器
// 写模式
********
写数据到 LCM 子函数************/
检测忙信号
选中数据寄存器 写模式
延时 K*1ms,12.000mhz**********/
void delay_LCM(ui nt k)
uint i,j; for(i=0;i<k;i++)
for(j=0;j<60;j++)
{;}
void WriteComma ndLCM(uchar WCLCM,uchar BusyC) { if(BusyC)lcd_wait(); DATAPORT=WCLCM; LCM_RS=0; //
LCM_RW=0; LCM_EN=1; _nop_(); _nop_(); _nop_(); LCM_EN=0; void WriteDataLCM(uchar WDLCM) { lcd_wait( );
//
DATAPORT=WDLCM; LCM_RS=1; // LCM_RW=0; //
LCM_EN=1; _n op_(); _nop_(); _nop_(); LCM_EN=0; }
/**********
写指令到 LCM 子函数************/
}
三次显示模式设置,不检测忙信号
数据传送,2行显示,5*7字型,检测忙信号 关闭显示,检测忙信号 清屏,检测忙信号
显示光标右移设置,检测忙信号
显示屏打开,光标不显示,不闪烁,检测忙信号
void lcd_wait(void)
{
DATAPORT=Oxff; LCM_EN=1; LCM_RS=0; LCM_RW=1; _n op_();
while(DATAPORT&BUSY) { LCM_EN=0;
_n op_(); _n op_(); LCM_EN=1; _n op_(); _n op_(); }
LCM_EN=0;
void ini tLCM()
{
DATAPORT=0; delay_LCM(15);
WriteComma ndLCM(0x38,0); // delay_LCM(5);
WriteComma ndLCM(0x38,0); delay_LCM(5);
WriteComma ndLCM(0x38,0); delay_LCM(5);
WriteComma ndLCM(0x38,1);//8bit WriteComma ndLCM(0x08,1); // WriteComma ndLCM(0x01,1); // WriteComma ndLCM(0x06,1); // WriteComma ndLCM(0x0c,1); //
void Display On eChar(uchar X,uchar Y,uchar DData) {
*********lc^
m 咅 E 等待函*************/ } ********LCM 初始化子函数 ***********/
} **************
显示指定坐标的一个字符子函数 *************/
,地址码+0X40
Y& =1; X& =15; if(Y)X|=0x40; // 若 y 为 1 (显示第二行) X|=0x80;
//
指令码为地址码
+0X80
WriteComma ndLCM(X,0); WriteDataLCM(DData); }
/***********
显示指定坐标的一串字符子函数 ***********/
void DisplayListChar(uchar X,uchar Y,uchar code *DData) {
uchar ListLe ngth=0; Y&=0x01; X&=0x0f; while(X<16) {
DisplayO neChar(X,Y,DData[ListLe ngth]); ListLe ngth++; X++; } }
/***********ds18b20 延迟子函数(晶振 12MHz )*******/ void delay_18B20(unsigned int i) {
void In it_DS18B20(void) {
while(i--);
} /**********ds18b20 初始化函数 ******************** **/ un sig ned char x=0;
DQ = 1;
//DQ
复位
delay_18B20(8); // 稍做延时
DQ = 0;
//
单片机将 DQ 拉低
delay_18B20(80); // 精确延时 大于480us
DQ = 1;
//
拉高总线
delay_18B20(14);
x=DQ;
//
稍做延时后
如果x=0则初始化成功
delay_18B20(20);
x=1则初始化失败
给脉冲信号
给脉冲信号 ************ 读取 ds18b20 当前温度 ************/
un sig ned char Read On eChar(void) {
uchar i=0; uchar dat = 0;
for (i=8;i>0;i--) {
DQ = 0; // dat>>=1;
DQ = 1; // if(DQ) dat|=0x80; delay_18B20(4); }
return(dat); }
void Write On eChar(uchar dat) {
un sig ned char i=0; for (i=8; i>0; i--) {
DQ = 0;
DQ = dat&0 x01; delay_18B20(5); DQ = 1; dat>>=1;
}
} void ReadTemperature(void) {
un sig ned char a=0; un sig ned char b=0; un sig ned char t=0;
/***********dsi8b20 读一 个字^节
**************/
/*************ds18b20 •写. 个字^节 **************
In it_DS18B20();
WriteO neChar(OxCC); // WriteO neChar(0x44);
跳过读序号列号的操作//启动温度转换
delay_18B20(100); // this message is wery importa nt In it_DS18B20();
WriteO neChar(OxCC);
WriteO neChar(OxBE); 是温度
delay_18B20(100);
a=ReadO neChar();
b=Read On eChar();
temp1=b<<4;
temp1+=(a&0 xf0)>>4;
temp2=a&0x0f;
temp=((b*256+a)>>4); // //跳过读序号列号的操作
//读取温度寄存器等(共可读9个寄存器) 前两个就
//读取温度值低位
//读取温度值高位
当前采集温度值除16得实际温度值
}
*************
液晶显示子函数
1 正常显^示*****************/
void displayfu n1(void)
{
WriteComma ndLCM(0x0c,1); // 显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(O,O,strO
);
DisplayListChar(O,1,str1)
;
DisplayO neChar(3,0,hour/10+0x30); DisplayO neChar(4,0,hour%10+0x30);
DisplayO neChar(6,0,mi nite/10+0x30); DisplayO neChar(7,0,mi nite%10+0x30);
DisplayO neChar(9,0,seco nde/10+0x30); Display On eChar(10,0,seco nde%10+0x30);
DisplayO neChar(4,1,K/10+0x30);
Display On eChar(5,1,K%10+0x30);
DisplayO neChar(11,1,temp1/10+0x30); // DisplayO neChar(12,1,temp1%10+0x30); DisplayO neChar(14,1,temp2/10+0x30); // 液晶上显示小时
//液晶上显示分
// 液晶上显示秒
// 液晶上显示设定的温度
液晶上显示测得的温度
液晶上显示控温的标志
if(ON_OFF==0) {
Display 。

neChar(14,0,0x4f); Display 。

neChar(15,0,0x46); } else //
若温控标志为
// 液晶上显示不控温的标志
{
Display On eChar(14,0,0x4f); //
Display On eChar(15,0,0x4e); if(outflag==1)
DisplayO neChar(0,0,0x7c);
else
Display On eChar(0,0,0xef);
void displayfu n2(void) {
WriteComma ndLCM(0x0c,1); //
显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0); DisplayListChar(0,1,str1);
DisplayO neChar(6,0,mi nite/10+0x30); DisplayO neChar(7,0,mi nite%10+0x30);
DisplayO neChar(9,0,seco nde/10+0x30); Display On eChar(10,0,seco nde%10+0x30);
DisplayO neChar(4,1,K/10+0x30); Display On eChar(5,1,K%10+0x30);
DisplayO neChar(11,1,temp1/10+0x30); DisplayO neChar(12,1,temp1%10+0x30); DisplayO neChar(14,1,temp2/10+0x30);
WriteComma ndLCM(0x0f,1); // 显示屏打开,光标显示,闪烁,检测忙信号
**********
液晶显示子函数
************
************
液晶显示子函数
3***************
************
液晶显示子函数 4 *****************/
Display 。

neChar(3,0,hour/10+0x30);
Display 。

neChar(4,0,hour%10+0x30);
void displayfu n3(void) {
WriteComma ndLCM(0x0c,1); //
显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(O,O,strO); DisplayListChar(O,1,str1);
DisplayO neChar(3,0,hour/10+0x30); DisplayO neChar(4,0,hour%10+0x30);
DisplayO neChar(9,0,seco nde/10+0x30); Display On eChar(10,0,seco nde%10+0x30);
DisplayO neChar(4,1,K/10+0x30); Display On eChar(5,1,K%10+0x30);
DisplayO neChar(11,1,temp1/10+0x30); DisplayO neChar(12,1,temp1%10+0x30); DisplayO neChar(14,1,temp2/10+0x30);
WriteComma ndLCM(0x0f,1); // 显示屏打开,光标显示,闪烁,检测忙信号
DisplayO neChar(6,0,mi nite/10+0x30); DisplayO neChar(7,0,mi nite%10+0x30);
void displayfu n4 (void) {
WriteComma ndLCM(0x0c,1); // 显示屏打开,光标不显示,不闪烁,检测忙信号
DisplayListChar(O,O,strO); DisplayListChar(0,1,str1);
} }
DisplayO neChar(3,0,hour/10+0x30);
显示屏打开,光标显示,闪烁,检测忙信号
Display 。

neChar(4,0,hour%10+0x30);
Display 。

neChar(6,0,mi nite/10+0x30); DisplayO neChar(7,0,mi nite%10+0x30);
DisplayO neChar(9,0,seco nde/10+0x30); Display On eChar(10,0,seco nde%10+0x30);
DisplayO neChar(11,1,temp1/10+0x30); DisplayO neChar(12,1,temp1%10+0x30); DisplayO neChar(14,1,temp2/10+0x30);
WriteComma ndLCM(0x0f,1); // DisplayO neChar(4,1,K/10+0x30); Display On eChar(5,1,K%10+0x30);
case 0xfb:dec_key(); break; case
Oxf7:{delay_LCM(150);ON_OFF=!ON_OFF;while(!BLUE_ALARM);} break;
default:break;
}
************ 键盘扫描子函******************/ void keysca n( void) { uchar xx; //
P 仁 Oxff; if(P1!=0xff)
{
delay_LCM(50); if(P1!=0xff) {
xx=P1; switch(xx) {
case Oxfe:set_adj();
case 0xfd:i
nc_key(); 局部变量
//根据按键状态,调用不同的子函数
break;
break;
************
设定工作模式子函数
**************
**/
**************
按键加**************** **/
break;
************** 按键减
法子函
*************** **/
break;
void set_adj(void) {
delay_LCM(100); set++; if(set>=4)set=O;
while(!RED_ALARM);
void in c_key(void) {
delay_LCM(150); switch(set) {
case 0:if(P1==Oxf7){delay_LCM(150);ON_OFF=!ON_OFF;} case 1:hour++; if(hour>=23)hour=23; break; case 2:min ite++; if(min ite>=59) min ite=59;break; case 3:K++;if(K>=99)K=99; break;
default:break; } while(!WRITE_ALARM); }
void dec_key(void) {
delay_LCM(150); switch(set) {
case 0:if(P1==0xf7){delay_LCM(150);ON_OFF=!ON_OFF;} case 1:hour--; if(hour<=0)hour=0; break; case 2:mi nite--;if(mi nite<=0)mi nite=0;break; case 3:K--;if(K<=1)K=1; break;
default:break; }
}
}
}
while(!GREEN_ALARM);
********* *24C02 ^读写驱动程^序**************/
void delay1(uchar x) {
uint i;
for(i=0;i<x;i++); }
void flash()
{ ; ; }
void x24c02_i ni t() 〃24c02 {
scl=1;
flash();
sda=1;
flash();
}
void start() //
{
sda=1;
flash();
scl=1;
flash();
sda=0;
flash();
scl=0;
flash();
}
void stop() //
{
sda=0;
flash();
scl=1;
flash();
sda=1;
flash();
}
void writex(uchar j) //
初始化子程序启动I2C总线
停止I2C总线
写一个字节
总线时钟
uchar i,temp; temp=j; for (i=0;i<8;i++)
{
temp=temp<<1; scl=0; flash(); sda=CY; flash(); scl=1; flash(); } scl=0; flash(); sda=1; flash(); } uchar readx() // 读一个字节
{
uchar i,j,k=0; scl=0; flash(); sda=1; for (i=0;i<8;i++)
{
flash(); scl=1; flash(); if (sda==1) j=1; else j=0; k=(k«1)|j; scl=0; } flash(); return(k); }
void clock()
〃I2C
uchar i=0;
scl=1;
flash();
while ((sda==1)&&(i<255))i++;
scl=0;
flash();
}
//////// 从24c02的地址address 中读取一个字节数据///// uchar x24c02_read(uchar address)
{
uchar i;
start();
writex(OxaO);
clock();
writex(address);
clock();
start();
writex(0xa1);
clock();
i=readx();
stop();
delay1(10);
return(i);
}
////// 向24c02的address 地址中写入一字节数据info///// void x24c02_write(uchar address,uchar info)
{
EA=0;
start();
writex(OxaO);
clock();
writex(address);
clock();
writex(i nfo);
clock();
stop();
EA=1;
/***************
定时器 t0 ^初始•^化
*******************/
TMOD=0x01;
//time O
TH0=0x3c;
//
为定时器,方式1
预置计数初值
/*******
**** void timer0(void) in terrupt 1 using 0 //
定时器0方式1 , 50ms 中断一次
keysca n();
//
按键扫描
P1=0xff;
//
x24c02」ni t();
// 初始化p1 口,全设为 1
初始化24C02 K=x24c02_read(2); //
读出保存的数据赋于
K
ini tLCM();
delay1(50);
void in it_timerO(void)
TL0=0xb0; EA=1; ET0=1; TR0=1;
定时器 t0中断子函数 **************
TH0=0x3c; TL0=0xb0; mstcnt++;
if(mstc nt>=20 ) {sec on de++; write=1; mstc nt=0; } if(sec on de>=60) {min ite++; sec on de=0;} if(min ite>=60 ) {hour++; min ite=0; } if(hour>=24 ) {hour=0;}
/***********the main funtion *************/ void mai n(void)
seco nde=x24c02_read(4);
mini te=x24c02_read(6);
hour=x24c02_read(8);
//LCD 初始化
delay_LCM(500); // 延时500ms 启动 ini t_timer0(); //
时钟定时器 0初始化
In it_DS18B20();
//DS18B20
初始化
//按键扫描
温度采集 根据工作模式显示
正常工作显示 调整时显示 调整分显示 温度设定
判断计时器是否计时一秒
清零
在24c02的地址 2中写入数据
hour
DisplayListChar(O,O,strO); DisplayListChar(0,1,str1); while (1) {
keysca n(); ReadTemperature(); //
switch(set)
//LCD
{
case O:displayfu n1();delay_LCM(1000);break; // case 1:displayfu n2();delay_LCM(1000);break; // case 2:displayfu n3();delay_LCM(1000);break; // case 3:displayfu n4();delay_LCM(1000);break; // default:break;
{
if(temp1>=K+1){outflag=1;OUT=0;} if(temp1<K) {
delay_LCM(1000);
if(temp1<K){outflag=0;OUT=1;} } }
else{outflag=0;OUT=1;} if(write==1) //
{
write=0;
//
x24c02_write(8,hour); //
delay_LCM(11); x24c02_write(6,mi ni te); delay_LCM(11);
x24c02_write(4,seco nde); delay_LCM(11); x24cO2_write(2,K); }
} }
keysca n(); // 相当于延时
if(0N_0FF==1)
//若温控标志位 1, 控制LAMP 动作。

相关文档
最新文档