#include <reg52.h> //頭文件 #include <intrins.h> #include <stdio.h> // #include <math.h> //Keil library //************************************** #define uchar unsigned char //定義一下方便使用 #define uint unsigned int //定義一下方便使用 #define ulong unsigned long //定義一下方便使用 #define TEMP_ML 0x03 //000 0001 1 溫度命令 #define HUMI_ML 0x05 //000 0010 1 溫度命令 unsigned char error ;//全局錯(cuò)誤變量 unsigned char ack ;//全局應(yīng)答變量 //float temp_zi ;//全局應(yīng)答變量 //float humi_zi ;//全局應(yīng)答變量 unsigned char temp_h ;//全局應(yīng)答變量 unsigned char temp_LL ;//全局應(yīng)答變量 unsigned int xianzhi_t=0;//溫度顯值 unsigned int xianzhi_h=0;//濕度顯值 ucharsetzhi_h,setzhi_l; bit setbz_h,setbz_l,setkey; sbitDATA =P2^6;//數(shù)據(jù) sbitSCK=P2^7;//時(shí)鐘 sbithot =P2^0;// 加熱 sbitmotor =P2^1;// 電機(jī) sbitspeek =P2^2;// 聲音 sbitset =P0^0;// 設(shè)置 sbitsetup =P0^1;// 設(shè)置+ sbitsetdown =P0^2;// 設(shè)置- sbit gwei =P3^4;//個(gè)位 sbit swei =P3^3;//十位 sbit bwei =P3^2;//百位 sbit qwei =P3^1;//千位 unsigned char codedispcode[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//共陽(yáng) //*******************************基本驅(qū)動(dòng)程 char read() //讀一個(gè)字節(jié) 返回應(yīng)答信號(hào) // reads a byte form the Sensibus and givesan acknowledge in case of "ack=1" { unsigned char i,val=0; temp_LL=0; temp_h=0; DATA=1; //釋放數(shù)據(jù)總線 for(i=0x80;i>0;i/=2) //位移8位 { SCK=1; //上升沿讀入 if (DATA) val=(val | i); //確定值 SCK=0; } DATA=0; //讀應(yīng)答信號(hào),有應(yīng)答為1,為應(yīng)答為0 通過(guò)CPU下拉為應(yīng)答 SCK=1; //第9個(gè)脈沖 _nop_(); _nop_(); _nop_(); //pulswith approx. 5 us SCK=0; DATA=1; //釋放數(shù)據(jù)總線 temp_h=val; val=0; ////低8位///////////////////////////// DATA=1; //釋放數(shù)據(jù)總線 for(i=0x80;i>0;i/=2) //位移8位 {SCK=1; //上升沿讀入 if (DATA) val=(val | i); //確定值 SCK=0; } DATA=1;//0; //不需要應(yīng)答 通過(guò)CPU下拉為應(yīng)答 SCK=1; //第9個(gè)脈沖 _nop_(); _nop_(); _nop_(); //pulswith approx. 5 us SCK=0; DATA=1; //釋放數(shù)據(jù)總線 temp_LL=val; } char write(unsigned char value) //寫一個(gè)字節(jié)返回應(yīng)答信號(hào) { unsigned char i ; ack=0; for(i=0x80;i>0;i/=2) //釋放數(shù)據(jù)總線 {if (i & value) DATA=1; //寫入值 else DATA=0; SCK=1; //上升沿寫入 _nop_(); _nop_(); _nop_(); //延時(shí) SCK=0; } DATA=1; //釋放數(shù)據(jù)總線 SCK=1; //第9個(gè)脈沖 if (DATA==1) ack=1; //讀應(yīng)答信號(hào) SCK=0; return ack; //error=1 表示沒(méi)有應(yīng)答 } void start_sht11(void) //啟動(dòng) { DATA=1; SCK=0; //數(shù)據(jù)為1,SCK=0 _nop_(); SCK=1; //第一個(gè)脈沖 _nop_(); DATA=0; //數(shù)據(jù)跌落 _nop_ (); SCK=0; //完成一個(gè)脈沖 _nop_(); _nop_(); _nop_(); SCK=1; //再一個(gè)脈沖 _nop_(); DATA=1; //數(shù)據(jù)變?yōu)?/font>1 _nop_(); SCK=0; //完成該脈沖 } void sht_rest(void) //復(fù)位 { unsigned char i; DATA=1; SCK=0; //數(shù)據(jù)為1 時(shí)鐘為0 for(i=0;i<9;i++) //9 個(gè)脈沖為 復(fù)位 {SCK=1; SCK=0; } start_sht11(); //啟動(dòng) } //測(cè)量溫度或者是溫度,返回校驗(yàn)值 text_a(unsigned char ml) { unsigned int i; start_sht11(); //啟動(dòng) write(ml);//寫入測(cè)溫度 if (ack==1) { sht_rest() ;//復(fù)位 write(ml);//寫入測(cè)溫度 } //判斷是否處于忙 // DATA=1;//釋放數(shù)據(jù)總線 //for (i=0;i<65535;i++) if(DATA==0) break; for (i=0;i<55535;i++){ if(DATA==0)break;else {xianshi();} } read();//讀溫度 } /////////溫濕度處理////// text_jishuan_temp11() { error=0; ack=0; sht_rest() ;//復(fù)位 text_a(TEMP_ML); text_jishuan_temp(); key(); text_a(HUMI_ML); text_jishuan_humi(); } //////////計(jì)算溫度//// text_jishuan_temp() { float aa=0,bb=0,temp_zi; int abcd=0; aa=(float)temp_h*256+(float)temp_LL; temp_zi=0.01*aa-40; if (temp_zi<0) { temp_zi=0; } temp_zi=temp_zi*10; xianzhi_t=(int)temp_zi;//給顯示值 } ///////計(jì)算濕度////// text_jishuan_humi() { float aa=0,bb=0,humi_zi; int abcd=0; aa=(float)temp_h*256+(float)temp_LL; bb=aa*aa*2.8/1000000; aa=0.0405*aa; aa=aa-4-bb; humi_zi=aa; humi_zi=humi_zi*10; xianzhi_h=(int)humi_zi; } ///////延時(shí)/////// delay(inti) { while(--i); } ///////顯示處理/////// xianshi() { int abcd=0; int i; for(i=0;i<1;i++) { abcd=xianzhi_h; gwei=1; swei=1; bwei=1; qwei=1; P1=dispcode[abcd/100]; qwei=0; delay(40); qwei=1; abcd=abcd%100 ; P1=dispcode[abcd/10]; bwei=0; delay(40); bwei=1; if(setbz_h^setbz_l) { if(setbz_h) abcd=setzhi_h; if(setbz_l) abcd=setzhi_l; P1=dispcode[abcd/10]; swei=0; delay(40); swei=1; P1=dispcode[abcd%10]; gwei=0; delay(40); gwei=1; } else { abcd=xianzhi_t; P1=dispcode[abcd/100]; swei=0; delay(40); swei=1; abcd=abcd%100 ; P1=dispcode[abcd/10]; gwei=0; delay(40); gwei=1; } } } doing() { char xianzhi_mi; xianzhi_mi=xianzhi_t/10; if((xianzhi_mi<setzhi_h)&(xianzhi_t>setzhi_l)) {motor=0;hot=0;speek=0;} if(xianzhi_mi>setzhi_h) { motor=1;hot=0;speek=1;} if(xianzhi_mi<setzhi_l) {motor=0;hot=1;speek=1;} } key() { if(set&setkey) { setkey=0; if(setbz_l) {setbz_l=0;setbz_h=0;} else { if(!setbz_h) setbz_h=1; else {setbz_h=0;setbz_l=1;} } } if(!set) setkey=1; if(setup==0) { if(setbz_h==1) { if (setzhi_h<=99) setzhi_h++;} if(setbz_l==1) { if((setzhi_l<setzhi_h)&(setzhi_l<=99)) setzhi_l++;} } if(setdown==0) { if(setbz_h==1) { if((setzhi_h>setzhi_l)&(setzhi_h>=1)) setzhi_h--;} if(setbz_l==1) { if (setzhi_l>=1) setzhi_l--;} } } //系統(tǒng)初始化/// csh() { P0=0XFF; P1=1; P2=0; P3=0XFF; } main() { setzhi_h=22;//設(shè)置高溫 setzhi_l=20;//設(shè)置低溫 csh();//系統(tǒng)初始化 while(1) { text_jishuan_temp11();//測(cè)溫濕度 //xianshi();//顯示 doing();//處理 key();//鍵處理 // xianshi();//顯示 } }
|