1000字范文,内容丰富有趣,学习的好帮手!
1000字范文 > 基于51单片机的温度控制proteus仿真原理图PCB

基于51单片机的温度控制proteus仿真原理图PCB

时间:2021-05-28 22:45:09

相关推荐

基于51单片机的温度控制proteus仿真原理图PCB

功能介绍:

0.本系统采用STC89C52作为单片机

1.LCD1602液晶实时显示当前温度及温度范围设定

2.超过温度设定范围将启动加热棒加热或风扇冷却

3.超过设定温度将声光报警

4.按键可设置温度范围

5.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:

PCB:

主程序:

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include <stdio.h>#include "18b20.h"#include "lcd1602.h"#include "delay.h"#define SETDOWN 0x01#define SETUP 0x02sbit KEY_SET = P3^3; //引脚定义sbit KEY_SUB = P3^6;sbit KEY_ADD = P3^4;sbit RELAY_HOT = P2^1;sbit RELAY_FAN = P2^0;sbit BUZZER = P2^3;unsigned int setLow = 20; //下限unsigned int setHigh = 50; //上限unsigned char dispFlag = 0; //更新显示标志unsigned char setFlag = 0; //设置参数标志unsigned int buzzerLater = 0; //蜂鸣器计时报int tempBuf = 0; //读取温度值float temperature; //实际温度值unsigned char readTempFlag = 0; //定义读时间标志char dis0[16]; //定义显示区域临时存储数组char dis1[16]; //定义显示区域临时存储数组void CheckKey(void);void Timer0_Init(void); //定时器初始化void main(void){bit ack = 0;RELAY_HOT = 1; //打开RELAY_FAN = 1; //打开BUZZER = 0; //打开Timer0_Init();LCD_Init(); //初始化液晶DelayMs(200); //延时有助于稳定LCD_Clear(); //清屏RELAY_HOT = 0; //关闭RELAY_FAN = 0; //关闭BUZZER = 1; //关闭while (1) //主循环{if (readTempFlag == 1) //读取温度标志{readTempFlag = 0;DS18B20_Start();ack = DS18B20_GetTemp(&tempBuf);if (ack == 1){temperature = (float)tempBuf * 0.0625; //温度值转换}else {temperature = 0;}}if (dispFlag == 1){dispFlag = 0;if ((temperature >= 0) && (temperature < 150)){sprintf(dis0, "Temp:%4.1f", temperature); //打印温度值LCD_DispStr(0, 0, dis0);//显示第二行LCD_DispOneChar(9, 0, 0xdf);//写入温度右上角点LCD_DispOneChar(10, 0, 'C');//写入温度右上角点if (temperature < setLow) //温度过低{RELAY_HOT = 0; //开启升温 关闭降温RELAY_FAN = 1;}else if ((temperature) > setHigh) //温度超高{RELAY_HOT = 1; //关闭升温 开启降温RELAY_FAN = 0;buzzerLater = 100; //温度超高,立即报警}else //正常温度{RELAY_HOT = 1; //关闭升温 关闭降温RELAY_FAN = 1;buzzerLater = 0;}if (buzzerLater >= 60) //正常清零 否则过高过低都会累加 超过1min{BUZZER = 0;} //打开蜂鸣器else{BUZZER = 1;} //关闭蜂鸣器}sprintf(dis1, "Set : %03d-- %03d", setLow, setHigh);LCD_DispStr(0, 1, dis1); //初始化显示if (setFlag == 0) //按键设置标志{LCD_DispOneChar(5, 1, ' ');LCD_DispOneChar(11, 1, ' '); //更新显示标志}else if (setFlag == 1) //按键设置标志{LCD_DispOneChar(5, 1, '>');LCD_DispOneChar(11, 1, ' '); //更新显示标志}else if (setFlag == 2) //按键设置标志{LCD_DispOneChar(5, 1, ' ');LCD_DispOneChar(11, 1, '>'); //更新显示标志}}CheckKey(); //检测按键}}void CheckKey(void){// static unsigned char rekey = 0;// if ((KEY_SET == 0) || (KEY_SUB == 0) || (KEY_ADD == 0)) //检测到按键按下// {//DelayMs(10); //小抖动//if (rekey == 0)//{// if (KEY_SET == 0) //检测是否按下// {// rekey = 1;// setFlag++; //设置标志// if (setFlag >= 3)// setFlag = 0;// }// else if (KEY_SUB == 0) //减值键// {// rekey = 1;// if (setFlag == 1) //处于设置1// {// if (setLow > 0)// {// setLow = setLow - 1;// }// }// else if (setFlag == 2) //处于设置2// {// if (setHigh > setLow + 1)// {// setHigh = setHigh - 1;// }// }// }// else if (KEY_ADD == 0) //加值键// {// rekey = 1;// if (setFlag == 1) //处于设置1// {// if (setLow < setHigh - 1)// {// setLow = setLow + 1;// }// }// else if (setFlag == 2) //处于设置2// {// if (setHigh < 99)// {// setHigh = setHigh + 1;// }// }// }//}// }// else// {//rekey = 0; //防止重复检测到按键// }if (KEY_SET == 0) //检测是否按下{DelayMs(20);if (KEY_SET == 0) //检测是否按下{setFlag++; //设置标志if (setFlag >= 3)setFlag = 0;}while (KEY_SET == 0); //等待释放}if (KEY_SUB == 0) //检测是否按下,可实现连减{DelayMs(180);if (KEY_SUB == 0) //检测是否按下{if (setFlag == 1) //处于设置1{if (setLow > 0){setLow = setLow - 1;}}else if (setFlag == 2) //处于设置2{if (setHigh > setLow + 1){setHigh = setHigh - 1;}}}}if (KEY_ADD == 0) //检测是否按下,可实现连加{DelayMs(180);if (KEY_ADD == 0) //检测是否按下{if (setFlag == 1) //处于设置1{if (setLow < setHigh - 1){setLow = setLow + 1;}}else if (setFlag == 2) //处于设置2{if (setHigh < 99){setHigh = setHigh + 1;}}}}}/*------------------------------------------------定时器初始化子程序------------------------------------------------*/void Timer0_Init(void){TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响TH0 = (65536 - 18432) / 256; //重新赋值 20msTL0 = (65536 - 18432) % 256;EA = 1; //总中断打开ET0 = 1; //定时器中断打开TR0 = 1; //定时器开关打开}/*------------------------------------------------定时器中断子程序------------------------------------------------*/void Timer0_Interrupt(void) interrupt 1{static unsigned char time20ms = 0;TH0 = (65536 - 18432) / 256; //重新赋值 20msTL0 = (65536 - 18432) % 256;time20ms++;if (time20ms > 50){time20ms = 0;readTempFlag = 1; //读标志位置1if (buzzerLater < 200)buzzerLater++;}if (time20ms % 10 == 0){dispFlag = 1;}}

仿真演示视频:

/video/BV13B4y1R7gy/

实物演示视频:

/video/BV11e4y1E7u5/

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。