日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪(fǎng)問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

基于51单片机的温控系统

發(fā)布時(shí)間:2023/12/20 windows 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于51单片机的温控系统 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

基于51單片機(jī)的溫控系統(tǒng)

本文是基于STC89C52單片機(jī)的溫度控制系統(tǒng),主要由主控模塊、顯示模塊及外圍電路幾個(gè)部分組成。
通過(guò)DS18B20檢測(cè)外部溫度,通過(guò)LCD1602顯示,按鍵可調(diào)節(jié)上下限。當(dāng)溫度超過(guò)上限或低于下限,蜂鳴器均會(huì)報(bào)警。當(dāng)溫度超過(guò)上限時(shí),電機(jī)會(huì)開(kāi)始工作,模擬風(fēng)扇,起到降溫作用。LED燈電路模擬家用電燈,由兩個(gè)開(kāi)關(guān)對(duì)其進(jìn)行控制。
刪除線(xiàn)格式 該溫控系統(tǒng)可以模擬簡(jiǎn)易智能家居系統(tǒng)。

系統(tǒng)硬件設(shè)計(jì)

整體電路原理圖設(shè)計(jì)

該系統(tǒng)由51單片機(jī)作為主控模塊,通過(guò)DS18B20檢測(cè)溫度,由LCD1602顯示,并加外圍電路組成。
測(cè)溫顯示模塊

蜂鳴器報(bào)警及電機(jī)模塊

系統(tǒng)軟件設(shè)計(jì)

單片機(jī)IO口定義

sbit beep = P1^7; //定義蜂鳴器IO口sbit LED1 = P1^0; //定義燈IO口 sbit LED2 = P1^1; sbit k1 = P1^2; //定義燈開(kāi)關(guān)IO口 sbit k2 = P1^3;sbit MOTOR = P1^4; //定義電機(jī) sbit BUTTON_RUN = P1^5; //定義電機(jī)啟動(dòng)按鈕 sbit BUTTON_STOP = P1^6; //定義電機(jī)關(guān)閉按鈕sbit RS = P2^7; sbit RW = P2^6; sbit EN = P2^5; sbit K1 = P2^0; sbit K2 = P2^1; //上限加 sbit K3 = P2^2; //下限減sbit DQ = P2^3; //DS18B20數(shù)據(jù)端

LCD1602初始化及讀/寫(xiě)數(shù)據(jù)

