采用热敏电阻pt100设计温度传感电路,温度传感电路通过放大电路进行放大后加载到A/D转换模块(ADC0804),以AT89C51单片机为主控制端,外接晶振电路满足各模块时序,最终通过7段数码管进行温度显示
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- #define ad0_7 P1 //AD数据口
- sbit cs=P2^4; //片选信号,低电平有效,控制芯片的启动和结果读取
- sbit rd=P2^7; //读数据控制,低电平有效
- sbit wr=P2^6; //AD启动控制,上升沿有效
- sbit intr=P2^5; //AD转换完成输出低电平
- uchar i;
- uchar led[11]={ 0x3F, //"0"
- 0x06, //"1"
- 0x5B, //"2"
- 0x4F, //"3"
- 0x66, //"4"
- 0x6D, //"5"
- 0x7D, //"6"
- 0x07, //"7"
- 0x7F, //"8"
- 0x6F, //"9"
- 0x40, //"-"
- };
- uchar dat_AD[4]={0};
-
- //启动AD转换子程序//////////////////
- void start_ad(void)
- { cs=0; //允许AD
- wr=0;
- _nop_();
- wr=1; //WR由低变高时启动AD转换
-
- while(intr); //等待转换完成,低电平有效
- cs=1; //停止AD转换
- }////////////////////
- read_ad()
- { uint ad_data;
- ad0_7=0xff;
- cs=0; //允许读
- rd=0; //读取转换数据结果
- _nop_();
- ad_data=ad0_7; //把数据存到AD——data中
- rd=1;cs=1; //停止读取AD
- return(ad_data);
- }
- // 数据处理函数
- //实际测量当0度时,AD数据为133,所以数据处理时判断AD数据和133的大小来识别正负温度。
- //由于ADC芯片精度不够,所以测量时有误差,8位AD的分辨率为19.5mV,约为20mV,
- //放大电路输出的电压,温度每变化一度,电压变化只有10mV左右,所以测量有误差,
- //以下温度和AD数据的计算公式为实测数据后线性拟合得到的,实际线性拟合得到公式为:y=0.503x+133.63.
- //因为AD数据为0-255的整数,所以公式简化为以下计算方式
- void data_shout(uint ad_data)
- {
- float temp;
- uint T;
- if(ad_data<79)
- {
- temp=614.422-7.811*ad_data;
- T=(uint)temp;
- dat_AD[0]=10;
- } //负温度 dat_AD[0]中为温度符号数据
- else if(ad_data<=204)
- {
- temp=7.990*ad_data-628.491;
- T=(uint)temp;
- dat_AD[0]=T/1000;
- } //正温度
- else if(ad_data>204)
- {
- temp=8.124*ad_data-655.742;
- T=(uint)temp;
- dat_AD[0]=T/1000;
- } //ad_data=T;
-
- dat_AD[1]=T%1000/100; //温度值的十位
- dat_AD[2]=T%100/10; //2温度值的个位
- dat_AD[3]=T%10; //温度值的小数位
- }
- //显示函数
- void disp(){
- switch(i){
- case 0: P0=0xfe;P3=led[dat_AD[0]];i++;break; //显示符号位
- case 1: P0=0xfd;P3=led[dat_AD[1]];i++;break;
- case 2: P0=0xfb;P3=led[dat_AD[2]]|0x80;i++;break;
- case 3: P0=0xf7;P3=led[dat_AD[3]];i=0;break;
- }
- }
- //定时器初始化
- //用作数码管显示的刷新
- void t0init(){
- TMOD=0x01;
- TH0=(65535-2000)/256; //定时20ms时间
- TL0=(65535-2000)%256;
- EA=1;
- ET0=1;
- TR0=1;
- }
- //定时器中断函数,在中断中刷新数码管显示
- void Time0( ) interrupt 1{
- TH0=(65535-2000)/256;
- TL0=(65535-2000)%256;
- disp();
- }
- //主函数
- void main(void){
- t0init(); //初始化
- while(1){
- start_ad(); //开始AD
- data_shout(read_ad()); //数据处理
- }
- }
复制代码
所有资料51hei提供下载:
pt100热敏电阻的体温计.zip
(48.38 KB, 下载次数: 305)
|