找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5651|回复: 7
收起左侧

单片机多路温度压力检测系统仿真与源码(LCD1604液晶显示)

  [复制链接]
ID:296303 发表于 2018-6-3 23:10 | 显示全部楼层 |阅读模式
多路温度压力检测系统仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png 0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #include "intrins.h"                                                                                          
  3. #include <math.H>
  4. #define     u8                          unsigned char
  5. #define     u16                   unsigned int
  6. #define     uchar                          unsigned char
  7. #define     uint                   unsigned int

  8. uchar yushe_wendu=80;                                //温度预设值
  9. uchar yushe_yali=250;                                //压力预设值
  10. uint wendu;                                                                 //温度值全局变量
  11. uchar yali1;                                                                 //用于读取ADC数据
  12. uchar yali2;                                                                 //用于读取ADC数据
  13. uchar yali3;                                                                 //用于读取ADC数据
  14. uchar yali4;                                                                 //用于读取ADC数据

  15. //运行模式  
  16. uchar Mode=0;                                                                 //=1是设置温度阀值  =2是设置压力阀值        =0是正常监控模式
  17. //管脚声明

  18. sbit Buzzer             =P2^3;                                 //蜂鸣器
  19. sbit Fan         =P1^7;
  20. //定义三个设置按键
  21. sbit Key_SET = P2^4;
  22. sbit Key_ADD = P2^5;
  23. sbit Key_SUB = P2^6;
  24. sbit Key_OK  = P2^7;



  25. sbit ds1 = P1^2;
  26. sbit ds2 = P1^3;
  27. sbit ds3 = P1^4;
  28. sbit ds4 = P1^5;

  29. /********************************************************************
  30. * 名称 : delay_1ms()
  31. * 功能 : 延时1ms函数
  32. * 输入 : q
  33. * 输出 : 无
  34. ***********************************************************************/
  35. void delay_ms(uint q)
  36. {
  37.         uint i,j;
  38.         for(i=0;i<q;i++)
  39.                 for(j=0;j<110;j++);
  40. }


  41. void delayUs()
  42. {
  43.     _nop_();
  44. }

  45. void delayMs(uint a)
  46. {
  47.     uint i, j;
  48.     for(i = a; i > 0; i--)
  49.         for(j = 100; j > 0; j--);
  50. }

  51. /***********************************************************************************************************
  52. LCD1604相关函数
  53. ***********************************************************************************************************/

  54. //LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)
  55. sbit LCDRS = P2^0;
  56. sbit LCDEN = P2^2;
  57. sbit D0                 = P0^0;
  58. sbit D1                 = P0^1;
  59. sbit D2                 = P0^2;
  60. sbit D3                 = P0^3;
  61. sbit D4                 = P0^4;
  62. sbit D5                 = P0^5;
  63. sbit D6                 = P0^6;
  64. sbit D7                 = P0^7;



  65. //LCD延时
  66. void LCDdelay(uint z)                  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
  67. {
  68.   uint x,y;
  69.   for(x=z;x>0;x--)
  70.     for(y=10;y>0;y--);
  71. }
  72. void LCD_WriteData(u8 dat)          
  73. {
  74.         if(dat&0x01)D0=1;else D0=0;
  75.         if(dat&0x02)D1=1;else D1=0;
  76.         if(dat&0x04)D2=1;else D2=0;
  77.         if(dat&0x08)D3=1;else D3=0;
  78.         if(dat&0x10)D4=1;else D4=0;
  79.         if(dat&0x20)D5=1;else D5=0;
  80.         if(dat&0x40)D6=1;else D6=0;
  81.         if(dat&0x80)D7=1;else D7=0;
  82. }
  83. //写命令
  84. void write_com(uchar com)
  85. {
  86.   LCDRS=0;                                  
  87.         LCD_WriteData(com);
  88. //  DAT=com;
  89.   LCDdelay(5);
  90.   LCDEN=1;
  91.   LCDdelay(5);
  92.   LCDEN=0;
  93. }
  94. //写数据
  95. void write_data(uchar date)
  96. {
  97.   LCDRS=1;
  98.         LCD_WriteData(date);
  99. //  DAT=date;
  100.   LCDdelay(5);
  101.   LCDEN=1;
  102.   LCDdelay(5);
  103.   LCDEN=0;
  104. }

  105. /*------------------------------------------------
  106.               选择写入位置
  107. ------------------------------------------------*/
  108. void SelectPosition(unsigned char x,unsigned char y)
  109. {     
  110.         if (x == 0)
  111.         {     
  112.                 write_com(0x80 + y);     //表示第一行
  113.         }

  114.         else if (x == 1)
  115.         {      
  116.                 write_com(0xC0 + y);      //表示第二行
  117.         }
  118.         else if (x == 2)
  119.         {
  120.             write_com(0x90 + y);
  121.         }
  122.         else if (x == 3)
  123.         {
  124.             write_com(0xD0 + y);
  125.         }
  126. }
  127. /*------------------------------------------------
  128.               写入字符串函数
  129. ------------------------------------------------*/
  130. void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s)
  131. {     
  132.         SelectPosition(x,y) ;
  133.         while (*s)
  134.         {     
  135.                 write_data( *s);     
  136.                 s++;     
  137.         }
  138. }

  139. void writeString(uchar * str, uchar length)
  140. {
  141.      uchar i;
  142.     for(i = 0; i < length; i++)
  143.     {
  144.          write_data(str[i]);
  145.      }
  146. }

  147. //========================================================================
  148. // 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
  149. // 应用: LCD_Write_Char(0,1,366,4) ;
  150. // 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
  151. // 参数: x:行,y:列,s:要显示的字,l:显示的位数
  152. // 返回: none.
  153. // 版本: VER1.0
  154. // 日期: 2013-4-1
  155. // 备注: 最大显示65535
  156. //========================================================================
  157. void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
  158. {     
  159.         SelectPosition(x,y) ;

  160.         if(l>=5)
  161.                 write_data(0x30+s/10000%10);        //万位
  162.         if(l>=4)
  163.                 write_data(0x30+s/1000%10);                //千位
  164.         if(l>=3)
  165.                 write_data(0x30+s/100%10);                //百位
  166.         if(l>=2)
  167.                 write_data(0x30+s/10%10);                        //十位
  168.         if(l>=1)
  169.                 write_data(0x30+s%10);                //个位

  170. }
  171. /*1604指令简介
  172.   write_com(0x38);//屏幕初始化
  173.   write_com(0x0c);//打开显示 无光标 无光标闪烁
  174.   write_com(0x0d);//打开显示 阴影闪烁
  175.   write_com(0x0d);//打开显示 阴影闪烁
  176. */
  177. //1604初始化
  178. void Init1604()
  179. {
  180.   uchar i=0;
  181.   write_com(0x38);//屏幕初始化
  182.   write_com(0x0c);//打开显示 无光标 无光标闪烁
  183.   write_com(0x06);//当读或写一个字符是指针后一一位
  184.   write_com(0x01);//清屏
  185.        
  186. }

  187. void Display_1604(yali1,yali2,yali3,yali4)
  188. {

  189.           LCD_Write_Char(2,3,yali1,3) ;
  190.           LCD_Write_Char(2,13,yali2,3) ;
  191.           
  192.           LCD_Write_Char(3,3,yali3,3) ;
  193.           LCD_Write_Char(3,13,yali4,3) ;
  194. }



  195. /***********************************************************************************************************
  196. ADC0832相关函数
  197. ***********************************************************************************************************/
  198. sbit ADCS1         =P1^0; //ADC0832 片选
  199. sbit ADCLK1  =P3^1; //ADC0832 时钟
  200. sbit ADDI1         =P3^0; //ADC0832 数据输入                /*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
  201. sbit ADDO1         =P3^0; //ADC0832 数据输出                /*为节省单片机引脚,简化电路所以输入输出连接在同一个引脚上

  202. sbit ADCS2         =P1^1; //ADC0832 片选
  203. sbit ADCLK2  =P3^3; //ADC0832 时钟
  204. sbit ADDI2         =P3^2; //ADC0832 数据输入                /*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
  205. sbit ADDO2         =P3^2; //ADC0832 数据输出

  206. sbit ADCS3         =P1^6; //ADC0832 片选
  207. sbit ADCLK3  =P3^5; //ADC0832 时钟
  208. sbit ADDI3         =P3^4; //ADC0832 数据输入                /*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
  209. sbit ADDO3         =P3^4; //ADC0832 数据输出

  210. sbit ADCS4         =P1^7; //ADC0832 片选
  211. sbit ADCLK4  =P3^7; //ADC0832 时钟
  212. sbit ADDI4         =P3^6; //ADC0832 数据输入                /*因为单片机的管脚是双向的,且ADC0832的数据输入输出不同时进行,
  213. sbit ADDO4         =P3^6; //ADC0832 数据输出


  214. //========================================================================
  215. // 函数: unsigned int Adc0832(unsigned char channel)
  216. // 应用:                 temp=Adc0832(0);
  217. // 描述: 读取0通道的AD值
  218. // 参数: channel:通道0和通道1选择
  219. // 返回: 选取通道的AD值
  220. // 版本: VER1.0
  221. // 日期: 2015-05-29
  222. // 备注:
  223. //========================================================================
  224. unsigned int Adc08321(unsigned char channel)
  225. {
  226.         uchar i=0;
  227.         uchar j;
  228.         uint dat=0;
  229.         uchar ndat=0;
  230.         uchar  Vot=0;

  231.         if(channel==0)channel=2;
  232.         if(channel==1)channel=3;
  233.        
  234.        
  235.                         ADDI1=1;
  236.                         _nop_();
  237.                         _nop_();
  238.                         ADCS1=0;//拉低CS端
  239.                         _nop_();
  240.                         _nop_();
  241.                         ADCLK1=1;//拉高CLK端
  242.                         _nop_();
  243.                         _nop_();
  244.                         ADCLK1=0;//拉低CLK端,形成下降沿1
  245.                         _nop_();
  246.                         _nop_();
  247.                         ADCLK1=1;//拉高CLK端
  248.                         ADDI1=channel&0x1;
  249.                         _nop_();
  250.                         _nop_();
  251.                         ADCLK1=0;//拉低CLK端,形成下降沿2
  252.                         _nop_();
  253.                         _nop_();
  254.                         ADCLK1=1;//拉高CLK端
  255.                         ADDI1=(channel>>1)&0x1;
  256.                         _nop_();
  257.                         _nop_();
  258.                         ADCLK1=0;//拉低CLK端,形成下降沿3
  259.                         ADDI1=1;//控制命令结束
  260.                         _nop_();
  261.                         _nop_();
  262.                         dat=0;
  263.                         for(i=0;i<8;i++)
  264.                         {
  265.                                 dat|=ADDO1;//收数据
  266.                                 ADCLK1=1;
  267.                                 _nop_();
  268.                                 _nop_();
  269.                                 ADCLK1=0;//形成一次时钟脉冲
  270.                                 _nop_();
  271.                                 _nop_();
  272.                                 dat<<=1;
  273.                                 if(i==7)dat|=ADDO1;
  274.                         }
  275.                         for(i=0;i<8;i++)
  276.                         {
  277.                                 j=0;
  278.                                 j=j|ADDO1;//收数据
  279.                                 ADCLK1=1;
  280.                                 _nop_();
  281.                                 _nop_();
  282.                                 ADCLK1=0;//形成一次时钟脉冲
  283.                                 _nop_();
  284.                                 _nop_();
  285.                                 j=j<<7;
  286.                                 ndat=ndat|j;
  287.                                 if(i<7)ndat>>=1;
  288.                         }
  289.                         ADCS1=1;//拉低CS端
  290.                         ADCLK1=0;//拉低CLK端
  291.                         ADDO1=1;//拉高数据端,回到初始状态
  292.                         dat<<=8;
  293.                         dat|=ndat;
  294.                         return(dat);            //return ad data
  295. }

  296. //2

  297. unsigned int Adc08322(unsigned char channel)
  298. {
  299.         uchar i=0;
  300.         uchar j;
  301.         uint dat=0;
  302.         uchar ndat=0;
  303.         uchar  Vot=0;

  304.         if(channel==0)channel=2;
  305.         if(channel==1)channel=3;
  306.        
  307.        
  308.                         ADDI2=1;
  309.                         _nop_();
  310.                         _nop_();
  311.                         ADCS2=0;//拉低CS端
  312.                         _nop_();
  313.                         _nop_();
  314.                         ADCLK2=1;//拉高CLK端
  315.                         _nop_();
  316.                         _nop_();
  317.                         ADCLK2=0;//拉低CLK端,形成下降沿1
  318.                         _nop_();
  319.                         _nop_();
  320.                         ADCLK2=1;//拉高CLK端
  321.                         ADDI2=channel&0x1;
  322.                         _nop_();
  323.                         _nop_();
  324.                         ADCLK2=0;//拉低CLK端,形成下降沿2
  325.                         _nop_();
  326.                         _nop_();
  327.                         ADCLK2=1;//拉高CLK端
  328.                         ADDI2=(channel>>1)&0x1;
  329.                         _nop_();
  330.                         _nop_();
  331.                         ADCLK2=0;//拉低CLK端,形成下降沿3
  332.                         ADDI2=1;//控制命令结束
  333.                         _nop_();
  334.                         _nop_();
  335.                         dat=0;
  336.                         for(i=0;i<8;i++)
  337.                         {
  338.                                 dat|=ADDO2;//收数据
  339.                                 ADCLK2=1;
  340.                                 _nop_();
  341.                                 _nop_();
  342.                                 ADCLK2=0;//形成一次时钟脉冲
  343.                                 _nop_();
  344.                                 _nop_();
  345.                                 dat<<=1;
  346.                                 if(i==7)dat|=ADDO2;
  347.                         }
  348.                         for(i=0;i<8;i++)
  349.                         {
  350.                                 j=0;
  351.                                 j=j|ADDO2;//收数据
  352.                                 ADCLK2=1;
  353.                                 _nop_();
  354.                                 _nop_();
  355.                                 ADCLK2=0;//形成一次时钟脉冲
  356.                                 _nop_();
  357.                                 _nop_();
  358.                                 j=j<<7;
  359.                                 ndat=ndat|j;
  360.                                 if(i<7)ndat>>=1;
  361.                         }
  362.                         ADCS2=1;//拉低CS端
  363.                         ADCLK2=0;//拉低CLK端
  364.                         ADDO2=1;//拉高数据端,回到初始状态
  365.                         dat<<=8;
  366.                         dat|=ndat;
  367.                         return(dat);            //return ad data         
  368. }
  369. //23
  370. unsigned int Adc08323(unsigned char channel)
  371. {
  372.         uchar i=0;
  373.         uchar j;
  374.         uint dat=0;
  375.         uchar ndat=0;
  376.         uchar  Vot=0;

  377.         if(channel==0)channel=2;
  378.         if(channel==1)channel=3;
  379.        
  380.         ADDI3=1;
  381.                         _nop_();
  382.                         _nop_();
  383.                         ADCS3=0;//拉低CS端
  384.                         _nop_();
  385.                         _nop_();
  386.                         ADCLK3=1;//拉高CLK端
  387.                         _nop_();
  388.                         _nop_();
  389.                         ADCLK3=0;//拉低CLK端,形成下降沿1
  390.                         _nop_();
  391.                         _nop_();
  392.                         ADCLK3=1;//拉高CLK端
  393.                         ADDI3=channel&0x1;
  394.                         _nop_();
  395.                         _nop_();
  396.                         ADCLK3=0;//拉低CLK端,形成下降沿2
  397.                         _nop_();
  398.                         _nop_();
  399.                         ADCLK3=1;//拉高CLK端
  400.                         ADDI3=(channel>>1)&0x1;
  401.                         _nop_();
  402.                         _nop_();
  403.                         ADCLK3=0;//拉低CLK端,形成下降沿3
  404.                         ADDI3=1;//控制命令结束
  405.                         _nop_();
  406.                         _nop_();
  407.                         dat=0;
  408.                         for(i=0;i<8;i++)
  409.                         {
  410.                                 dat|=ADDO3;//收数据
  411.                                 ADCLK3=1;
  412.                                 _nop_();
  413.                                 _nop_();
  414.                                 ADCLK3=0;//形成一次时钟脉冲
  415.                                 _nop_();
  416.                                 _nop_();
  417.                                 dat<<=1;
  418.                                 if(i==7)dat|=ADDO3;
  419.                         }
  420.                         for(i=0;i<8;i++)
  421.                         {
  422.                                 j=0;
  423.                                 j=j|ADDO3;//收数据
  424.                                 ADCLK3=1;
  425.                                 _nop_();
  426.                                 _nop_();
  427.                                 ADCLK3=0;//形成一次时钟脉冲
  428.                                 _nop_();
  429.                                 _nop_();
  430.                                 j=j<<7;
  431.                                 ndat=ndat|j;
  432.                                 if(i<7)ndat>>=1;
  433.                         }
  434.                         ADCS3=1;//拉低CS端
  435.                         ADCLK3=0;//拉低CLK端
  436.                         ADDO3=1;//拉高数据端,回到初始状态
  437.                         dat<<=8;
  438.                         dat|=ndat;
  439.                         return(dat);            //return ad data      
  440. }
  441.        

  442. //23
  443. unsigned int Adc08324(unsigned char channel)
  444. {
  445.         uchar i=0;
  446.         uchar j;
  447.         uint dat=0;
  448.         uchar ndat=0;
  449.         uchar  Vot=0;

  450.         if(channel==0)channel=2;
  451.         if(channel==1)channel=3;
  452.        
  453.         ADDI4=1;
  454.                         _nop_();
  455.                         _nop_();
  456.                         ADCS4=0;//拉低CS端
  457.                         _nop_();
  458.                         _nop_();
  459.                         ADCLK4=1;//拉高CLK端
  460.                         _nop_();
  461.                         _nop_();
  462.                         ADCLK4=0;//拉低CLK端,形成下降沿1
  463.                         _nop_();
  464.                         _nop_();
  465.                         ADCLK4=1;//拉高CLK端
  466.                         ADDI4=channel&0x1;
  467.                         _nop_();
  468.                         _nop_();
  469.                         ADCLK4=0;//拉低CLK端,形成下降沿2
  470.                         _nop_();
  471.                         _nop_();
  472.                         ADCLK4=1;//拉高CLK端
  473.                         ADDI4=(channel>>1)&0x1;
  474.                         _nop_();
  475.                         _nop_();
  476.                         ADCLK4=0;//拉低CLK端,形成下降沿3
  477.                         ADDI4=1;//控制命令结束
  478.                         _nop_();
  479.                         _nop_();
  480.                         dat=0;
  481.                         for(i=0;i<8;i++)
  482.                         {
  483.                                 dat|=ADDO4;//收数据
  484.                                 ADCLK4=1;
  485.                                 _nop_();
  486.                                 _nop_();
  487.                                 ADCLK4=0;//形成一次时钟脉冲
  488.                                 _nop_();
  489.                                 _nop_();
  490.                                 dat<<=1;
  491.                                 if(i==7)dat|=ADDO4;
  492.                         }
  493.                         for(i=0;i<8;i++)
  494.                         {
  495.                                 j=0;
  496.                                 j=j|ADDO4;//收数据
  497.                                 ADCLK4=1;
  498.                                 _nop_();
  499.                                 _nop_();
  500.                                 ADCLK4=0;//形成一次时钟脉冲
  501.                                 _nop_();
  502.                                 _nop_();
  503.                                 j=j<<7;
  504.                                 ndat=ndat|j;
  505.                                 if(i<7)ndat>>=1;
  506.                         }
  507.                         ADCS4=1;//拉低CS端
  508.                         ADCLK4=0;//拉低CLK端
  509.                         ADDO4=1;//拉高数据端,回到初始状态
  510.                         dat<<=8;
  511.                         dat|=ndat;
  512.                         return(dat);            //return ad data   
  513. }
  514.                

  515. //         else if(num==4)
  516. //         {
  517. //                 //if(channel==0)channel=2;
  518. //                 //        if(channel==1)channel=3;
  519. //                         ADDI4=1;
  520. //                         _nop_();
  521. //                         _nop_();
  522. //                         ADCS4=0;//拉低CS端
  523. //                         _nop_();
  524. //                         _nop_();
  525. //                         ADCLK4=1;//拉高CLK端
  526. //                         _nop_();
  527. //                         _nop_();
  528. //                         ADCLK4=0;//拉低CLK端,形成下降沿1
  529. //                         _nop_();
  530. //                         _nop_();
  531. //                         ADCLK4=1;//拉高CLK端
  532. //                         ADDI4=channel&0x1;
  533. //                         _nop_();
  534. //                         _nop_();
  535. //                         ADCLK4=0;//拉低CLK端,形成下降沿2
  536. //                         _nop_();
  537. //                         _nop_();
  538. //                         ADCLK4=1;//拉高CLK端
  539. //                         ADDI4=(channel>>1)&0x1;
  540. //                         _nop_();
  541. //                         _nop_();
  542. //                         ADCLK4=0;//拉低CLK端,形成下降沿3
  543. //                         ADDI4=1;//控制命令结束
  544. //                         _nop_();
  545. //                         _nop_();
  546. //                         dat=0;
  547. //                         for(i=0;i<8;i++)
  548. //                         {
  549. //                                 dat|=ADDO4;//收数据
  550. //                                 ADCLK4=1;
  551. //                                 _nop_();
  552. //                                 _nop_();
  553. //                                 ADCLK4=0;//形成一次时钟脉冲
  554. //                                 _nop_();
  555. //                                 _nop_();
  556. //                                 dat<<=1;
  557. //                                 if(i==7)dat|=ADDO4;
  558. //                         }
  559. //                         for(i=0;i<8;i++)
  560. //                         {
  561. //                                 j=0;
  562. //                                 j=j|ADDO4;//收数据
  563. //                                 ADCLK4=1;
  564. //                                 _nop_();
  565. //                                 _nop_();
  566. //                                 ADCLK4=0;//形成一次时钟脉冲
  567. //                                 _nop_();
  568. //                                 _nop_();
  569. //                                 j=j<<7;
  570. //                                 ndat=ndat|j;
  571. //                                 if(i<7)ndat>>=1;
  572. //                         }
  573. //                         ADCS4=1;//拉低CS端
  574. //                         ADCLK4=0;//拉低CLK端
  575. //                         ADDO4=1;//拉高数据端,回到初始状态
  576. //                         dat<<=8;
  577. //                         dat|=ndat;
  578. //                         return(dat);            //return ad data
  579. //                
  580. //         }
  581. //         else;
  582. //        

  583. //         //return(dat);            //return ad data
  584. // }


  585. /***********************************************************************************************************
  586. DS18B20相关函数
  587. ***********************************************************************************************************/

  588. /***********************************************************************************************************
  589. DS18B20相关函数
  590. ***********************************************************************************************************/

  591. void ds1Init()
  592. {
  593.    
  594.     unsigned int i;  
  595.     ds1 = 0;
  596.     i = 100;  
  597.      while(i>0) i--;
  598.     ds1 = 1;   
  599.     i = 4;
  600.      while(i>0) i--;
  601. }

  602. void ds1Wait()
  603. {
  604.       unsigned int i;
  605.       while(ds1);  
  606.       while(~ds1);
  607.       i = 4;
  608.       while(i > 0) i--;
  609. }


  610. void ds2Init()
  611. {
  612.    
  613.     unsigned int i;  
  614.     ds2 = 0;
  615.     i = 100;  
  616.      while(i>0) i--;
  617.     ds2 = 1;   
  618.     i = 4;
  619.      while(i>0) i--;
  620. }

  621. void ds2Wait()
  622. {
  623.       unsigned int i;
  624.       while(ds2);  
  625.       while(~ds2);
  626.       i = 4;
  627.       while(i > 0) i--;
  628. }


  629. void ds3Init()
  630. {
  631.    
  632.     unsigned int i;  
  633.     ds3 = 0;
  634.     i = 100;  
  635.      while(i>0) i--;
  636.     ds3 = 1;   
  637.     i = 4;
  638.      while(i>0) i--;
  639. }

  640. void ds3Wait()
  641. {
  642.       unsigned int i;
  643.       while(ds3);  
  644.       while(~ds3);
  645.       i = 4;
  646.       while(i > 0) i--;
  647. }

  648. void ds4Init()
  649. {
  650.    
  651.     unsigned int i;  
  652.     ds4 = 0;
  653.     i = 100;  
  654.      while(i>0) i--;
  655.     ds4 = 1;   
  656.     i = 4;
  657.      while(i>0) i--;
  658. }

  659. void ds4Wait()
  660. {
  661.       unsigned int i;
  662.       while(ds4);  
  663.       while(~ds4);
  664.       i = 4;
  665.       while(i > 0) i--;
  666. }

  667. //************************************功能函数
  668. bit readBit1()
  669. {
  670.     unsigned int i;
  671.     bit b;
  672.     ds1 = 0;
  673.     i++;   
  674.     ds1 = 1;
  675.    i++; i++;  
  676.     b = ds1;
  677.     i = 8;
  678.     while(i>0) i--;
  679.     return b;
  680. }

  681. unsigned char readByte1()
  682. {
  683.     unsigned int i;
  684.     unsigned char j, dat;
  685.    dat = 0;
  686.     for(i=0; i<8; i++)
  687.     {
  688.         j = readBit1();
  689.       
  690.         dat = (j << 7) | (dat >> 1);
  691.     }
  692.     return dat;
  693. }


  694. void writeByte1(unsigned char dat)
  695. {
  696.     unsigned int i;
  697.     unsigned char j;
  698.     bit b;
  699.     for(j = 0; j < 8; j++)
  700.     {
  701.         b = dat & 0x01;
  702.         dat >>= 1;
  703.    
  704.         if(b)   
  705.         {
  706.            ds1 = 0;          i++; i++;  
  707.             ds1 = 1;   
  708.             i = 8; while(i>0) i--;  
  709.         }
  710.         else  
  711.         {
  712.             ds1 = 0;
  713.           i = 8; while(i>0) i--;  
  714.             ds1 = 1;
  715.            i++; i++;
  716.         }
  717.    }
  718. }



  719. //2

  720. bit readBit2()
  721. {
  722.     unsigned int i;
  723.     bit b;
  724.     ds2 = 0;
  725.     i++;   
  726.     ds2 = 1;
  727.    i++; i++;  
  728.     b = ds2;
  729.     i = 8;
  730.     while(i>0) i--;
  731.     return b;
  732. }

  733. unsigned char readByte2()
  734. {
  735.     unsigned int i;
  736.     unsigned char j, dat;
  737.    dat = 0;
  738.     for(i=0; i<8; i++)
  739.     {
  740.         j = readBit2();
  741.       
  742.         dat = (j << 7) | (dat >> 1);
  743.     }
  744.     return dat;
  745. }


  746. void writeByte2(unsigned char dat)
  747. {
  748.     unsigned int i;
  749.     unsigned char j;
  750.     bit b;
  751.     for(j = 0; j < 8; j++)
  752.     {
  753.         b = dat & 0x01;
  754.         dat >>= 1;
  755.    
  756.         if(b)   
  757.         {
  758.            ds2 = 0;          i++; i++;  
  759.             ds2 = 1;   
  760.             i = 8; while(i>0) i--;  
  761.         }
  762.         else  
  763.         {
  764.             ds2 = 0;
  765.           i = 8; while(i>0) i--;  
  766.             ds2 = 1;
  767.            i++; i++;
  768.         }
  769.    }
  770. }

  771. //3

  772. bit readBit3()
  773. {
  774.     unsigned int i;
  775.     bit b;
  776.     ds3 = 0;
  777.     i++;   
  778.     ds3 = 1;
  779.    i++; i++;  
  780.     b = ds3;
  781.     i = 8;
  782.     while(i>0) i--;
  783.     return b;
  784. }

  785. unsigned char readByte3()
  786. {
  787.     unsigned int i;
  788.     unsigned char j, dat;
  789.    dat = 0;
  790.     for(i=0; i<8; i++)
  791.     {
  792.         j = readBit3();
  793.       
  794.         dat = (j << 7) | (dat >> 1);
  795.     }
  796.     return dat;
  797. }


  798. void writeByte3(unsigned char dat)
  799. {
  800.     unsigned int i;
  801.     unsigned char j;
  802.     bit b;
  803.     for(j = 0; j < 8; j++)
  804.     {
  805.         b = dat & 0x01;
  806.         dat >>= 1;
  807.    
  808.         if(b)   
  809.         {
  810.            ds3 = 0;          i++; i++;  
  811.             ds3 = 1;   
  812.             i = 8; while(i>0) i--;  
  813.         }
  814.         else  
  815.         {
  816.             ds3 = 0;
  817.           i = 8; while(i>0) i--;  
  818.             ds3 = 1;
  819.            i++; i++;
  820.         }
  821.    }
  822. }
  823. //4

  824. bit readBit4()
  825. {
  826.     unsigned int i;
  827.     bit b;
  828.     ds4 = 0;
  829.     i++;   
  830.     ds4 = 1;
  831.    i++; i++;  
  832.     b = ds4;
  833.     i = 8;
  834.     while(i>0) i--;
  835.     return b;
  836. }

  837. unsigned char readByte4()
  838. {
  839.     unsigned int i;
  840.     unsigned char j, dat;
  841.    dat = 0;
  842.     for(i=0; i<8; i++)
  843.     {
  844.         j = readBit4();
  845.       
  846.         dat = (j << 7) | (dat >> 1);
  847.     }
  848.     return dat;
  849. }


  850. void writeByte4(unsigned char dat)
  851. {
  852.     unsigned int i;
  853.     unsigned char j;
  854.     bit b;
  855.     for(j = 0; j < 8; j++)
  856.     {
  857.         b = dat & 0x01;
  858.         dat >>= 1;
  859.    
  860.         if(b)   
  861.         {
  862.            ds4 = 0;          i++; i++;  
  863.             ds4 = 1;   
  864.             i = 8; while(i>0) i--;  
  865.         }
  866.         else  
  867.         {
  868.             ds4 = 0;
  869.           i = 8; while(i>0) i--;  
  870.             ds4 = 1;
  871.            i++; i++;
  872.         }
  873.    }
  874. }


  875. //发送转换命令
  876. void sendChangeCmd(unsigned char num)
  877. {
  878.                  if(num==1)
  879.                  {
  880.                         ds1Init();   
  881.                         ds1Wait();
  882.                         delayMs(1);   
  883.                         writeByte1(0xcc);
  884.                         writeByte1(0x44);
  885.                  }
  886.                 else if(num==2)
  887.                 {
  888.                         ds2Init();   
  889.                         ds2Wait();
  890.                                  delayMs(1);   
  891.       writeByte2(0xcc);
  892.      writeByte2(0x44);
  893.                 }       
  894.                 else if(num==3)
  895.                 {
  896.                         ds3Init();   
  897.                         ds3Wait();
  898.                          delayMs(1);   
  899.     writeByte3(0xcc);
  900.     writeByte3(0x44);
  901.                 }       
  902.                 else if(num==4)
  903.                 {
  904.                         ds4Init();   
  905.                         ds4Wait();
  906.                          delayMs(1);   
  907.     writeByte4(0xcc);
  908.     writeByte4(0x44);
  909.                 }       
  910.                 else;
  911.    
  912. }

  913. void sendReadCmd(unsigned char num)
  914. {
  915.    if(num==1)
  916.                  {
  917.                                 ds1Init();   
  918.                                 ds1Wait();
  919.                           delayMs(1);
  920.                                 writeByte1(0xcc);
  921.                                 writeByte1(0xbe);
  922.                  }
  923.                 else if(num==2)
  924.                 {
  925.                                 ds2Init();   
  926.                                 ds2Wait();
  927.                                 delayMs(1);
  928.                                 writeByte2(0xcc);
  929.                                 writeByte2(0xbe);
  930.                 }       
  931.                 else if(num==3)
  932.                 {
  933.                                 ds3Init();   
  934.                                 ds3Wait();
  935.                          delayMs(1);
  936.                                 writeByte3(0xcc);
  937.                                 writeByte3(0xbe);
  938.                 }       
  939.                 else if(num==4)
  940.                 {
  941.                         ds4Init();   
  942.                         ds4Wait();
  943.                          delayMs(1);
  944.                         writeByte4(0xcc);
  945.                         writeByte4(0xbe);
  946.                 }       
  947.                 else;
  948.    
  949. }


  950. int getTmpValue(unsigned char num)
  951. {
  952.     unsigned int tmpvalue;
  953.     int value;
  954.     float t;
  955.     unsigned char low, high;
  956.     sendReadCmd(num);
  957.    
  958.         if(num==1)
  959.         {
  960.     low = readByte1();
  961.     high = readByte1();
  962.         }
  963.         else if(num==2)
  964.         {
  965.                 low = readByte2();
  966.     high = readByte2();
  967.         }
  968.         else if(num==3)
  969.         {
  970.                 low = readByte3();
  971.     high = readByte3();
  972.         }
  973.         else if(num==4)
  974.         {
  975.                 low = readByte4();
  976.     high = readByte4();
  977.         }
  978.         else;
  979.     tmpvalue = high;
  980.     tmpvalue <<= 8;
  981.     tmpvalue |= low;
  982.     value = tmpvalue;
  983.    
  984.   \
  985.     t = value * 0.0625;
  986.     \
  987.     value = t * 100 + (value > 0 ? 0.5 : -0.5); //大于0加0.5, 小于0减0.5
  988.     return value;
  989. }

  990. void display(int v, unsigned char num)
  991. {
  992.     unsigned char count;
  993.     unsigned char datas[] = {0, 0, 0, 0, 0};
  994.     unsigned int tmp = abs(v);
  995.     datas[0] = tmp / 10000;
  996.     datas[1] = tmp % 10000 / 1000;
  997.     datas[2] = tmp % 1000 / 100;
  998.     datas[3] = tmp % 100 / 10;
  999.     datas[4] = tmp % 10;
  1000. if(num==1)
  1001. {
  1002.     write_com(0x80+2);
  1003.     if(v < 0)
  1004.     {
  1005.         writeString("-", 1);
  1006.    }
  1007.     else
  1008.     {
  1009.        writeString("+", 1);
  1010.     }
  1011.     if(datas[0] != 0)
  1012.     {
  1013.         write_data('0'+datas[0]);
  1014.     }
  1015.     for(count = 1; count != 4; count++)
  1016.     {
  1017.         write_data('0'+datas[count]);
  1018.         if(count == 2)
  1019.         {
  1020.             write_data('.');
  1021.         }
  1022.     }
  1023.         }
  1024.         else if(num==2)
  1025. {
  1026.     write_com(0x80+11);
  1027.     if(v < 0)
  1028.     {
  1029.         writeString("-", 1);
  1030.    }
  1031.     else
  1032.     {
  1033.        writeString("+", 1);
  1034.     }
  1035.     if(datas[0] != 0)
  1036.     {
  1037.         write_data('0'+datas[0]);
  1038.     }
  1039.     for(count = 1; count != 4; count++)
  1040.     {
  1041.         write_data('0'+datas[count]);
  1042.         if(count == 2)
  1043.         {
  1044.             write_data('.');
  1045.         }
  1046.     }
  1047.         }
  1048.         else if(num==3)
  1049. {
  1050.     write_com(0xc0+2);
  1051.     if(v < 0)
  1052.     {
  1053.         writeString("-", 1);
  1054.    }
  1055.     else
  1056.     {
  1057.        writeString("+", 1);
  1058.     }
  1059.     if(datas[0] != 0)
  1060.     {
  1061.         write_data('0'+datas[0]);
  1062.     }
  1063.     for(count = 1; count != 4; count++)
  1064.     {
  1065.         write_data('0'+datas[count]);
  1066.         if(count == 2)
  1067.         {
  1068.             write_data('.');
  1069.         }
  1070.     }
  1071.         }
  1072.         else if(num==4)
  1073. {
  1074.     write_com(0xC0+11);
  1075.     if(v < 0)
  1076.     {
  1077.         writeString("-", 1);
  1078.    }
  1079.     else
  1080.     {
  1081.        writeString("+", 1);
  1082.     }
  1083.     if(datas[0] != 0)
  1084.     {
  1085.         write_data('0'+datas[0]);
  1086.     }
  1087.     for(count = 1; count != 4; count++)
  1088.     {
  1089.         write_data('0'+datas[count]);
  1090.         if(count == 2)
  1091.         {
  1092.             write_data('.');
  1093.         }
  1094.     }
  1095.         }
  1096. }
  1097. /**//*****************************DS18B20*******************************/



  1098. /***********************************************************************************************************
  1099. 按键检测相关函数
  1100. ***********************************************************************************************************/
  1101. //按键
  1102. sbit Key1=P1^6;                                 //设置键
  1103. sbit Key2=P1^7;                                 //加按键
  1104. sbit Key3=P3^2;                                 //减按键



  1105. #define KEY_SET                 1                //设置
  1106. #define KEY_ADD                        2                //加
  1107. #define KEY_MINUS                3                //减


  1108. //========================================================================
  1109. // 函数: u8 Key_Scan()
  1110. // 应用: temp=u8 Key_Scan();
  1111. // 描述: 按键扫描并返回按下的键值
  1112. // 参数: NONE
  1113. // 返回: 按下的键值
  1114. // 版本: VER1.0
  1115. // 日期: 2015-05-29
  1116. // 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下
  1117. //========================================================================
  1118. u8 Key_Scan()
  1119. {         
  1120.         static u8 key_up=1;//按键按松开标志
  1121.         if(key_up&&(Key1==0||Key2==0||Key3==0))
  1122.         {
  1123.                 delay_ms(10);//去抖动
  1124.                 key_up=0;
  1125.                 if(Key1==0)                        return 1;
  1126.                 else if(Key2==0)return 2;
  1127.                 else if(Key3==0)return 3;
  1128.         }
  1129.         else if(Key1==1&&Key2==1&&Key3==1)
  1130.                 key_up=1;             
  1131.         return 0;// 无按键按下
  1132. }

  1133. unsigned char table1[] = "T1";
  1134.         unsigned char table2[] = "T2";
  1135.         unsigned char table3[] = "T3";
  1136.         unsigned char table4[] = "T4";
  1137.   unsigned char table5[] = "P1";
  1138.         unsigned char table6[] = "P2";
  1139.         unsigned char table7[] = "P3";
  1140.         unsigned char table8[] = "P4";

  1141. void main (void)
  1142. {
  1143.         u8 key;
  1144.        
  1145.         Init1604();                          //调用初始化显示函数

  1146. //         LCD_Write_String(0,0,"NOW T:00.0 P:000");
  1147. //         LCD_Write_String(1,0,"NOW T:00.0 P:000");
  1148. //   LCD_Write_String(2,0,"NOW T:00.0 P:000");
  1149.        
  1150.     write_com(0x80);
  1151.     writeString(table1, 2);
  1152.           write_com(0x89);
  1153.     writeString(table2, 2);
  1154.                 write_com(0xc0);
  1155.     writeString(table3, 2);
  1156.                 write_com(0xc9);
  1157.     writeString(table4, 2);
  1158.        
  1159.                 write_com(0x90);
  1160.     writeString(table5, 2);
  1161.           write_com(0x99);
  1162.     writeString(table6, 2);
  1163.                 write_com(0xd0);
  1164.     writeString(table7, 2);
  1165.                 write_com(0xd9);
  1166.     writeString(table8, 2);
  1167.                 delay_ms(1000);

  1168.         while (1)                                                //主循环
  1169.         {
  1170.                 key=Key_Scan();                                        //按键扫描
  1171.                 yali1=Adc08321(0);                                //读取烟雾值
  1172.                 delay_ms(10);
  1173.                 yali2=Adc08322(0);                                //读取烟雾值
  1174.                 delay_ms(10);
  1175.                 yali3=Adc08323(0);                                //读取烟雾值
  1176.                 delay_ms(10);
  1177.                 yali4=Adc08324(0);                                //读取烟雾值
  1178.                 delay_ms(10);
  1179. //                 yali2=Adc0832(0,2);                                //读取烟雾值
  1180.                         write_com(0xc0);
  1181.     display(getTmpValue(1),1);
  1182.     sendChangeCmd(1);
  1183.                        
  1184.                 write_com(0xc0);
  1185.     display(getTmpValue(2),2);
  1186.     sendChangeCmd(2);
  1187.                        
  1188.                 write_com(0xc0);
  1189.     display(getTmpValue(3),3);
  1190.     sendChangeCmd(3);
  1191.                        
  1192.           write_com(0xc0);
  1193.     display(getTmpValue(4),4);
  1194.     sendChangeCmd(4);
  1195.                
  1196.                 if(key==KEY_SET)
  1197.                 {
  1198.                         Mode++;
  1199.                 }
  1200.                
  1201.                 switch(Mode)                                                //判断模式的值
  1202.                 {
  1203.                         case 0:                                                                //监控模式
  1204.                         {
  1205.                                 Display_1604(yali1,yali2,yali3,yali4);  //显示预设温度,预设烟雾,温度值,烟雾值
  1206.                                 if(yali1>=yushe_yali)          //烟雾值大于等于预设值时
  1207.                                 {

  1208.                                         Fan=0;
  1209.                                         Buzzer=0;                                                  //蜂鸣器报警
  1210.                                 }
  1211.                                 else                                                                                  //烟雾值小于预设值时
  1212.                                 {

  1213.                                         Fan=1;
  1214.                                 }
  1215.                                 if(wendu>=(yushe_wendu*10))          //温度大于等于预设温度值时(为什么是大于预设值*10:因为我们要显示的温度是有小数点后一位,是一个3位数,25.9°C时实际读的数是259,所以判断预设值时将预设值*10)
  1216.                                 {
  1217.                                         Buzzer=0;                                                  //打开蜂鸣器报警

  1218.                                 }
  1219.                                 else                                                                                  //温度值小于预设值时
  1220.                                 {

  1221.                                 }
  1222.                                 if((yali1<yushe_yali)&&(wendu<(yushe_wendu*10)))          //当烟雾小于预设值并且温度也小于预设值时 (&&:逻辑与,左右两边的表达式都成立(都为真,也就是1)时,该if语句才成立)
  1223.                                 {
  1224.                                         Buzzer=1;                                                  //停止报警
  1225.                                 }
  1226.                                 break;
  1227.                         }
  1228.                         case 1://预设温度模式
  1229.                         {
  1230.                                 SelectPosition(0,5) ;                                        //指定位置
  1231.                            write_com(0x0d);                                                        //阴影闪烁
  1232.                                 if(key==KEY_ADD)                                                        //加键按下
  1233.                                 {
  1234.                                         yushe_wendu++;                                            //预设温度值(阀值)加1
  1235.                                         if(yushe_wendu>=120)                                         //当阀值加到大于等于99时
  1236.                                         yushe_wendu=120;                                                         //阀值固定为99
  1237.                                         LCD_Write_Char(0,6,yushe_wendu,2) ;//显示预设温度
  1238.                                 }
  1239.                                 if(key==KEY_MINUS)                                                 //减键按下
  1240.                                 {
  1241.                                         if(yushe_wendu<=1)                                        //当温度上限值减小到1时
  1242.                                         yushe_wendu=1;                          //固定为1
  1243.                                         yushe_wendu--;                                                        //预设温度值减一,最小为0
  1244.                                         LCD_Write_Char(0,6,yushe_wendu,2) ;//显示预设温度
  1245.                                 }
  1246.                                 break;                                                                                          //执行后跳出switch
  1247.                         }
  1248.                         case 2:                                //预设烟雾模式
  1249.                         {
  1250.                                 SelectPosition(0,12) ;                                //指定位置       
  1251.                            write_com(0x0d);                                                        //打开显示 无光标 光标闪烁
  1252.                                 if(key==KEY_ADD)                                                        //加键按下
  1253.                                 {
  1254.                                         if(yushe_yali>=255)        //当阀值加到大于等于255时
  1255.                                         yushe_yali=254;            //阀值固定为254
  1256.                                         yushe_yali++;                                            //预设烟雾值(阀值)加1,最大为255
  1257.                                         LCD_Write_Char(0,13,yushe_yali,3) ;//显示预设烟雾
  1258.                                 }
  1259.                                 if(key==KEY_MINUS)                                                //减键按下
  1260.                                 {
  1261.                                         if(yushe_yali<=1)                                        //当烟雾上限值减小到1时
  1262.                                                 yushe_yali=1;                  //固定为1
  1263.                                         yushe_yali--;                                                        //预设温度值减一,最小为0          
  1264.                                         LCD_Write_Char(0,13,yushe_yali,3) ;//显示预设烟雾
  1265.                                 }
  1266.                                 break;
  1267.                         }
  1268.                         default        :       
  1269.                         {
  1270.                                 write_com(0x38);//屏幕初始化
  1271.                                 write_com(0x0c);//打开显示 无光标 无光标闪烁
  1272.                                 Mode=0;                        //恢复正常模式
  1273.                                 break;
  1274.                         }
  1275.                 }
  1276.                
  1277.         }

  1278. }

复制代码


所有资料51hei提供下载:
多路温度压力检测系统.rar (136.27 KB, 下载次数: 191)

评分

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

查看全部评分

回复

使用道具 举报

ID:134870 发表于 2018-6-4 18:27 | 显示全部楼层
51hei有你更精彩!
回复

使用道具 举报

ID:519576 发表于 2019-4-23 15:00 | 显示全部楼层
厉害
回复

使用道具 举报

ID:473504 发表于 2020-4-2 20:08 | 显示全部楼层
请问楼主,你这个作品可以实现各路温度压力值的选择显示和连续滚动显示吗?
回复

使用道具 举报

ID:756407 发表于 2020-5-20 21:52 | 显示全部楼层
楼主好棒
回复

使用道具 举报

ID:468084 发表于 2020-5-21 20:55 | 显示全部楼层
为什么我仿真的时候,显示屏不显示东西?
回复

使用道具 举报

ID:924555 发表于 2021-5-20 17:45 来自手机 | 显示全部楼层
下载之后,用什么软件能打开呀
回复

使用道具 举报

ID:774143 发表于 2022-4-21 17:34 来自手机 | 显示全部楼层
大佬为啥运行起来有这个报警Logic contention(s) detected on net #00005.
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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