51单片机气象参数检测程序与Proteus仿真 SHT10+MPX4115+ADC0832芯片

[复制链接]
查看15 | 回复0 | 2021-6-11 16:10:23 | 显示全部楼层 |阅读模式
原理图如下(proteus仿真工程文件和51单片机完整源程序可到本帖附件中下载)
1.png
部分单片机源码:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>   
  4. #include <stdio.h>   

  5. #define LCD_DB P0
  6. sbit LCD_RS=P2^0;   
  7. sbit LCD_RW=P2^1;   
  8. sbit LCD_E=P2^2;   
  9. sbit ADCS =P3^4;                              
  10. sbit ADDI =P3^7;                              
  11. sbit ADDO =P3^7;                              
  12. sbit ADCLK =P3^6;                             
  13. sbit SCK = P2^6;      
  14. sbit DATA = P2^7;
  15. sbit h=P1^0;
  16. sbit t=P1^1;
  17. sbit p=P1^2;

  18. #define noACK 0            
  19. #define ACK   1            
  20. #define STATUS_REG_W 0x06   
  21. #define STATUS_REG_R 0x07  
  22. #define MEASURE_TEMP 0x03   
  23. #define MEASURE_HUMI 0x05   
  24. #define RESET        0x1e  
  25. #define uchar unsigned char
  26. #define uint unsigned int
  27. uint temp;
  28. uchar getdata;
  29. typedef union  
  30. { unsigned int i;      
  31.   float f;
  32. } value;

  33. enum {TEMP,HUMI};      

  34. void s_transstart(void);               
  35. void s_connectionreset(void);         
  36. char s_write_byte(unsigned char value);
  37. char s_read_byte(unsigned char ack);   
  38. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode);
  39. void calc_dht90(float *p_humidity ,float *p_temperature);
  40. void LCD_init(void);                        
  41. void LCD_write_command(uchar command);      
  42. void LCD_write_data(uchar dat);              
  43. void LCD_disp_char(uchar x,uchar y,uchar dat);
  44. void LCD_disp_str(uchar x,uchar y,uchar *str);
  45. void delay_n10us(uint n);                    

  46. void LCD_init(void)
  47. {
  48. delay_n10us(10);
  49. LCD_write_command(0x38);
  50. delay_n10us(10);
  51. LCD_write_command(0x0c);
  52. delay_n10us(10);
  53. LCD_write_command(0x06);
  54. delay_n10us(10);
  55. LCD_write_command(0x01);
  56. delay_n10us(1000);      
  57. }

  58. void LCD_write_command(uchar dat)
  59. {
  60. delay_n10us(10);
  61. LCD_RS=0;         
  62. LCD_RW=0;         
  63. LCD_E=1;         
  64. LCD_DB=dat;
  65. delay_n10us(10);  
  66. LCD_E=0;
  67. delay_n10us(10);  
  68. }

  69. void LCD_write_data(uchar dat)
  70. {
  71. delay_n10us(10);
  72. LCD_RS=1;         
  73. LCD_RW=0;         
  74. LCD_E=1;         
  75. LCD_DB=dat;
  76. delay_n10us(10);
  77. LCD_E=0;
  78. delay_n10us(10);
  79. }

  80. void LCD_disp_char(uchar x,uchar y,uchar dat)
  81. {
  82.   uchar address;
  83.   if(y==1)
  84.          address=0x80+x;
  85.   else
  86.          address=0xc0+x;
  87.   LCD_write_command(address);
  88.   LCD_write_data(dat);
  89. }

  90. void LCD_disp_str(uchar x,uchar y,uchar *str)
  91. {
  92.   uchar address;
  93.   if(y==1)
  94.          address=0x80+x;
  95.   else
  96.          address=0xc0+x;
  97.   LCD_write_command(address);
  98.   while(*str!='\0')
  99.   {
  100.     LCD_write_data(*str);   
  101.     str++;
  102.   }
  103. }

  104. void delay_n10us(uint n)  
  105. {      
  106.         uint i;           
  107.         for(i=n;i>0;i--)   
  108.         {
  109.         _nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
  110.                 }
  111. }                                    

  112. void s_transstart(void)
  113. {   
  114.    DATA=1; SCK=0;                  
  115.    _nop_();
  116.    SCK=1;
  117.    _nop_();
  118.    DATA=0;
  119.    _nop_();
  120.    SCK=0;   
  121.    _nop_();_nop_();_nop_();
  122.    SCK=1;
  123.    _nop_();
  124.    DATA=1;        
  125.    _nop_();
  126.    SCK=0;        
  127. }

  128. void s_connectionreset(void)
  129. {   
  130.   unsigned char i;  
  131.   DATA=1; SCK=0;                    
  132.   for(i=0;i<9;i++)                  
  133.   {
  134.     SCK=1;
  135.     SCK=0;
  136.   }
  137.   s_transstart();                  
  138. }

  139. char s_write_byte(unsigned char value)
  140. {  
  141.   unsigned char i,error=0;   
  142.   for (i=0x80;i>0;i/=2)            
  143.   {  
  144.     if (i & value) DATA=1;         
  145.     else DATA=0;                        
  146.     SCK=1;                          
  147.     _nop_();_nop_();_nop_();      
  148.     SCK=0;
  149.   }
  150.   DATA=1;                           
  151.   SCK=1;                           
  152.   error=DATA;                       
  153.   _nop_();_nop_();_nop_();
  154.   SCK=0;
  155.   DATA=1;                           
  156.   return error;                    
  157. }

  158. char s_read_byte(unsigned char ack)  
  159. {  
  160.   unsigned char i,val=0;
  161.   DATA=1;                           
  162.   for (i=0x80;i>0;i/=2)            
  163.   { SCK=1;                       
  164.     if (DATA) val=(val | i);      
  165.         _nop_();_nop_();_nop_();        
  166.     SCK=0;              
  167.   }
  168.   if(ack==1)DATA=0;                 
  169.   else DATA=1;                     
  170.   _nop_();_nop_();_nop_();         
  171.   SCK=1;                           
  172.   _nop_();_nop_();_nop_();         
  173.   SCK=0;                 
  174.   _nop_();_nop_();_nop_();         
  175.   DATA=1;                           
  176.   return val;
  177. }

  178. char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
  179. {  
  180.   unsigned error=0;
  181.   unsigned int i;

  182.   s_transstart();                  
  183.   switch(mode){                     
  184.     case TEMP  : error+=s_write_byte(MEASURE_TEMP); break;
  185.     case HUMI  : error+=s_write_byte(MEASURE_HUMI); break;
  186.     default     : break;   
  187.   }
  188.   for (i=0;i<65535;i++) if(DATA==0) break;
  189.   if(DATA) error+=1;               
  190.   *(p_value)  =s_read_byte(ACK);   
  191.   *(p_value+1)=s_read_byte(ACK);   
  192.   *p_checksum =s_read_byte(noACK);  
  193.   return error;
  194. }
复制代码
完整单片机源码和proteus文件 气象参数.rar (111.09 KB, 售价: 3 工控币)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则