找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机压力传感器的实时监测和报警程序

[复制链接]
跳转到指定楼层
楼主
最近因一台消防控制系统设备需加泡沫罐检漏功能,所以专门做了单片机检测压力传感器电流值,做AD转换,进行实时处理,实现对压力传感器的实时监测和报警功能,原理图如图片所示,程序如附件所示。


单片机源程序如下:
  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)


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

使用道具 举报

沙发
ID:634209 发表于 2020-1-11 16:14 | 只看该作者
请问,原理图能更清楚的发出来吗?
回复

使用道具 举报

板凳
ID:14237 发表于 2020-1-12 10:02 | 只看该作者
同楼上,能给份原理图学习,谢了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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