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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4328|回復: 2
收起左側

單片機壓力傳感器的實時監測和報警程序

[復制鏈接]
ID:588689 發表于 2019-7-23 14:47 | 顯示全部樓層 |閱讀模式
最近因一臺消防控制系統設備需加泡沫罐檢漏功能,所以專門做了單片機檢測壓力傳感器電流值,做AD轉換,進行實時處理,實現對壓力傳感器的實時監測和報警功能,原理圖如圖片所示,程序如附件所示。
無標題.png

單片機源程序如下:
  1. #include <REG51F.H>
  2. #include <stdio.h>
  3. #include <intrins.h>
  4. #define LEAK_chg 320 //泄漏判斷靈敏度
  5. #define ADD_chg 100  //加液判斷靈敏度
  6. #define dat_yu 10  //抖動變量

  7. /*********************
  8. *   基本命令宏定義   *
  9. *********************/
  10. #define     HZ_16X16                0XF0        //固定處: 顯示16X16點陣國標漢字命令
  11. #define     ASCII_8X8               0XF1        //固定處: 顯示8X8ASCII字符命令
  12. #define     SINGLE_DOT              0XF2        //任意點: 顯示命令
  13. #define     BYTE_DOT                0XF3        //字節處: 顯示點陣命令  
  14. #define     SCREEN_CLEAR            0XF4        //整屏清屏命令   
  15. #define     ASCII_8X16              0XF9        //固定處: 顯示8X16ASCII字符命令
  16. #define     ALL_TOGGLE              0XFA        //反白顯示命令  
  17. #define     CURSOR_LENGTH           0XFB        //光標: 開關及類型設置命令
  18. #define     MOVE_SPEED              0XFC        //調整移動速度命令
  19. #define     PICTURE_DISP            0XFD        //畫圖片命令  
  20. #define     SCREEN_ONOFF            0XFE        //屏幕開命令
  21. #define     POWER_SAVE              0XFF        //系統省電命令

  22. #define     ASCII_5X8               0XE0        //固定處: 顯示5X8ASCII字符命令
  23. #define     NUMBER_3X5              0XE1        //固定處: 顯示3X5數字及大寫字母命令
  24. #define     ASCII_6X12              0XE2        //固定處: 顯示6X12ASCII命令
  25. #define     NUMBER_9X16             0XE3        //固定處: 顯示9X16數字命令
  26. #define     CURSOR_LOC              0XE4        //光標: 位置設置命令   
  27. #define     BACK_TOGGLE             0XE5        //背光取反命令  
  28. #define     CONTRAST_GRADIENT       0XE6        //對比度調整命令
  29. #define     UART_BAUDRATE           0XE8        //UART波特率設置命令
  30. #define     STR_8X16                0XE9        //固定處: 顯示16X16中文和8X16ASCII混合字符串命令
  31. #define     HZ_16X16_LOC            0XEA        //任意點: 顯示16X16中文字符命令  
  32. #define     STR_8X16_LOC            0XEB        //任意點: 顯示16X16中文和8X16ASCII混合字符串命令
  33. #define     HZ_16X16_CUR            0XEC        //光標處: 顯示16X16點陣的中文字符命令
  34. #define     STR_8X16_CUR            0XED        //光標處: 顯示中文和8X16ASCII混合字符串命令
  35. #define     TEMPERATURE_SET         0XEE        //設置溫度補償開關和系數命令
  36. #define     SOFT_RESET              0XEF        //復位命令

  37. #define     ASCII_5X8_CUR           0XD0        //光標處: 顯示一個5X8ASCII字符命令
  38. #define     ASCII_8X8_CUR           0XD1        //光標處: 顯示一個8X8ASCII字符命令
  39. #define     ASCII_6X12_CUR          0XD2        //光標處: 顯示一個6X12ASCII命令
  40. #define     NUMBER_9X16_CUR         0XD3        //光標處: 顯示一個9X16數字命令
  41. #define     NUMBER_3X5_CUR          0XD4        //光標處: 顯示一個3X5數字和大寫字母命令
  42. #define     STR_ASCII_5X8_CUR       0XD5        //光標處: 顯示一5X8ASCII字符串命令
  43. #define     STR_NUMBER_3X5_CUR      0XD6        //光標處: 顯示3X5數字和大寫字母字符串命令
  44. #define     STR_6X12_CUR            0XD7        //光標處: 顯示12X12中文和6X12ASCII混合字符串命令
  45. #define     STR_NUMBER_9X16_CUR     0XD8        //光標處: 顯示9X16數字字符串命令
  46. #define     ASCII_8X16_CUR          0XD9        //光標處: 顯示一個8X16ASCII字符命令
  47. #define     STR_ASCII_8X8_CUR       0XDA        //光標處: 顯示8X8ASCII字符串命令
  48. #define     STR_ASCII_5X8_LOC       0XDB        //任意點: 顯示5X8ASCII字符串命令
  49. #define     STR_6X12_LOC            0XDC        //任意點: 顯示12X12中文和6X12ASCII混合字符串命令
  50. #define     STR_NUMBER_9X16_LOC     0XDD        //任意點: 顯示9X16數字字符串命令
  51. #define     STR_NUMBER_3X5_LOC      0XDE        //任意點: 顯示3X5數字和大寫字母字符串命令
  52. #define     STR_ASCII_8X8_LOC       0XDF        //任意點: 顯示8X8ASCII字符串命令

  53. #define     ASCII_5X8_LOC           0XC0        //任意點: 顯示5X8ASCII字符命令
  54. #define     ASCII_8X8_LOC           0XC1        //任意點: 顯示8X8ASCII字符命令
  55. #define     ASCII_6X12_LOC          0XC2        //任意點: 顯示6X12ASCII字符命令
  56. #define     NUMBER_9X16_LOC         0XC3        //任意點: 顯示9X16數字字符命令
  57. #define     NUMBER_3X5_LOC          0XC4        //任意點: 顯示3X5數字和大寫字母字符命令
  58. #define     DRAWLINE                0XC5        //任意點: 畫線
  59. #define     AREA_MOVE               0XC6        //任意指定: 區域塊移位
  60. #define     AREA_DATA               0XC7        //任意指定: 區域塊顯示數據 清零/全亮/反顯
  61. #define     AREA_FLASH              0XC8        //任意指定: 區域塊顯示數據自動閃爍
  62. #define     ASCII_8X16_LOC          0XC9        //任意點: 顯示8X16ASCII字符命令
  63. #define     RESERVE_01              0XCA        //模塊內部預留命令,請勿使用
  64. #define     KEYBOARD                0XCB        //內置鍵盤開關命令
  65. #define     RESERVE_02              0XCC        //模塊內部預留命令,請勿使用
  66. #define     HZ_FORM                 0XCD        //設置中文和半角ASCII放大字體命令
  67. #define     GET_TEMP                0XCE        //獲取環境溫度命令
  68. #define     RESERVE_03              0XCF        //模塊內部預留命令,請勿使用

  69. #define     HZ_12X12                0XB0        //固定處: 顯示12X12點陣國標漢字命令
  70. #define     RESERVE_04              0XB1        //模塊內部預留命令,請勿使用
  71. #define     RESERVE_05              0XB2        //模塊內部預留命令,請勿使用
  72. #define     RESERVE_06              0XB3        //模塊內部預留命令,請勿使用
  73. #define     RESERVE_07              0XB4        //模塊內部預留命令,請勿使用
  74. #define     BACK_ONOFF              0XB5        //背光開關命令
  75. #define     RESERVE_08              0XB6        //模塊內部預留命令,請勿使用
  76. #define     RESERVE_09              0XB7        //模塊內部預留命令,請勿使用
  77. #define     RESERVE_10              0XB8        //模塊內部預留命令,請勿使用
  78. #define     STR_6X12                0XB9        //固定處: 顯示12X12中文和6X12ASCII混合字符串命令
  79. #define     HZ_12X12_LOC            0XBA        //任意點: 顯示12X12中文字符命令
  80. #define     NOP                     0XBB        //空轉命令
  81. #define     HZ_12X12_CUR            0XBC        //光標處: 顯示12X12點陣的中文字符命令
  82. #define     RESERVE_11              0XBD        //模塊內部預留命令,請勿使用
  83. #define     RESERVE_12              0XBE        //模塊內部預留命令,請勿使用
  84. #define     RESERVE_13              0XBF        //模塊內部預留命令,請勿使用

  85. sbit AMXR=P2^3;        //  禁止ALE

  86. unsigned int n0,n1,n2,n3,n4;
  87. unsigned int SBMF;

  88. unsigned int ad_data1 , ad_data2 , ccc1 , ccc2;


  89. unsigned char  tr_rx;
  90. unsigned char  rx[9] , rec;//發送、接收緩存 計數
  91. unsigned int rec_tim;


  92. unsigned char prefz;//壓力采樣峰谷值判斷計數


  93. unsigned int pressmax;//壓力峰谷值采樣數組
  94. unsigned int pressmin;//壓力谷值采樣數組
  95. unsigned int D_dat,avedat,avedatlast;//LCD顯示最大值最小值

  96. unsigned int pressph[2];
  97. unsigned long press1p;//壓力1采樣平均值
  98. unsigned long press2p;//壓力2采樣平均值
  99. unsigned char bj,bj_jc; //泄漏報警標識 bj=1泄漏報警 bj=2加液過程 bj=3加液結束  bj=4進行噴放 bj=5噴放結束 bj=6停止檢測 bj=7開始檢測
  100. unsigned char cgf;//傳感器閥標識 0:傳感器閥關 1:傳感器閥開

  101. void max126(unsigned int ch);   //max126 AD 轉換
  102. void Value(); //加液判斷
  103. void DP();//數據處理

  104. void X5045wr1(unsigned char a);  //寫X5045指令 a:指令
  105. void X5045wr2(unsigned int a,unsigned char b) ; //寫X5045存儲器 a:數據 b:起始地址
  106. void X5045wr3(unsigned char a);  //寫X5045寄存器    a:寄存器數據
  107. unsigned char X5045rd1(); //讀X5045寄存器 c:命令 d:讀長度(位數)
  108. unsigned int X5045rd2(unsigned char c);  //讀X5045存儲器 c:起始地址

  109. void BCD_chg(unsigned int dat1,unsigned char m,unsigned char n); //BCD碼轉換,m行    n 列
  110. void LCD(void);  //液晶顯示初始化
  111. void LCD_DISPLAY(unsigned int disdat1,unsigned int disdat2,unsigned int disdat3,unsigned int disdat4);//LCD顯示



  112. //********************
  113. //延時函數1ms 100us
  114. //********************
  115. void Delay_1ms(unsigned int j)   //對于11.0592MHz時鐘延時1ms
  116. {
  117.     unsigned char i,k;
  118.     while(j--)
  119.     {
  120.         for(k=0;k<12;k++)
  121.         for(i=0;i<125;i++)
  122.         {}
  123.     }
  124. }
  125. //*********************
  126. //串口方式讀寫數據
  127. //*********************

  128. void put_char(unsigned char ch)
  129. {   
  130.     SBUF = ch;  
  131.     while( TI == 0 );           //查詢法
  132.     TI = 0;
  133. }

  134. unsigned char get_char(void)
  135. {
  136.     unsigned char ch;
  137.     while(RI==0);
  138.     ch=SBUF;
  139.     RI=0;
  140.     return ch;
  141. }
  142. /*****************************************************/
  143. /***********************液晶屏基本設置函數************/
  144. /*****************************************************/
  145. /*************************************************************
  146. 函數名稱:Screen_Clear
  147. 函數功能:整屏清屏
  148. 調用函數:NO
  149. 被調函數:NO
  150. 輸入參數:NO
  151. 輸出參數:NO
  152. 函數返回:NO
  153. 其他說明:NO     
  154. *************************************************************/
  155. void Screen_Clear(void)
  156. {
  157.     unsigned char ch;                       
  158.     put_char(SCREEN_CLEAR);                              //0xE3 行位置0-7 列位置0-25 ASC2字符代碼 9*16 0-9數字
  159.     ch=get_char();
  160.     while(ch!=0xCC);    //等待返回值???
  161. }

  162. /*************************************************************
  163. 函數名稱:Back_Toggle
  164. 函數功能:背光開關
  165. 調用函數:NO
  166. 被調函數:NO
  167. 輸入參數:NO
  168. 輸出參數:NO
  169. 函數返回:NO
  170. 其他說明:發送一次E5命令,打開背光,在發送一次E5命令,關閉背光
  171. *************************************************************/
  172. void Back_Toggle(void)
  173. {
  174.     unsigned char ch;
  175.     put_char(BACK_TOGGLE);
  176.     ch=get_char();
  177.     while(ch!=0xCC);    //等待返回值???
  178. }

  179. /********************************************************************************/
  180. /**************************    液晶屏漢字顯示函數    ****************************/
  181. /********************************************************************************/
  182. /*************************************************************
  183. 函數名稱:Screen_Onoff
  184. 函數功能:鍵盤開關命令
  185. 調用函數:NO
  186. 被調函數:NO
  187. 輸入參數:Switch-開關(0/1)
  188. 輸出參數:NO
  189. 函數返回:NO
  190. 其他說明:NO
  191. *************************************************************/
  192. void Screen_Onoff(unsigned char Switch)
  193. {
  194.     unsigned char ch;
  195.     put_char(SCREEN_ONOFF);
  196.     put_char(Switch);
  197.     put_char(02);
  198.     ch=get_char();
  199.     while(ch!=0xCC);    //等待返回值???
  200. }

  201. /********************************************************************************/
  202. /**************************    液晶屏數字顯示函數    ****************************/
  203. /********************************************************************************/


  204. /*************************************************************
  205. 函數名稱:Number_9x16
  206. 函數功能:在指定位置顯示一個9X16數字
  207. 調用函數:NO
  208. 被調函數:NO
  209. 輸入參數:Y-行數(0-3),X-列數(00-13), *S-顯示ASCII字符  
  210. 輸出參數:NO
  211. 函數返回:NO
  212. 其他說明:NO
  213. *************************************************************/
  214. void Number_9x16(unsigned char Y, unsigned char X, unsigned char s)
  215. {
  216.     unsigned char ch;
  217.     put_char(ASCII_8X16);
  218.     put_char(Y);
  219.     put_char(X);
  220.     put_char(s);               // 顯示字符
  221.     ch=get_char();
  222.     while(ch!=0xCC);    //等待返回值???
  223. }

  224. /********************************************************************************/
  225. /************************** 液晶屏ASCII字符顯示函數  ****************************/
  226. /********************************************************************************/

  227. /********************************************************************************/
  228. /**************************  液晶屏混合字符顯示函數  ****************************/
  229. /********************************************************************************/


  230. /*************************************************************
  231. 函數名稱:Str_8x16
  232. 函數功能:在指定位置顯示16X16中文和8X16ASCII字符串
  233. 調用函數:NO
  234. 被調函數:NO
  235. 輸入參數:Y-行數(0-3),X-列數(0-15), *S-顯示內容
  236. 輸出參數:NO
  237. 函數返回:NO
  238. 其他說明:NO
  239. *************************************************************/
  240. void Str_8x16(unsigned char Y, unsigned char X, unsigned char *s)
  241. {
  242.     unsigned char ch;
  243.     put_char(STR_8X16);
  244.     put_char(Y);
  245.     put_char(X);
  246.     while (*s)                          
  247.     {
  248.         put_char(*s);                 // 顯示字符
  249.         s++;
  250.     }
  251.     put_char(0X00);                   //結束符
  252.     ch=get_char();
  253.     while(ch!=0xCC);    //等待返回值???
  254. }



  255. void X5045wr1(unsigned char a)  //寫X5045指令  a:指令
  256. {
  257.     unsigned char i ,j,c;
  258.     T0=1;
  259.     T1=1;T2=0;
  260.     T1=0;
  261.     c=6;                            //X5045使能寫
  262.     for(i=0;i!=8;i++)
  263.     {
  264.         if((a & 0x80) == 0x80)
  265.         {
  266.             WR = 1;
  267.             T2 = 1;
  268.         }
  269.         if((a & 0x80) == 0)
  270.         {
  271.             WR = 0;
  272.             T2 = 1;
  273.         }
  274.         a = a << 1;
  275.         for(j=0;j!=10;j++){}
  276.         T2 = 0;
  277.     }
  278.     T1=1;                    //X5045禁止寫
  279. }

  280. void X5045wr3(unsigned char a)  //寫X5045寄存器 a:寄存器數據
  281. {
  282.     unsigned char i  , c;
  283.     c=0x01;
  284.     T0=1;
  285.     T1=1;
  286.     T2=0;      
  287.     T1=0;                                   //X5045使能寫
  288.     for(i=0;i!=8;i++)
  289.     {
  290.         if((c & 0x80 )== 0x80)
  291.         {
  292.             WR = 1;
  293.             T2 = 1;
  294.         }        
  295.         if((c & 0x80) == 0)
  296.         {
  297.             WR = 0;
  298.             T2 = 1;
  299.         }
  300.         c = c << 1;
  301.         T2 = 0;
  302.     }
  303.    
  304.     for(i=0;i!=8;i++)
  305.     {
  306.         if((a & 0x80 )== 0x80)
  307.         {
  308.         WR = 1;
  309.         T2 = 1;
  310.         }
  311.         if((a & 0x80) == 0)
  312.         {
  313.             WR = 0;
  314.             T2 = 1;
  315.         }
  316.         a = a << 1;
  317.         T2 = 0;
  318.     }
  319.     T1=1;           //X5045禁止寫
  320. }


  321. unsigned char X5045rd1() //讀X5045寄存器 c:命令 d:讀長度(位數)
  322. {
  323.     unsigned char i,c,j,dat;
  324.     c=0x05;
  325.     T0=1;
  326.     T1=1;
  327.     T2=0;         //讀狀態寄存器
  328.     T1=0;
  329.                       //X5045使能寫
  330.     for(i=0;i!=8;i++)       //寫讀指令
  331.     {
  332.         if((c & 0x80) == 0x80)
  333.         {
  334.             WR = 1;
  335.             T2 = 1;
  336.         }
  337.         if((c & 0x80) == 0)
  338.         {
  339.             WR = 0;
  340.             T2 = 1;
  341.         }
  342.         c = c << 1;
  343.         for(j=0;j!=10;j++){}
  344.         T2 = 0;
  345.     }      
  346.     dat = 0;
  347.     T2 = 0;
  348.     for(i=0;i!=8;i++)
  349.     {
  350.         for(j=0;j!=10;j++){}
  351.         {
  352.             dat = dat << 1;
  353.         }
  354.         T2 = 0;
  355.         for(j=0;j!=10;j++)
  356.         {};
  357.         c=RD;
  358.         //for(j=0;j!=10;j++){}
  359.         if(c == 1)
  360.         {
  361.             dat = (dat | 0x01);
  362.         }
  363.         T2 = 1;
  364.     }
  365.     T1=1;             //X5045禁止
  366.     return dat;
  367. }                                          

  368. void rec_dat()interrupt 4 using 1//串口中斷
  369. {
  370.     RI=0;
  371.     rec_tim=0;
  372.     rx[rec]=SBMF;
  373.     if(rx[0]==0x055 && rec<9)//幁頭正確,未接收完
  374.     {
  375.         rec=rec+1;
  376.     }
  377.     if(rec==9)
  378.     {
  379.         rec=0;
  380.         tr_rx=2;
  381.     }           //置接收完成標志
  382. }

  383. void BCD_chg(unsigned int dat1,unsigned char m,unsigned char n) //BCD碼轉換,m行 n 列
  384. {
  385.        if((dat1==0)||(dat1<10))
  386.        {
  387.          n0=dat1+0x30;
  388.        Number_9x16(m, n,n0);
  389.            Number_9x16(m, n+1, 0x20);
  390.            Number_9x16(m, n+2, 0x20);
  391.            Number_9x16(m, n+3, 0x20);
  392.            Number_9x16(m, n+4, 0x20);                  
  393.        }  
  394.        else if((dat1==10)||((dat1>10)&&(dat1<100)))
  395.        {            
  396.            n0=0x30+(dat1%10);      //個位
  397.            n1=(dat1/10)+0x30;     //十位
  398.        Number_9x16(m, n, n1);
  399.              Number_9x16(m, n+1, n0);
  400.            Number_9x16(m, n+2, 0x20);
  401.            Number_9x16(m, n+3, 0x20);
  402.            Number_9x16(m, n+4, 0x20);                  
  403.        }
  404.        else if((dat1==100)||((dat1>100)&&(dat1<1000)))
  405.        {
  406.             n0=((dat1%100)%10)+0x30;    //個位
  407.             n1=((dat1%100)/10)+0x30;      //十位
  408.             n2=(dat1/100)+0x30;      //百位   
  409.         Number_9x16(m,n,n2);
  410.               Number_9x16(m,n+1,n1);
  411.               Number_9x16(m,n+2,n0);  
  412.             Number_9x16(m, n+3, 0x20);
  413.             Number_9x16(m, n+4, 0x20);
  414.        }
  415.        else if((dat1==1000)||((dat1>1000)&&(dat1<10000)))
  416.        {
  417.             n0=((dat1%100)%10)+0x30;    //個位
  418.             n1=((dat1%100)/10)+0x30;      //十位
  419.             n2=((dat1/100)%10)+0x30;      //百位
  420.               n3=(dat1/1000)+0x30;       //千位   
  421.         Number_9x16(m,n,n3);
  422.               Number_9x16(m,n+1,n2);
  423.               Number_9x16(m,n+2,n1);
  424.               Number_9x16(m,n+3,n0);     
  425.             Number_9x16(m, n+4, 0x20);                       
  426.        }
  427.        else if((dat1==10000)||(dat1>10000))
  428.        {
  429.             n0=((dat1%100)%10)+0x30;    //個位
  430.             n1=((dat1%100)/10)+0x30;      //十位
  431.             n2=((dat1%1000)/100)+0x30;    //百位
  432.               n3=((dat1%10000)/1000)+0x30;  //千位     
  433.               n4=(dat1/10000)+0x30;      //萬位   
  434.         Number_9x16(m,n,n4);
  435.               Number_9x16(m,n+1,n3);
  436.               Number_9x16(m,n+2,n2);
  437.               Number_9x16(m,n+3,n1);
  438.               Number_9x16(m,n+4,n0);                 
  439.        }
  440.        else
  441.        {
  442.          Number_9x16(m,n,0x39);
  443.              Number_9x16(m,n+1,0x39);
  444.              Number_9x16(m,n+2,0x39);
  445.              Number_9x16(m,n+3,0x39);
  446.              Number_9x16(m,n+4,0x39);      
  447.        }
  448. }

  449. void LCD()//液晶顯示初始化
  450. {
  451.     Screen_Clear();             //清屏
  452.     Back_Toggle();              //打開背光
  453.     Screen_Onoff(01);           //屏幕全亮6S用于檢查屏幕質量
  454.     Delay_1ms(1000);
  455.     Screen_Onoff(00);               //屏幕恢復正常
  456.     Str_8x16(1,0,"西安新竹防災救生設備有限");
  457.     Str_8x16(2,0,"公司");
  458.     //顯示“西安新竹防災救生設備有限公司”
  459.     Delay_1ms(500);
  460.   Screen_Clear();           //清屏   
  461. }

  462. void LCD_DISPLAY(unsigned int disdat1,unsigned int disdat2,unsigned int disdat3,unsigned int disdat4)//LCD顯示
  463. {      
  464.         Str_8x16(0,0,"瞬時值");
  465.         Str_8x16(1,0,"平均值");   
  466.         Str_8x16(2,0,"基準值");
  467.         Str_8x16(3,0,"差  值");   
  468.         switch(bj)
  469.         {
  470.          case 1:
  471.             Str_8x16(1,14,"泄漏報警");  //顯示“泄漏報警”
  472.             break;
  473.          case 2:
  474.             Str_8x16(1,14,"加泡沫液");  //顯示"加泡沫液"
  475.             break;
  476.          case 3:
  477.             Str_8x16(1,14,"液面穩定");  //顯示"液面穩定"
  478.             break;
  479.          default:           
  480.             break;
  481.         }
  482.         if( bj_jc==0)
  483.         {
  484.             Str_8x16(0,14,"停止檢測");
  485.         }//顯示“停止檢測”
  486.         else if( bj_jc==1)
  487.         {
  488.            Str_8x16(0,14,"開始檢測");
  489.         }//顯示“開始檢測”
  490.         if( cgf==1)
  491.         {
  492.             Str_8x16(2,14,"傳感器閥開");
  493.         }//顯示“傳感器閥開”
  494.         else
  495.         {
  496.           Str_8x16(2,14,"傳感器閥關");
  497.         }
  498.    
  499.         BCD_chg(disdat1,0,7);      
  500.         BCD_chg(disdat2,1,7);      
  501.         BCD_chg(disdat3,2,7);      
  502.         BCD_chg(disdat4,3,7);      
  503. }

  504. //void max126(unsigned int ch)   //max126 AD 轉換
  505. //{
  506. //  P2=(P2|0x80);
  507. //  P2=0xff;
  508. //  P0=0xff;//禁止62256
  509. //  AMXR=0x01;//禁止ALE
  510. //  CEX4=0; //max126選通 CS
  511. //  WR=0; //寫命令
  512. //  P0=ch;//ch; //單通道
  513. //  WR=1;
  514. //  CEX4=1;                       
  515. //  CEX3=0;//開始轉換  CONVST
  516. //  CEX3=1;
  517. //  while(INT0==1){}   //INT
  518. //  CEX4=0;//max126選通         
  519. //  RD=0;
  520. //  P0=0xff;
  521. //  P2=0xff;
  522. //  ad_data2 = P2;   //  地址
  523. //  ad_data1 = P0;//  數據   ad_data1 = P0;ad_data2 = P2;
  524. //  RD=1;
  525. //  CEX4=1;//max126禁止   
  526. //  ccc1 = ad_data1;
  527. //  ccc2 = (ad_data2 & 0x003f);
  528. //  ccc2 = (ccc2 <<8);//c2 = c2 & 0x3f00;
  529. //  pressph[0]=(ccc1|ccc2); //c1;
  530. //  if((pressph[0]<400)||(pressph[0]>16300))
  531. //  {
  532. //     pressph[0]=pressph[1];
  533. //  }
  534. //  else
  535. //  {
  536. //     pressph[1]=pressph[0];
  537. //  }
  538. //  P2=(P2 & 0xef);//使能62256
  539. //  AMXR=0x00;//使能ALE

  540. //}

  541. void max126(unsigned int ch)   //max126 AD 轉換
  542. {
  543.     P2=(P2|0x80);
  544.     P2=0xff;
  545.     P0=0xff;//禁止62256
  546.     AMXR=0x01;//禁止ALE
  547.     CEX4=0; //max126選通 CS
  548.     WR=0; //寫命令
  549.     P0=ch;//ch; //單通道
  550.     WR=1;
  551.     CEX4=1;                       
  552.     CEX3=0;//開始轉換  CONVST
  553.     CEX3=1;
  554.     while(INT0==1);  //INT
  555.     CEX4=0;//max126選通         
  556.     RD=0;
  557.     P0=0xff;
  558.     P2=0xff;
  559.     ad_data2 = P2;   //  地址
  560.     ad_data1 = P0;//  數據   ad_data1 = P0;ad_data2 = P2;
  561.     RD=1;
  562.     CEX4=1;//max126禁止   
  563.     ccc1 = ad_data1;
  564.     ccc2 = (ad_data2 & 0x003f);
  565.     ccc2 = (ccc2 <<8);//c2 = c2 & 0x3f00;
  566.     pressph[0]=(ccc1|ccc2); //c1;
  567.     if((pressph[0]<1000)||(pressph[0]>16300))
  568.     {
  569.        pressph[0]=pressph[1];
  570.     }
  571.     else
  572.     {
  573.        pressph[1]=pressph[0];
  574.     }
  575.     P2=(P2 & 0xef);//使能62256
  576.     AMXR=0x00;//使能ALE
  577. }

  578. void DP()//數據處理
  579. {
  580.     prefz=prefz+1;
  581.     pressmax=0;
  582.     pressmin=16300;
  583.     if((pressph[1]>pressmax))
  584.     {
  585.       pressmax=pressph[1];
  586.     }

  587.     if(pressph[1]<pressmin)
  588.     {
  589.       pressmin=pressph[1];
  590.     }
  591.     if(prefz>10)
  592.     {
  593.       prefz=0;
  594.         avedat=(pressmax+pressmin)/2;   
  595.       if(avedat<avedatlast)
  596.         {
  597.             bj=1;
  598.             CEX0=0;
  599.             D_dat=avedatlast-avedat;
  600.         }
  601.         else
  602.         {
  603.             D_dat=avedat-avedatlast;
  604.             bj=3;
  605.             CEX0=1;
  606.         }   
  607.     }
  608. }

  609. void main()
  610. {
  611.     unsigned int i,k;
  612.     unsigned char m,normal,normal1,timecount,timecount1;//normal正常LED
  613.     unsigned int timecount2;
  614.     normal=0;normal1=0;timecount=0;timecount1=0;timecount2=0;//start=1;
  615.     Delay_1ms(50);
  616.     T0=1;
  617.     T1=1;
  618.     T2=0;//X5045 寫保護
  619.     m=0xff;
  620.     P2=P2 | 0x80;//禁止62256
  621.     T0=0;
  622.     {X5045wr1(0x06);}//寫允許
  623.     while((m & 2)!=2){m=X5045rd1();}//是否允許寫
  624.     while((m & 1)==1){m=X5045rd1();}//是否寫完
  625.     X5045wr3(0x00);
  626.     while((m & 1)==1){m=X5045rd1();}//讀數據指令
  627.     P2=P2 & 0xef;//使能62256
  628.     SM0 = 0;
  629.     SM1 = 1;
  630.     SM2 = 1;//串口方式1,
  631.     TMOD = 0x33;  //禁止定時/計數器0,1
  632.     TCON = 0x0;   //禁止定時/計數器0,1計數
  633.     T2CON = 0x30; //設定定時/計數器2為波特率發生器(接收、發送)
  634.     T2MOD = 0x00; //設定定時/計數器2為遞增
  635.     PCON = 0x00;//波特率不倍增
  636.     RCAP2H = 0xff;//0xfd;//22.1184MHz 9600 波特率
  637.     RCAP2L = 0xb7;//0xc0;
  638.     TR2 = 1; //啟動定時器2
  639.     REN = 1;  //允許串口接收
  640.     CEX2=1;
  641.     WR=1;
  642.     RD=1;
  643.     ES=0;/////
  644.     TI=0;
  645.     RI=0;///////
  646.     k=0;
  647.     timecount=0;   
  648.     pressmax=0;
  649.     pressmin=16300;
  650.     bj=0;
  651.     cgf=1;
  652.     CEX0=1;
  653.     INT1=0;
  654.   if(CEX2==0)
  655.   {
  656.    LCD();
  657.   }//液晶顯示初始化    顯示“西安新竹防災救生設備有限公司”  
  658.     while (1)
  659.     {
  660.     if(T2EX==1)
  661.     {
  662.         cgf=1;
  663.       bj_jc=1;
  664.         RCAP2H = 0xff;//0xfd;//40MHz 輸出16Mhz時鐘
  665.         RCAP2L = 0xff;//0xc0;
  666.         T2CON = 0x04;//設定定時/計數器2為可編程時鐘輸出
  667.         T2MOD = 0x02; //設定定時/計數器2為遞增
  668.         TR2 = 1; //啟動定時器2
  669.         press1p=0;
  670.         press2p=0;
  671.         for(i=0;i<50;i++)
  672.         {
  673.         max126(4);
  674.         press2p=press2p+pressph[0];
  675.         }
  676.         press1p=press2p/50;
  677.         press2p=0;
  678.         if((press1p<400)||(press1p>16300))
  679.         {
  680.             INT1=1;
  681.         }
  682.         else
  683.         {
  684.             INT1=0;
  685.         }//傳感器故障判斷
  686.         T0=0;//X5054 寫保護
  687.         DP();//數據處理
  688.         T2CON = 0x30;  //設定定時/計數器2為波特率發生器(接收、發送)
  689.         T2MOD = 0x00; //設定定時/計數器2為遞增
  690.         RCAP2H = 0xff;//0xfd;//22.1184MHz 9600 波特率
  691.         RCAP2L = 0xb7;//0xc0;
  692.         TR2 = 1; //啟動定時器2
  693.         if(CEX2==0)
  694.     {
  695.       LCD_DISPLAY(pressph[1],avedat,avedatlast,D_dat);//
  696.     }
  697.         if(CEX0==0)
  698.         {
  699.             i=10;
  700.         }
  701.         else
  702.         {
  703.             i=30;
  704.         }//如果泄漏-液晶不顯示;工作指示燈快閃。如果不泄漏-液晶不顯示;工作指示燈慢閃。
  705.         timecount++;
  706.         if(timecount>i)
  707.         {
  708.             timecount=0;
  709.             ECI=~ECI;
  710.         }//工作指示燈點?
  711.     }
  712.     else
  713.     {
  714.         bj_jc=0;
  715.         cgf=0;
  716.         ECI=1;
  717.         pressmax=0;
  718.         pressmin=16300;
  719.         if(CEX2==0)
  720.         {
  721.         LCD_DISPLAY(0,0,0,0);//
  722.         }
  723.   }
  724.         T1=1;
  725.         T1=0;   
  726.         T1=1;      
  727. }
  728. }
