打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
基于C8051F410的am2305温湿度传感器的驱动编写

这个和那个DHT11差不多,精度稍高一点,价格相差十倍呢。程序很有改进,中间如果连线出问题则会自动恢复。

直接上程序吧。

  1. #include <C8051F410.h>                 // SFR declarations  
  2. #include <stdio.h>  
  3.   
  4. #define SYSCLK        24500000         // SYSCLK frequency in Hz  
  5. #define BAUDRATE      9600           // Baud rate of UART in bps  
  6. #define WAIT          50000  
  7.   
  8. sbit led1 = P2^1;  
  9. sbit led2 = P2^3;  
  10. sbit dht_dat = P0^6;  
  11.   
  12. void Oscillator_Init (void);  
  13. void Port_Init(void);  
  14. void UART0_Init (void);  
  15. void delay(unsigned int m);  
  16. void delay_ms(unsigned int m);  
  17. void read_am2305(void);  
  18.   
  19.   
  20. void main (void)  
  21. {  
  22.    PCA0MD &= ~0x40;                    // WDTE = 0 (clear watchdog timer  
  23.                                        // enable)  
  24.   
  25.    Oscillator_Init ();                 // Initialize system clock to  
  26.                                        // 24.5MHz  
  27.    Port_Init();  
  28.    UART0_Init();                       // Initialize UART0 for printf's  
  29.   
  30.    EA = 1;                             // Enable global interrupts  
  31.   
  32.    printf("初始化完成!\n\n");  
  33.    //delay_ms(5000);  
  34.    led1 = 1;  
  35.    led2 = 1;  
  36.    dht_dat = 1;  
  37.    while (1)  
  38.    {  
  39.         delay_ms(1000);  
  40.         read_am2305();  
  41.    }  
  42. }  
  43.   
  44. void Oscillator_Init (void)  
  45. {  
  46.    OSCICN = 0x87;                      // Configure internal oscillator for  
  47.                                        // its highest frequency  
  48.    RSTSRC = 0x04;                      // Enable missing clock detector  
  49. }  
  50.   
  51. void Port_Init (void)  
  52. {  
  53.    P1SKIP |= 0x40;                      // Skip all analog pins  
  54.   
  55.    XBR0 = 0x01;                        // UART0 TX and RX pins enabled  
  56.    XBR1 = 0x40;                        // Enable crossbar and weak pull-ups  
  57.   
  58.    P0MDOUT |= 0x10;                    // Enable TX0 as a push-pull output  
  59.   
  60. }  
  61.   
  62. void UART0_Init (void)  
  63. {  
  64.    SCON0 = 0x10;                       // SCON0: 8-bit variable bit rate  
  65.                                        //        level of STOP bit is ignored  
  66.                                        //        RX enabled  
  67.                                        //        ninth bits are zeros  
  68.                                        //        clear RI0 and TI0 bits  
  69.    if (SYSCLK/BAUDRATE/2/256 < 1) {  
  70.       TH1 = -(SYSCLK/BAUDRATE/2);  
  71.       CKCON |=  0x08;                  // T1M = 1; SCA1:0 = xx  
  72.    } else if (SYSCLK/BAUDRATE/2/256 < 4) {  
  73.       TH1 = -(SYSCLK/BAUDRATE/2/4);  
  74.       CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 01  
  75.       CKCON |=  0x01;  
  76.    } else if (SYSCLK/BAUDRATE/2/256 < 12) {  
  77.       TH1 = -(SYSCLK/BAUDRATE/2/12);  
  78.       CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 00  
  79.    } else if (SYSCLK/BAUDRATE/2/256 < 48) {  
  80.       TH1 = -(SYSCLK/BAUDRATE/2/48);  
  81.       CKCON &= ~0x0B;                  // T1M = 0; SCA1:0 = 10  
  82.       CKCON |=  0x02;  
  83.    } else {  
  84.       while (1);                       // Error.  Unsupported baud rate  
  85.    }  
  86.   
  87.    TL1 = TH1;                          // Init Timer1  
  88.    TMOD &= ~0xF0;                      // TMOD: timer 1 in 8-bit autoreload  
  89.    TMOD |=  0x20;  
  90.    TR1 = 1;                            // START Timer1  
  91.    TI0 = 1;                            // Indicate TX0 ready  
  92. }  
  93.   
  94. void delay(unsigned int m)  
  95. {  
  96.     while(m--);  
  97. }  
  98.   
  99. void delay_ms(unsigned int m)  
  100. {  
  101.     while(m--)  
  102.         delay(2046);  
  103. }  
  104.   
  105. unsigned char am2305_byte(void)  
  106. {  
  107.     unsigned char tmp1=0,wei=0;  
  108.     unsigned int cnt;  
  109.       
  110.     for (wei=0;wei<8;wei++)  
  111.     {  
  112.         tmp1*=2;  
  113.         delay(90);  
  114.         cnt=0;  
  115.         while(0==dht_dat)  
  116.         {  
  117.             cnt++;  
  118.             if(cnt>WAIT)  
  119.             {  
  120.                 printf("\n传输错误1");  
  121.                 return 0;  
  122.             }  
  123.         }  
  124.         delay(60);  
  125.         if(1==dht_dat)  
  126.         {  
  127.             tmp1++;  
  128.             cnt=0;  
  129.             delay(80);  
  130.             while(1==dht_dat)  
  131.             {  
  132.                 cnt++;  
  133.                 if(cnt>WAIT)  
  134.                 {  
  135.                     printf("\n传输错误2");  
  136.                     return 0;  
  137.                 }  
  138.             }  
  139.         }  
  140.     }  
  141.     return tmp1;  
  142. }  
  143.   
  144. void read_am2305(void)  
  145. {  
  146.     unsigned char wei=0;  
  147.     unsigned char humi_int=0,humi_float=0,temp_int=0,temp_float=0,chk_dat=0;  
  148.     float temp,humi;  
  149.     unsigned int cnt;  
  150.   
  151.     dht_dat=1;  
  152.     printf("\n\n\n开始发送请求。\n");  
  153.     delay_ms(5);  
  154.     dht_dat=0;  
  155.     delay_ms(1);  
  156.     dht_dat=1;  
  157.     delay(40);  
  158.     cnt=0;  
  159.     while(1==dht_dat)  
  160.     {  
  161.         cnt++;  
  162.         if(cnt>WAIT)  
  163.         {  
  164.             printf("\n传感器未响应1。");  
  165.             return;  
  166.         }  
  167.     }  
  168.     //printf("下位机已响应--当前低电平。\n");  
  169.     delay(160);  
  170.     cnt=0;  
  171.     while(0==dht_dat)  
  172.     {  
  173.         cnt++;  
  174.         if(cnt>WAIT)  
  175.         {  
  176.             printf("\n传感器未响应2。");  
  177.             return;  
  178.         }  
  179.     }  
  180.     //printf("下位机已响应--当前高电平。\n");  
  181.     delay(160);  
  182.     cnt=0;  
  183.     while(1==dht_dat)  
  184.     {  
  185.         cnt++;  
  186.         if(cnt>WAIT)  
  187.         {  
  188.             printf("\n传感器未响应3。");  
  189.             return;  
  190.         }  
  191.     }  
  192.     //printf("下位机开始传送数据\n");  
  193.   
  194.         //开始接收数据  
  195.     //湿度整数接受完成  
  196.     humi_int=am2305_byte();  
  197.     humi_float=am2305_byte();  
  198.     temp_int=am2305_byte();  
  199.     temp_float=am2305_byte();  
  200.     chk_dat=am2305_byte();  
  201.       
  202.     humi=(float)((humi_int*256+humi_float)*0.1);  
  203.     temp=(float)(((temp_int & 0x7f)*256+temp_float)*0.1);  
  204.     if (temp_int & 0x80)  
  205.         temp=-temp;  
  206.     printf("湿度为:%2.1f%%。\n",humi);  
  207.     printf("温度为:%2.1f。\n",temp);  
  208.     printf("校验码为:%d\n",(int)chk_dat);  
  209.     // putchar('A');  
  210.     // scanf("%c",wei);  
  211.     // printf("\nyour input is:%d",(int)wei);  
  212.     if(chk_dat==(char)(humi_int+humi_float+temp_int+temp_float))  
  213.         printf("校验无误。\n",wei);  
  214.     else  
  215.         printf("校验出错。\n");  
  216.     delay_ms(2500);  
  217. }  



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
LCD1602的C8051驱动
DS18B20和串口通信的那点事儿 ? 笨笨剥壳
【转】SD卡WAV音乐播放器(quartus11.0)(FAT32)(DE2
[pthread] 同步机制(4)
九九的STM32笔记(四)DMA、USART的演示 (www.ourdev.cn)
操作 变量 的某一位
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服