主页 > 游戏开发  > 

基于51单片机的智能温控器设计与实现

基于51单片机的智能温控器设计与实现

一、前言

基于51单片机的智能温控器,使用DS18B20温度传感器来测量温度,并通过驱动风扇降温,同时使用LCD1602显示屏显示当前温度和设定温度。

二、51单片机代码

#include <reg52.h> //显示 #include <lcd.h> #define uchar unsigned char #define uint unsigned int sbit DQ = P2^7; // 温度传感器引脚 sbit fan = P3^3; // 风扇 sbit LED = P3^5; // LED指示灯 sbit Key4 = P2^1; // 开机/关机键 uchar Mode = 0; // 0表示确定状态,1表示设置温度上限状态,2表示设置温度下限状态 uchar MODE_OK = 0; uchar MODE_SET_TEMP_UP = 1; uchar MODE_SET_TEMP_DOWN = 1; uint dat = 0; // 温度值 // 温度 char wendu; uchar down =30; //温度下限 uchar wendu_up =50; //温度上限 uchar status_machine = 1; uchar status_shutdown = 1; // 关机 uchar status_power_on = 2; // 开机 // 初始化温度传感器 void init_ds18b20() { uint i; DQ = 0; // 拉低电平 i = 80; // 延时约732us while(i > 0) i--; DQ = 1; // 拉高总线 i = 4; // 延时约40us while(i > 0) i--; } // 读取一位温度传感器的数据 bit read_bit() { uint i; bit dat; DQ = 0; i++; // 延时 DQ = 1; i++; // 延时 i++; dat = DQ; i = 8; while(i > 0) i--; return dat; } // 读取一个字节温度传感器的数据 uchar read_byte() { uchar i, j, dat; dat = 0; for (i = 1; i <= 8; i++) { j = read_bit(); dat = (j << 7) | (dat >> 1); } return dat; } // 向温度传感器写入一个字节 void write_byte(uchar dat) { uint i; uchar j; bit testbit; for (j = 1; j <= 8; j++) { testbit = dat & 0x01; dat = dat >> 1; if (testbit) { DQ = 0; i++; // 延时 DQ = 1; i = 8; // 延时 while(i > 0) i--; } else { DQ = 0; i = 8; while(i > 0) i--; DQ = 1; i++; // 延时 i++; } } } // 读取温度 unsigned int read_temperature(void) { uchar a = 0; uchar b = 0; uint u_temp = 0; float f_temp = 0; init_ds18b20(); delay(1); write_byte(0xCC); //跳过读序号列号的操作 write_byte(0x44); //启动温度转换 init_ds18b20(); delay(1); write_byte(0xCC); //跳过读序号列号的操作 write_byte(0xBE); //读取温度寄存器 a = read_byte(); //读低8位 b = read_byte(); //读高8位 u_temp = b; u_temp <<= 8; u_temp = u_temp | a; f_temp = u_temp * 0.0625; // 获取实际温度 u_temp = f_temp * 10; return u_temp; } // 按键控制 void Key() { // 开机/关机键 if(Key4 == 0) { while(Key4 == 0); // 如果是关机状态 if (status_machine == status_shutdown) { // 开机 status_machine = status_power_on; } // 如果是开机状态 else if (status_machine == status_power_on) { // 关机 status_machine = status_shutdown; } } } // 主函数 void main() { init_lcd(); // 初始化lcd1602 init_ds18b20(); // 初始化ds18b20 // 第一次读取温度 read_temperature(); delay(2000); while(1) { // 获取温度 dat = read_temperature(); if (Mode == MODE_OK) { // 水温显示在液晶显示屏上 display(dat, wendu_up, down); wendu = dat / 10; // 取温度值得整数位 } // 按键控制 Key(); // 判断当前机器状态 // 如果是要关机 if (status_machine == status_shutdown) { LED = 1; fan = 1; } // 如果是开机状态 else if (status_machine == status_power_on) { // 如果当前温度小于温度上限 if (wendu < wendu_up) { fan = 1; LED = 1; } else { fan = 0; LED = 0; } } } }

三、Proteus仿真

四、完整资料下载

基于51单片机的智能温控器: url83.ctfile /d/45573183-65297122-ca5848?p=7526 (访问密码: 7526)  

标签:

基于51单片机的智能温控器设计与实现由讯客互联游戏开发栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“基于51单片机的智能温控器设计与实现