找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2148|回复: 2
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
气象参数仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机气象参数检测源程序如下:
  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. }

  195. void calc_dht90(float *p_humidity ,float *p_temperature)

  196. { const float C1=-4.0;            
  197.   const float C2=+0.0405;         
  198.   const float C3=-0.0000028;        
  199.   const float T1=+0.01;            
  200.   const float T2=+0.00008;           

  201.   float rh=*p_humidity;            
  202.   float t=*p_temperature;           
  203.   float rh_lin;                    
  204.   float rh_true;                    
  205.   float t_C;                        

  206.   t_C=t*0.01 - 40;                  
  207.   rh_lin=C3*rh*rh + C2*rh + C1;     
  208.   rh_true=(t_C-25)*(T1+T2*rh)+rh_lin-3;  
  209.   if(rh_true>100)rh_true=100;      
  210.   if(rh_true<0.1)rh_true=0.1;      

  211.   *p_temperature=t_C;              
  212.   *p_humidity=rh_true;            
  213. }

  214. unsigned int Adc0832(unsigned char channel)            
  215. {
  216.     uchar i=0;
  217.     uchar j;
  218.     uint dat=0;
  219.                 uchar ndat=0;
  220.     if(channel==0)channel=2;
  221.     if(channel==1)channel=3;
  222.     ADDI=1;
  223.     _nop_();
  224.     _nop_();
  225.     ADCS=0;                                      
  226.     _nop_();
  227.     _nop_();
  228.     ADCLK=1;                                    
  229.     _nop_();
  230.     _nop_();
  231.     ADCLK=0;                                    
  232.     _nop_();
  233.     _nop_();
  234.     ADCLK=1;                                       
  235.     ADDI=channel&0x1;
  236.     _nop_();
  237.     _nop_();
  238.     ADCLK=0;                                       
  239.     _nop_();
  240.     _nop_();
  241.     ADCLK=1;                                       
  242.     ADDI=(channel>>1)&0x1;
  243.     _nop_();
  244.     _nop_();
  245.     ADCLK=0;                                       
  246.     ADDI=1;                                          
  247.     _nop_();
  248.     _nop_();
  249.     dat=0;
  250.     for(i=0;i<8;i++)
  251.     {
  252.         dat|=ADDO;                                 
  253.         ADCLK=1;
  254.         _nop_();
  255.         _nop_();
  256.         ADCLK=0;                                    
  257.         _nop_();
  258.         _nop_();
  259.         dat<<=1;
  260.         if(i==7)dat|=ADDO;
  261.     }  
  262.     for(i=0;i<8;i++)
  263.     {
  264.         j=0;
  265.         j=j|ADDO;                                    
  266.         ADCLK=1;
  267.         _nop_();
  268.         _nop_();
  269.         ADCLK=0;                                   
  270.         _nop_();
  271.         _nop_();
  272.         j=j<<7;
  273.         ndat=ndat|j;
  274.         if(i<7)ndat>>=1;
  275.     }
  276.     ADCS=1;                                          
  277.     ADCLK=0;                                       
  278.     ADDO=1;                                          
  279.     dat<<=8;
  280.     dat|=ndat;
  281.     return(dat);            
  282. }

  283. void main(void)
  284. {
  285.                                 value humi_val,temp_val;
  286.                                 int vary;
  287.         unsigned char error,checksum;
  288.         unsigned int wendu,shidu;
  289.                                 unsigned int temp;
  290.                                 float  press;         
  291.         LCD_init();        
  292.         s_connectionreset();
  293.         LCD_disp_str(0,1,"TE");
  294.                                 LCD_disp_str(9,1,"P");
  295.                                 LCD_disp_str(4,2,"RH");
  296.         LCD_disp_str(2,1,"TTT.TC");
  297.         LCD_disp_str(6,2,"RRR.R%");
  298.               LCD_disp_str(10,1,"PPP.Pk");
  299.         delay_n10us(2000);     
  300.         while(1)
  301.         {                  
  302.                                                         p=1;
  303.                                                         getdata=Adc0832(0);                                                        
  304. ……………………

  305. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
气象参数.rar (111.09 KB, 下载次数: 70)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏2 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1036115 发表于 2022-6-21 17:34 | 只看该作者
老哥,有点看不懂那个仿真。能否指点指点
回复

使用道具 举报

板凳
ID:1070823 发表于 2023-4-12 15:08 | 只看该作者
楼主keil用的哪个版本,为啥我一打开就卡住了
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表