|
這是一款有溫度濕度顯示的單片機(jī)萬年歷程序,程序來源于本壇,修改了一些原程序在KEIL4編譯環(huán)境下的編譯出出的警造,程序修改后用單片機(jī)開發(fā)板進(jìn)行驗證,功能正常。
這是修改完善后的程序:
單片機(jī)開發(fā)板完成的單片機(jī)試驗_帶溫度濕度的多功能萬年歷.zip
(2.72 MB, 下載次數(shù): 132)
2017-7-9 15:33 上傳
點擊文件名下載附件
帶溫度濕度測量功能的51單片機(jī)萬年歷 下載積分: 黑幣 -5
下面是試驗時的照片:
溫度.jpg (364.13 KB, 下載次數(shù): 109)
下載附件
2017-7-9 15:31 上傳
濕度.jpg (358.03 KB, 下載次數(shù): 95)
下載附件
2017-7-9 15:31 上傳
單片機(jī)源碼:
- #include <REGX52.H>
- typedef unsigned int u16;
- typedef unsigned char u8;
- sbit k2=P3^2; //K1 K2 K3 K4按鍵接口,建議從左到右接K1-K4
- sbit k1=P3^5;
- sbit k3=P3^3;
- sbit k4=P3^4;
- sbit DQ=P3^7;
- sbit beep=P1^6;
- sbit Data=P1^1; //有源蜂鳴器在P16口
- sbit lcden=P0^5; //LCD1602接口定義
- sbit lcdrs=P0^7;
- sbit lcdrw=P0^6;
- sbit bg=P1^7; //背光變量接入LCD1602的K極,通過bg的高低電平就可控制自動熄滅與點亮
- u8 k,e,d,o=1,p=1,temp,nxflag=0,mbflag=0,tianmax;
- float temperature; //溫度變量,18B20接收時為浮點數(shù)
- u8 miao1,miao2,fen1,fen2,shi1,shi2,tian1,tian2,wk,tem1,tem2,tem3,wendufu;
- u8 day=1,mon=1,day1,day2,yue1,yue2,mbw,n=0,m=0,beiguang,RH,RL,TH,TL,tempH,tempL;
- u8 se1,se2,mon1,mon2,hou1,hou2,min1,min2,MB2,nian1,nian2,nian3,nian4;
- u16 y,MB1;
- u16 temper,buchang,tempwarn=0,tempwarn1=500; //tempwarn為溫度下限,1為溫度上限
- u8 code set[]={"NaoZhong Status"}; //上電后傻瓜調(diào)節(jié)模塊
- u8 code tempwarng[]={"Wendu Waring!"};
- u8 code temmin[]={"Min"};
- u8 code temmax[]={"Max"};
- u8 code naozhongON[]={" ON"};
- u8 code naozhongOFF[]={"OFF"};
- u8 code setsucces[]={"Set Success!"};
- u8 code thanks[]={"Welcome to use !"};
- u8 code thanksu[]={"thanks for using"};
- u8 code make[]={"Designed by LY"};
- u8 code MB[]={"Stopwatch"};
- u8 code week1[]={"[MON]"};
- u8 code week2[]={"[TUE]"};
- u8 code week3[]={"[WED]"};
- u8 code week4[]={"[THU]"};
- u8 code week5[]={"[FRI]"};
- u8 code week6[]={"[SAT]"};
- u8 code week7[]={"[SUN]"};
- void delay(unsigned int z) //定義延時函數(shù)
- {
- unsigned int x,y;
- for(x=z;x>0;x--)
- for(y=1;y>0;y--);
- }
- void DHT11_delay_us(u8 n)
- {
- while(--n);
- }
- void DHT11_delay_ms(u16 z) //定義DHT11延遲函數(shù)
- {
- u16 i,j;
- for(i=z;i>0;i--)
- for(j=110;j>0;j--);
- }
- void DHT11_start()
- {
- Data=1;
- DHT11_delay_us(2);
- Data=0;
- DHT11_delay_ms(20); //延時18ms以上
- Data=1;
- DHT11_delay_us(30);
- }
- u8 DHT11_rec_byte() //接收一個字節(jié)
- {
- u8 i,dat=0;
- for(i=0;i<8;i++) //從高到低依次接收8位數(shù)據(jù)
- {
- while(!Data); //等待50us低電平過去
- DHT11_delay_us(8); //延時60us,如果還為高則數(shù)據(jù)為1,否則為0
- dat<<=1; //移位使正確接收8位數(shù)據(jù),數(shù)據(jù)為0時直接移位
- if(Data==1) //數(shù)據(jù)為1時,使dat加1來接收數(shù)據(jù)1
- dat+=1;
- while(Data); //等待數(shù)據(jù)線拉低
- }
- return dat;
- }
- void DHT11_receive() //接收40位的數(shù)據(jù)
- {
- u8 R_H,R_L,T_H,T_L,revise;
- DHT11_start();
- if(Data==0)
- {
- while(Data==0); //等待拉高
- DHT11_delay_us(40); //拉高后延時80us
- R_H=DHT11_rec_byte(); //接收濕度高八位
- R_L=DHT11_rec_byte(); //接收濕度低八位
- T_H=DHT11_rec_byte(); //接收溫度高八位
- T_L=DHT11_rec_byte(); //接收溫度低八位
- revise=DHT11_rec_byte(); //接收校正位
- DHT11_delay_us(25); //結(jié)束
- if((R_H+R_L+T_H+T_L)==revise) //校正
- {
- RH=R_H;
- RL=R_L;
- TH=T_H;
- TL=T_L;
- }
- }
- }
- void beepon() //PWM(如果你是無源蜂鳴器,這里寫PWM函數(shù))
- { //當(dāng)前為有源蜂鳴器,有源蜂鳴器無需更改
- beep=0;
- delay(1200);
- beep=1;
- }
- void write_nian(); //預(yù)定義
- void write_yue();
- void write_tian();
- void write_shi();
- void write_fen();
- void write_miao();
- void write_week();
- void zhuanhuan();
- void write_temp();
- void write_nz();
- void nzON();
- void write_setsuccess();
- void beiguangpd();
- void write_com(u8 com) //LCD1602初始化程序,了解1602時序圖后新手的話可以直接照搬使用
- {
- lcdrs=0;
- P2=com;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void write_data(u8 date)
- {
- lcdrs=1;
- P2=date;
- delay(5);
- lcden=1;
- delay(5);
- lcden=0;
- }
- void init()
- {
- lcdrw=0;
- lcden=0;
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- write_com(0x01);
- write_com(0x80+0x10);
- }
-
- void TimerInit() //定時器0工作方式1 中斷初始化,923位12M晶振在KEIL仿真后的計算結(jié)果
- {
- TMOD=0X01;
- TH0=(65535-901)/256;
- TL0=(65535-901)%256;
- ET0=1; //打開定時器0中斷允許位
- EA=1; //打開總中斷允許
- TR0=1; //打開 定時器0,開始計時
- }
- Init_DS18B20(void) //DS18B20初始化與時序圖程序,仿真時溫度問題改進(jìn)這個初始化程序就解決了
- {
- DQ=1;
- delay(70);
- DQ=0;
- delay(485);
- DQ=1;
- delay(50);
- return(1);
- }
- ReadOneChar(void) //18B20讀一個字節(jié)
- {
- unsigned char i=0;
- unsigned char dat=0;
- for (i=8;i>0;i--)
- {
- DQ=1;
- delay(1);
- DQ=0;
- dat>>=1;
- DQ=1;
- if(DQ)
- dat|=0x80;
- delay(4);
- }
- return(dat);
- }
- WriteOneChar(unsigned char dat) //18B20寫一個字節(jié)
- {
- unsigned char i=0;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay(5);
- DQ=1;
- dat>>=1;
- }
- delay(4);
- return(1);
- }
- ReadTemperature(void) //讀取溫度函數(shù)定義,返回值為浮點數(shù)
- {
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0x44);
- delay(125);
- Init_DS18B20();
- WriteOneChar(0xcc);
- WriteOneChar(0xbe);
- tempL=ReadOneChar();
- tempH=ReadOneChar();
- if(tempH>0x7f)
- {
- tempH=~tempH;
- tempL=~tempL+1;
- wendufu=1;
- }
- else
- wendufu=0;
- temperature=(((tempH*256)+tempL)*0.0625)*10;
- delay(200);
- return(temperature);
- }
- void welcome() //定義歡迎函數(shù)
- { static u8 i;
- init(); //初始化1602
- delay(5000);
- for(i=0;i<16;i++)
- {
- write_com(0x80+i);
- write_data(thanks[i]);
- delay(4000);
- }
- delay(50000);
- for(i=0;i<14;i++)
- {
- write_com(0x81+0x40+i);
- write_data(make[i]);
- delay(4000);
- }
- delay(50000);
- delay(50000);
- }
- void pdtian1() //PD在上電后設(shè)置完畢主界面處的天數(shù)判斷
- {
- if((p==1||p==3)||(p==5||p==7)||(p==8||p==10)||p==12)
- tianmax=31;
- if((p==4||p==6)||(p==9||p==11))
- tianmax=30;
- if(p==2)
- {
- if(((y%4==0)&&(y%100!=0))||(y%400==0))
- tianmax=29;
- else
- tianmax=28;
- }
- }
- void pdxingqi1() //PD在上電后設(shè)置完畢至主界面處的星期判斷
- {
- static char c,yi,mt,xwk1,xwk2,xwk3;
- static int xwk,yn,xwk4;
- yn=y;
- if(p==1||p==2)
- { yn=yn-1;
- mt=p+12;
- }
- else
- mt=p;
- yi=yn%100;
- c=yn/100;
- xwk1=yi+(yi/4);
- xwk2=c/4;
- xwk3=2*c;
- xwk4=(26*mt+26)/10;
- xwk=xwk1+xwk2-xwk3+xwk4+o-1;
- while(xwk<0)
- {xwk+=7; }
- wk=xwk%7;
- }
- void Display() //定義主程序 顯示部分函數(shù)模塊
- { static u16 xunhuan;
- RH=RH%100;
- write_nian(); //1602寫入顯示年
- write_com(0x84);
- write_data('-');
- write_yue(); //寫入月
- write_com(0x87);
- write_data('-');
- write_com(0x88);
- write_tian(); //寫入天
- write_week();
- write_shi();
- write_com(0x82+0x40);
- write_data(':');
- write_fen();
- write_com(0x85+0x40);
- write_data(':');
- write_miao(); //寫入溫度,溫度TEM1與2與3是溫度的三位數(shù)
- xunhuan++;
- if(xunhuan<180)
- {if(wendufu==1)
- {
- if((temper/100)!=0)
- {
- write_com(0x89+0x40);
- write_data('-');
- write_com(0x8a+0x40);
- write_data(tem1);
- }
- else
- {
- write_com(0x89+0x40);
- write_data(' ');
- write_com(0x8a+0x40);
- write_data('-');
- }
- }
- else
- {
- write_com(0x89+0x40);
- write_data(' ');
-
- if((temper/100)!=0)
- {
- write_com(0x8a+0x40);
- write_data(tem1);
- }
- else
- {
- write_com(0x8a+0x40);
- write_data(' ');
- } }
- write_com(0x8b+0x40);
- write_data(tem2);
- write_com(0x8c+0x40);
- write_data('.');
- write_com(0x8d+0x40);
- write_data(tem3);
- write_com(0x8e+0x40);
- write_data(0xdf);
- write_com(0x8f+0x40);
- write_data('C');
- }
- if(xunhuan>180)
- {
- write_com(0x89+0x40);
- write_data(' ');
- write_com(0x8a+0x40);
- write_data(' ');
- write_com(0x8b+0x40);
- write_data(RH/10+0x30);
- write_com(0x8c+0x40);
- write_data(RH%10+0x30);
- write_com(0x8d+0x40);
- write_data('%');
- write_com(0x8e+0x40);
- write_data('R');
- write_com(0x8f+0x40);
- write_data('H');
- }
- if(xunhuan==360)
- xunhuan=0;
- }
- void NZdisplay() //定義鬧鐘模塊
- {
- static u8 nzflag=2,nzwei;
- delay(2000);
- init();
- delay(2000);
- nzON(); //鬧鐘開關(guān)選擇模塊
- while(k4) //沒有檢測到K4鍵退出時無限循環(huán)
- {
- ...........................................................................................................................................
- 由于程序較長,需要的可以自己下載。
復(fù)制代碼
帶溫度補(bǔ)償超聲波測距:http://www.raoushi.com/bbs/dpj-89712-1.html
單片機(jī)DHT11溫度濕度程序:http://www.raoushi.com/bbs/dpj-89543-1.html
|
評分
-
查看全部評分
|