標(biāo)題: 基于51單片機(jī)的溫度報(bào)警系統(tǒng)設(shè)計(jì) [打印本頁]
作者: Lxy18 時(shí)間: 2022-3-18 10:19
標(biāo)題: 基于51單片機(jī)的溫度報(bào)警系統(tǒng)設(shè)計(jì)
設(shè)計(jì)中有很多不完善的地方,歡迎各位大佬指正。 演示視頻:https://www.bilibili.com/video/BV1CS4y1u7s6?share_source=copy_web
利用單片機(jī)、DS18B20溫度傳感器、數(shù)碼管、按鍵、蜂鳴器設(shè)計(jì)。編程時(shí)考慮數(shù)碼需要一直掃描,按鍵也需要一直掃描,DS18B20實(shí)時(shí)讀取溫度也需要實(shí)時(shí)掃描,這三個(gè)都放到主函數(shù)的while循環(huán)中,由于溫度讀取轉(zhuǎn)換時(shí)間比較長,數(shù)碼管就會一直閃爍。另外數(shù)碼管和按鍵都再主函數(shù)中掃描,按鍵按下時(shí)數(shù)碼管會熄滅。
最后,在一個(gè)定時(shí)器中斷中掃描數(shù)碼管,另一個(gè)定時(shí)器中斷讀取溫,主函數(shù)主要掃描按鍵和判斷溫度值是否超過上下限。
經(jīng)過不斷調(diào)試終于實(shí)現(xiàn)了所有的功能。
功能說明:
1.數(shù)碼管默認(rèn)顯示當(dāng)前溫度。默認(rèn)上限30℃,下限22℃
2.當(dāng)溫度高于上限,蜂鳴器報(bào)警,紅色LED點(diǎn)亮;低于下限,蜂
鳴器報(bào)警,藍(lán)色LED點(diǎn)亮。
3.第一次點(diǎn)擊'設(shè)置'按鍵,數(shù)碼管第一位顯示H,此時(shí)點(diǎn)擊'加'
'減'按鍵,調(diào)節(jié)溫度上限值。
第二次點(diǎn)擊'設(shè)置'按鍵,數(shù)碼管第一位顯示L,此時(shí)點(diǎn)擊'加'
'減'按鍵,調(diào)節(jié)溫度下限值。
注意:在調(diào)節(jié)溫度上下限過程中,溫度報(bào)警關(guān)閉。
第三次點(diǎn)擊'設(shè)置'按鍵,退出設(shè)置狀態(tài),打開溫度報(bào)警。
4.溫度傳感器測溫范圍:-55—128℃。
溫度上下限調(diào)節(jié)范圍:-55—128℃。
洞洞板.png (460.05 KB, 下載次數(shù): 60)
下載附件
2022-3-18 20:03 上傳
仿真截圖.png (47.23 KB, 下載次數(shù): 76)
下載附件
2022-3-18 09:59 上傳
原理圖.png (141.31 KB, 下載次數(shù): 80)
下載附件
2022-3-18 09:59 上傳
程序截圖.png (94.5 KB, 下載次數(shù): 67)
下載附件
2022-3-18 09:59 上傳
元件清單.png (38.02 KB, 下載次數(shù): 59)
下載附件
2022-3-18 09:59 上傳
主函數(shù) 單片機(jī)代碼如下:
- /******************************************************************************
- * 單片機(jī)溫度報(bào)警系統(tǒng)
- *******************************************************************************/
- #include <reg52.h>
- #include "delay.h"
- #include "key.h"
- #include "DS18B20.h"
- #define uchar unsigned char //對數(shù)據(jù)類型定義
- #define uint unsigned int
- /****************************端口定義******************************************/
- sbit D1=P2^4;
- sbit D2=P2^6;
- sbit D3=P2^5;
- sbit D4=P2^7;
-
- sbit Beep=P1^6; //蜂鳴器
- sbit LED_G=P1^2; //綠色LED端口
- sbit LED_B=P1^0; //藍(lán)色LED端口
- sbit LED_R=P1^1; //紅色LED端口
- /****************************定義變量******************************************/
- uchar KeyValve=0; //按鍵值
- float Temp=20.0; //溫度變量
- float TH=30.0; //溫度上限
- float TL=22.0; //溫度下限
- uint Time_Count=1; //定時(shí)器0中斷次數(shù)
- uchar Temp_Str[4]; //數(shù)組變量存放溫度數(shù)據(jù)
- uchar Set_Mode=0; //設(shè)置模式
- uchar SMG_Data[4]={0,0,0,0}; //存放數(shù)碼管的各個(gè)位的值
- uchar code smgduan[]={ //共陽極數(shù)碼管段碼
- 0xc0, //0,0
- 0xf9, //1,1
- 0xa4, //2,2
- 0xb0, //3,3
- 0x99, //4,4
- 0x92, //5,5
- 0x82, //6,6
- 0xf8, //7,7
- 0x80, //8,8
- 0x90, //9,9
- 0x88, //10,A
- 0x83, //11,b
- 0xc6, //12,C
- 0xa1, //13,d
- 0x86, //14,E
- 0x8e, //15,F
- 0xff, //16,
- 0xbf, //17,
- 0x89, //18,H
- 0xc7 //19,L
- };
- /*****************************************************************************/
- /***************************函數(shù)聲明******************************************/
- void Timer_Init(); //定時(shí)器初始化
- void Temp_T(float t); //溫度轉(zhuǎn)換函數(shù)
- /******************************************************************************
- * 函 數(shù) 名 : 主函數(shù)
- * 函數(shù)功能 :
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- DS18B20_Init(); //溫度傳感器初始化
- Timer_Init(); //定時(shí)器初始化
- Delay_Ms(100);
- while(1)
- {
- /***********按鍵掃描程序**************/
- KeyValve=Key_Check(); //掃描按鍵
- if(KeyValve!=0) //判斷按鍵是否按下
- {
- switch(KeyValve) //判斷按鍵值,并處理
- {
- case 1: //溫度上限/下限設(shè)置
- {
- if(Set_Mode<2)
- Set_Mode++;
- else
- Set_Mode=0;
- Delay_Ms(200);
- }
- break;
- case 2: //按鍵加
- {
- if((Set_Mode==1)&&(TH<128.0)) //限制溫度上限小于128℃
- TH=TH+1.0; //溫度上限加一
- if((Set_Mode==2)&&(TL<TH)) //限制溫度下限小于溫度上限
- TL=TL+1.0; //溫度下限加一
- Delay_Ms(200);
- }
- break;
- case 3: //按鍵減
- {
- if((Set_Mode==1)&&(TH>TL)) //限制溫度上限大于溫度下限
- TH=TH-1.0; //溫度上限減一
- if((Set_Mode==2)&&(TL>-55.0)) //限制溫度下限大于-55℃
- TL=TL-1.0; //溫度下限減一
- Delay_Ms(200);
- }
- break;
- }
- }
- /***********溫度上下限判斷報(bào)警程序**************/
- if(Set_Mode==0)
- {
- if(Temp>TH)
- {
- LED_R=0; //紅燈點(diǎn)亮
- LED_B=1; //藍(lán)燈熄滅
- LED_G=1;
- Beep=0; //蜂鳴器報(bào)警
- }
- else if(Temp<TL)
- {
- LED_R=1; //紅燈熄滅
- LED_B=0; //藍(lán)燈點(diǎn)亮
- LED_G=1;
- Beep=0; //蜂鳴器報(bào)警
- }
- else
- {
- LED_R=1; //紅燈熄滅
- LED_B=1; //藍(lán)燈熄滅
- LED_G=0;
- Beep=1;
- }
- }
- else
- Beep=1;
- }
- }
- /*******************************************************************************
- * 函 數(shù) 名 : Temp_T(float t)
- * 函數(shù)功能 : 溫度轉(zhuǎn)換函數(shù):將溫度值放到數(shù)組中,便于顯示
- * 輸 入 : t
- * 輸 出 : 無
- *******************************************************************************/
- void Temp_T(float t)
- {
- if(Set_Mode==0)
- {
- t=t*10.0; //放大十倍
- if(t>=0) //正溫度
- {
- if(((int)t/1000)==0)
- SMG_Data[0]=16;
- else
- SMG_Data[0]=(int)t/1000; //提取溫度百、十、個(gè)位
- SMG_Data[1]=((int)t%1000)/100;
- SMG_Data[2]=((int)t%100)/10;
- SMG_Data[3]=(int)t%10;
- }
- else //負(fù)溫度
- {
- t=-t; //將負(fù)數(shù)轉(zhuǎn)換為正數(shù)
- SMG_Data[0]=17; //顯示“—”號
- SMG_Data[1]=(int)t/100; //提取溫度個(gè)、十位
- SMG_Data[2]=((int)t%100)/10;
- SMG_Data[3]=(int)t%10;
- }
- }
- else
- {
- if(Set_Mode==1)
- SMG_Data[0]=18; //數(shù)碼管第一位顯示H
- if(Set_Mode==2)
- SMG_Data[0]=19; //數(shù)碼管第一位顯示L
- if(t>=0) //正溫度
- {
- SMG_Data[1]=(int)t/100; //提取溫度百、十、個(gè)位
- SMG_Data[2]=((int)t%100)/10;
- SMG_Data[3]=(int)t%10;
- }
- else //負(fù)溫度
- {
- t=-t; //將負(fù)數(shù)轉(zhuǎn)換為正數(shù)
- SMG_Data[1]=17; //顯示“—”號
- SMG_Data[2]=((int)t%100)/10; //提取溫度個(gè)、十位
- SMG_Data[3]=(int)t%10;
- t=-t; //將溫度恢復(fù)
- }
- }
- }
- /*****************************************************************************
- * 函 數(shù) 名 : Timer_Init
- * 函數(shù)功能 : 定時(shí)器初始化
- * 輸 入 : 無
- * 輸 出 : 無
- *****************************************************************************/
- void Timer_Init()
- {
- TMOD=0x11; //打開定時(shí)器0,工作方式1。
- TH0=0xff; //給定時(shí)器0賦初值,定時(shí)200us (65536-200)/256 (65536-200)%256
- TL0=0x38;
- TH1=0xc5; //定時(shí)60ms
- TL1=0x68;
- ET0=1; //打開定時(shí)器0中斷允許
- ET1=1; //打開定時(shí)器1中斷允許
- TR0=1; //打開定時(shí)器0
- TR1=1; //打開定時(shí)器1
- PT1=1; //高優(yōu)先級
- EA=1; //打開總中斷
- }
- /*******************************************************************************
- * 函 數(shù) 名 : void Timer0() interrupt 1
- * 函數(shù)功能 : 定時(shí)器0中斷函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer0() interrupt 1
- {
- TH0=0xff; //給定時(shí)器賦初值,定時(shí)
- TL0=0x38;
- if(Time_Count%2==0)
- {
- switch(Time_Count%8) //位選,選擇點(diǎn)亮的數(shù)碼管,
- {
- case(0):
- D1=0;
- D2=1;
- D3=1;
- D4=1;
- break;//顯示第0位
- case(2):
- D1=1;
- D2=0;
- D3=1;
- D4=1;
- break;//顯示第1位
- case(4):
- D1=1;
- D2=1;
- D3=0;
- D4=1;
- break;//顯示第2位
- case(6):
- D1=1;
- D2=1;
- D3=1;
- D4=0;
- break;//顯示第3位
- }
- if((Set_Mode==0)&&(Time_Count%8==4))
- P0=smgduan[SMG_Data[(Time_Count%8)/2]]-0x80;//顯示小數(shù)點(diǎn)
- P0=smgduan[SMG_Data[(Time_Count%8)/2]];//發(fā)送段碼
- }
- if(Time_Count%2==1)
- {
- P0=0xff;//消隱
- }
- Time_Count++;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : void Timer1() interrupt 3
- * 函數(shù)功能 : 定時(shí)器1中斷函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer1() interrupt 3
- {
- TH1=0xBB; //定時(shí)15ms
- TL1=0xa4;
- if(Set_Mode==0) //模式0:顯示當(dāng)前為溫度
- {
- Temp=DS18B20_ReadTemp(); //讀取溫度值
- Temp_T(Temp); //溫度轉(zhuǎn)換
- }
- if(Set_Mode==1) //模式1:顯示溫度上限
- Temp_T(TH);
- if(Set_Mode==2) //模式2:顯示溫度下限
- Temp_T(TL);
- Time_Count=0;
- }
復(fù)制代碼 DS18B20.c
KEY.C
- /******************************************************************************
- *文件描述:按鍵驅(qū)動文件
- *******************************************************************************/
- #include<reg52.h>
- #include "key.h"
- #include "delay.h"
- /*******************************************************************************
- * 函 數(shù) 名 : Key_Check()
- * 函數(shù)功能 : 檢測有獨(dú)立按鍵按下并讀取鍵值
- * 輸 入 : 無
- * 輸 出 : KeyValue:按鍵值,無按鍵按下返回0
- *******************************************************************************/
- uchar Key_Check(void)
- {
- uchar KeyValue=0; //按鍵值初始化為0
- if((GPIO_KEY&0x0f)!=0x0f) //讀取高4位,判斷按鍵是否按下
- {
- Delay_Ms(10); //延時(shí)10ms進(jìn)行消抖
- if((GPIO_KEY&0x0f)!=0x0f) //再次檢測鍵盤是否按下
- {
- switch(GPIO_KEY&0x0f)
- {
- case(0x0e): KeyValue=1; break;
- case(0x0d): KeyValue=2; break;
- case(0x0b): KeyValue=3; break;
- case(0x07): KeyValue=4; break;
- }
- }
- }
- return KeyValue;
- }
復(fù)制代碼 主要代碼都在上面,拒絕白嫖,就不上傳附件了,歡迎各位大佬留言。
作者: heicad 時(shí)間: 2022-3-19 04:16
好資料,51黑有你更精彩!!!
作者: 1276327078 時(shí)間: 2022-3-19 07:43
為啥我的只能用揚(yáng)聲器發(fā)聲http://m.zg4o1577.cn/bbs/dpj-218190-1.html
作者: lkc8210 時(shí)間: 2022-3-19 14:31
在定時(shí)中斷中讀溫度不太好吧?
這里起碼耗掉幾個(gè)ms吧?
作者: Lxy18 時(shí)間: 2022-3-19 14:59
十幾個(gè)ms,不影響數(shù)碼管顯示,目前沒有其他好方法,放在主函數(shù)中一直刷會被定時(shí)器打斷,測溫讀數(shù)亂碼。
作者: lkc8210 時(shí)間: 2022-3-19 15:17
DS18B20的初始化和讀寫可以分9步來完成
每步只耗600~700us
步與步之間可以干其它事情
- typedef unsigned char u8; //0 to 255
- typedef unsigned int u16; //0 to 65535
- u16 Ds18b20ReadTemp()//放在while(1)中呼叫
- {
- static u8 step = 0, tml = 0, tmh = 0;
- u16 temp = 0;
- if(!Delayms_Ds18b20)
- {
- TMR_x10 = 1;//Delayms_Ds18b20每1ms減1
- Delayms_Ds18b20 = 2;//if(Delayms_Ds18b20)Delayms_Ds18b20--;<<放到1ms中斷中
- switch(step)
- {
- case 0:Ds18b20Init();break;
- case 1:Ds18b20WriteByte(0xcc);break;
- case 2:Ds18b20WriteByte(0x44);break;
- case 3:Ds18b20Init();break;
- case 4:Ds18b20WriteByte(0xcc);break;
- case 5:Ds18b20WriteByte(0xbe);break;
- case 6:tml = Ds18b20ReadByte();break;
- case 7:tmh = Ds18b20ReadByte();break;
- case 8:
- temp = tmh;
- temp <<= 8;
- temp |= tml;
- tml = 0;
- tmh = 0;
- break;
- default:
- Delayms_Ds18b20 = 25;
- TMR_x10 = 0;//Delayms_Ds18b20每10ms減1
- break;
- }
- step = ++step % 10;
- }
- return temp;
- }
復(fù)制代碼
作者: adad2 時(shí)間: 2022-3-21 19:11
好資料,51黑有你更精彩!!!
作者: 小灰灰、 時(shí)間: 2022-12-9 17:07
大佬,delay的代碼沒有啊
歡迎光臨 (http://m.zg4o1577.cn/bbs/) |
Powered by Discuz! X3.1 |
主站蜘蛛池模板:
欧美一级片在线看
|
成人欧美一区二区三区白人
|
国产综合久久久久久鬼色
|
欧美日韩视频在线播放
|
午夜一区二区三区在线观看
|
日干夜干|
亚洲人成人一区二区在线观看
|
国产精品久久久久久久久免费
|
欧美一区二区三区
|
欧洲免费视频
|
一区二区三区国产精品
|
久久精品国产精品青草
|
男女视频在线观看
|
中文字幕一区二区三区四区
|
日韩在线三级
|
国产在线麻豆精品入口
|
日本成人午夜影院
|
国产一级在线观看
|
日韩一二区
|
蜜桃一区二区三区在线
|
亚洲视频在线观看免费
|
在线免费黄色小视频
|
久久午夜视频
|
日日爱av|
国产激情91久久精品导航
|
精品一区二区免费视频
|
在线黄
|
午夜欧美a级理论片915影院
|
国产激情第一页
|
91精品国产91久久综合桃花
|
成人精品一区二区三区中文字幕
|
日日日日操
|
亚洲一区免费
|
中文字幕第十页
|
超级乱淫av片免费播放
|
日韩精品一区二区三区在线播放
|
日韩一区二区三区在线看
|
91精品一区二区三区久久久久
|
国产综合精品一区二区三区
|
一区视频|
伊人网综合在线
|