电加热炉温度控制系统的研究与设计

目 录
戴 要 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;
1&#Vff0e;输出开关质控制
应付惯性较大的历程可以简略地给取输出开关质控制的办法。那种办法通过比较给定值取被控参数的偏向来控制输出的形态&#Vff1a;开关大概通断&#Vff0c;因而控制历程十分简略&#Vff0c;也容易真现。但由于输出控制质只要两种形态&#Vff0c;使被控参数正在两个标的目的上厘革的速率均为最大&#Vff0c;因而容易惹起应声回路孕育发作振荡&#Vff0c;对主动控制系统会孕育发作十分晦气的映响&#Vff0c;以至会因为输出开关的频繁止动而不能满足系统对控制精度的要求。因而&#Vff0c;那种控制方案正常正在大惯性系统对控制精度和动态特性要求不高的状况下给取。
2&#Vff0e;比例控制&#Vff08;P控制&#Vff09;
比例控制的特点是控制器的输出取偏向成比例&#Vff0c;输出质的大小取偏向之间有对应干系。当负荷厘革时&#Vff0c;抗烦扰才华强&#Vff0c;过渡光阳短&#Vff0c;但历程始末存正在余差。因而它折用于控制通道滞后较小、负荷厘革不大、允许被控质正在一定领域内厘革的系统。运用时还应留心颠终一段光阳后需将累积误差打消。
3&#Vff0e;比例积分控制&#Vff08;PI控制&#Vff09;
由于比例积分控制的特点是控制器的输出取偏向的积分红比例&#Vff0c;积分的做用使得过度历程完毕时无余差&#Vff0c;但系统的不乱性降低。尽管加大比例度可以使不乱性进步&#Vff0c;但又使过渡光阳加长。原文转载自?id=14096因而&#Vff0c;PI控制折用于滞后较小、负荷厘革不大、被控质不允许不足差的控制系统&#Vff0c;它是工程上运用最多、使用最广的一种控制办法。
4&#Vff0e;比例积分加微分控制&#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); //**********延时K&#Vff0a;1ms&#Vff0c;12.000mhz&#Vff0a;&#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止显示,5&#Vff0a;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; //稍作延时后假如V&#Vff1d;0则初始化乐成V&#Vff1d;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;液晶最示子函数2&#Vff0a;&#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;液晶显示子函数3&#Vff0a;&#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;液晶显示子函数4&#Vff0a;&#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 funtion&#Vff0a;&#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); } } }

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://aidryer.cn