|
*2021年1月15日10:19:01*/
- #include<reg51.h>
- #include"lcd.h"
- #include"temp.h"
- #include"general.h"
- #include"ds1302.h"
- /*******************************************************************************
- * 函數(shù)名 : main
- * 函數(shù)功能 :進(jìn)入目標(biāo)溫度和報(bào)警溫度設(shè)置頁面后,需要返回溫度顯示頁面,必須先返回萬年歷頁面,此時(shí)再按溫度顯示鍵,方可進(jìn)入溫度顯示頁面
- * 輸入 : 無
- * 輸出 : 無
- *******************************************************************************/
- //全局函數(shù)
- void LcdDisplay(int);
- void DS1302_LcdDisplay();
- void RES();//結(jié)果運(yùn)算函數(shù)
- void aim();
- void alarm();
- void change_temp();
- //--定義全局變量
- typedef unsigned int u16;
- unsigned char Runmodel = Calendar;
- unsigned char Temp[] = "Temperature"; //溫度
- unsigned char Date[] = "calendar"; //萬年歷
- unsigned char Aim_tp[] = "AIM_TEMP";
- unsigned char Alarm_tp[] = "Alarm_tp";
- unsigned char Aim_temp = 27; //目標(biāo)溫度初始值
- unsigned char Alarm_temp = 95; //報(bào)警溫度初始值
- unsigned char Aim_h,Aim_l,Alarm_h,Alarm_l,Alarm_mh;
- int Now_temp;
- //IO口設(shè)定
- #define GPIO_KEY P1
- sbit K1 = P2^0; //選擇按鍵1,進(jìn)入萬年歷模式
- sbit K2 = P2^1; //選擇按鍵2,進(jìn)入溫度測(cè)量模式
- sbit K3 = P2^2; //選擇按鍵3,進(jìn)行目標(biāo)溫度和最高溫度警報(bào)設(shè)置
- sbit K4 = P1^0; //自加按鍵
- sbit K5 = P1^1; //自減按鍵
- sbit led = P2^3;
- sbit beep=P1^5; //蜂鳴器響應(yīng)
- sbit reset = P3^2; //復(fù)位按鍵
- void delay(u16 i)
- {
- while(i--);
- }
-
- void main()
- {
- unsigned char i = 0;
- Isrint();
- LcdInit(); //初始化LCD1602
- while(1)
- {
- Runmodel = Run_Model();
- if(K3 == PutDown)
- {
- Delay10ms(1);
- if(K3 == PutDown)
- {
- LcdWriteCom(0x01);
- LcdWriteCom(0x83);
- for(i = 0;i<8;i++)
- LcdWriteData(Aim_tp[i]); //第一次按下K3進(jìn)行目標(biāo)溫度設(shè)定
- LcdWriteCom(0xc5);
- aim();
- LcdWriteData(Aim_h);
- LcdWriteData(Aim_l);
- LcdWriteData(0xdf);
- LcdWriteData('C');
- while(1)
- {
- Delay10ms(10); //這里必須加個(gè)延遲,不然溫度會(huì)一下子加三下
- if(K4 == PutDown) //設(shè)置目標(biāo)溫度進(jìn)行自加
- {
- Delay10ms(2);
- if(K4 == PutDown)
- {
- Aim_temp++; //設(shè)置目標(biāo)溫度進(jìn)行自加
- aim();
- LcdWriteCom(0xc5);
- LcdWriteData(Aim_h);
- LcdWriteData(Aim_l);
- LcdWriteData(0xdf);
- LcdWriteData('C');
- }
- }
-
- if(K5 == PutDown) //設(shè)置目標(biāo)溫度進(jìn)行自減
- {
- Delay10ms(1);
- if(K5 == PutDown)
- {
- Aim_temp--;
- aim();
- LcdWriteCom(0xc5);
- LcdWriteData(Aim_h);
- LcdWriteData(Aim_l);
- }
- }
-
- if(K3 == PutDown)
- {
- Delay10ms(1);
- if(K3 == PutDown)
- {
- LcdWriteCom(0x01); //清屏,進(jìn)入下一個(gè)警報(bào)溫度設(shè)置頁面
- LcdWriteCom(0x83);
- for(i = 0;i<8;i++)
- LcdWriteData(Alarm_tp[i]);
- LcdWriteCom(0xc5);
- alarm();
- LcdWriteData(Alarm_mh);
- LcdWriteData(Alarm_h);
- LcdWriteData(Alarm_l);
- LcdWriteData(0xdf);
- LcdWriteData('C');
- while(1)
- {
- Delay10ms(10);
- if(K4 == PutDown)
- {
- Delay10ms(1);
- if(K4 == PutDown)
- {
- Alarm_temp++;
- alarm();
- LcdWriteCom(0xc5);
- LcdWriteData(Alarm_mh);
- LcdWriteData(Alarm_h);
- LcdWriteData(Alarm_l);
- LcdWriteData(0xdf);
- LcdWriteData('C');
- }
- }
-
- if(K5 == PutDown)
- {
- Delay10ms(1);
- if(K5 == PutDown)
- {
- Alarm_temp--;
- alarm();
- LcdWriteCom(0xc5);
- LcdWriteData(Alarm_mh);
- LcdWriteData(Alarm_h);
- LcdWriteData(Alarm_l);
- LcdWriteData(0xdf);
- LcdWriteData('C');
- }
- }
- if(K1 == PutDown)
- {
- Delay10ms(1);
- if(K1 == PutDown)
- {
- Runmodel = Calendar;
- break;
- }
- }
- }
- }
- }
- if(K1 == PutDown)
- {
- Delay10ms(1);
- if(K1 == PutDown)
- {
- Runmodel = Calendar;
- break;
- }
- }
- }
- }
- }
- if(Runmodel == Calendar) //萬年歷模式
- {
- LcdWriteCom(0x01);
- LcdWriteCom(0x83);
- for(i=0; i<8;i++)
- LcdWriteData(Date[i]);
- Ds1302Init();
- LcdWriteCom(0x01);
- while(1)
- {
- Ds1302ReadTime();
- DS1302_LcdDisplay();
- Runmodel = Run_Model();
- if(Runmodel == Temp_test|| K3 == PutDown)
- break;
- }
- }
-
- if(Runmodel == Temp_test) //溫度測(cè)試模式
- {
- LcdWriteCom(0x01);
- LcdWriteCom(0x83);
- for(i=0; i<11;i++)
- LcdWriteData(Temp[i]);
- LcdWriteCom(0xca);
- LcdWriteData(0xdf);
- LcdWriteData('C'); //攝氏度
- while(1)
- {
- LcdDisplay(Ds18b20ReadTemp());
- // Delay1ms(1000);//1s鐘刷一次
- Now_temp = Ds18b20ReadTemp();
- change_temp();
- if(Now_temp< Aim_temp) //如果目前溫度低于目標(biāo)溫度,那么將開啟加熱模式
- {
- EA = 1;
- }
- if( Now_temp> Aim_temp) //如果目前溫度高于目標(biāo)溫度,那么將關(guān)閉加熱模式
- {
- led =1;
- EA = 0;
- }
- if(Now_temp >= Alarm_temp)
- {
- while(1)
- {
- beep=~beep;
- delay(10);
- if(Now_temp < Alarm_temp)
- break;
- }
- }
- if(K1 == PutDown)
- {
- Delay10ms(1);
- if(K1 == PutDown)
- {
- Runmodel = Calendar;
- LcdWriteCom(0x01); //清屏,這里不能用初始化!
- break;
- }
-
-
- }
- if(K3 == PutDown)
- {
- Delay10ms(1);
- if(K3 == PutDown)
- {
- break;
- }
- }
-
- }
- }
-
- }
- }
- /*******************************************************************************
- * 函數(shù)名 : LcdDisplay()
- * 函數(shù)功能 : LCD顯示讀取到的溫度
- * 輸入 : v
- * 輸出 : 無
- *******************************************************************************/
- void LcdDisplay(int temp) //lcd顯示
- {
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數(shù)組
- float tp;
- if(temp< 0) //當(dāng)溫度值為負(fù)數(shù)
- {
- LcdWriteCom(0xc3); //寫地址 80表示初始地址
- LcdWriteData('-'); //顯示負(fù)
- //因?yàn)樽x取的溫度是實(shí)際溫度的補(bǔ)碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個(gè)小數(shù)點(diǎn)就*100,+0.5是四舍五入,因?yàn)镃語言浮點(diǎn)數(shù)轉(zhuǎn)換為整型的時(shí)候把小數(shù)點(diǎn)
- //后面的數(shù)自動(dòng)去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進(jìn)1了,小于0.5的就
- //算由?.5,還是在小數(shù)點(diǎn)后面。
- }
- else
- {
- LcdWriteCom(0xc3); //寫地址 80表示初始地址
- LcdWriteData('+'); //顯示正
- 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)镃語言浮點(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)后面。
- }
- datas[0] = temp / 10000;
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- datas[4] = temp % 10;
- LcdWriteCom(0xc4); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[0]); //百位
-
- LcdWriteCom(0xc5); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[1]); //十位
- LcdWriteCom(0xc6); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[2]); //個(gè)位
- LcdWriteCom(0xc7); //寫地址 80表示初始地址
- LcdWriteData('.'); //顯示 ‘.’
- LcdWriteCom(0xc8); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[3]); //顯示小數(shù)點(diǎn)
- LcdWriteCom(0xc9); //寫地址 80表示初始地址
- LcdWriteData('0'+datas[4]); //顯示小數(shù)點(diǎn)
- }
- void DS1302_LcdDisplay()
- {
- LcdWriteCom(0x80+0X40);
- LcdWriteData('0'+TIME[2]/16); //時(shí)
- LcdWriteData('0'+(TIME[2]&0x0f));
- LcdWriteData(':');
- LcdWriteData('0'+TIME[1]/16); //分
- LcdWriteData('0'+(TIME[1]&0x0f));
- LcdWriteData(':');
- LcdWriteData('0'+TIME[0]/16); //秒
- LcdWriteData('0'+(TIME[0]&0x0f));
- LcdWriteCom(0x80);
- LcdWriteData('2');
- LcdWriteData('0');
- LcdWriteData('0'+TIME[6]/16); //年
- LcdWriteData('0'+(TIME[6]&0x0f));
- LcdWriteData('-');
- LcdWriteData('0'+TIME[4]/16); //月
- LcdWriteData('0'+(TIME[4]&0x0f));
- LcdWriteData('-');
- LcdWriteData('0'+TIME[3]/16); //日
- LcdWriteData('0'+(TIME[3]&0x0f));
- LcdWriteCom(0x8D);
- LcdWriteData('0'+(TIME[5]&0x07)); //星期
- }
- void aim()
- {
- Aim_h = (Aim_temp)/10 + '0'; //必選加個(gè)'0',不然沒用
- Aim_l = Aim_temp%10 + '0';
- }
- void alarm()
- {
- Alarm_mh = Alarm_temp/100 + '0';
- Alarm_h = (Alarm_temp%100)/10 + '0'; //必選加個(gè)'0',不然沒用
- Alarm_l = Alarm_temp%10 + '0';
- }
- void change_temp() //必要的轉(zhuǎn)換,將返回的tp進(jìn)行轉(zhuǎn)化
- {
- Now_temp = Now_temp*0.0625*100+0.5;
- Now_temp = (Now_temp/10000)*100+(Now_temp%10000/1000)*10+(Now_temp%1000/100);
- }
復(fù)制代碼
全部資料51hei下載地址:
高壓開關(guān)柜溫度測(cè)控系統(tǒng).zip
(741.97 KB, 下載次數(shù): 36)
2021-1-21 15:22 上傳
點(diǎn)擊文件名下載附件
仿真+程序
|
|