unsigned char DHT11_rec_byte(){ unsigned char 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; } unsigned char* DHT11_receive(){ unsigned char rec_dat[9]; unsigned char R_H,R_L,T_H,T_L,RH,RL,TH,TL,revise; Data=1; DHT11_delay_us(2); Data=0; DHT11_delay_ms(20); //延時18ms以上 Data=1; DHT11_delay_us(30); 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; } /*數(shù)據(jù)處理,方便顯示*/ rec_dat[0]='0'+(RH/10); rec_dat[1]='0'+(RH%10); rec_dat[2]='R'; rec_dat[3]='H'; rec_dat[4]=' '; rec_dat[5]=' '; rec_dat[6]='0'+(TH/10); rec_dat[7]='0'+(TH%10); rec_dat[8]='C'; } return rec_dat; } |
//用單次寫操作向寄存器寫入一個字節(jié) void DS1302SingleWrite(unsigned char reg, unsigned char dat) { DS1302_CE = 1; //使能片選信號 DS1302ByteWrite((reg<<1) | 0x80); //發(fā)送寫寄存器指令 DS1302ByteWrite(dat); //寫入字節(jié)數(shù)據(jù) DS1302_CE = 0; } //用單次讀操作從某一寄存器讀取一個字節(jié) unsigned char DS1302SingleRead(unsigned char reg) { unsigned char dat; DS1302_CE = 1; DS1302ByteWrite((reg<<1) | 0x81); //發(fā)送讀寄存器指令 dat = DS1302ByteRead(); //讀取字節(jié)數(shù)據(jù) DS1302_CE = 0; return dat; } |
init_time(); //初始化定時器 flag = 0; //置溢出標(biāo)志位為0 //控制口發(fā)一個10US 以上的高電平 TRIG = 1; delay(3); TRIG = 0; //等待接收端出現(xiàn)高電平 while(!ECHO); TR0 = 1; //啟動計時器 開始計時 while(ECHO); //等待高電平結(jié)束 TR0 = 0; //關(guān)閉低電平 out_TH0 = TH0; //取定時器的值 out_TL0 = TL0; out_TH0 <<= 8; //右移8位 distance = out_TH0 | out_TL0; //合并為16位的值 distance *= 0.017; if(flag == 1) //如果定時器溢出 則超出超聲波測量范圍 { display(-1); flag = 0; } else { for(y =5; y >=0; y--)//加此循環(huán)只是為了將結(jié)果在數(shù)碼管上停留時間長點便于觀察 { display(distance); } } delay(1000);//60ms的周期,這里不是6ms,太多會閃爍。 |
75.01 KB, 下載次數(shù): 18, 下載積分: 黑幣 -5
源碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/) | Powered by Discuz! X3.1 |