void lcd_init() {uint8 i;RW = 0;lcd_order(0x38); //設(shè)置顯示光標(biāo)功能delay(100);lcd_order(0x0e); //顯示開(kāi)及光標(biāo)設(shè)置delay(100);lcd_order(0x06); //顯示光標(biāo)移動(dòng)設(shè)置delay(100);lcd_order(0x01); //顯示清屏delay(100);lcd_order(0x80);for(i=0;i<16;i++)lcd_data(hodometer[i]); }void write_1602(uint8 add,uint8 daa) {lcd_order(0x80+add);lcd_data(0x30+daa/10);lcd_data(0x30+daa%10); }void lcd_order(uint8 date) //LCD1602寫(xiě)指令 {RS = 0; //選擇寫(xiě)指令RW = 0; //使能初始化P0 = date; //發(fā)送指令EN = 1; //開(kāi)使能delay(100); //延時(shí)EN = 0; //關(guān)使能 }void lcd_data(uint8 date) //LCD1602寫(xiě)數(shù)據(jù) {RS = 1; //選擇寫(xiě)數(shù)據(jù)RW = 0; //使能初始化P0 = date; //發(fā)送指令EN = 1; //開(kāi)使能delay(100); //延時(shí)EN = 0; //關(guān)使能 }

DS18B20初始化及讀/寫(xiě)數(shù)據(jù)

uint8 DS18B20_init() {uint8 ans;DQ = 1;delay(1);DQ = 0;delay(100);DQ = 1;delay(6);ans = DQ;delay(100);if(!ans)return 1;elsereturn 0; }void DS18B20_write(uint8 date) {uint8 i;DQ = 1;delay(1);for(i=0;i<8;i++) //根據(jù)時(shí)序?qū)?shù)據(jù)從低到高一位一位發(fā)送出來(lái){DQ = 0;if(date&0x01) //從低到高取出數(shù)據(jù)的每位DQ = 1;elseDQ = 0;delay(10);DQ = 1;date >>= 1;delay(1);} }uint8 DS18B20_read() {uint8 i,date = 0;DQ = 1; //釋放總線(xiàn)delay(1);for(i=0;i<8;i++) //根據(jù)時(shí)序?qū)?shù)據(jù)從低到高一位一位接收{DQ = 0;date >>= 1;DQ = 1;if(DQ)date |= 0x80; //將data的一位置1delay(8);DQ = 1;delay(1);}return date; //返回讀出的數(shù) }void DS18B20_check() {uint8 date1,date2;float ta;if(DS18B20_init()){DS18B20_write(0xcc); //跳過(guò)序列號(hào)DS18B20_write(0x44); //啟動(dòng)溫度轉(zhuǎn)換DS18B20_init(); //復(fù)位DS18B20_write(0xcc); //跳過(guò)序列號(hào)DS18B20_write(0xbe); //啟動(dòng)讀取溫度date1 = DS18B20_read(); //讀取兩個(gè)溫度字節(jié)date2 = DS18B20_read();tmp = date2;tmp <<= 8;tmp = tmp|date1;ta = tmp*0.0625;tmp = ta*1000;} }

溫度上下限調(diào)節(jié)函數(shù)

void KEY() {uint8 jj;uint8 i = 0;beep = 1;if(K1==0){while(!K1);while(1){lcd_order(0x0f); //開(kāi)啟光標(biāo)顯示lcd_order(0x80+5); //光標(biāo)顯示位置if(K2==0) //判斷加按鍵按下{while(K2==0); //等待按鍵釋放t_h++; //溫度上限加1write_1602(4,t_h); //顯示溫度上限}if(K3==0) //判斷減按鍵按下{while(K3==0); //等待按鍵釋放if(t_h>t_l) //判斷溫度上限大于溫度下限t_h--;write_1602(4,t_h); //顯示溫度上限}if(K1==0){while(K1==0);while(1){lcd_order(0x0f);lcd_order(0x80+13);if(K2==0){while(K2==0);if(t_l<t_h&&t_l>=0){lcd_order(0x80+11);lcd_data(' ');t_l++;write_1602(12,t_l);}else{t_l++;jj =~ t_l;write_1602(12,jj);}}if(K3==0){while(K3==0);if(t_l>(-50)){t_l--;if(t_l<0)jj =~ t_l;}if(t_l>=0){lcd_order(0x80+11);lcd_data(' ');write_1602(12,t_l);}if(t_l<0){write_1602(12,jj);lcd_order(0x80+11);lcd_data('-');}}if(K1==0){while(K1==0);goto loop;}}}}}loop:beep = 1; }

完整程序展示

#include<reg52.h> #include"stdio.h"#define uint unsigned int #define uchar unsigned chartypedef unsigned char uint8; typedef unsigned int uint16;sbit beep = P1^7; //定義蜂鳴器IO口sbit LED1 = P1^0; //定義燈IO口 sbit LED2 = P1^1; sbit k1 = P1^2; //定義燈開(kāi)關(guān)IO口 sbit k2 = P1^3;sbit MOTOR = P1^4; //定義電機(jī) sbit BUTTON_RUN = P1^5; //定義電機(jī)啟動(dòng)按鈕 sbit BUTTON_STOP = P1^6; //定義電機(jī)關(guān)閉按鈕sbit RS = P2^7; sbit RW = P2^6; sbit EN = P2^5; sbit K1 = P2^0; sbit K2 = P2^1; //加 sbit K3 = P2^2; //減 sbit DQ = P2^3; //DS18B20數(shù)據(jù)端//void delay(uint xms); void motor_run(); void motor_stop();void LED1_SWITCH(); void LED2_SWITCH();void init();void delay(uint16 time); void lcd_init(); //LCD1602初始化 void lcd_order(uint8 date); //向LCD1602寫(xiě)一個(gè)指令 void lcd_data(uint8 date); //向LCD1602寫(xiě)一個(gè)指令 void write_1602(uint8 add,uint8 daa); //寫(xiě)數(shù)據(jù)void display(); //顯示溫度uint8 DS18B20_init(); //DS18B20初始化 void DS18B20_write(uint8 date); //向DS18B20中寫(xiě)入一個(gè)數(shù)據(jù) uint8 DS18B20_read(); //從DS18B20中讀一個(gè)數(shù)據(jù)并返回 void DS18B20_check(); //啟動(dòng)DS18B20進(jìn)行溫度采集,并返回當(dāng)前溫度void KEY(); //修改報(bào)警范圍long tmp = 0; //存儲(chǔ)溫度值 long t_h = 37,t_l = 10; //溫度上限 溫度下限bit tmp_hb = 0; tmp_lb = 0; //溫度上下限調(diào)節(jié)指示變量void judge(); //判斷報(bào)警uint8 hodometer[] = " H:00 L:00 "; uint8 temp[]= " wendu:00.00 "; uint16 ji = 0; uint8 ku = 0; //標(biāo)志位void main() {init();lcd_init(); //LCD1602初始化DS18B20_init(); //DS18B20初始化DS18B20_write(0xcc); //跳過(guò)序列號(hào)DS18B20_write(0x44); //啟動(dòng)溫度轉(zhuǎn)換write_1602(4,t_h);write_1602(12,t_l);while(1){ LED1_SWITCH();LED2_SWITCH();motor_run();motor_stop();DS18B20_check(); //從DS18B20中讀取溫度display();KEY();judge();} }void write_1602(uint8 add,uint8 daa) {lcd_order(0x80+add);lcd_data(0x30+daa/10);lcd_data(0x30+daa%10); }void judge() //判斷是否在報(bào)警范圍 {if(tmp<(t_l*1000)||tmp>(t_h*1000)&&t_l>=0){beep = 0;delay(10);MOTOR = 1;}else if(t_l<0&&tmp>(t_h*1000)){beep = 1;MOTOR = 0;}else{beep = 1;MOTOR = 0;} }void KEY() {uint8 jj;uint8 i = 0;beep = 1;if(K1==0){while(!K1);while(1){lcd_order(0x0f); //開(kāi)啟光標(biāo)顯示lcd_order(0x80+5); //光標(biāo)顯示位置if(K2==0) //判斷加按鍵按下{while(K2==0); //等待按鍵釋放t_h++; //溫度上限加1write_1602(4,t_h); //顯示溫度上限}if(K3==0) //判斷減按鍵按下{while(K3==0); //等待按鍵釋放if(t_h>t_l) //判斷溫度上限大于溫度下限t_h--;write_1602(4,t_h); //顯示溫度上限}if(K1==0){while(K1==0);while(1){lcd_order(0x0f);lcd_order(0x80+13);if(K2==0){while(K2==0);if(t_l<t_h&&t_l>=0){lcd_order(0x80+11);lcd_data(' ');t_l++;write_1602(12,t_l);}else{t_l++;jj =~ t_l;write_1602(12,jj);}}if(K3==0){while(K3==0);if(t_l>(-50)){t_l--;if(t_l<0)jj =~ t_l;}if(t_l>=0){lcd_order(0x80+11);lcd_data(' ');write_1602(12,t_l);}if(t_l<0){write_1602(12,jj);lcd_order(0x80+11);lcd_data('-');}}if(K1==0){while(K1==0);goto loop;}}}}}loop:beep = 1; }//void delay(uint xms) //延時(shí) //{ // uint i,j; // for(i=xms;i>0;i--) // for(j=110;j>0;j--) ; //}void delay(uint16 time) {while(time--); }void lcd_init() {uint8 i;RW = 0;lcd_order(0x38); //設(shè)置顯示光標(biāo)功能delay(100);lcd_order(0x0e); //顯示開(kāi)及光標(biāo)設(shè)置delay(100);lcd_order(0x06); //顯示光標(biāo)移動(dòng)設(shè)置delay(100);lcd_order(0x01); //顯示清屏delay(100);lcd_order(0x80);for(i=0;i<16;i++)lcd_data(hodometer[i]); }void lcd_order(uint8 date) //LCD1602寫(xiě)指令 {RS = 0; //選擇寫(xiě)指令RW = 0; //使能初始化P0 = date; //發(fā)送指令EN = 1; //開(kāi)使能delay(100); //延時(shí)EN = 0; //關(guān)使能 }void lcd_data(uint8 date) //LCD1602寫(xiě)數(shù)據(jù) {RS = 1; //選擇寫(xiě)數(shù)據(jù)RW = 0; //使能初始化P0 = date; //發(fā)送指令EN = 1; //開(kāi)使能delay(100); //延時(shí)EN = 0; //關(guān)使能 }uint8 DS18B20_init() {uint8 ans;DQ = 1;delay(1);DQ = 0;delay(100);DQ = 1;delay(6);ans = DQ;delay(100);if(!ans)return 1;elsereturn 0; }void DS18B20_write(uint8 date) {uint8 i;DQ = 1;delay(1);for(i=0;i<8;i++) //根據(jù)時(shí)序?qū)?shù)據(jù)從低到高一位一位發(fā)送出來(lái){DQ = 0;if(date&0x01) //從低到高取出數(shù)據(jù)的每位DQ = 1;elseDQ = 0;delay(10);DQ = 1;date >>= 1;delay(1);} }uint8 DS18B20_read() {uint8 i,date = 0;DQ = 1; //釋放總線(xiàn)delay(1);for(i=0;i<8;i++) //根據(jù)時(shí)序?qū)?shù)據(jù)從低到高一位一位接收{DQ = 0;date >>= 1;DQ = 1;if(DQ)date |= 0x80; //將data的一位置1delay(8);DQ = 1;delay(1);}return date; //返回讀出的數(shù) }void DS18B20_check() {uint8 date1,date2;float ta;if(DS18B20_init()){DS18B20_write(0xcc); //跳過(guò)序列號(hào)DS18B20_write(0x44); //啟動(dòng)溫度轉(zhuǎn)換DS18B20_init(); //復(fù)位DS18B20_write(0xcc); //跳過(guò)序列號(hào)DS18B20_write(0xbe); //啟動(dòng)讀取溫度date1 = DS18B20_read(); //讀取兩個(gè)溫度字節(jié)date2 = DS18B20_read();tmp = date2;tmp <<= 8;tmp = tmp|date1;ta = tmp*0.0625;tmp = ta*1000;} }void display() {uint8 i;temp[8] = 0x30+tmp/10000;temp[9] = 0x30+tmp/1000%10;temp[11] = 0x30+tmp/100%10;temp[12] = 0x30+tmp/10%10;temp[13] = 0x30+tmp%10;lcd_order(0x80+0x40);for(i=0;i<16;i++)lcd_data(temp[i]) ; }void init() //初始化函數(shù) {BUTTON_RUN = 1; BUTTON_STOP = 1;MOTOR = 0;beep = 0;delay(50); }void motor_run() //打開(kāi)電機(jī) {if(BUTTON_RUN==0){delay(10);if(BUTTON_RUN==0){while(1){MOTOR = 1;if(BUTTON_STOP==0){delay(5);if(BUTTON_STOP==0){break;}}}}} }void motor_stop() //關(guān)閉電機(jī) {if(BUTTON_STOP==0){delay(10);if(BUTTON_STOP==0){MOTOR = 0;}} }void LED1_SWITCH() //LED1開(kāi)關(guān) {if(k1==0)LED1 = 0;else if(k1==1)LED1 = 1; }void LED2_SWITCH() //LED2開(kāi)關(guān) {if(k2==0)LED2 = 0;else if(k2==1)LED2 = 1; }

使用Proteus仿真

整體電路PCB設(shè)計(jì)

51單片機(jī)溫控系統(tǒng)程序(電機(jī)模擬風(fēng)扇 可調(diào)上下限)Proteus仿真 DS18B20+LCD1602顯示
原理圖+程序+仿真圖
HappyFrankie的公眾號(hào)

總結(jié)

以上是生活随笔為你收集整理的基于51单片机的温控系统的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。