pt100+51单片机的温控系统程序+仿真图 还带压力显示的

pt100+51单片机的温控系统程序+仿真图 还带压力显示的

使用pt100测温度,经过放大器放大后的电压值乘以236就是实际的温度值0.42V对应100度,0V对应0度,经过ad运算显示出来,其他滤掉,就只显示0-100度,0-100对应输出0-5v的电压使用DA,功能,ad和da使用同个芯片,就是实现0-100显示,温度变化的同时da输出0-5v。
第二个就是压力传感器输出芯片ad输入0-5v,对应压力6-8pad,显示出来。


仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
none.gif

none.gif

none.gif

none.gif

单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define NOP() _nop_()
  6. #define Delay5us() {_nop_();_nop_();_nop_();_nop_();_nop_();}
  7.  
  8. #define LCD_LINE_ONE 1
  9. #define LCD_LINE_TWO 2
  10.  
  11. sbit LCD_RS = P2^0 ;
  12. sbit LCD_RW = P2^1 ;
  13. sbit LCD_EN = P2^2 ;
  14.  
  15. sbit SCL = P1^1;
  16. sbit SDA = P1^2;
  17.  
  18. sbit BEEP = P1^0;   
  19. uchar temp = 40;
  20. uchar pres = 40;
  21. uint Voltage[]={'0','0','0'};                                                //AD的LCD显示值
  22. unsigned char LCD_Line_1[] = {"TEMP:             "};//TEMP-是温度值
  23. unsigned char LCD_Line_2[] = {"PRES:             "};//PRES-是压力值
  24.  
  25. extern void Convert_To_Voltage(uint val);                        //函数声明
  26. uchar IIC_ERROR;                                                                        //IIC错误标志
  27.  
  28. void Delay(uint ms)                                //延时函数
  29. {
  30.          uchar i;
  31.         while(ms--)
  32.         {
  33.                  for(i=0;i<120;i++);
  34.         }
  35. }
  36. bit LCD_Busy_Check()                        //检测忙信号
  37. {
  38.          bit Result;
  39.         LCD_RS = 0;
  40.         LCD_RW = 1;
  41.         LCD_EN = 1;
  42.         Delay5us();
  43.         Result = (bit)(P0&0x80);
  44.         LCD_EN = 0;
  45.         return Result;
  46. }
  47. void LCD_Write_Command(uchar cmd)//LCD写命令
  48. {
  49.          while(LCD_Busy_Check());
  50.         LCD_RS = 0;
  51.         LCD_RW = 0;
  52.         LCD_EN = 0;
  53.         _nop_();
  54.         _nop_();
  55.         P0 = cmd;
  56.         Delay5us();
  57.         LCD_EN = 1;
  58.         Delay5us();
  59.         LCD_EN = 0;
  60. }
  61. void LCD_Write_Data(uchar dat)//LCD写数据
  62. {
  63.         while(LCD_Busy_Check());
  64.         LCD_RS = 1;
  65.         LCD_RW = 0;
  66.         LCD_EN = 0;
  67.         P0 = dat;
  68.         Delay5us();
  69.         LCD_EN = 1;
  70.         Delay5us();
  71.         LCD_EN = 0;         
  72. }
  73.  
  74. void LCD_Set_Position(uchar pos)                                //LCD显示位置设置
  75. {
  76.         if(pos == LCD_LINE_ONE)
  77.                 LCD_Write_Command(0x80);        
  78.         else
  79.                 LCD_Write_Command(0xc0);        
  80. }
  81. void LCD_Display_A_Line(uchar Line_Addr,uchar s[])//LCD显示行
  82. {
  83.          uchar i;
  84.         LCD_Set_Position(Line_Addr);
  85.         for(i=0;i<16;i++)
  86.         {
  87.                  LCD_Write_Data(s[i]);
  88.         }
  89. }
  90. void LCD_Dispay(void)                                                        //LCD实时显示
  91. {
  92.         Convert_To_Voltage(temp*5);
  93.         LCD_Line_1[6]= Voltage[2];
  94.         LCD_Line_1[7]= Voltage[1];
  95.         LCD_Line_1[8]= '.';
  96.         LCD_Line_1[9]= Voltage[0];
  97.         LCD_Line_1[11]= 'C';
  98.         LCD_Line_1[12]= 'e';
  99.         LCD_Line_1[13]= 'n';
  100.         LCD_Line_1[14]= 't';
  101.         LCD_Display_A_Line(LCD_LINE_ONE,LCD_Line_1);//温度显示
  102.         
  103.         Convert_To_Voltage(pres);
  104.         LCD_Line_2[6]= Voltage[2]+6;
  105.         LCD_Line_2[7]= '.';
  106.         LCD_Line_2[8]= Voltage[1];
  107.         LCD_Line_2[9]= Voltage[0];
  108.         LCD_Line_2[11]= 'p';
  109.         LCD_Line_2[12]= 'a';
  110.         LCD_Display_A_Line(LCD_LINE_TWO,LCD_Line_2);//压力显示
  111. }
  112. void LCD_Initialise()                                                        //LCD初始化
  113. {
  114.          LCD_Write_Command(0x38);Delay(5);
  115.         LCD_Write_Command(0x0c);Delay(5);
  116.         LCD_Write_Command(0x06);Delay(5);
  117.         LCD_Write_Command(0x01);Delay(5);
  118.         
  119.         LCD_Display_A_Line(1,LCD_Line_1);
  120.         LCD_Display_A_Line(2,LCD_Line_2);
  121. }
  122. /********************************PCF8591部分************************************/
  123. void Convert_To_Voltage(uint val)//电压换算成温度或压力
  124. {
  125.          uint Tmp;
  126.         Tmp = val;
  127.         Voltage[2] = Tmp/100+'0';
  128.         Tmp = Tmp%100*10;
  129.         Voltage[1] = Tmp/100+'0';
  130.         Tmp = Tmp%100*10;
  131.         Voltage[0] = Tmp/100+'0';
  132. }
  133.  
  134. /*****************IIC初始化*****************/
  135. void delay()   
  136. {;;}
  137.  
  138.  
  139. void start()//停止
  140. {
  141.         SDA=1;
  142.         delay();
  143.         SCL=1;
  144.         delay();
  145.         SDA=0;
  146.         delay();
  147. }
  148.  
  149. void stop()      //启动
  150. {
  151.         SDA=0;
  152.         delay();
  153.         SCL=1;
  154.         delay();
  155.         SDA=1;
  156.         delay();
  157. }
  158.  
  159.  
  160. void respons()//应答信号
  161. {
  162.         uchar i;
  163.         SCL=1;
  164.         delay();
  165.         while((SDA==1)&&(i<250))
  166.         i++;
  167.         SCL=0;
  168.         delay();
  169. }
  170.  
  171. void init()      //初始化PCF8591接口
  172. {
  173.         SDA=1;
  174.         delay();
  175.         SCL=1;
  176.         delay();   
  177. }
  178.  
  179. uchar read_byte()//对PCF8591读一个字节数据
  180. {
  181.         uchar i,k;
  182.         SCL=0;
  183.         delay();
  184.         SDA=1;
  185.         delay();
  186.         for(i=0;i<8;i++)
  187.         {
  188.                 SCL=1;
  189.                 delay();
  190.                 k=(k<<1)|SDA;
  191.                 SCL=0;
  192.                 delay();
  193.         }
  194.         return k;
  195. }
  196.  
  197. void write_byte(uchar date)  //对PCF8591写一个字节数据
  198. {
  199.         uchar i,temp1;
  200.         temp1=date;
  201.         for(i=0;i<8;i++)
  202.         {
  203.                 temp1=temp1<<1;
  204.                 SCL=0;
  205.                 delay();
  206.                 SDA=CY;
  207.                 delay();
  208.                 SCL=1;
  209.                 delay();            
  210.         }   
  211.         SCL=0;
  212.         delay();
  213.         SDA=1;
  214.         delay();
  215. }
  216.  
  217.  
  218.  
  219. void write_add(uchar control,uchar date)//输出电压
  220. {
  221.         start();
  222.         write_byte(0x90);        
  223.         respons();
  224.         write_byte(control);
  225.         respons();
  226.         write_byte(date);
  227.         respons();
  228.         stop();
  229.  
  230. }
  231.  
  232. uchar read_add(uchar control)//读取AD转换值
  233. {
  234.         uchar date;
  235.         start();
  236.         write_byte(0x90);
  237.         respons();
  238.         write_byte(control);
  239.         respons();
  240.         start();
  241.         write_byte(0x90+1);      
  242.         respons();
  243.         date=read_byte();
  244.         stop();
  245.         return date;
  246.  
  247. }
  248.  
  249.  
  250. void main()
  251. ……………………
  252.  
  253.  
复制代码


附件资料下载:

U创论坛下载-温控系统.rar
 
点击下方链接跳转过去下载
文件到原文下载,原文出自:https://bbs.usoftchina.com/thread-202540-1-1.html
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值