復制代碼

所有資料51hei提供下載:
include.docx (31.05 KB, 下載次數: 34)


回復

使用道具 舉報

ID:634209 發表于 2020-1-11 16:14 | 顯示全部樓層
請問,原理圖能更清楚的發出來嗎?
回復

使用道具 舉報

ID:14237 發表于 2020-1-12 10:02 | 顯示全部樓層
同樓上,能給份原理圖學習,謝了。
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 色偷偷噜噜噜亚洲男人 | 欧美色综合一区二区三区 | 999免费网站 | 三级在线观看 | 亚洲色图在线观看 | 成人在线免费视频观看 | 成人免费看片网 | 91精产国品一二三区 | 免费国产成人av | 国产精品久久国产精品 | 狠狠爱综合| 97日日碰人人模人人澡分享吧 | 九九视频在线观看视频6 | 久久一| 国产线视频精品免费观看视频 | 男女午夜免费视频 | 亚洲综合视频一区 | 美女福利视频 | 中文字幕一区二区三区四区五区 | 日韩高清国产一区在线 | 成人在线看片 | 羞羞的视频网站 | 91高清视频在线观看 | 国产精品污www一区二区三区 | 一区二区视屏 | 亚洲精品久久久一区二区三区 | 精品综合在线 | 91久久国产精品 | 国产精品一区二区免费看 | 免费在线国产视频 | 亚洲一区中文字幕 | av天天看| 日韩在线欧美 | 亚洲不卡av在线 | 一区二区三区观看视频 | 九九热精品视频在线观看 | 欧美精品影院 | 国产精品一区二区三区在线播放 | 自拍偷拍第一页 | 欧产日产国产精品视频 | 波多野吉衣久久 |