經典溫度檢測程序,親測可用
電路原理圖如下:
0.jpg (254.83 KB, 下載次數: 63)
下載附件
2020-3-18 19:15 上傳
元件清單
1) 萬用板
2) 單片機
3) 40腳IC座
4) LCD1602液晶
5) 16P排母座
6) 16P排針
7) TLC2543
8) 20腳ic座
9) 熱敏電阻
10) 2p排座
11) 1K電阻*2
12) 2K電阻
13) 10k電阻*2
14) 104電容
15) 10uf電容
16) 30pf電容*2
17) 12M晶振
18) 輕觸按鍵*4
19) 8550三極管
20) 蜂鳴器
21) 5mm LED燈(紅色)
22) 5mm LED燈(綠色)
23) 103電位器
24) 自鎖開關
25) DC電源插口
26) 焊錫若干
27) 導線若干
28) USB電源線或電池盒
單片機源程序如下:
- #include<reg52.h> //頭文件
- #include<intrins.h>
- #include"eeprom.h" //調用STC89C52單片機的EEPROM控制程序
- #include "math.h"
- #define uchar unsigned char //宏定義
- #define uint unsigned int //宏定義
- #define ulong unsigned long //宏定義
- #define LCD1602_dat P0 //LCD1602的數據傳輸IO口
- sbit LCD1602_rs = P2^5; //LCD1602命令數據控制IO
- sbit LCD1602_rw = P2^6; //LCD1602讀寫IO控制
- sbit LCD1602_e = P2^7; //數據脈沖輸入
- sbit beep=P2^4; //蜂鳴器IO
- sbit led_1=P2^1; //超上限指示燈
- sbit led_2=P2^0; //超下限指示燈
- sbit key_1=P3^2;//設置按鍵
- sbit key_2=P3^3;//加按鍵
- sbit key_3=P3^4;//減按鍵
- sbit TCL2543_EOC = P1^0; //轉換結束標志IO口
- sbit TCL2543_CLK = P1^1; //I/O時鐘輸入
- sbit TCL2543_ADIN = P1^2; //串行數據輸入端
- sbit TCL2543_DOUT = P1^3; //串行數據輸出端
- sbit TCL2543_CS = P1^4; //片選腳IO
- float zhi; //暫存讀取的輸入變量
- int temp; //讀取DS18B20的溫度數據
- char temp_h,temp_l; //溫度上下限制存儲變量
- uchar state,ms; //系統設置項變量、50ms定時變量
- bit s1,beep1; //設置閃爍標志位、報警標志位
- ulong AD,AD_Data=0;
- uint num;
- void delay(uint T) //系統延時程序
- {
- while(T--);
- }
- /******************把數據保存到單片機內部eeprom中******************/
- void write_eeprom()
- {
- SectorErase(0x2000); //清空
- byte_write(0x2000,temp_h);
- byte_write(0x2001,temp_l);
- byte_write(0x2060,a_a);
- }
- /******************把數據從單片機內部eeprom中讀出來*****************/
- void read_eeprom()
- {
- temp_h=byte_read(0x2000);
- temp_l=byte_read(0x2001);
- a_a = byte_read(0x2060);
- }
- /**************開機自檢eeprom初始化*****************/
- void init_eeprom()
- {
- read_eeprom();
- if(a_a != 1||key_2==0) //新的單片機初始單片機內問eeprom
- {
- temp_h=35;
- temp_l=15;
-
- a_a = 1;
- write_eeprom(); //保存數據
- }
- }
- // 其中 port 為通道: 通道0:port = 0x01 通道1:port = 0x02 通道2:port = 0x04 ...
- // 片子操作文本地址 http://wenku.baidu.com/link?url=WTp8rj93fYDbqM6kYbynkqTrI5MGQFQGtgk6aDrMMdfcB0K2Q9HIrVOs-SSSCLUMOKLOS31ENJAadBSdrVMHg_YxXPYcXWC7T0rb-rINptW
- uint read2543(unsigned char port) //讀取TCL2543對應模擬輸入口的AD數據,并返回數據
- {
- unsigned int i; //上電時,EOC=“1”,CS=“1”
- uint ad_value=0;
- TCL2543_CLK=0;
- TCL2543_CS=0; //使能TCL2543片選
- TCL2543_EOC=1;
- port<<=4;
- for(i=0;i<12;i++) //讀取12位的模擬量的數字數據
- {
- if(TCL2543_DOUT) ad_value|=0x01; //前次轉換結果的MSB即A11位數據輸出到Dout供讀數
- TCL2543_ADIN=(bit)(port&0x80);
- TCL2543_CLK=1; //
- _nop_();
- _nop_();
- _nop_();
- TCL2543_CLK=0;
- _nop_();
- _nop_();
- _nop_();
- port=port<<1;
- ad_value=ad_value<<1;
- }
- TCL2543_CS=1; //鎖定片子
- ad_value=ad_value>>1;
- return ad_value; //返回讀取的AD值
- }
- /********************************************************************
- * 名稱 : LCD1602_write(uchar order,dat)
- * 功能 : 1602寫如數據函數
- * 輸入 : 輸入的命令值
- * 輸出 : 無
- ***********************************************************************/
- void LCD1602_write(uchar order,dat) //1602 一個字節 處理
- {
- LCD1602_e=0;
- LCD1602_rs=order;
- LCD1602_dat=dat;
- LCD1602_rw=0;
- LCD1602_e=1;
- delay(1);
- LCD1602_e=0;
- }
- /********************************************************************
- * 名稱 : LCD1602_writebye(uchar *prointer)
- * 功能 : 1602寫入數據函數 指針式
- * 輸入 : 輸入的命令值
- * 輸出 : 無
- ***********************************************************************/
- void LCD1602_writebyte(uchar *prointer) //1602 字符串 處理
- {
- while(*prointer!='\0')
- {
- LCD1602_write(1,*prointer);
- prointer++;
- }
- }
- /********************************************************************
- * 名稱 : LCD1602_cls()
- * 功能 : 初始化1602液晶
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void LCD1602_cls() //1602 初始化
- {
- LCD1602_write(0,0x01); //1602 清屏 指令
- delay(1500);
- LCD1602_write(0,0x38); // 功能設置 8位、5*7點陣
- delay(1500);
- LCD1602_write(0,0x0c); //設置 光標 不顯示開關、不顯示光標、字符不閃爍
- LCD1602_write(0,0x06);
- LCD1602_write(0,0xd0);
- delay(1500);
- }
- /********************************************************************
- * 名稱 : show()
- * 功能 : LCD1602液晶顯示程序
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void show() //顯示數據
- {
- LCD1602_write(0,0x80); //顯示位置設定
- LCD1602_writebyte("Temp:"); //顯示當前溫度值
- if(temp>=0) //顯示溫度整數部分
- {
- if(temp>999)LCD1602_write(1,0x30+temp/1000%10);
- else LCD1602_writebyte(" ");
- if(temp>99)LCD1602_write(1,0x30+temp/100%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+temp/10%10);
- LCD1602_writebyte(".");
- LCD1602_write(1,0x30+temp%10);
- }else
- {
- LCD1602_writebyte("-"); //顯示溫度負數部分
- if(temp*-1>99)LCD1602_write(1,0x30+(temp*-1)/10%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+(temp*-1)%10);
- LCD1602_writebyte(".");
- LCD1602_write(1,0x30+temp%10);
- }
- LCD1602_write(1,0xdf);
- LCD1602_writebyte("C ");
- LCD1602_write(0,0xC0); //第二行顯示溫度上下限值
- LCD1602_writebyte("H:");
- if(state==1&&s1==1) //對應設置項設置時閃爍控制 //上限
- {
- LCD1602_writebyte(" ");
- }else //顯示上限值
- {
- if(temp_h>=0)
- {
- if(temp_h>99)LCD1602_write(1,0x30+temp_h/100%10);
- else LCD1602_writebyte(" ");
- if(temp_h>9)LCD1602_write(1,0x30+temp_h/10%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+temp_h%10);
- }else
- {
- LCD1602_writebyte("-");
- if(temp_h*-1>9)LCD1602_write(1,0x30+(temp_h*-1)/10%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+(temp_h*-1)%10);
- }
- }
- LCD1602_write(1,0xdf);
- LCD1602_writebyte("C L:");
- if(state==2&&s1==1) //對應設置項設置時閃爍控制 //下限
- {
- LCD1602_writebyte(" ");
- }else
- {
- if(temp_l>=0) //顯示下限值
- {
- if(temp_l>99)LCD1602_write(1,0x30+temp_l/100%10);
- else LCD1602_writebyte(" ");
- if(temp_l>9)LCD1602_write(1,0x30+temp_l/10%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+temp_l%10);
- }else
- {
- LCD1602_writebyte("-");
- if(temp_l*-1>9)LCD1602_write(1,0x30+(temp_l*-1)/10%10);
- else LCD1602_writebyte(" ");
- LCD1602_write(1,0x30+(temp_l*-1)%10);
- }
- }
- LCD1602_write(1,0xdf);
- LCD1602_writebyte("C");
-
- }
- /********************************************************************
- * 名稱 : proc()
- * 功能 : 系統指示燈與報警處理
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void proc()
- {
- if(temp>temp_h*10) //如果當前溫度高于上限溫度
- {
- led_1=0; //對應指示燈點亮
- }else //否則 熄滅
- {
- led_1=1;
- }
- if(temp<temp_l*10) //如果當前溫度低于下限溫度
- {
- led_2=0; //對應指示燈點亮
- }else //否則 熄滅
- {
- led_2=1;
- }
- if(temp>temp_h*10||temp<temp_l*10) //如果當前溫度 值不處于 上下限溫度之間 這報警標志位值1 反之 置0
- {
- beep1=1; //開始報警
- }else
- {
- beep1=0; //停止報警
- }
- }
- /********************************************************************
- * 名稱 : key()
- * 功能 : 系統控制按鍵控制檢測程序
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void key()
- {
- if(!key_1) //判斷按鍵是否按下
- {
- delay(888); //延時去抖
- if(!key_1) //再次判斷按鍵是否按下
- {
- state=(state+1)%3; //切換設置項
- while(!key_1); //按鍵判斷釋放
- }
- }
- if(state!=0) //如果系統非設置狀態 則
- {
- if(!key_2) //判斷按鍵是否按下//如果加按鍵按下
- {
- delay(888); //延時去抖
- if(!key_2) //再次判斷按鍵是否按下
- {
- while(!key_2) show(); //按鍵判斷釋放
- switch(state) //判斷當前設置項
- {
- case 1: //如果是上限設置
- if(temp_h<99)temp_h++;
- break;
- case 2: //如果是下限設置
- if(temp_h>temp_l+1)temp_l++;
- break;
- }
- write_eeprom();
- }
- }
- if(!key_3) //判斷按鍵是否按下 如果減按鍵按下
- {
- delay(888); //延時去抖
- if(!key_3) //再次判斷按鍵是否按下
- {
- while(!key_3) show(); //按鍵判斷釋放
- switch(state) //判斷當前設置項
- {
- case 1: //如果是上限設置
- if(temp_h>temp_l+1)temp_h--;
- break;
- case 2: //如果是下限設置
- if(temp_l>-40)temp_l--;
- break;
- }
- write_eeprom();
- }
- }
- }
- }
- /********************************************************************
- * 名稱 : float TempCalculate(float Rx,float B,float Revise,float BasicRx)
- * 功能 : 根據當前熱敏電阻的阻值、以及參數、通過Sin曲線求出當前系統的溫度值 并返回浮點型的溫度值
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- float TempCalculate(float Rx,float B,float Revise,float BasicRx){
- /*
- Rx: 熱敏電阻當前阻值
- B: 熱敏電阻參數B值
- Revise: 校正溫度
- BasicRx: 熱敏電阻25度時電阻(標稱電阻數值)
- 返回: 攝氏度
- */
- Rx = Rx / BasicRx;
-
- Rx = log(Rx);
-
- Rx = (Rx) / B;
-
- Rx = Rx + 0.003356;
- Rx = 1 / Rx;
- Rx = Rx - 273.13;
- Rx = Rx + Revise;
-
-
- return Rx;
-
- }
- /********************************************************************
- * 名稱 : void main()
- * 功能 : 系統主程序
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void main()
- {
- float Rad; //生成運算暫存變量
- LCD1602_cls();//LCD1602初始化程序調用
- TMOD=0x01; //定時器0初始化配置
- TH0=0x4c;
- TL0=0x00; //定時初值賦值
- ET0=1; //定時器0中斷打開
- TR0=1; //打開定時器0
- EA=1; //打開總中斷
- init_eeprom();
- while(1)
- {
- num++;
- AD=read2543(0);
- AD_Data=AD_Data+AD;
- if(num>=30)
- {
- num=0;
- AD_Data=AD_Data/30;
- zhi=(float)AD_Data/819.0; //計算電壓值
- // zhi=(float)read2543(0)/819.0; //計算電壓值
- Rad=zhi/((5.0-zhi)/10000.0); //計算熱敏電阻當前阻值
- //temp=(int)((temp * 0.2) +(TempCalculate(Rad,600.0,0,630) * 0.5)*10);//求出當前系統的當前溫度
- temp=(int)((0.19*Rad-86)*10);//求出當前系統的當前溫度
- // temp=Rad;
- AD_Data=0;
- }
- show(); //顯示函數
- key(); //按鍵處理程序
- proc(); //超限處理程序
- }
- }
- /********************************************************************
- * 名稱 : void UART_1() interrupt 1
- * 功能 : 定時器0中斷服務程序
- * 輸入 : 無
- * 輸出 : 無
- ***********************************************************************/
- void UART_1() interrupt 1
- {
- TH0=0x4c; //重新賦值
- TL0=0x00;
- ms++; //50ms定時變量計時
- if(ms%5==0) //區分250ms定時
- {
- s1=!s1; //閃爍標志位切換
- if(beep1==1) beep=!beep; //判斷報警標志位是否報警
- else beep=1;
- }
- if(ms>19) //1s定時
- {
- ms=0;
- }
- }
復制代碼
所有資料51hei提供下載:
溫度檢測資料.7z
(46.05 KB, 下載次數: 104)
2020-3-18 15:55 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
|