|
基于stc89c52恒溫控制系統(tǒng)電路原理圖如下:
引腳分配 lcd lcddata: P0
lcd_e: P2^7
lcd_rs: P2^6
lcd_rw: P2^5
設(shè)置按鍵 limit_choise: P //溫度上下限選擇按鍵
increase_temperature P //增加溫度限值按鍵
reduce_temperature P //減少溫度限值按鍵
蜂鳴器報(bào)警 warning P
溫度傳感器 temperature_sensor P
制熱 heatting P
制冷 refrigerating P
LED顯示 normal P //正常溫度指示燈
high_temperature P //高溫指示燈
low_temperature P //低溫指示燈
單片機(jī)源程序如下:
- #include <main.h>
- void main()//主函數(shù)
- {
- init();//初始化函數(shù)
- while(1)
- {
- temp_control();//控制按鍵函數(shù)
- unnormal_proccessing(get_temp(Ds18b20ReadTemp()),up_limit_temp,down_limit_temp);//恒溫控制函數(shù)
- }
- }
- void init()//初始化函數(shù)
- {
- uint i,j;
- //函數(shù)初始化
- LcdInit();//LCD初始化函數(shù)
- Ds18b20Init();
-
- //I/O口初始化
- heatting=1;//不制熱
- refrigerating=1;//不制冷
-
- //LCD初始化顯示
- LcdWriteCom(0x80);//第一行顯示
- j=strlen(num1);
- for(i=0; i<j; i++)
- {
- LcdWriteData(num1[i]);
- delay_ms(1);
- }
- LcdWriteCom(0x80+0x40);//第二行顯示
- j=strlen(num2);
- for(i=0; i<j; i++)
- {
- LcdWriteData(num2[i]);
- delay_ms(1);
- }
- LcdWriteCom(0x04); //關(guān)閉寫(xiě)一個(gè)指針加1
- }
- uint get_temp(uint temp)//計(jì)算溫度函數(shù)
- {
- float tp;
-
- tp=temp;//因?yàn)閿?shù)據(jù)處理有小數(shù)點(diǎn)所以將溫度賦給一個(gè)浮點(diǎn)型變量
- //如果溫度是正的那么,那么正數(shù)的原碼就是補(bǔ)碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語(yǔ)言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算加上0.5,還是在小數(shù)點(diǎn)后面。
- return temp;
- }
- void display_real_tenp(uint temp)//實(shí)時(shí)溫度顯示函數(shù)
- {
- uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組
- datas[0] = temp % 10000 / 1000;
- datas[1] = temp % 1000 / 100;
- datas[2] = temp % 100 / 10;
- datas[3] = temp % 10;
-
- LcdWriteCom(0x80+0x0a); //寫(xiě)地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //十位
- LcdWriteCom(0x80+0x0b); //寫(xiě)地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //個(gè)位
- LcdWriteCom(0x80+0x0d); //寫(xiě)地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //顯示小數(shù)點(diǎn)
- LcdWriteCom(0x80+0x0e); //寫(xiě)地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)
- }
- void temp_control()//控制溫度上下限函數(shù)
- {
- if(limit_choise==0)//選擇按鍵
- {
- delay_ms(5);
- if(limit_choise==0)
- {
- while(!limit_choise);
- limit_choise_num++;
- if(limit_choise_num>=3)
- {
- limit_choise_num=0;
- }
- }
- }
- if(limit_choise_num==0)//正常顯示
- {
- LcdWriteCom(0x0c);//關(guān)閉光標(biāo)
- display_real_tenp(get_temp(Ds18b20ReadTemp()));//顯示函數(shù)
- }
-
- if(limit_choise_num==1)//調(diào)節(jié)上限溫度
- {
- LcdWriteCom(0x80+0X40+2);
- LcdWriteCom(0x0f);//開(kāi)啟光標(biāo)
- if(increase_temperature==0)//增加溫度
- {
- delay_ms(5);
- if(increase_temperature==0)
- {
- while(!increase_temperature);
- up_limit_temp++;
- if(up_limit_temp>=100)
- {
- up_limit_temp=0;
- }
- //寫(xiě)入新數(shù)據(jù)
- LcdWriteCom(0x80+0X40+0x03);
- LcdWriteData('0'+up_limit_temp/10);
- LcdWriteCom(0x80+0X40+0x04);
- LcdWriteData('0'+up_limit_temp%10);
- LcdWriteCom(0x80+0X40+2);//光標(biāo)回寫(xiě)
- }
- }
- if(reduce_temperature==0)//減少溫度
- {
- delay_ms(5);
- if(reduce_temperature==0)
- {
- while(!reduce_temperature);
- up_limit_temp--;
- if(up_limit_temp<0)
- {
- up_limit_temp=99;
- }
- //寫(xiě)入新數(shù)據(jù)
- LcdWriteCom(0x80+0X40+0x03);
- LcdWriteData('0'+up_limit_temp/10);
- LcdWriteCom(0x80+0X40+0x04);
- LcdWriteData('0'+up_limit_temp%10);
- LcdWriteCom(0x80+0X40+2);//光標(biāo)回寫(xiě)
- }
- }
- }
-
- if(limit_choise_num==2)//調(diào)節(jié)下限溫度
- {
- LcdWriteCom(0x80+0X40+12);
- LcdWriteCom(0x0f);//開(kāi)啟光標(biāo)
- if(increase_temperature==0)//增加溫度
- {
- delay_ms(5);
- if(increase_temperature==0)
- {
- while(!increase_temperature);
- down_limit_temp++;
- if(down_limit_temp>=100)
- {
- down_limit_temp=0;
- }
- //寫(xiě)入新數(shù)據(jù)
- LcdWriteCom(0x80+0X40+0x0d);
- LcdWriteData('0'+down_limit_temp/10);
- LcdWriteCom(0x80+0X40+0x0e);
- LcdWriteData('0'+down_limit_temp%10);
- LcdWriteCom(0x80+0X40+12);//光標(biāo)回寫(xiě)
- }
- }
- if(reduce_temperature==0)//減少溫度
- {
- delay_ms(5);
- if(reduce_temperature==0)
- {
- while(!reduce_temperature);
- down_limit_temp--;
- if(down_limit_temp<0)
- {
- down_limit_temp=99;
- }
- //寫(xiě)入新數(shù)據(jù)
- LcdWriteCom(0x80+0X40+0x0d);
- LcdWriteData('0'+down_limit_temp/10);
- LcdWriteCom(0x80+0X40+0x0e);
- LcdWriteData('0'+down_limit_temp%10);
- LcdWriteCom(0x80+0X40+12);//光標(biāo)回寫(xiě)
- }
- }
- }
- }
- void unnormal_proccessing(uint temp,uint up_temp,uint down_temp)//恒溫控制函數(shù)
- {
- uchar datas[] = {0, 0, 0, 0}; //定義數(shù)組
- uint temp1=0;
- datas[0] = temp % 10000 / 1000;
- datas[1] = temp % 1000 / 100;
- datas[2] = temp % 100 / 10;
- datas[3] = temp % 10;
- temp1=datas[0]*1000+datas[1]*100+datas[2]*10+datas[3];//實(shí)際的溫度乘以100
- if(temp1 < down_temp*100)//升溫函數(shù)
- {
- heatting=0;//制熱
- warning=0;
- delay_ms(10);
- warning=1;
- }
- else//正常
- {
- heatting=1;//不制熱
-
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
恒溫箱.rar
(175.84 KB, 下載次數(shù): 86)
2018-4-26 16:48 上傳
點(diǎn)擊文件名下載附件
程序+仿真
|
評(píng)分
-
查看全部評(píng)分
|