找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1762|回复: 4
收起左侧

BMP180设置压力范围控制led 在某一气压下不同的led灯闪烁

[复制链接]
ID:164979 发表于 2017-5-29 20:14 | 显示全部楼层 |阅读模式

我想设置在某一气压下不同的led灯闪烁,但是不好使,麻烦大神帮忙修改

  1. #define   uchar unsigned char
  2. #define   uint unsigned int        
  3. #define   DataPort P0   
  4. sbit      SCL=P2^3;     
  5. sbit      SDA=P2^4;     
  6. sbit      LCM_RS=P1^0;                 
  7. sbit      LCM_RW=P1^1;               
  8. sbit      LCM_EN=P2^5;  
  9. sbit led1=P1^5;
  10. sbit led2=P1^6;
  11. sbit led3=P1^7;
  12. #define        BMP180_SlaveAddress   0xee                                    
  13. #define OSS 0        // Oversampling Setting (note: code is not set up to use other OSS values)
  14.                                                            
  15. typedef unsigned char  BYTE;
  16. typedef unsigned short WORD;
  17. uint pressurewarn;           
  18. uchar ge,shi,bai,qian,wan,shiwan;           
  19. int  dis_data;                              
  20. short ac1;
  21. short ac2;
  22. short ac3;
  23. unsigned short ac4;
  24. unsigned short ac5;
  25. unsigned short ac6;
  26. short b1;
  27. short b2;
  28. short mb;
  29. short mc;
  30. short md;
  31. void delay(unsigned int k);
  32. void InitLcd();                           
  33. void WriteDataLCM(uchar dataW);
  34. void WriteCommandLCM(uchar CMD,uchar Attribc);
  35. void DisplayOneChar(uchar X,uchar Y,uchar DData);
  36. void conversion(long temp_data);
  37. //void warn(uint pressure);
  38. void  Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data);  
  39. uchar Single_Read(uchar REG_Address);                                    
  40. void  Multiple_Read(uchar,uchar);                                          
  41. void Delay5us();
  42. void Delay5ms();
  43. void BMP180_Start();
  44. void BMP180_Stop();
  45. void BMP180_SendACK(bit ack);
  46. bit  BMP180_RecvACK();
  47. void BMP180_SendByte(BYTE dat);
  48. BYTE BMP180_RecvByte();
  49. void BMP180_ReadPage();
  50. void BMP180_WritePage();
  51. void conversion(long temp_data)  
  52. {  
  53.    
  54.     shiwan=temp_data/100000+0x30 ;
  55.     temp_data=temp_data%100000;   
  56.     wan=temp_data/10000+0x30 ;
  57.     temp_data=temp_data%10000;   
  58.         qian=temp_data/1000+0x30 ;
  59.     temp_data=temp_data%1000;   
  60.     bai=temp_data/100+0x30   ;
  61.     temp_data=temp_data%100;     
  62.     shi=temp_data/10+0x30    ;
  63.     temp_data=temp_data%10;      
  64.     ge=temp_data+0x30;         
  65. }

  66. void delay(unsigned int k)        
  67. {                                                
  68. unsigned int i,j;                                
  69. for(i=0;i<k;i++)
  70. {                        
  71. for(j=0;j<121;j++)                        
  72. {;}}                                                
  73. }
  74. void WaitForEnable(void)        
  75. {                                       
  76. DataPort=0xff;               
  77. LCM_RS=0;LCM_RW=1;_nop_();
  78. LCM_EN=1;_nop_();_nop_();
  79. while(DataPort&0x80);        
  80. LCM_EN=0;                                
  81. }                                       
  82. void WriteCommandLCM(uchar CMD,uchar Attribc)
  83. {                                       
  84. if(Attribc)WaitForEnable();        
  85. LCM_RS=0;LCM_RW=0;_nop_();
  86. DataPort=CMD;_nop_();        
  87. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  88. }                                       
  89. void WriteDataLCM(uchar dataW)
  90. {                                       
  91. WaitForEnable();               
  92. LCM_RS=1;LCM_RW=0;_nop_();
  93. DataPort=dataW;_nop_();        
  94. LCM_EN=1;_nop_();_nop_();LCM_EN=0;
  95. }               
  96. void InitLcd()                                
  97. {                        
  98. WriteCommandLCM(0x38,1);        
  99. WriteCommandLCM(0x08,1);        
  100. WriteCommandLCM(0x01,1);        
  101. WriteCommandLCM(0x06,1);        
  102. WriteCommandLCM(0x0c,1);
  103. }                        
  104. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  105. {                                                
  106. Y&=1;                                                
  107. X&=15;                                                
  108. if(Y)X|=0x40;                                       
  109. X|=0x80;                        
  110. WriteCommandLCM(X,0);               
  111. WriteDataLCM(DData);               
  112. }                                                
  113. void Delay5us()
  114. {
  115.     _nop_();_nop_();_nop_();_nop_();
  116.     _nop_();_nop_();_nop_();_nop_();
  117.         _nop_();_nop_();_nop_();_nop_();
  118.         _nop_();_nop_();_nop_();_nop_();
  119. }
  120. void Delay5ms()
  121. {
  122.     WORD n = 560;
  123.     while (n--);
  124. }
  125. void BMP180_Start()
  126. {
  127.     SDA = 1;                     
  128.   SCL = 1;                    
  129.    Delay5us();                 
  130.     SDA = 0;                    
  131.   Delay5us();               
  132.     SCL = 0;                    
  133. }
  134. void BMP180_Stop()
  135. {
  136.     SDA = 0;                       
  137.   SCL = 1;                  
  138.     Delay5us();               
  139.     SDA = 1;                    
  140.   Delay5us();               
  141. }
  142. void BMP180_SendACK(bit ack)
  143. {
  144.     SDA = ack;                 
  145.   SCL = 1;                     
  146.    Delay5us();               
  147.     SCL = 0;                    
  148.   Delay5us();               
  149. }
  150. bit BMP180_RecvACK()
  151. {
  152.     SCL = 1;                     
  153. Delay5us();               
  154.     CY = SDA;                  
  155.    SCL = 0;                     
  156.     Delay5us();               
  157.     return CY;
  158. }
  159. void BMP180_SendByte(BYTE dat)
  160. {
  161.     BYTE i;
  162.     for (i=0; i<8; i++)         
  163.     {
  164.         dat <<= 1;            
  165.         SDA = CY;              
  166.         SCL = 1;                     
  167.    Delay5us();            
  168.         SCL = 0;                     
  169.     Delay5us();            
  170.     }
  171.     BMP180_RecvACK();
  172. }
  173. BYTE BMP180_RecvByte()
  174. {
  175.     BYTE i;
  176.     BYTE dat = 0;
  177.     SDA = 1;                  
  178.     for (i=0; i<8; i++)        
  179.     {
  180.         dat <<= 1;
  181.         SCL = 1;                 
  182.    Delay5us();            
  183.         dat |= SDA;                     
  184.         SCL = 0;                    
  185.      Delay5us();            
  186.     }
  187.     return dat;
  188. }
  189. /*

  190. void Single_Write(uchar SlaveAddress,uchar REG_Address,uchar REG_data)
  191. {
  192.     BMP180_Start();                  
  193.     BMP180_SendByte(SlaveAddress);     
  194.   BMP180_SendByte(REG_Address);   
  195.     BMP180_SendByte(REG_data);         
  196. BMP180_Stop();                  
  197. */
  198. /*
  199. uchar Single_Read(uchar REG_Address)
  200. {  uchar REG_data;
  201.     BMP180_Start();                          
  202.     BMP180_SendByte(BMP180_SlaveAddress);           
  203.   BMP180_SendByte(REG_Address);                  
  204.     BMP180_Start();                        
  205.     BMP180_SendByte(BMP180_SlaveAddress+1);        
  206.    REG_data=BMP180_RecvByte();                  
  207.       BMP180_SendACK(1);   
  208.         BMP180_Stop();                           
  209.     return REG_data;
  210. }
  211. */
  212. short Multiple_read(uchar ST_Address)
  213. {   
  214.         uchar msb, lsb;
  215.         short _data;
  216.     BMP180_Start();                        
  217.     BMP180_SendByte(BMP180_SlaveAddress);     
  218.    BMP180_SendByte(ST_Address);            
  219.     BMP180_Start();                        
  220.     BMP180_SendByte(BMP180_SlaveAddress+1);      
  221.     msb = BMP180_RecvByte();               
  222.     BMP180_SendACK(0);                     
  223.     lsb = BMP180_RecvByte();     
  224.         BMP180_SendACK(1);                       
  225.     BMP180_Stop();                          
  226.     Delay5ms();
  227.     _data = msb << 8;
  228.         _data |= lsb;        
  229.         return _data;
  230. }
  231. long bmp180ReadTemp(void)
  232. {
  233.     BMP180_Start();                 
  234.     BMP180_SendByte(BMP180_SlaveAddress);   
  235.   BMP180_SendByte(0xF4);                 
  236.     BMP180_SendByte(0x2E);              
  237.     BMP180_Stop();                        
  238.   delay(10);        
  239.         
  240.         return (long) Multiple_read(0xF6);
  241. }
  242. long bmp180ReadPressure(void)
  243. {
  244.         long pressure = 0;
  245.     BMP180_Start();                  
  246.     BMP180_SendByte(BMP180_SlaveAddress);     
  247.    BMP180_SendByte(0xF4);                  
  248.     BMP180_SendByte(0x34);                 
  249.     BMP180_Stop();                        
  250.   delay(10);                              
  251.         
  252.         pressure = Multiple_read(0xF6);
  253.         pressure &= 0x0000FFFF;
  254.         pressurewarn=pressure;
  255.         return pressurewarn;        
  256.       
  257. }

  258. void Init_BMP180()
  259. {
  260.         ac1 = Multiple_read(0xAA);
  261.         ac2 = Multiple_read(0xAC);
  262.         ac3 = Multiple_read(0xAE);
  263.         ac4 = Multiple_read(0xB0);
  264.         ac5 = Multiple_read(0xB2);
  265.         ac6 = Multiple_read(0xB4);
  266.         b1 =  Multiple_read(0xB6);
  267.         b2 =  Multiple_read(0xB8);
  268.         mb =  Multiple_read(0xBA);
  269.         mc =  Multiple_read(0xBC);
  270.         md =  Multiple_read(0xBE);
  271. }
  272. void bmp180Convert()
  273. {
  274.         //long ut;
  275.         long up;
  276.         long x1, x2, b5, b6, x3, b3, p;
  277.         unsigned long b4, b7;
  278.        // long  temperature;
  279.         long  pressure;
  280.         
  281.        // ut = bmp180ReadTemp();
  282.        // ut = bmp180ReadTemp();           
  283.         //up = bmp180ReadPressure();
  284.         up = bmp180ReadPressure();  
  285.         
  286.       /*  x1 = ((long)ut - ac6) * ac5 >> 15;
  287.         x2 = ((long) mc << 11) / (x1 + md);
  288.         b5 = x1 + x2;
  289.          temperature = (b5 + 8) >> 4;

  290.          conversion(temperature);
  291.          DisplayOneChar(0,0,'W');      
  292.          DisplayOneChar(1,0,'e');
  293.          DisplayOneChar(2,0,'n');
  294.          DisplayOneChar(3,0,'D');
  295.          DisplayOneChar(4,0,'u');
  296.      DisplayOneChar(5,0,':');
  297.      DisplayOneChar(7,0,bai);      
  298.      DisplayOneChar(8,0,shi);
  299.      DisplayOneChar(9,0,'.');
  300.          DisplayOneChar(10,0,ge);
  301.          DisplayOneChar(11,0,0XDF);   
  302.          DisplayOneChar(12,0,'C');    */
  303.          
  304.    
  305.         
  306.         b6 = b5 - 4000;
  307.         x1 = (b2 * (b6 * b6 >> 12)) >> 11;
  308.         x2 = ac2 * b6 >> 11;
  309.         x3 = x1 + x2;
  310.         b3 = (((long)ac1 * 4 + x3) + 2)/4;
  311.         x1 = ac3 * b6 >> 13;
  312.         x2 = (b1 * (b6 * b6 >> 12)) >> 16;
  313.         x3 = ((x1 + x2) + 2) >> 2;
  314.         b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  315.         b7 = ((unsigned long) up - b3) * (50000 >> OSS);
  316.         if( b7 < 0x80000000)
  317.              p = (b7 * 2) / b4 ;
  318.            else  
  319.                     p = (b7 / b4) * 2;
  320.         x1 = (p >> 8) * (p >> 8);
  321.         x1 = (x1 * 3038) >> 16;
  322.         x2 = (-7357 * p) >> 16;
  323.          pressure = p + ((x1 + x2 + 3791) >> 4);
  324.          conversion(pressure);
  325.      DisplayOneChar(0,1,'Q');   
  326.          DisplayOneChar(1,1,'i');
  327.          DisplayOneChar(2,1,'Y');
  328.          DisplayOneChar(3,1,'a');
  329.      DisplayOneChar(5,1,':');
  330.          DisplayOneChar(6,1,shiwan);
  331.          DisplayOneChar(7,1,wan);   
  332.      DisplayOneChar(8,1,qian);
  333.      DisplayOneChar(9,1,'.');
  334.      DisplayOneChar(10,1,bai);
  335.      DisplayOneChar(11,1,shi);
  336.          DisplayOneChar(12,1,'K');  
  337.          DisplayOneChar(13,1,'p');
  338.          DisplayOneChar(14,1,'a');
  339. }
  340. void Warn(uint pressurewarn)  
  341. {  
  342.   if(pressurewarn==199.97)  
  343.   {
  344.      
  345.      led2=0;
  346.      delay(500);
  347.      led2=1;
  348.      delay(500);     
  349.   }     
  350. if(pressurewarn>=199.88)     
  351.   {
  352.   
  353.    led3=1;
  354.    delay(500);
  355.    led3=0;
  356.    delay(500);
  357.   }   

  358.   if(pressurewarn<=99.99)  
  359.   {   
  360.    led1=0;
  361.    delay(500);
  362.    led1=1;
  363.    delay(500);
  364.   }
  365. }
  366. void main()
  367. {

  368.     delay(50);                                          
  369.     InitLcd();                       
  370. Init_BMP180();               
  371.    while(2)                        
  372.    {
  373.      bmp180Convert();     
  374.      delay(1000);
  375.      Warn(pressurewarn);
  376.    }
  377. }
复制代码
回复

使用道具 举报

ID:164979 发表于 2017-5-29 20:15 | 显示全部楼层
无论数值改成多少,一直都是led3在闪
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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