設(shè)計中有很多不完善的地方,歡迎各位大佬指正。 演示視頻:https://www.bilibili.com/video/BV1CS4y1u7s6?share_source=copy_web
利用單片機、DS18B20溫度傳感器、數(shù)碼管、按鍵、蜂鳴器設(shè)計。編程時考慮數(shù)碼需要一直掃描,按鍵也需要一直掃描,DS18B20實時讀取溫度也需要實時掃描,這三個都放到主函數(shù)的while循環(huán)中,由于溫度讀取轉(zhuǎn)換時間比較長,數(shù)碼管就會一直閃爍。另外數(shù)碼管和按鍵都再主函數(shù)中掃描,按鍵按下時數(shù)碼管會熄滅。 最后,在一個定時器中斷中掃描數(shù)碼管,另一個定時器中斷讀取溫,主函數(shù)主要掃描按鍵和判斷溫度值是否超過上下限。 經(jīng)過不斷調(diào)試終于實現(xiàn)了所有的功能。 功能說明: 1.數(shù)碼管默認(rèn)顯示當(dāng)前溫度。默認(rèn)上限30℃,下限22℃ 2.當(dāng)溫度高于上限,蜂鳴器報警,紅色LED點亮;低于下限,蜂 鳴器報警,藍(lán)色LED點亮。 3.第一次點擊'設(shè)置'按鍵,數(shù)碼管第一位顯示H,此時點擊'加' '減'按鍵,調(diào)節(jié)溫度上限值。 第二次點擊'設(shè)置'按鍵,數(shù)碼管第一位顯示L,此時點擊'加' '減'按鍵,調(diào)節(jié)溫度下限值。 注意:在調(diào)節(jié)溫度上下限過程中,溫度報警關(guān)閉。 第三次點擊'設(shè)置'按鍵,退出設(shè)置狀態(tài),打開溫度報警。 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ù) 單片機代碼如下: - /******************************************************************************
- * 單片機溫度報警系統(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; //定時器0中斷次數(shù)
- uchar Temp_Str[4]; //數(shù)組變量存放溫度數(shù)據(jù)
- uchar Set_Mode=0; //設(shè)置模式
- uchar SMG_Data[4]={0,0,0,0}; //存放數(shù)碼管的各個位的值
- 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(); //定時器初始化
- void Temp_T(float t); //溫度轉(zhuǎn)換函數(shù)
- /******************************************************************************
- * 函 數(shù) 名 : 主函數(shù)
- * 函數(shù)功能 :
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- DS18B20_Init(); //溫度傳感器初始化
- Timer_Init(); //定時器初始化
- 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;
- }
- }
- /***********溫度上下限判斷報警程序**************/
- if(Set_Mode==0)
- {
- if(Temp>TH)
- {
- LED_R=0; //紅燈點亮
- LED_B=1; //藍(lán)燈熄滅
- LED_G=1;
- Beep=0; //蜂鳴器報警
- }
- else if(Temp<TL)
- {
- LED_R=1; //紅燈熄滅
- LED_B=0; //藍(lán)燈點亮
- LED_G=1;
- Beep=0; //蜂鳴器報警
- }
- 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; //提取溫度百、十、個位
- 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; //提取溫度個、十位
- 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; //提取溫度百、十、個位
- 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; //提取溫度個、十位
- SMG_Data[3]=(int)t%10;
- t=-t; //將溫度恢復(fù)
- }
- }
- }
- /*****************************************************************************
- * 函 數(shù) 名 : Timer_Init
- * 函數(shù)功能 : 定時器初始化
- * 輸 入 : 無
- * 輸 出 : 無
- *****************************************************************************/
- void Timer_Init()
- {
- TMOD=0x11; //打開定時器0,工作方式1。
- TH0=0xff; //給定時器0賦初值,定時200us (65536-200)/256 (65536-200)%256
- TL0=0x38;
- TH1=0xc5; //定時60ms
- TL1=0x68;
- ET0=1; //打開定時器0中斷允許
- ET1=1; //打開定時器1中斷允許
- TR0=1; //打開定時器0
- TR1=1; //打開定時器1
- PT1=1; //高優(yōu)先級
- EA=1; //打開總中斷
- }
- /*******************************************************************************
- * 函 數(shù) 名 : void Timer0() interrupt 1
- * 函數(shù)功能 : 定時器0中斷函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer0() interrupt 1
- {
- TH0=0xff; //給定時器賦初值,定時
- TL0=0x38;
- if(Time_Count%2==0)
- {
- switch(Time_Count%8) //位選,選擇點亮的數(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ù)點
- P0=smgduan[SMG_Data[(Time_Count%8)/2]];//發(fā)送段碼
- }
- if(Time_Count%2==1)
- {
- P0=0xff;//消隱
- }
- Time_Count++;
- }
- /*******************************************************************************
- * 函 數(shù) 名 : void Timer1() interrupt 3
- * 函數(shù)功能 : 定時器1中斷函數(shù)
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer1() interrupt 3
- {
- TH1=0xBB; //定時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ù)功能 : 檢測有獨立按鍵按下并讀取鍵值
- * 輸 入 : 無
- * 輸 出 : KeyValue:按鍵值,無按鍵按下返回0
- *******************************************************************************/
- uchar Key_Check(void)
- {
- uchar KeyValue=0; //按鍵值初始化為0
- if((GPIO_KEY&0x0f)!=0x0f) //讀取高4位,判斷按鍵是否按下
- {
- Delay_Ms(10); //延時10ms進行消抖
- 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ù)制代碼 主要代碼都在上面,拒絕白嫖,就不上傳附件了,歡迎各位大佬留言。
|