标题: pt100+51单片机的温控系统程序+仿真图 还带压力显示 [打印本页]

作者: lqx861106    时间: 2017-9-10 20:06
标题: 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仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  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. #define LCD_LINE_ONE 1
  8. #define LCD_LINE_TWO 2

  9. sbit LCD_RS = P2^0 ;
  10. sbit LCD_RW = P2^1 ;
  11. sbit LCD_EN = P2^2 ;

  12. sbit SCL = P1^1;
  13. sbit SDA = P1^2;

  14. sbit BEEP = P1^0;   
  15. uchar temp = 40;
  16. uchar pres = 40;
  17. uint Voltage[]={'0','0','0'};                                                //AD的LCD显示值
  18. unsigned char LCD_Line_1[] = {"TEMP:             "};//TEMP-是温度值
  19. unsigned char LCD_Line_2[] = {"PRES:             "};//PRES-是压力值

  20. extern void Convert_To_Voltage(uint val);                        //函数声明
  21. uchar IIC_ERROR;                                                                        //IIC错误标志

  22. void Delay(uint ms)                                //延时函数
  23. {
  24.          uchar i;
  25.         while(ms--)
  26.         {
  27.                  for(i=0;i<120;i++);
  28.         }
  29. }
  30. bit LCD_Busy_Check()                        //检测忙信号
  31. {
  32.          bit Result;
  33.         LCD_RS = 0;
  34.         LCD_RW = 1;
  35.         LCD_EN = 1;
  36.         Delay5us();
  37.         Result = (bit)(P0&0x80);
  38.         LCD_EN = 0;
  39.         return Result;
  40. }
  41. void LCD_Write_Command(uchar cmd)//LCD写命令
  42. {
  43.          while(LCD_Busy_Check());
  44.         LCD_RS = 0;
  45.         LCD_RW = 0;
  46.         LCD_EN = 0;
  47.         _nop_();
  48.         _nop_();
  49.         P0 = cmd;
  50.         Delay5us();
  51.         LCD_EN = 1;
  52.         Delay5us();
  53.         LCD_EN = 0;
  54. }
  55. void LCD_Write_Data(uchar dat)//LCD写数据
  56. {
  57.         while(LCD_Busy_Check());
  58.         LCD_RS = 1;
  59.         LCD_RW = 0;
  60.         LCD_EN = 0;
  61.         P0 = dat;
  62.         Delay5us();
  63.         LCD_EN = 1;
  64.         Delay5us();
  65.         LCD_EN = 0;         
  66. }

  67. void LCD_Set_Position(uchar pos)                                //LCD显示位置设置
  68. {
  69.         if(pos == LCD_LINE_ONE)
  70.                 LCD_Write_Command(0x80);        
  71.         else
  72.                 LCD_Write_Command(0xc0);        
  73. }
  74. void LCD_Display_A_Line(uchar Line_Addr,uchar s[])//LCD显示行
  75. {
  76.          uchar i;
  77.         LCD_Set_Position(Line_Addr);
  78.         for(i=0;i<16;i++)
  79.         {
  80.                  LCD_Write_Data(s[i]);
  81.         }
  82. }
  83. void LCD_Dispay(void)                                                        //LCD实时显示
  84. {
  85.         Convert_To_Voltage(temp*5);
  86.         LCD_Line_1[6]= Voltage[2];
  87.         LCD_Line_1[7]= Voltage[1];
  88.         LCD_Line_1[8]= '.';
  89.         LCD_Line_1[9]= Voltage[0];
  90.         LCD_Line_1[11]= 'C';
  91.         LCD_Line_1[12]= 'e';
  92.         LCD_Line_1[13]= 'n';
  93.         LCD_Line_1[14]= 't';
  94.         LCD_Display_A_Line(LCD_LINE_ONE,LCD_Line_1);//温度显示
  95.         
  96.         Convert_To_Voltage(pres);
  97.         LCD_Line_2[6]= Voltage[2]+6;
  98.         LCD_Line_2[7]= '.';
  99.         LCD_Line_2[8]= Voltage[1];
  100.         LCD_Line_2[9]= Voltage[0];
  101.         LCD_Line_2[11]= 'p';
  102.         LCD_Line_2[12]= 'a';
  103.         LCD_Display_A_Line(LCD_LINE_TWO,LCD_Line_2);//压力显示
  104. }
  105. void LCD_Initialise()                                                        //LCD初始化
  106. {
  107.          LCD_Write_Command(0x38);Delay(5);
  108.         LCD_Write_Command(0x0c);Delay(5);
  109.         LCD_Write_Command(0x06);Delay(5);
  110.         LCD_Write_Command(0x01);Delay(5);
  111.         
  112.         LCD_Display_A_Line(1,LCD_Line_1);
  113.         LCD_Display_A_Line(2,LCD_Line_2);
  114. }
  115. /********************************PCF8591部分************************************/
  116. void Convert_To_Voltage(uint val)//电压换算成温度或压力
  117. {
  118.          uint Tmp;
  119.         Tmp = val;
  120.         Voltage[2] = Tmp/100+'0';
  121.         Tmp = Tmp%100*10;
  122.         Voltage[1] = Tmp/100+'0';
  123.         Tmp = Tmp%100*10;
  124.         Voltage[0] = Tmp/100+'0';
  125. }

  126. /*****************IIC初始化*****************/
  127. void delay()   
  128. {;;}


  129. void start()//停止
  130. {
  131.         SDA=1;
  132.         delay();
  133.         SCL=1;
  134.         delay();
  135.         SDA=0;
  136.         delay();
  137. }

  138. void stop()      //启动
  139. {
  140.         SDA=0;
  141.         delay();
  142.         SCL=1;
  143.         delay();
  144.         SDA=1;
  145.         delay();
  146. }


  147. void respons()//应答信号
  148. {
  149.         uchar i;
  150.         SCL=1;
  151.         delay();
  152.         while((SDA==1)&&(i<250))
  153.         i++;
  154.         SCL=0;
  155.         delay();
  156. }

  157. void init()      //初始化PCF8591接口
  158. {
  159.         SDA=1;
  160.         delay();
  161.         SCL=1;
  162.         delay();   
  163. }

  164. uchar read_byte()//对PCF8591读一个字节数据
  165. {
  166.         uchar i,k;
  167.         SCL=0;
  168.         delay();
  169.         SDA=1;
  170.         delay();
  171.         for(i=0;i<8;i++)
  172.         {
  173.                 SCL=1;
  174.                 delay();
  175.                 k=(k<<1)|SDA;
  176.                 SCL=0;
  177.                 delay();
  178.         }
  179.         return k;
  180. }

  181. void write_byte(uchar date)  //对PCF8591写一个字节数据
  182. {
  183.         uchar i,temp1;
  184.         temp1=date;
  185.         for(i=0;i<8;i++)
  186.         {
  187.                 temp1=temp1<<1;
  188.                 SCL=0;
  189.                 delay();
  190.                 SDA=CY;
  191.                 delay();
  192.                 SCL=1;
  193.                 delay();            
  194.         }   
  195.         SCL=0;
  196.         delay();
  197.         SDA=1;
  198.         delay();
  199. }



  200. void write_add(uchar control,uchar date)//输出电压
  201. {
  202.         start();
  203.         write_byte(0x90);        
  204.         respons();
  205.         write_byte(control);
  206.         respons();
  207.         write_byte(date);
  208.         respons();
  209.         stop();

  210. }

  211. uchar read_add(uchar control)//读取AD转换值
  212. {
  213.         uchar date;
  214.         start();
  215.         write_byte(0x90);
  216.         respons();
  217.         write_byte(control);
  218.         respons();
  219.         start();
  220.         write_byte(0x90+1);      
  221.         respons();
  222.         date=read_byte();
  223.         stop();
  224.         return date;

  225. }


  226. void main()
  227. ……………………

  228. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
