久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2796|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

51單片機實現(xiàn)大氣壓傳感器GY68測量程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:293035 發(fā)表于 2020-3-26 09:20 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
51單片機實現(xiàn)大氣壓傳感器GY68測量程序


單片機源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <math.h>    //Keil library
  4. #define uint unsigned int
  5. #define uchar unsigned char
  6. #define        BMP085_SlaveAddress   0xee          //定義器件在IIC總線中的從地址                              

  7. #define OSS 0        // Oversampling Setting (note: code is not set up to use other OSS values)
  8.                                                           
  9. typedef unsigned char  BYTE;
  10. typedef unsigned short WORD;

  11. sbit duoji = P1^2;
  12. sbit lcden = P2^1;
  13. sbit rs = P2^2;
  14. sbit key_1 = P3^4;
  15. sbit key_2 = P3^5;
  16. sbit key_3 = P3^6;
  17. sbit key_4 = P3^7;
  18. sbit SCL=P1^0;      //IIC時鐘引腳定義
  19. sbit SDA=P1^1;      //IIC數(shù)據(jù)引腳定義
  20. uchar count3;
  21. uchar ge,shi,bai,qian,wan,shiwan;           //顯示變量
  22. int  dis_data;
  23. short ac1;
  24. short ac2;
  25. short ac3;
  26. unsigned short ac4;
  27. unsigned short ac5;
  28. unsigned short ac6;
  29. short b1;
  30. short b2;
  31. short mb;
  32. short mc;
  33. short md;

  34. uchar code table1[]="Pressure:    HPa";
  35. uchar code table2[]="status: normal  ";
  36. uchar code table3[]="status: abnormal";
  37. uchar code table4[]="MQ7:      T:    ";
  38. uchar code table5[]="Revise success!!";
  39. uchar code table6[]="  Revise  Menu  ";

  40. void LCD_DISPLAY(uchar num); //LCD顯示

  41. void delay(uint z) //毫秒延時
  42. {
  43.         uint x,y;
  44.         for(x=z;x>0;x--)
  45.         for(y=110;y>0;y--);
  46. }



  47. //****************************LCD1602的初始化*******************************
  48. /**************************************************************************/


  49. void write_com(uchar com)//LCD寫字節(jié)
  50. {         
  51.         rs=0;
  52.         lcden=0;
  53.         P0=com;
  54.         delay(5);
  55.         lcden=1;
  56.         delay(5);
  57.         lcden=0;        
  58. }
  59.                
  60. void write_date(uchar date)//LCD讀字節(jié)
  61. {        
  62.         rs=1;
  63.         lcden=0;
  64.         P0=date;
  65.         delay(5);
  66.         lcden=1;
  67.         delay(5);
  68.         lcden=0;        
  69. }

  70. void lcd_sfm(uchar add,int date)//顯示位置和數(shù)字
  71. {
  72.         uchar qian,bai,shi,ge;
  73.         qian = date/1000;
  74.         bai  = date%1000/100;
  75.         shi  = date%100/10;
  76.         ge   = date%10;
  77.         write_com(0x80+add);
  78.         write_date(0x30+qian);
  79.         write_date(0x30+bai);
  80.         write_date(0x30+shi);
  81.         write_date(0x30+ge);
  82. }

  83. void SetCurPosition(uchar X, uchar Y)//設(shè)置光標(biāo)
  84. {
  85.         Y &= 0x01;
  86.         X &= 0x0F; // 限制X不能大于15,Y不能大于1
  87.         if (Y)
  88.         {
  89.           X |= 0xc0; // 當(dāng)要顯示第二行時地址碼:0xc0
  90.         }
  91.         X |= 0x80; // 第一行的地址碼:0x80
  92.         write_com(X); // 這里不檢測忙信號,發(fā)送地址碼
  93.         //write_com(0x02); //光標(biāo)歸位
  94.         write_com(0x0f); //關(guān)光標(biāo),閃爍
  95.        
  96. }

  97. void DisplayOneChar(uchar X,uchar Y,uchar DData)
  98. {                                               
  99.         Y&=1;                                               
  100.         X&=15;                                               
  101.         if(Y)X|=0x40;                                       
  102.         X|=0x80;                       
  103.         write_com(X);               
  104.         write_date(DData);
  105.        
  106. }       

  107. void conversion(long temp_data)  
  108. {  
  109.    
  110.     shiwan=temp_data/100000+0x30 ;
  111.     temp_data=temp_data%100000;   //取余運算
  112.     wan=temp_data/10000+0x30 ;
  113.     temp_data=temp_data%10000;   //取余運算
  114.           qian=temp_data/1000+0x30 ;
  115.     temp_data=temp_data%1000;    //取余運算
  116.     bai=temp_data/100+0x30   ;
  117.     temp_data=temp_data%100;     //取余運算
  118.     shi=temp_data/10+0x30    ;
  119.     temp_data=temp_data%10;      //取余運算
  120.     ge=temp_data+0x30;        
  121. }

  122. /**********************************************************************************************
  123. **                              BMP180初始化及測試函數(shù)
  124. **********************************************************************************************/
  125. void Delay5us()
  126. {
  127.     _nop_();_nop_();_nop_();_nop_();
  128.     _nop_();_nop_();_nop_();_nop_();
  129.         _nop_();_nop_();_nop_();_nop_();
  130.         _nop_();_nop_();_nop_();_nop_();
  131. }

  132. /**************************************
  133. 延時5毫秒(STC90C52RC@12M)
  134. 不同的工作環(huán)境,需要調(diào)整此函數(shù)
  135. 當(dāng)改用1T的MCU時,請調(diào)整此延時函數(shù)
  136. **************************************/
  137. void Delay5ms()
  138. {
  139.     WORD n = 560;

  140.     while (n--);
  141. }

  142. /**************************************
  143. 起始信號
  144. **************************************/
  145. void BMP085_Start()
  146. {
  147.     SDA = 1;                    //拉高數(shù)據(jù)線
  148.     SCL = 1;                    //拉高時鐘線
  149.     Delay5us();                 //延時
  150.     SDA = 0;                    //產(chǎn)生下降沿
  151.     Delay5us();                 //延時
  152.     SCL = 0;                    //拉低時鐘線
  153. }

  154. /**************************************
  155. 停止信號
  156. **************************************/
  157. void BMP085_Stop()
  158. {
  159.     SDA = 0;                    //拉低數(shù)據(jù)線
  160.     SCL = 1;                    //拉高時鐘線
  161.     Delay5us();                 //延時
  162.     SDA = 1;                    //產(chǎn)生上升沿
  163.     Delay5us();                 //延時
  164. }

  165. /**************************************
  166. 發(fā)送應(yīng)答信號
  167. 入口參數(shù):ack (0:ACK 1:NAK)
  168. **************************************/
  169. void BMP085_SendACK(bit ack)
  170. {
  171.     SDA = ack;                  //寫應(yīng)答信號
  172.     SCL = 1;                    //拉高時鐘線
  173.     Delay5us();                 //延時
  174.     SCL = 0;                    //拉低時鐘線
  175.     Delay5us();                 //延時
  176. }

  177. /**************************************
  178. 接收應(yīng)答信號
  179. **************************************/
  180. bit BMP085_RecvACK()
  181. {
  182.     SCL = 1;                    //拉高時鐘線
  183.     Delay5us();                 //延時
  184.     CY = SDA;                   //讀應(yīng)答信號
  185.     SCL = 0;                    //拉低時鐘線
  186.     Delay5us();                 //延時

  187.     return CY;
  188. }

  189. /**************************************
  190. 向IIC總線發(fā)送一個字節(jié)數(shù)據(jù)
  191. **************************************/
  192. void BMP085_SendByte(BYTE dat)
  193. {
  194.     BYTE i;

  195.     for (i=0; i<8; i++)         //8位計數(shù)器
  196.     {
  197.         dat <<= 1;              //移出數(shù)據(jù)的最高位
  198.         SDA = CY;               //送數(shù)據(jù)口
  199.         SCL = 1;                //拉高時鐘線
  200.         Delay5us();             //延時
  201.         SCL = 0;                //拉低時鐘線
  202.         Delay5us();             //延時
  203.     }
  204.     BMP085_RecvACK();
  205. }

  206. /**************************************
  207. 從IIC總線接收一個字節(jié)數(shù)據(jù)
  208. **************************************/
  209. BYTE BMP085_RecvByte()
  210. {
  211.     BYTE i;
  212.     BYTE dat = 0;

  213.     SDA = 1;                    //使能內(nèi)部上拉,準(zhǔn)備讀取數(shù)據(jù),
  214.     for (i=0; i<8; i++)         //8位計數(shù)器
  215.     {
  216.         dat <<= 1;
  217.         SCL = 1;                //拉高時鐘線
  218.         Delay5us();             //延時
  219.         dat |= SDA;             //讀數(shù)據(jù)               
  220.         SCL = 0;                //拉低時鐘線
  221.         Delay5us();             //延時
  222.     }
  223.     return dat;
  224. }

  225. //*********************************************************
  226. //讀出BMP085內(nèi)部數(shù)據(jù),連續(xù)兩個
  227. //*********************************************************
  228. short Multiple_read(uchar ST_Address)
  229. {   
  230.         uchar msb, lsb;
  231.         short _data;
  232.     BMP085_Start();                          //起始信號
  233.     BMP085_SendByte(BMP085_SlaveAddress);    //發(fā)送設(shè)備地址+寫信號
  234.     BMP085_SendByte(ST_Address);             //發(fā)送存儲單元地址
  235.     BMP085_Start();                          //起始信號
  236.     BMP085_SendByte(BMP085_SlaveAddress+1);         //發(fā)送設(shè)備地址+讀信號

  237.     msb = BMP085_RecvByte();                 //BUF[0]存儲
  238.     BMP085_SendACK(0);                       //回應(yīng)ACK
  239.     lsb = BMP085_RecvByte();     
  240.         BMP085_SendACK(1);                       //最后一個數(shù)據(jù)需要回NOACK

  241.     BMP085_Stop();                           //停止信號
  242.     Delay5ms();
  243.     _data = msb << 8;
  244.         _data |= lsb;       
  245.         return _data;
  246. }

  247. //*************************************************************
  248. long bmp085ReadPressure(void)
  249. {
  250.         long pressure = 0;

  251.     BMP085_Start();                   //起始信號
  252.     BMP085_SendByte(BMP085_SlaveAddress);   //發(fā)送設(shè)備地址+寫信號
  253.     BMP085_SendByte(0xF4);                  // write register address
  254.     BMP085_SendByte(0x34);                 // write register data for pressure
  255.     BMP085_Stop();                    //發(fā)送停止信號
  256.         delay(10);                              // max time is 4.5ms
  257.        
  258.         pressure = Multiple_read(0xF6);
  259.         pressure &= 0x0000FFFF;
  260.        
  261.         return pressure;       
  262.         //return (long) bmp085ReadShort(0xF6);
  263. }

  264. //**************************************************************

  265. //初始化BMP085,根據(jù)需要請參考pdf進行修改**************
  266. void Init_BMP085()
  267. {
  268.         ac1 = Multiple_read(0xAA);
  269.         ac2 = Multiple_read(0xAC);
  270.         ac3 = Multiple_read(0xAE);
  271.         ac4 = Multiple_read(0xB0);
  272.         ac5 = Multiple_read(0xB2);
  273.         ac6 = Multiple_read(0xB4);
  274.         b1 =  Multiple_read(0xB6);
  275.         b2 =  Multiple_read(0xB8);
  276.         mb =  Multiple_read(0xBA);
  277.         mc =  Multiple_read(0xBC);
  278.         md =  Multiple_read(0xBE);
  279. }

  280. //***********************************************************************
  281. void bmp085Convert()//bmp180轉(zhuǎn)換
  282. {
  283.         long up;
  284.         long x1, x2, b5, b6, x3, b3, p;
  285.         unsigned long b4, b7;
  286.         long  pressure;
  287.         float temp;
  288.         int pressure_int;

  289.         up = bmp085ReadPressure();
  290.         up = bmp085ReadPressure();  // 讀取壓強
  291.        
  292.   //*************
  293.        
  294.         b6 = b5 - 4000;
  295.         x1 = (b2 * (b6 * b6 >> 12)) >> 11;
  296.         x2 = ac2 * b6 >> 11;
  297.         x3 = x1 + x2;
  298.         b3 = (((long)ac1 * 4 + x3) + 2)/4;
  299.         x1 = ac3 * b6 >> 13;
  300.         x2 = (b1 * (b6 * b6 >> 12)) >> 16;
  301.         x3 = ((x1 + x2) + 2) >> 2;
  302.         b4 = (ac4 * (unsigned long) (x3 + 32768)) >> 15;
  303.         b7 = ((unsigned long) up - b3) * (50000 >> OSS);
  304.         if( b7 < 0x80000000)
  305.              p = (b7 * 2) / b4 ;
  306.            else  
  307.                     p = (b7 / b4) * 2;
  308.         x1 = (p >> 8) * (p >> 8);
  309.         x1 = (x1 * 3038) >> 16;
  310.         x2 = (-7357 * p) >> 16;
  311.         pressure = p + ((x1 + x2 + 3791) >> 4);
  312.         temp = (float)pressure / 100.0 + 0.5;//轉(zhuǎn)換為百帕 并四舍五入
  313.         pressure_int = (int)temp; //強制轉(zhuǎn)換
  314.         lcd_sfm(0x09,pressure_int);//顯示
  315.                                          
  316. }


  317. void init()
  318. {
  319.         lcden=0;   
  320.         write_com(0x38);                                        //打開顯示模式設(shè)置
  321.         write_com(0x0c);                                        //打開顯示,光標(biāo)等等設(shè)置未零
  322.         write_com(0x06);                                        //當(dāng)讀或?qū)懸粋字符后地址指針加一,且光標(biāo)加一,當(dāng)寫一個字符后整頻顯示左移,
  323.         write_com(0x01);                                        //清零指令
  324.         write_com(0x80);   
  325.        
  326.         TMOD = 0x01;
  327.         TH0 = (65536-100)/256;//100us進入一次中斷
  328.         TL0 = (65536-100)%256;
  329.         TR0 = 1;
  330.         ET0 = 1;
  331.         EA = 0;//開啟總中斷
  332.        
  333. }

  334. /**********************************************************************************************
  335. **                              TIMER0中斷服務(wù)子函數(shù)產(chǎn)生PWM
  336. **********************************************************************************************/
  337. uchar count = 0;
  338. uchar pwm = 15;
  339. void timer0()interrupt 1   using 0
  340. {       
  341.         TH0 = (65536-100)/256;
  342.         TL0 = (65536-100)%256;
  343.         count++;
  344.         if(count >= 200)
  345.         {
  346.                 count = 0;
  347.         }
  348.         if(count <= pwm) duoji = 1;
  349.         else             duoji = 0;
  350.        
  351. }

  352. /**********************************************************************************************
  353. **                                                              主函數(shù)
  354. **********************************************************************************************/
  355. int max_pressure = 910;//大氣壓閾值

  356. void main()
  357. {
  358.   delay(100);//開機延時
  359.         init();//初始化
  360.         Init_BMP085();//BMP初始化
  361.         //lcd_sfm(0x05,666);
  362.         LCD_DISPLAY(1);
  363.         LCD_DISPLAY(2);
  364.         while(1)
  365.         {
  366.                 bmp085Convert();
  367.                 delay(1000);
  368.         }
  369. }

  370. /********************************************************************************************
  371. *                                                                                                                                   LCD顯示函數(shù)
  372. ********************************************************************************************/
  373. void LCD_DISPLAY(uchar num) //LCD顯示
  374. {      
  375.         if(num == 1)
  376.         {
  377.                 //write_com(0x01);
  378.                 write_com(0x80);
  379.                 for(count3=0;count3<16;count3++)
  380.                 {
  381.                         write_date(table1[count3]);        //
  382.                         delay(5);
  383.                 }
  384.   }
  385.         if(num == 2)
  386. ……………………

  387. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
test.zip (62.13 KB, 下載次數(shù): 26)

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 五月天婷婷综合 | 精品亚洲一区二区三区 | 黄色一级片aaa | 精品丝袜在线 | 一级爱爱片 | 欧美日韩亚洲一区 | 欧美日韩高清在线观看 | 91亚洲国产| 51ⅴ精品国产91久久久久久 | 亚洲精品一 | 久久久精品影院 | 国产高清一区二区三区 | 综合久久综合久久 | 精品久久久久久久 | 国产久| 亚洲第1页 | 日韩av手机在线观看 | 国产高清一二三区 | 欧美精品中文字幕久久二区 | 精品国产一区二区三区成人影院 | 精品自拍视频 | 懂色av色香蕉一区二区蜜桃 | 正在播放国产精品 | 欧美国产精品一区二区三区 | 免费观看日韩精品 | 国产精品久久久久久亚洲调教 | 99久久久久 | 欧美一区二区三区在线 | 本地毛片 | 欧美日韩在线成人 | 国产亚洲一区二区精品 | 亚洲精选一区二区 | 天天操网 | 天天操网| 黑人性hd| 日韩国产欧美 | xxxxx黄色片 欧美一区免费 | 日韩久久久久 | 国产精品久久久久久久久久不蜜臀 | 久久久久国产一区二区三区四区 | 久久久精品网 |