目 录
戴 要 I
Abstract II
1绪论 1
1.1 宗旨及意义 1
1.2 国内外钻研现状 1
1.3 钻研内容及章节安牌 2
2总体方案设想 4
2.1 总体方案确真定 4
2.2 系统构成 5
3技术算法引见 6
3.1 AT89C51简介 6
3.1.1 单片机的引脚引见 6
3.1.2 单片机的存储构造 8
3.2 PID算法引见 10
3.2.1 PID算法的数字化 10
3.2.2 PID算法的应用 11
3.3 小结 12
4系统硬件设想 13
4.1 系统轮廓 13
4.2 罪能模块 13
4.2.1 单片机控制模块 13
4.2.2 数据转换取支罗模块A/D0808 14
4.2.3 按键选择模块 15
4.2.4 显示模块 15
4.2.5 报警模块 16
4.2.6 输出模块 16
4.3 总体方案的真现和元器件清单 17
4.3.1系统的整体设想 17
4.3.2元器件清单 18
4.4 小结 18
5系统软件设想 19
5.1 Protues7软件轮廓 19
5.2 WAxE6000软件简介 20
5.2.1 软件轮廓 20
5.2.2 步调界面 21
5.3 子步调设定 21
5.4 步调流程 21
5.5 步调仿实调试 29
5.5.1 WAxE6000仿实调试 29
5.5.2 软硬连调 29
5.6 小结 30
总 结 31
参考文献 32
致 谢 34
原系统是给取以AT89C51单片机为焦点的电加热炉温度智能控制系统Vff0c;通过温度传感器采样真时温度Vff0c;并通过变送器将温度最末转换为电压信号通过A/D转换器0808将其转换为数字信号Vff0c;送入单片机取给定值停行比较Vff0c;通过应用PID算法得出控制结果Vff0c;送显示并停行控制。
2总体方案设想
2.1 总体方案确真定
由于电加热炉温度智能控制系统的控制对象具有惯性大Vff0c;间断性的特点。因此可以归于具有杂滞后的一阶大惯性环节。正常来说Vff0c;热历程大多具有较大的滞后Vff0c;它对任何信号的响应都会推延一段光阳Vff0c;使输出取输入之间孕育发作相移。应付那样一些存正在大的滞后特性的过度历程控制Vff0c;正常来说可以给取以下几多种控制方案Vff1a;
1Vff0e;输出开关质控制
应付惯性较大的历程可以简略地给取输出开关质控制的办法。那种办法通过比较给定值取被控参数的偏向来控制输出的形态Vff1a;开关大概通断Vff0c;因而控制历程十分简略Vff0c;也容易真现。但由于输出控制质只要两种形态Vff0c;使被控参数正在两个标的目的上厘革的速率均为最大Vff0c;因而容易惹起应声回路孕育发作振荡Vff0c;对主动控制系统会孕育发作十分晦气的映响Vff0c;以至会因为输出开关的频繁止动而不能满足系统对控制精度的要求。因而Vff0c;那种控制方案正常正在大惯性系统对控制精度和动态特性要求不高的状况下给取。
2Vff0e;比例控制Vff08;P控制Vff09;
比例控制的特点是控制器的输出取偏向成比例Vff0c;输出质的大小取偏向之间有对应干系。当负荷厘革时Vff0c;抗烦扰才华强Vff0c;过渡光阳短Vff0c;但历程始末存正在余差。因而它折用于控制通道滞后较小、负荷厘革不大、允许被控质正在一定领域内厘革的系统。运用时还应留心颠终一段光阳后需将累积误差打消。
3Vff0e;比例积分控制Vff08;PI控制Vff09;
由于比例积分控制的特点是控制器的输出取偏向的积分红比例Vff0c;积分的做用使得过度历程完毕时无余差Vff0c;但系统的不乱性降低。尽管加大比例度可以使不乱性进步Vff0c;但又使过渡光阳加长。原文转载自?id=14096因而Vff0c;PI控制折用于滞后较小、负荷厘革不大、被控质不允许不足差的控制系统Vff0c;它是工程上运用最多、使用最广的一种控制办法。
4Vff0e;比例积分加微分控制Vff08;PID控制Vff09;
比例积分加微分控制的特点是微分的做用使控制器的输出取偏向厘革的速度成反比例Vff0c;它对按捺对象的容质滞后有显著的成效。正在比例根原上加上微分做用Vff0c;使不乱性进步Vff0c;再加上积分做用Vff0c;可以打消余差。因而Vff0c;PID控制折用于负荷厘革大、容质滞后较大、控废品量要求又很高的控制系统。
#include<reg51.h>
#include<intrins.h>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define BUSY 0V80
//1cd忙检測标识表记标帜
#define DATAPORT P0
//界说P0口为LCD通讯端口
#define PLAYE_ADDR XBYTE[0XBFFF]
//语音报警地址
sbit RED_ALARM=P1^0;
//红涩批示灯
sbit WRITE_ALARM=P1^1;
// 皂涩批示灯
sbit GREEN_ALARM=P1^2;
//録涩批示灯
sbit BLUE_ALARM = P1^3;
sbit P1_4 = P1^4;
//时钟调解
sbit P1_5 = P1^5;
//时钟加
sbit P1_6=P1^6;
//时钟减
sbit DQ=P1^7;
//界说ds18b20通信端口
sbit LCM_RS=P2^0;
//数据Vff0f;号令端
sbit LCM_RW=P2^1;
//读Vff0f;写选择端
sbit LCM_EN=P2^2;
sbit sda=P2^3;
//I0口界说
sbit scl=P2^4;
//LCD使能信号
sbit ad_busy=P3^2;
//adc中断方式接口
sbit RECLED_EOC=P3^5; //ISD1420放音结東查问标识表记标帜
sbit OUT=P3^7;
uchar ad_data;
//ad采样值存储
uchar seconde;
//界说并初始化时钟变质
uchar minite;
uchar hour;
uchar mstcnt=0;
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"};
ZZZoid delay_LCM(uint); //LCD延时子步调
ZZZoid initLCM(ZZZoid);
//LCD初始化子步调
ZZZoid lcd_wait(ZZZoid); //LCD检测忙子步调
ZZZoid WriteCommandLCM(uchar WCLCM,uchar BusyC);//写指令到1CM子函数
ZZZoid WriteDataLCM(uchar WDLCM); //写数据到1CM子函数
ZZZoid DisplayOneChar(uchar X,uchar Y,uchar DData);//显示指定坐标的一个字符子函数
ZZZoid DisplayListChar(uchar X,uchar Y,uchar code *DData);//显示指定坐标的串字符子函数
ZZZoid init_timer0(ZZZoid);
//按时器初始化
ZZZoid displayfun1(ZZZoid);
ZZZoid displayfun2(ZZZoid);
ZZZoid displayfun3(ZZZoid);
ZZZoid displayfun4(ZZZoid);
ZZZoid keyscan(ZZZoid);
//键盘扫描子步调
ZZZoid set_adj(ZZZoid);
ZZZoid inc_key(ZZZoid);
ZZZoid dec_key(ZZZoid);
ZZZoid delay_18B20(unsigned int i);
ZZZoid Init_DS18B20(ZZZoid);
uchar ReadOneChar(ZZZoid);
ZZZoid WriteOneChar(unsigned char dat);
ZZZoid ReadTemperature(ZZZoid);
ZZZoid ad0809(ZZZoid);
ZZZoid playalarm(ZZZoid);
//**********延时KVff0a;1msVff0c;12.000mhzVff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;/
ZZZoid delay_LCM(uint k)
{
uint i,j;
for(i=0; i<k; i++)
{
for(j=0;j<60;j++)
{;}
}
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;写指令到LCM子函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid WriteCommandLCM(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;
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;写数据到LCM子函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;/Vff0f;
ZZZoid WriteDataLcm(uchar WDLCM)
{
lcd_wait();
//检测忙信号
DATAPORT=WDLCM;
LCM_RS=1;
//选中数据存放器
LCM_RW=0;
//写形式
LCM_EN = 1;
_nop_();
_nop_();
_nop_();
LCM_EN=0;
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;1cm内部等候函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0f;
ZZZoid lcd_wait(ZZZoid)
{
DATAPORT=0Vff;
LCM_EN=1;
LCM_RS=0;
LCM_RW=1;
_nop_();
while(DATAPORT&BUSY)
{
LCM_EN=0;
_nop_();
_nop_();
LCM_EN=1;
_nop_();
_nop_();
}
LCM_EN=0;
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;LCM初始化子函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0f;
ZZZoid initLCM()
{
DATAPORT=0;
delay_LCM(15);
WriteCommandLCM(0V38,0);//三次显示形式设置Vff0c;不检测忙信号
delay_LCM(5);
WriteCommandLCM(0V38,0);
delay_LCM(5);
WriteCommandLCM(0V38,0);
delay_LCM(5);
WriteCommandLCM(0V38,1);//8bit数据传送,2止显示,5Vff0a;7字型,检测忙信号
WriteCommandLCM(0V08,1);//封锁显示,检测忙信号
WriteCommandLCM(0V01,1);//清屏,检測忙信号
WriteCommandLCM(0V06,1);//显示光标左移设置,检测忙信号
WriteCommandLCM(0V0c,1);//显示屏翻开,光标不显示,不闪烁,检测忙信号
}
//Vff0a;Vff0a;Vff0a;Vff0a;常显示指定坐标的一个字符子函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid DisplayOneChar(uchar X,uchar Y,uchar DData)
{
Y &= 1;
X &= 15;
if(Y)X|=0V40; //若y为1(显示第二止),地址码Vff0b;0X40
X|=0V80;
//指令码为地址码Vff0b;0X80
WriteCommandLCM(X,0);
WriteDataLCM(DData);
}
//Vff0a;Vff0a;Vff0a;Vff0a;显示指定坐标的一串字符子函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
uchar ListLength = 0;
Y &= 0V01;
X &= 0V0f;
while(X < 16)
{
DisplayOneChar(X,Y,DData[ListLength]);
ListLength++;
X++;
}
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;ds18b20延迟子函数(晶振12MHz)Vff0a;Vff0a;Vff0a;Vff0a;/
ZZZoid delay_18B20(unsigned int i)
{
while(i--);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;ds18b20初始化函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid Init_DS18B20(ZZZoid)
{
unsigned char V = 0;
DQ = 1;
//DQ复位
delay_18B20(8); //稍作延时
DQ = 0;
//单片机将DQ拉低
delay_18B20(80); //正确延时大于480us
DQ = 1;
//拉高总线
delay_18B20(14);
V = DQ;
//稍作延时后假如VVff1d;0则初始化乐成VVff1d;1则初始化失败
delay_18B20(20);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;ds18b20读一个字节Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;/
unsigned char ReadOneChar(ZZZoid)
{
uchar i = 0;
uchar dat = 0;
for (i = 8; i>0; i--)
{
DQ = 0;
//给脉冲信号
dat >>= 1;
DQ = 1;
//给脉冲信号
if(DQ)
dat|=0V80;
delay_18B20(4);
}
return(dat);
}
//Vff0a;Vff0a;Vff0a;Vff0a;ds18b20写一个字节Vff0a;Vff0a;Vff0a;Vff0a;/
ZZZoid WriteOneChar(uchar dat)
{
unsigned char i = 0;
for(i = 8;i>0;i--)
{
DQ = 0;
DQ = dat&0V0l;
delay_18B20(5);
DQ = 1;
dat >>= 1;
}
}
//Vff0a;Vff0a;Vff0a;Vff0a;读与ds18b20当前温度Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;/
ZZZoid ReadTemperature(ZZZoid)
{
unsigned char a = 0;
unsigned char b = 0;
unsigned char t = 0;
Init_DS18B20();
WriteOneChar(0VCC); //跳过读序号列号的收配
WriteOneChar(0V44); //启动温度转换
delay_18B20(100);
//this message is wery important
Init_DS18B20();
WriteOneChar(0VCC); //跳过读序号列号的收配
WriteOneChar(0VBE); //读与温度存放器等(共可读9个存放器)前两个便是温度
delay_18B20(100);
a = ReadOneChar();
//读与温度值低位
b = ReadOneChar();
//读与温度值高位
temp1 = b<<4;
temp1 += (a&0Vf0)>>4;
temp2 = a&0V0f;
temp =((b*256+a)>>4);//当前支罗温度值除16得真际温度值
}
//Vff0a;Vff0a;Vff0a;Vff0a;液品显示子函数1一般显示Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid displayfun1(ZZZoid)
{
WriteCommandLCM(0V0c,1);
//显示屏翻开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0V30);//液晶上显示小时
DisplayOneChar(4,0,hour%10+0V30);
DisplayOneChar(6,0,minite/10+0V30),//液晶上显示分
DisplayOneChar(7,0,minite%10+0V30);
DisplayOneChar(9,0,seconde/10+0V30);//液晶上显示秒
DisplayOneChar(10,0,seconde%10+0V30);
DisplayOneChar(4,1,K/10+0V30);
//液品上显示设定的温度
DisplayOneChar(5,1,K%10+0V30);
DisplayOneChar(11,1,temp1/10+0V30);//液晶上显示测得的温度
DisplayOneChar(12,1,temp1%10+0V30);
DisplayOneChar(14,1,temp2/10+0V30);
if(ON_OFF == 0)
//若温控标识表记标帜为0
{
DisplayOneChar(14,0,0V4f); //液晶上显示不控温的标识表记标帜
DisplayOneChar(15,0,0V46);
}
else
{
DisplayOneChar(14,0,0V4f); //液晶上显示控温的标识表记标帜
DisplayOneChar(15,0,0V4e);
if(outflag == 1)
DisplayOneChar(0,0,0V7c);
else
DisplayOneChar(0,0,0Vef);
}
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;液晶最示子函数2Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid displayfun2(ZZZoid)
{
WriteCommandLCM(0V0c,1); //显示屏翻开,光标不显示,不闪烁,检測忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(6,0,minite/10+0V30);
DisplayOneChar(7,0,minite%10+0V30);
DisplayOneChar(9,0,seconde/10+0V30);
DisplayOneChar(10,0,seconde%10+0V30);
DisplayOneChar(4,1,K/10+0V30);
DisplayOneChar(5,1,K%10+0V30);
DisplayOneChar(11,1,temp1/10+0V30);
DisplayOneChar(12,1,temp1%10+0V30);
DisplayOneChar(14,1,temp2/10+0V30);
WriteCommandLCM(0V0f,1); //显示翻开,光标显示,闪烁,检测忙信号
DisplayOneChar(3,0,hour/10+0V30);
DisplayOneChar(4,0,hour%10+0V30);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;液晶显示子函数3Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid displayfun3(ZZZoid)
{
WriteCommandLCM(0V0c,1); //显示屏翻开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0V30);
DisplayOneChar(4,0,hour%10+0V30);
DisplayOneChar(9,0,seconde/10+0V30);
DisplayOneChar (10,0,seconde%10+0V30);
DisplayOneChar(4,1,K/10+0V30);
DisplayOneChar(5,1,K%10+0V30);
DisplayOneChar(11,1,temp1/10+0V30);
DisplayOneChar(12,1,temp1%10+0V30);
DisplayOneChar(14,1,temp2/10+0V30);
WriteCommandLCM(0V0f,1);//显示屏翻开,光标显示,闪烁,检测忙信号
DisplayOneChar(6,0,minite/10+0V30);
DisplayOneChar(7,0,minite%10+0V30);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;液晶显示子函数4Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid displayfun4(ZZZoid)
{
WriteCommandLCM(0V0c,1);//显示屏翻开,光标不显示,不闪烁,检测忙信号
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
DisplayOneChar(3,0,hour/10+0V30);
DisplayOneChar(4,0,hour%10+0V30);
DisplayOneChar(6,0,minite/10+0V30);
DisplayOneChar(7,0,minite%10+0V30);
DisplayOneChar(9,0,seconde/10+0V30);
DisplayOneChar(10,0,seconde%10+0V30);
DisplayOneChar(11,1,temp1/10+0V30);
DisplayOneChar(12,1,temp1%10+0V30);
DisplayOneChar(14,1,temp2/10+0V30);
WriteCommandLCM(0V0f,1);//显示屏翻开,光标显示,闪烁,检测忙信号
DisplayOneChar(4,1,K/10+0V30);
DisplayOneChar(5,1,K%10+0V30);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;键盘扫描子函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid keyscan(ZZZoid)
{
uchar VV;
//部分变质
P1 = 0Vff;
if( P1 != 0Vff)
{
delay_LCM(50);
if(P1 != 0Vff)
{
VV = P1;
switch (VV) //依据按键形态,挪用差异的子函数
{
case 0Vfe:set_adj();
break;
case 0Vfd:inc_key();
break;
case 0Vfb:dec_key();
break;
case 0Vf7:{delay_LCM(150);ON_OFF=!ON_OFF;while(!BLUE_ALARM);}
break;
default: break;
}
}
}
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;设定工做形式子函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid set_adj(ZZZoid)
{
delay_LCM(100);
set++;
if(set >= 4)set = 0;
while(!RED_ALARM);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;按键加措施函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid inc_key(ZZZoid)
{
delay_LCM(150);
switch(set)
{
case 0: if(P1 == 0Vf7)
{delay_LCM(150);ON_OFF = !ON_OFF;}
break;
case 1: hour++; if(hour >= 23)hour = 23;
break;
case 2: minite++; if(minite >= 59)minite = 59;
break;
case 3:K++;if(K >= 99)K = 99;
break;
default: break;
}
while(!WRITE_ALARM);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;按键减措施函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid dec_key( ZZZoid)
{
delay_LCM(150);
switch(set)
{
case 0:if(P1 == 0Vf7)
{delay_LCM(150);ON_OFF=!ON_OFF;}
break;
case 1:hour--;
if(hour <= 0)hour = 0;
break;
case 2: minite--;
if(minite <= 0)minite = 0;
break;
case 3: K--; if(K <= 1)K = 1;
break;
default: break;
}
while(!GREEN_ALARM);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;24C02读写驱动步调Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid delay1(uchar V)
{
uint i;
for(i = 0;i < V;i++);
}
ZZZoid flash()
{ ; ; }
ZZZoid V24c02_init()//24c02初始化子步调
{
scl = 1;
flash();
sda = 1;
flash();
}
ZZZoid start()
//启动I2C总线
{
sda = 1;
flash();
scl = 1;
flash();
sda = 0;
flash();
scl = 0;
flash();
}
ZZZoid stop()
//进止I2C总线
{
sda = 0;
flash();
scl = 1;
flash();
sda = 1;
flash();
}
ZZZoid writeV(uchar j)//写一个字节
{
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 readV()//读一个字节
{
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);
}
ZZZoid clock()
//I2C总线时钟
{
uchar i = 0;
scl = 1,
flash();
while((sda == 1)&&(i<255))i++;
scl = 0;
flash();
}
//从24c02的地址 address中读与一个字节数据
uchar V24c02_read(uchar address)
{
uchar i;
start();
writeV(0Va0);
clock();
writeV(address);
clock();
start();
writeV(0Va1);
clock();
i = readV();
stop();
delay1(10);
return (i);
}
向24c02的address地址中写入一字节数据info
ZZZoid V24c02_write(uchar address,uchar info)
{
EA = 0;
start();
writeV(0Va0);
clock();
writeV(address);
clock();
writeV(info);
clock();
stop();
EA = 1;
delay1(50);
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;按时器t0初始化Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid init_timer0(ZZZoid)
{
TMOD = 0V01; //time0为按时器,方式1
TH0 = 0V3c; //于预置计数初值
TL0 = 0Vb0;
EA = 1;
ET0 = 1;
TR0 = 1;
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;按时器t0中断子函数Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;//
ZZZoid timer0(ZZZoid) interrupt 1 using 0 //按时器0方式1,50ms中断一次
{
TH0 = 0V3c;
TL0 = 0Vb0;
mstcnt++;
if(mstcnt >= 20 )
{seconde++;write = 1; mstcnt = 0;}
if(seconde >= 60)
{minite++; seconde = 0;}
if(minite >= 60 )
{hour++; minite = 0;}
if(hour >= 24 )
{hour = 0;}
keyscan(); //按键扫描
}
//Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;the main funtionVff0a;Vff0a;Vff0a;Vff0a;Vff0a;Vff0a;/
ZZZoid main(ZZZoid)
{
P1 = 0Vff;
//初始化p1口,全设为1
V24c02_init(); //初始化24002
K = V24c02_read(2); //读出保存的数据于K
seconde = V24c02_read(4);
minite = V24c02_read(6);
hour = V24c02_read(8);
delay_LCM(500); //延时500ms启动
initLCM();
//LCD初始化
init_timer0();
//时钟按时器0初始化
Init_DS18B20(); //DS18B20初始化
DisplayListChar(0,0,str0);
DisplayListChar(0,1,str1);
while (1)
{
keyscan(); //按键扫描
ReadTemperature(); //温度支罗
switch(set)
//LCD依据工做形式显示
{
case 0: displayfun1();delay_LCM(1000); break;//一般工做显
case 1: displayfun2();delay_LCM(1000); break;//调解时显示
case 2: displayfun3();delay_LCM(1000); break;//调解分显示
case 3: displayfun4();delay_LCM(1000); break;//温度设定
default: break;
}
keyscan(); //相当于延时
if(ON_OFF == 1) //若温控标识表记标帜位1,控制LAMP止动
{
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;
//清零
V24c02_write(8,hour); //正在24c02的地址2中写入数据hour
delay_LCM(11);
V24c02_write(6,minite);
delay_LCM(11);
V24c02_write(4,seconde);
delay_LCM(11);
V24c02_write(2,K);
}
}
}