設計中有很多不完善的地方,歡迎各位大佬指正。 演示視頻:https://www.bilibili.com/video/BV1CS4y1u7s6?share_source=copy_web
利用單片機、DS18B20溫度傳感器、數碼管、按鍵、蜂鳴器設計。編程時考慮數碼需要一直掃描,按鍵也需要一直掃描,DS18B20實時讀取溫度也需要實時掃描,這三個都放到主函數的while循環中,由于溫度讀取轉換時間比較長,數碼管就會一直閃爍。另外數碼管和按鍵都再主函數中掃描,按鍵按下時數碼管會熄滅。 最后,在一個定時器中斷中掃描數碼管,另一個定時器中斷讀取溫,主函數主要掃描按鍵和判斷溫度值是否超過上下限。 經過不斷調試終于實現了所有的功能。 功能說明: 1.數碼管默認顯示當前溫度。默認上限30℃,下限22℃ 2.當溫度高于上限,蜂鳴器報警,紅色LED點亮;低于下限,蜂 鳴器報警,藍色LED點亮。 3.第一次點擊'設置'按鍵,數碼管第一位顯示H,此時點擊'加' '減'按鍵,調節溫度上限值。 第二次點擊'設置'按鍵,數碼管第一位顯示L,此時點擊'加' '減'按鍵,調節溫度下限值。 注意:在調節溫度上下限過程中,溫度報警關閉。 第三次點擊'設置'按鍵,退出設置狀態,打開溫度報警。 4.溫度傳感器測溫范圍:-55—128℃。 溫度上下限調節范圍:-55—128℃。
洞洞板.png (460.05 KB, 下載次數: 60)
下載附件
2022-3-18 20:03 上傳
仿真截圖.png (47.23 KB, 下載次數: 76)
下載附件
2022-3-18 09:59 上傳
原理圖.png (141.31 KB, 下載次數: 80)
下載附件
2022-3-18 09:59 上傳
程序截圖.png (94.5 KB, 下載次數: 67)
下載附件
2022-3-18 09:59 上傳
元件清單.png (38.02 KB, 下載次數: 59)
下載附件
2022-3-18 09:59 上傳
主函數 單片機代碼如下: - /******************************************************************************
- * 單片機溫度報警系統
- *******************************************************************************/
- #include <reg52.h>
- #include "delay.h"
- #include "key.h"
- #include "DS18B20.h"
- #define uchar unsigned char //對數據類型定義
- #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; //藍色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中斷次數
- uchar Temp_Str[4]; //數組變量存放溫度數據
- uchar Set_Mode=0; //設置模式
- uchar SMG_Data[4]={0,0,0,0}; //存放數碼管的各個位的值
- uchar code smgduan[]={ //共陽極數碼管段碼
- 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
- };
- /*****************************************************************************/
- /***************************函數聲明******************************************/
- void Timer_Init(); //定時器初始化
- void Temp_T(float t); //溫度轉換函數
- /******************************************************************************
- * 函 數 名 : 主函數
- * 函數功能 :
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void main()
- {
- DS18B20_Init(); //溫度傳感器初始化
- Timer_Init(); //定時器初始化
- Delay_Ms(100);
- while(1)
- {
- /***********按鍵掃描程序**************/
- KeyValve=Key_Check(); //掃描按鍵
- if(KeyValve!=0) //判斷按鍵是否按下
- {
- switch(KeyValve) //判斷按鍵值,并處理
- {
- case 1: //溫度上限/下限設置
- {
- 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; //藍燈熄滅
- LED_G=1;
- Beep=0; //蜂鳴器報警
- }
- else if(Temp<TL)
- {
- LED_R=1; //紅燈熄滅
- LED_B=0; //藍燈點亮
- LED_G=1;
- Beep=0; //蜂鳴器報警
- }
- else
- {
- LED_R=1; //紅燈熄滅
- LED_B=1; //藍燈熄滅
- LED_G=0;
- Beep=1;
- }
- }
- else
- Beep=1;
- }
- }
- /*******************************************************************************
- * 函 數 名 : Temp_T(float t)
- * 函數功能 : 溫度轉換函數:將溫度值放到數組中,便于顯示
- * 輸 入 : 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 //負溫度
- {
- t=-t; //將負數轉換為正數
- 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; //數碼管第一位顯示H
- if(Set_Mode==2)
- SMG_Data[0]=19; //數碼管第一位顯示L
- if(t>=0) //正溫度
- {
- SMG_Data[1]=(int)t/100; //提取溫度百、十、個位
- SMG_Data[2]=((int)t%100)/10;
- SMG_Data[3]=(int)t%10;
- }
- else //負溫度
- {
- t=-t; //將負數轉換為正數
- SMG_Data[1]=17; //顯示“—”號
- SMG_Data[2]=((int)t%100)/10; //提取溫度個、十位
- SMG_Data[3]=(int)t%10;
- t=-t; //將溫度恢復
- }
- }
- }
- /*****************************************************************************
- * 函 數 名 : Timer_Init
- * 函數功能 : 定時器初始化
- * 輸 入 : 無
- * 輸 出 : 無
- *****************************************************************************/
- 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; //高優先級
- EA=1; //打開總中斷
- }
- /*******************************************************************************
- * 函 數 名 : void Timer0() interrupt 1
- * 函數功能 : 定時器0中斷函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer0() interrupt 1
- {
- TH0=0xff; //給定時器賦初值,定時
- TL0=0x38;
- if(Time_Count%2==0)
- {
- switch(Time_Count%8) //位選,選擇點亮的數碼管,
- {
- 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;//顯示小數點
- P0=smgduan[SMG_Data[(Time_Count%8)/2]];//發送段碼
- }
- if(Time_Count%2==1)
- {
- P0=0xff;//消隱
- }
- Time_Count++;
- }
- /*******************************************************************************
- * 函 數 名 : void Timer1() interrupt 3
- * 函數功能 : 定時器1中斷函數
- * 輸 入 : 無
- * 輸 出 : 無
- *******************************************************************************/
- void Timer1() interrupt 3
- {
- TH1=0xBB; //定時15ms
- TL1=0xa4;
- if(Set_Mode==0) //模式0:顯示當前為溫度
- {
- Temp=DS18B20_ReadTemp(); //讀取溫度值
- Temp_T(Temp); //溫度轉換
- }
- if(Set_Mode==1) //模式1:顯示溫度上限
- Temp_T(TH);
- if(Set_Mode==2) //模式2:顯示溫度下限
- Temp_T(TL);
- Time_Count=0;
- }
復制代碼 DS18B20.c
KEY.C
- /******************************************************************************
- *文件描述:按鍵驅動文件
- *******************************************************************************/
- #include<reg52.h>
- #include "key.h"
- #include "delay.h"
- /*******************************************************************************
- * 函 數 名 : Key_Check()
- * 函數功能 : 檢測有獨立按鍵按下并讀取鍵值
- * 輸 入 : 無
- * 輸 出 : 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;
- }
復制代碼 主要代碼都在上面,拒絕白嫖,就不上傳附件了,歡迎各位大佬留言。
|