这个也是在暑假培训时做的一个小东西,之前在网上买了一些传感器,还花了不少大洋,于是就拿来练手了。
这个DHT11的输出引脚还要加上拉电阻,真是麻烦,程序也比较不好,如果连线出现问题就会死机,建议参考下篇文章对AM2305的驱动编写,不过那东西可要一百多呢,这个才几块钱。
#include #include #define SYSCLK 24500000 // SYSCLK frequency in Hz #define BAUDRATE 9600 // Baud rate of UART in bps sbit led1 = P2^1; sbit led2 = P2^3; sbit dht_dat = P0^6; void Oscillator_Init (void); void Port_Init(void); void UART0_Init (void); void delay(unsigned int m); void delay_ms(unsigned int m); void read_dth(void); void main (void) { PCA0MD &= ~0x40; // WDTE = 0 (clear watchdog timer // enable) Oscillator_Init (); // Initialize system clock to // 24.5MHz Port_Init(); UART0_Init(); // Initialize UART0 for printf's EA = 1; // Enable global interrupts printf("初始化完成!nn"); delay_ms(5000); led1 = 1; led2 = 1; dht_dat = 1; while (1) { delay_ms(2000); read_dth(); } } void Oscillator_Init (void) { OSCICN = 0x87; // Configure internal oscillator for // its highest frequency RSTSRC = 0x04; // Enable missing clock detector } void Port_Init (void) { P1SKIP |= 0x40; // Skip all analog pins XBR0 = 0x01; // UART0 TX and RX pins enabled XBR1 = 0x40; // Enable crossbar and weak pull-ups P0MDOUT |= 0x10; // Enable TX0 as a push-pull output } void UART0_Init (void) { SCON0 = 0x10; // SCON0: 8-bit variable bit rate // level of STOP bit is ignored // RX enabled // ninth bits are zeros // clear RI0 and TI0 bits if (SYSCLK/BAUDRATE/2/256 < 1) { TH1 = -(SYSCLK/BAUDRATE/2); CKCON |= 0x08; // T1M = 1; SCA1:0 = xx } else if (SYSCLK/BAUDRATE/2/256 < 4) { TH1 = -(SYSCLK/BAUDRATE/2/4); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 01 CKCON |= 0x01; } else if (SYSCLK/BAUDRATE/2/256 < 12) { TH1 = -(SYSCLK/BAUDRATE/2/12); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 00 } else if (SYSCLK/BAUDRATE/2/256 < 48) { TH1 = -(SYSCLK/BAUDRATE/2/48); CKCON &= ~0x0B; // T1M = 0; SCA1:0 = 10 CKCON |= 0x02; } else { while (1); // Error. Unsupported baud rate } TL1 = TH1; // Init Timer1 TMOD &= ~0xF0; // TMOD: timer 1 in 8-bit autoreload TMOD |= 0x20; TR1 = 1; // START Timer1 TI0 = 1; // Indicate TX0 ready } void delay(unsigned int m) { while(m--); } void delay_ms(unsigned int m) { while(m--) delay(2046); } void read_dth(void) { unsigned char wei=0; unsigned char humi_int=0,humi_float=0,temp_int=0,temp_float=0,chk_dat=0; dht_dat=1; printf("nnn开始发送请求。n"); delay_ms(100); dht_dat=0; delay_ms(25); dht_dat=1; delay(64); while(1==dht_dat); //printf("下位机已响应--当前低电平。n"); while(0==dht_dat); //printf("下位机已响应--当前高电平。n"); while(1==dht_dat); //printf("下位机开始传送数据n"); //开始接收数据 for (wei=0;wei<8;wei++) { humi_int*=2; while(0==dht_dat); delay(62); if(1==dht_dat) { humi_int++; while(1==dht_dat); } } //湿度整数接受完成 for (wei=0;wei<8;wei++) { humi_float*=2; while(0==dht_dat); delay(62); if(1==dht_dat) { humi_float++; while(1==dht_dat); } } //湿度小数接收完成 for (wei=0;wei<8;wei++) { temp_int*=2; while(0==dht_dat); delay(62); if(1==dht_dat) { temp_int++; while(1==dht_dat); } } //温度整数接收完成 for (wei=0;wei<8;wei++) { temp_float*=2; while(0==dht_dat); delay(62); if(1==dht_dat) { temp_float++; while(1==dht_dat); } } //湿度小数接收完成 for (wei=0;wei<8;wei++) { chk_dat*=2; while(0==dht_dat); delay(62); if(1==dht_dat) { chk_dat++; while(1==dht_dat); } } //校验码接收完成 printf("湿度为:%d.%dn",(int)humi_int,(int)humi_float); printf("温度为:%d.%dn",(int)temp_int,(int)temp_float); printf("校验码为:%dn",(int)chk_dat); delay_ms(1500); } 引脚我就不多说了,注意必须有上拉,没上拉不行的,我试过了,AM2305可以不要上拉。
上一篇:基于C8051F410的矩阵键盘设计
下一篇:基于C8051F410的am2305温湿度传感器的驱动编写
推荐阅读最新更新时间:2024-11-02 10:39
设计资源 培训 开发板 精华推荐
- 具有附加迟滞的 MC33164 低压检测微处理器复位的典型应用电路
- 使用 NXP Semiconductors 的 TDA8559 的参考设计
- LT1317CS8 2V 至 3.3V 转换器的典型应用电路
- 使用 Analog Devices 的 LT1328 的参考设计
- DC819,LT1990CS8 可配置增益放大器演示板,V+ = +2.5V 至 +15V,V- = -2.5V 至 -15V
- LTC3854EDDB 演示板、小尺寸、低引脚数、具有宽输入电压范围的同步降压控制器
- USTC-EDU-STM32
- 使用 ROHM Semiconductor 的 BD5223 的参考设计
- MC34074ADR2G 高阻抗差分放大器的典型应用
- 具有 400mA 突发模式操作、2.25MHz 同步降压稳压器的 LTC3621EDCB-5 5Vout 的典型应用