温控系统.rar (121.02 KB, 下载次数: 715)





作者: 1253676557    时间: 2017-10-22 08:53
大神  temp=read_add(0x40)得到的值是温度么   不是ad转化的电压值?
作者: lmy1200    时间: 2018-1-15 15:42
大神,如果针对此电路,需要测一百以上的温度,该如何改电路啊
作者: qjzyx    时间: 2018-1-16 12:22
谢谢分享!
作者: zhxiufan    时间: 2018-1-16 15:03
程序内容是用的PCF8591,不是题目上说的PT100。
作者: xugh1977    时间: 2018-2-6 11:03
学习一下!
作者: 雁过留香丶    时间: 2018-2-6 12:59
谢谢分享
作者: 索尼克    时间: 2018-4-1 22:25
学习一下
作者: xxpjian520    时间: 2018-5-6 23:08
不错不错不错
作者: xxpjian520    时间: 2018-5-6 23:09
看看了,再说了,应该不错
作者: xxpjian520    时间: 2018-5-6 23:10
看看看再评价了。是不是
作者: doney    时间: 2018-5-9 16:19
正在学习,谢谢分享
作者: heamin    时间: 2018-5-9 22:06
1253676557 发表于 2017-10-22 08:53
**** 作者被禁止或删除 内容自动屏蔽 ****

你说得对
作者: heamin    时间: 2018-5-9 22:07
用c83单片机效果一样吗???
作者: 猛哥欧巴    时间: 2018-5-12 13:33
真的可以,学习一下
作者: 沧海一声笑、    时间: 2018-5-26 09:40
怎么调节压力的值,让其变化范围大一些呢
作者: 阔爱的钊钊    时间: 2018-6-7 01:31
楼主威武,我做的题目不让用数字传感器,无奈只好四处找找有没有PT100的。
作者: 三万英尺双子    时间: 2018-8-14 15:21
很好很好
作者: prettytank    时间: 2018-10-24 10:29
就是在找Pt100啊,谢谢楼主的分享
作者: goinwin    时间: 2018-10-24 13:17
楼主!有做过用热电偶控制300度的案列吗??
作者: 应作如是观    时间: 2018-11-8 19:12
大哥 你这个放大电路的放大倍数是多少啊
作者: bwk    时间: 2018-12-20 18:22
nice!

