unsigned char DHT11_rec_byte(){ unsigned char i,dat=0; for(i=0;i<8;i++) //从高到低依次接收8位数据 { while(!Data); ////等待50us低电平过去 DHT11_delay_us(8); //延时60us,如果还为高则数据为1,否则为0 dat<<=1; //移位使正确接收8位数据,数据为0时直接移位 if(Data==1) //数据为1时,使dat加1来接收数据1 dat+=1; while(Data); //等待数据线拉低 } 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); //结束 if((R_H+R_L+T_H+T_L)==revise) //校正 { RH=R_H; RL=R_L; TH=T_H; TL=T_L; } /*数据处理,方便显示*/ 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; } |
//用单次写操作向寄存器写入一个字节 void DS1302SingleWrite(unsigned char reg, unsigned char dat) { DS1302_CE = 1; //使能片选信号 DS1302ByteWrite((reg<<1) | 0x80); //发送写寄存器指令 DS1302ByteWrite(dat); //写入字节数据 DS1302_CE = 0; } //用单次读操作从某一寄存器读取一个字节 unsigned char DS1302SingleRead(unsigned char reg) { unsigned char dat; DS1302_CE = 1; DS1302ByteWrite((reg<<1) | 0x81); //发送读寄存器指令 dat = DS1302ByteRead(); //读取字节数据 DS1302_CE = 0; return dat; } |
init_time(); //初始化定时器 flag = 0; //置溢出标志位为0 //控制口发一个10US 以上的高电平 TRIG = 1; delay(3); TRIG = 0; //等待接收端出现高电平 while(!ECHO); TR0 = 1; //启动计时器 开始计时 while(ECHO); //等待高电平结束 TR0 = 0; //关闭低电平 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--)//加此循环只是为了将结果在数码管上停留时间长点便于观察 { display(distance); } } delay(1000);//60ms的周期,这里不是6ms,太多会闪烁。 |
75.01 KB, 下载次数: 18, 下载积分: 黑币 -5
源码
欢迎光临 (http://www.51hei.com/bbs/) | Powered by Discuz! X3.1 |