18b20 dht11的51单片机驱动程序
dht11单片机源程序:
- #include"DHT11.h"
- #include"delay.h"
- #define uchar unsigned char
- #define uint unsigned uint
- uchar onedata;
- uchar rh,rl,th,tl;
- sbit JS=P1^4;
- void start(void)//起始信号
- {
- JS=1;
- delay_us(8);
- JS=0;
- delay_ms(20);//主机总线拉低大于18毫秒
- JS=1;
- delay_us(25);//发送起始信号结束后,拉高电平25US
- }
- uchar Receive_Byte()//接收一个字节
- {
- uchar i,temp;
- for(i=0;i<8;i++) //接收八位数据
- {
- while(!JS); //等待50us的低电平开始信号结束
- delay_us(25);//开始信号结束之后延时25us
- temp=0; //时间在26us—28us 接收数据为‘0’
- if(JS==1)
- temp=1; //时间在26us—28us之后还为高电平 接收数据为‘1’
- while(JS); //等待数据信号高电平26us—28us 接收数据为‘0’,70us为‘1’
- onedata<<=1;
- onedata|=temp;
- }
- return onedata;
- }
- void receive(void)//接收数据
- {
- uchar t_h,t_l,r_h,r_l;
- uchar check,num_check;
- start(); //开始信号
- JS=1; //主机何为输入,判断从机 DUL11 相应信号
- if(!JS) //判断从机是否有低电平响应信号
- {
- while(!JS);//判断从机发出80us的低电平响应信号是否结束
- while(JS); //判断从机80us的高电平是否结束 结束则主机进入接收状态
- r_h=Receive_Byte();
- r_l=Receive_Byte();
- t_h=Receive_Byte();
- t_l=Receive_Byte();
- check=Receive_Byte(); //校验位
- JS=0;
- delay_us(50);//当最后一位数据接收完毕时从机拉低50us的低电平
- JS=1; //主机有上啦电阻拉高进入空闲状态
- num_check=r_h+r_l+t_h+t_l;
- if(num_check==check)
- {
- rh=r_h;
- rl=r_l;
- th=t_h;
- tl=t_l;
- check=num_check;
- }
- }
- }
- void Get_Air_Humidity() //获取空气湿度
- {
- start(); //DHT11起始信号
- receive();//获取DHT11温湿度
- //SendData_Uart1(rh);//串口输出湿度值
- }
复制代码
ds18b20单片机源程序:
- #include"DS18B20.h"
- #define uchar unsigned char
- #define uint unsigned int
- //18b20测温
- sbit DQ=P3^6;
- sbit boom=P3^5;
- uchar fuhao; //判断温度的正负
- uchar temp_int=0;//定义温度的整数部分
- uint temp_point=0;//定义温度的小数部分
- uint temp,tempflag=261;
- //char a,b,c,d,e,f,g,h;
- //void delay(uchar i)
- //{
- // while(i--);
- //}
-
- /*初始化18b20*/
- void Init_18b20(void)
- {
- P3M1=0X00;
- P3M0=0X40;
- DQ=1; //复位18b20
- delay_us(16);
- DQ=0; //拉低DQ
- delay_us(160);
- DQ=1; //拉高DQ
- delay_us(100);
- }
- /*读一个字节*/
- ReadOneChar(void)
- {
- uchar i=0;
- uchar dat=0;
- P3M1=0X00;
- P3M0=0X00;
- for(i=8;i>0;i--)
- {
- DQ=0; //给脉冲信号
- dat>>=1;
- delay_us(1);
- DQ=1; //给脉冲信号
- if(DQ)
- {
- dat|=0x80;
- }
- delay_us(20);
- }
- return(dat);
- }
- /*写一个字节*/
- void WriteOneChar(uchar dat)
- {
- uchar i=0;
- P3M1=0X00;
- P3M0=0X40;
- for(i=8;i>0;i--)
- {
- DQ=0;
- DQ=dat&0x01;
- delay_us(20);
- DQ=1;
- dat>>=1;
- }
- delay_us(8);
- }
- /*写RAm中的三四字节的内容*/
- void Write_Calm(void)
- {
- Init_18b20();
- WriteOneChar(0xCC);//跳过读序列号操作
- WriteOneChar(0x4E);//写温度上下限及配置寄存器
- WriteOneChar(50); //写温度上限
- WriteOneChar(0); //写温度下限
- WriteOneChar(0x7f);//默认十二位精度
- }
- /*读取温度*/
- void ReadTemperature(void)
- {
- uchar low=0;
- uchar high=0;
- uint t=0;
- Init_18b20();
- WriteOneChar(0xCC); //跳过读序列号操作
- WriteOneChar(0x44); //启动温度转换
- LCD_write_Num(36,1,temp_int);
- Init_18b20();
- WriteOneChar(0xCC); //跳过读序列号操作
- WriteOneChar(0xBE); //读取温度寄存器等(共9个可读寄存器)前两个就是温度
- low=ReadOneChar(); //读取温度最低值
- high=ReadOneChar(); //读取温度最高值
- fuhao=high&0xf0; //取得温度的符号,fuhao==0温度为正或0,否则为负
- if(fuhao!=0)
- {
- t=65536-(high<<8|low)+1;
- high=t/256;
- low=t%256;
- }
- temp_point=(low&0x0f)*625;
- low=low>>4; //低位右移4位,舍弃小数部分
- high=high<<4; //高位左移4为,舍弃符号位
- temp_int=high|low;
-
- temp=temp_int%100*10+temp_point/1000;
- }
复制代码
完整代码(包含头文件)下载:
温湿度.rar
(2.64 KB, 下载次数: 138)
|