找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于单片机+pt100热敏电阻的体温计Proteus仿真程序

  [复制链接]
ID:679189 发表于 2020-9-9 19:38 | 显示全部楼层 |阅读模式
采用热敏电阻pt100设计温度传感电路,温度传感电路通过放大电路进行放大后加载到A/D转换模块(ADC0804),以AT89C51单片机为主控制端,外接晶振电路满足各模块时序,最终通过7段数码管进行温度显示

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
51hei截图20200909193703.png

单片机源程序如下:
  1. #include<reg51.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. #define      ad0_7      P1       //AD数据口

  6. sbit         cs=P2^4;      //片选信号,低电平有效,控制芯片的启动和结果读取

  7. sbit         rd=P2^7;        //读数据控制,低电平有效

  8. sbit         wr=P2^6;         //AD启动控制,上升沿有效

  9. sbit         intr=P2^5;       //AD转换完成输出低电平

  10. uchar i;
  11. uchar led[11]={     0x3F,  //"0"
  12.                 0x06,  //"1"
  13.                 0x5B,  //"2"
  14.                 0x4F,  //"3"
  15.                 0x66,  //"4"
  16.                 0x6D,  //"5"
  17.                 0x7D,  //"6"
  18.                 0x07,  //"7"
  19.                 0x7F,  //"8"
  20.                 0x6F,  //"9"
  21.                                 0x40,   //"-"
  22.                                 };
  23.         uchar dat_AD[4]={0};
  24.   
  25. //启动AD转换子程序//////////////////
  26. void start_ad(void)
  27. {       cs=0;                 //允许AD
  28.         wr=0;
  29.         _nop_();
  30.          wr=1;                //WR由低变高时启动AD转换
  31.         
  32.         while(intr);          //等待转换完成,低电平有效
  33.         cs=1;                 //停止AD转换
  34. }////////////////////
  35. read_ad()
  36. {       uint ad_data;
  37.         ad0_7=0xff;
  38.         cs=0;                 //允许读       
  39.         rd=0;                 //读取转换数据结果
  40.         _nop_();
  41.         ad_data=ad0_7;         //把数据存到AD——data中
  42.         rd=1;cs=1;            //停止读取AD
  43.         return(ad_data);
  44. }
  45. // 数据处理函数
  46. //实际测量当0度时,AD数据为133,所以数据处理时判断AD数据和133的大小来识别正负温度。
  47. //由于ADC芯片精度不够,所以测量时有误差,8位AD的分辨率为19.5mV,约为20mV,
  48. //放大电路输出的电压,温度每变化一度,电压变化只有10mV左右,所以测量有误差,
  49. //以下温度和AD数据的计算公式为实测数据后线性拟合得到的,实际线性拟合得到公式为:y=0.503x+133.63.
  50. //因为AD数据为0-255的整数,所以公式简化为以下计算方式
  51. void data_shout(uint ad_data)
  52. {      
  53.          float  temp;
  54.          uint T;

  55.                 if(ad_data<79)
  56.                {
  57.                    temp=614.422-7.811*ad_data;
  58.                  T=(uint)temp;
  59.                  dat_AD[0]=10;
  60.                }                            //负温度   dat_AD[0]中为温度符号数据
  61.                 else if(ad_data<=204)
  62.                {
  63.                    temp=7.990*ad_data-628.491;
  64.                  T=(uint)temp;
  65.                  dat_AD[0]=T/1000;
  66.                }                             //正温度

  67.                 else if(ad_data>204)
  68.                {
  69.                  temp=8.124*ad_data-655.742;
  70.                  T=(uint)temp;
  71.                  dat_AD[0]=T/1000;
  72.                }                                        //ad_data=T;
  73.                
  74.                dat_AD[1]=T%1000/100;              //温度值的十位
  75.          dat_AD[2]=T%100/10;          //2温度值的个位
  76.          dat_AD[3]=T%10;          //温度值的小数位

  77. }
  78. //显示函数
  79. void disp(){

  80.         switch(i){
  81.                 case 0: P0=0xfe;P3=led[dat_AD[0]];i++;break;         //显示符号位
  82.                 case 1: P0=0xfd;P3=led[dat_AD[1]];i++;break;
  83.                 case 2: P0=0xfb;P3=led[dat_AD[2]]|0x80;i++;break;
  84.                 case 3: P0=0xf7;P3=led[dat_AD[3]];i=0;break;

  85.         }
  86. }

  87. //定时器初始化
  88. //用作数码管显示的刷新
  89. void t0init(){
  90.         TMOD=0x01;
  91.         TH0=(65535-2000)/256;           //定时20ms时间
  92.         TL0=(65535-2000)%256;
  93.         EA=1;
  94.         ET0=1;
  95.         TR0=1;
  96. }
  97. //定时器中断函数,在中断中刷新数码管显示
  98. void Time0(  ) interrupt 1{
  99.         TH0=(65535-2000)/256;
  100.         TL0=(65535-2000)%256;
  101.         disp();
  102. }

  103. //主函数
  104. void main(void){
  105.          t0init();          //初始化
  106.      while(1){
  107.         start_ad();             //开始AD
  108.         data_shout(read_ad());           //数据处理
  109.      }
  110. }
复制代码

所有资料51hei提供下载:
pt100热敏电阻的体温计.zip (48.38 KB, 下载次数: 290)

评分

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

查看全部评分

回复

使用道具 举报

ID:896842 发表于 2021-3-26 15:51 | 显示全部楼层
小白,想问温度范围是怎么定的,感谢
回复

使用道具 举报

ID:679189 发表于 2021-3-29 12:57 | 显示全部楼层
keliandexiaowa 发表于 2021-3-26 15:51
小白,想问温度范围是怎么定的,感谢

根据pt100热敏电阻的温度特性
回复

使用道具 举报

ID:896842 发表于 2021-3-31 20:42 | 显示全部楼层
楼主可以告诉我怎么改变温度大小吗,非常感谢
回复

使用道具 举报

ID:46065 发表于 2021-3-31 21:40 | 显示全部楼层
这个要用阻值对照表的,才精确
回复

使用道具 举报

ID:879351 发表于 2022-5-23 18:33 | 显示全部楼层
阻值对照表的应该怎么看啊?
回复

使用道具 举报

ID:228452 发表于 2022-5-23 22:28 | 显示全部楼层
find data sheet for used PT100..
回复

使用道具 举报

ID:1031438 发表于 2022-6-15 00:24 | 显示全部楼层
这个有没有报警系统
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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