作者: 矛木    时间: 2019-1-2 20:21
想下载
作者: lkk99号    时间: 2019-1-13 21:39
感谢楼主,新接项目正好用到PT100仿真,找了一下午资料不会话仿真图!!!!谢谢楼主
作者: lkk99号    时间: 2019-1-13 21:40
这个PT100,可不可以直接不加放大电路,然后直接引出来一个节点然后用8591读取呢
作者: woyaodwn    时间: 2019-3-28 09:28
有热电偶的资料吗
作者: billchun    时间: 2019-3-30 23:13
谢谢分享
作者: 萌个锤子    时间: 2019-4-16 16:30
观摩学习
作者: 萌个锤子    时间: 2019-4-16 16:35
谢谢分享
作者: 萌个锤子    时间: 2019-4-16 16:39
观摩学习 谢谢分享
作者: zzf872490437    时间: 2019-5-13 00:24
请问:如果只要温度显示,不要压力显示,程序应该如何修改呢?
作者: swy分工会尽快    时间: 2019-5-14 18:06
学习一下
作者: 若离枝    时间: 2019-5-14 19:26
很有用
作者: 若离枝    时间: 2019-5-14 19:26
学习学习
作者: gdatgb    时间: 2019-5-17 14:45
谢谢分享 学习一下
作者: Wuhen_123456789    时间: 2019-5-22 22:52
想请问为什么电压值乘以236就是温度值?

作者: 嘿哈123    时间: 2019-6-5 16:06
若离枝 发表于 2019-5-14 19:26
很有用

十分感谢

作者: QWE8764210    时间: 2019-6-11 17:07
可以  很强大很给力
作者: abc111111    时间: 2019-6-12 00:34
刚好需要这个作为参考程序,谢谢
作者: jovew    时间: 2019-6-13 09:56
怎么将温度测量范围放大?负温度怎么写程序?
作者: JEFF1    时间: 2019-6-13 15:36
lmy1200 发表于 2018-1-15 15:42
大神,如果针对此电路,需要测一百以上的温度,该如何改电路啊

不用改电路,程序这两个地方成这样就好了:
        Convert_To_Voltage(temp*5);
        LCD_Line_1[7]= Voltage[3];
        LCD_Line_1[8]= Voltage[2];
        LCD_Line_1[9]= Voltage[1];
        LCD_Line_1[10]= '.';
        LCD_Line_1[11]= Voltage[0];
        LCD_Line_1[12]= 'C';
        LCD_Line_1[13]= 'e';
        LCD_Line_1[14]= 'n';
        LCD_Line_1[15]= 't';
        LCD_Display_A_Line(LCD_LINE_ONE,LCD_Line_1);//温度显示

void Convert_To_Voltage(uint val)//电压换算成温度或压力
{
        uint Tmp;
        Tmp = val;
        Voltage[3] = Tmp/1000+'0';
        Tmp = Tmp%1000*10;
        Voltage[2] = Tmp/1000+'0';
        Tmp = Tmp%1000*10;
        Voltage[1] = Tmp/1000+'0';
        Tmp = Tmp%1000*10;
        Voltage[0] = Tmp/1000+'0';
}
作者: yang123456789    时间: 2019-6-17 09:46
麻烦问一下Pt100是三线的吗?
作者: 韩昊辰    时间: 2019-6-19 09:28
谢谢分享
作者: lucheng77    时间: 2019-8-22 12:33
yang123456789 发表于 2019-6-17 09:46
麻烦问一下Pt100是三线的吗?

有三线的,也有两线的,三线是线材补偿,因为PT100本身电阻比较小,引线长了后引线的电阻就不能忽略不计了,为了测量更精确才加入另一条线进行补偿。
作者: 梅江松子    时间: 2019-8-22 14:08
谢谢分享
作者: 6467778399    时间: 2019-9-26 14:46


学习学习备用
作者: pps10086    时间: 2019-10-29 15:22
谢谢分享。。。
作者: blackss    时间: 2019-12-25 10:33
很给力
作者: cbay    时间: 2020-1-16 01:22
楼主太厉害
作者: qssh    时间: 2020-12-28 17:31
1253676557 发表于 2017-10-22 08:53
**** 作者被禁止或删除 内容自动屏蔽 ****

是温度值
作者: 文把把2    时间: 2022-4-29 17:21
请问一下这个输出电压乘上236对不上实际温度值呢




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1