找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 23488|回复: 51
收起左侧

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

  [复制链接]
ID:232268 发表于 2017-9-10 20:06 | 显示全部楼层 |阅读模式
使用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仿真工程文件可到本帖附件中下载)
0.png 0.png 0.png 0.png

单片机源程序如下:
  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, 下载次数: 707)

评分

参与人数 5黑币 +68 收起 理由
三万英尺双子 + 5 很给力!
danpianji3501 + 5 共享资料的黑币奖励!
qjzyx + 4 赞一个!
vktpas + 4 赞一个!
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:241069 发表于 2017-10-22 08:53 | 显示全部楼层
大神  temp=read_add(0x40)得到的值是温度么   不是ad转化的电压值?
回复

使用道具 举报

ID:274871 发表于 2018-1-15 15:42 | 显示全部楼层
大神,如果针对此电路,需要测一百以上的温度,该如何改电路啊
回复

使用道具 举报

ID:266116 发表于 2018-1-16 12:22 | 显示全部楼层
谢谢分享!
回复

使用道具 举报

ID:121859 发表于 2018-1-16 15:03 | 显示全部楼层
程序内容是用的PCF8591,不是题目上说的PT100。
回复

使用道具 举报

ID:17083 发表于 2018-2-6 11:03 | 显示全部楼层
学习一下!
回复

使用道具 举报

ID:282576 发表于 2018-2-6 12:59 来自手机 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:300584 发表于 2018-4-1 22:25 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:323859 发表于 2018-5-6 23:08 | 显示全部楼层
不错不错不错
回复

使用道具 举报

ID:323859 发表于 2018-5-6 23:09 | 显示全部楼层
看看了,再说了,应该不错
回复

使用道具 举报

ID:323859 发表于 2018-5-6 23:10 | 显示全部楼层
看看看再评价了。是不是
回复

使用道具 举报

ID:326015 发表于 2018-5-9 16:19 来自手机 | 显示全部楼层
正在学习,谢谢分享
回复

使用道具 举报

ID:326369 发表于 2018-5-9 22:06 | 显示全部楼层
1253676557 发表于 2017-10-22 08:53
**** 作者被禁止或删除 内容自动屏蔽 ****

你说得对
回复

使用道具 举报

ID:326369 发表于 2018-5-9 22:07 | 显示全部楼层
用c83单片机效果一样吗???
回复

使用道具 举报

ID:185448 发表于 2018-5-12 13:33 | 显示全部楼层
真的可以,学习一下
回复

使用道具 举报

ID:330340 发表于 2018-5-26 09:40 | 显示全部楼层
怎么调节压力的值,让其变化范围大一些呢
回复

使用道具 举报

ID:222006 发表于 2018-6-7 01:31 | 显示全部楼层
楼主威武,我做的题目不让用数字传感器,无奈只好四处找找有没有PT100的。
回复

使用道具 举报

ID:386086 发表于 2018-8-14 15:21 | 显示全部楼层
很好很好
回复

使用道具 举报

ID:302850 发表于 2018-10-24 10:29 | 显示全部楼层
就是在找Pt100啊,谢谢楼主的分享
回复

使用道具 举报

ID:414168 发表于 2018-10-24 13:17 | 显示全部楼层
楼主!有做过用热电偶控制300度的案列吗??
回复

使用道具 举报

ID:314528 发表于 2018-11-8 19:12 | 显示全部楼层
大哥 你这个放大电路的放大倍数是多少啊
回复

使用道具 举报

ID:450925 发表于 2018-12-20 18:22 | 显示全部楼层
nice!
回复

使用道具 举报

ID:460397 发表于 2019-1-2 20:21 | 显示全部楼层
想下载
回复

使用道具 举报

ID:467578 发表于 2019-1-13 21:39 | 显示全部楼层
感谢楼主,新接项目正好用到PT100仿真,找了一下午资料不会话仿真图!!!!谢谢楼主
回复

使用道具 举报

ID:467578 发表于 2019-1-13 21:40 | 显示全部楼层
这个PT100,可不可以直接不加放大电路,然后直接引出来一个节点然后用8591读取呢
回复

使用道具 举报

ID:462629 发表于 2019-3-28 09:28 | 显示全部楼层
有热电偶的资料吗
回复

使用道具 举报

ID:147434 发表于 2019-3-30 23:13 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:513748 发表于 2019-4-16 16:30 | 显示全部楼层
观摩学习
回复

使用道具 举报

ID:513748 发表于 2019-4-16 16:35 | 显示全部楼层
谢谢分享
回复

使用道具 举报

ID:513748 发表于 2019-4-16 16:39 | 显示全部楼层
观摩学习 谢谢分享
回复

使用道具 举报

ID:526151 发表于 2019-5-13 00:24 | 显示全部楼层
请问:如果只要温度显示,不要压力显示,程序应该如何修改呢?
回复

使用道具 举报

ID:531100 发表于 2019-5-14 18:06 | 显示全部楼层
学习一下
回复

使用道具 举报

ID:538248 发表于 2019-5-14 19:26 | 显示全部楼层
很有用
回复

使用道具 举报

ID:538248 发表于 2019-5-14 19:26 | 显示全部楼层
学习学习
回复

使用道具 举报

ID:165117 发表于 2019-5-17 14:45 | 显示全部楼层
谢谢分享 学习一下
回复

使用道具 举报

ID:520972 发表于 2019-5-22 22:52 | 显示全部楼层
想请问为什么电压值乘以236就是温度值?
回复

使用道具 举报

ID:555724 发表于 2019-6-5 16:06 | 显示全部楼层

十分感谢
回复

使用道具 举报

ID:560131 发表于 2019-6-11 17:07 | 显示全部楼层
可以  很强大很给力
回复

使用道具 举报

ID:557774 发表于 2019-6-12 00:34 来自手机 | 显示全部楼层
刚好需要这个作为参考程序,谢谢
回复

使用道具 举报

ID:97678 发表于 2019-6-13 09:56 | 显示全部楼层
怎么将温度测量范围放大?负温度怎么写程序?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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