inerDelay_us(20); } //
void conversion(uint temp_data) // 数据转换出 个,十,百,千,万 {
wan=temp_data/10000+0x30 ;
temp_data=temp_data000; //取余运算 qian=temp_data/1000+0x30 ;
temp_data=temp_data00; //取余运算 bai=temp_data/100+0x30 ;
temp_data=temp_data0; //取余运算 shi=temp_data/10+0x30 ;
temp_data=temp_data; //取余运算 ge=temp_data+0x30; }
//毫秒延时************************** void delay_nms(unsigned int k) {
unsigned int i,j; for(i=0;i for(j=0;j<121;j++) {;}} } void Delay5us() { _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_();_nop_();_nop_();_nop_(); } void Delay5ms() { WORD n = 560; while (n--); } /************************************** 起始信号 **************************************/ void BH1750_Start() { 17 基于nRF2401无线传输的集温湿度与光照监测系统 SDA = 1; //拉高数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 0; //产生下降沿 Delay5us(); //延时 SCL = 0; //拉低时钟线 } /************************************** 停止信号 **************************************/ void BH1750_Stop() { SDA = 0; //拉低数据线 SCL = 1; //拉高时钟线 Delay5us(); //延时 SDA = 1; //产生上升沿 Delay5us(); //延时 } /************************************** 发送应答信号 入口参数:ack (0:ACK 1:NAK) **************************************/ void BH1750_SendACK(bit ack) { SDA = ack; //写应答信号 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } /************************************** 接收应答信号 **************************************/ bit BH1750_RecvACK() { SCL = 1; //拉高时钟线 Delay5us(); //延时 CY = SDA; //读应答信号 SCL = 0; //拉低时钟线 Delay5us(); //延时 return CY; } 18 /************************************** 向IIC总线发送一个字节数据 **************************************/ void BH1750_SendByte(BYTE dat) { BYTE i; for (i=0; i<8; i++) //8位计数器 { dat <<= 1; //移出数据的最高位 SDA = CY; //送数据口 SCL = 1; //拉高时钟线 Delay5us(); //延时 SCL = 0; //拉低时钟线 Delay5us(); //延时 } BH1750_RecvACK(); } /************************************** 从IIC总线接收一个字节数据 **************************************/ BYTE BH1750_RecvByte() { BYTE i; BYTE dat = 0; SDA = 1; //使能内部上拉,准备读取数据, for (i=0; i<8; i++) //8位计数器 { dat<<= 1; SCL = 1; //拉高时钟线 Delay5us(); //延时 dat |= SDA; //读数据 SCL = 0; //拉低时钟线 Delay5us(); //延时 } return dat; } //********************************* void Single_Write_BH1750(uchar REG_Address) { BH1750_Start(); //起始信号 19 基于nRF2401无线传输的集温湿度与光照监测系统 BH1750_SendByte(SlaveAddress); //发送设备地址+写信号 BH1750_SendByte(REG_Address); //内部寄存器地址,请参考中文pdf22页 BH1750_Stop(); //发送停止信号 } //初始化BH1750,根据需要请参考pdf进行修改**** void Init_BH1750() { Single_Write_BH1750(0x01); //波特率9600 TR1=1; REN=1; SM0=0; SM1=1; TMOD = 0x20; TH1 = 0xFD; TL1 = 0xFD; ES=1; EA=1; } void Multiple_read_BH1750() { uchar i; BH1750_Start(); //起始信号 BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号 for (i=0; i<3; i++) //连续读取6个地址数据,存储中BUF { BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据 if (i == 3) { BH1750_SendACK(1); //最后一个数据需要回NOACK } else { BH1750_SendACK(0); //回应ACK } } BH1750_Stop(); //停止信号 Delay5ms(); } bit init_DTH11() //图2 { bit flag; uchar num; 20 DQ=0; delay1ms(19); // >18ms DQ=1; for(num=0;num<10;num++); // 20-40us 34.7us for(num=0;num<12;num++); flag=DQ; for(num=0;num<11;num++); //DTH响应80us for(num=0;num<24;num++); //DTH拉高80us return flag; } uchar DTH11_RD_CHAR() //图4 图3 { uchar byte=0; uchar num; uchar num1; while(DQ==1); //低电平开始 50us for(num1=0;num1<8;num1++) { while(DQ==0); //高电平读数 byte<<=1; //高位在前 for(num=0;DQ==1;num++); //通过时间长短判断电平高低 if(num<10) //低电平 byte|=0x00; else ///高电平 byte|=0x01; } return byte; } void DTH11_DUSHU() { uchar num; if(init_DTH11()==0) { shidu=DTH11_RD_CHAR(); //比正常值高7度左右 ///湿度整数位 DTH11_RD_CHAR(); //湿度 小数位 wendu=DTH11_RD_CHAR(); //温度整数位 DTH11_RD_CHAR(); //温度小数位 DTH11_RD_CHAR(); //最后八位校验位 for(num=0;num<17;num++); //最后BIT输出后拉低总线50us DQ=1; BELL=0; delay1ms(1); BELL=1; 21