您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 基于51单片机的Pt100的温度计程序
#includereg51.h#includeabsacc.h#defineucharunsignedchar#defineuintunsignedint#defineADC0801XBYTE[0x7fff]#definedisp_datP1#defineLED_nP2sbitINTR=P3^2;constuchartab[]={0xc0,0xf9,0xa4,0xb0,//0~30x99,0x92,0x82,0xf8,//4~70x80,0x90,0xff,0x86//8、9、mie};constuchartab_dot[]={0x40,0x79,0x24,0x30,//0.~3.0x19,0x12,0x02,0x78,//4.~7.0x00,0x10,0xff,0x86//8.、9.、mie、E};ucharT[4]={1,0,4,5};uchartem[11]={10,10,20,13,11,11,15,21,18,29,11};ucharT_num=20,sam_n=0;/************************函数声明***********************/voiddelay(intn);//延时函数voidinit_T0(void);//定时器T0初始化voiddisp_seg(ucharn,uchard_dat);//显示函数ucharAD_dat(void);//AD转换函数ucharmedian(uchar*dat,ucharnum_d);//中值滤波函数floataccount_res(void);//电阻值计算函数floattemperature(void);//计算温度函数voidadj_t(void);//调整显示数据函数voiddisp(void);//温度显示程序voidrenovate(void);//更新显示数据/*********************主程序*********************/main(){init_T0();//初始化T0while(1){disp();//调用显示函数renovate();//更新显示数据};}/*****************温度显示函数*****************/voiddisp(void){uchari;for(i=0;i4;i++){disp_seg(i,T[i]);}}/***************更新显示数据函数***************/voidrenovate(void){if(sam_n==11)//去完11个采样值{sam_n=0;//清零采样计数器adj_t();//调用数据调整程序}}/******************延时函数********************/voiddelay(intn){inti,j;for(i=0;in;i++)for(j=0;j1000;j++);}/****************定时器T0初始化****************/voidinit_T0(void){TMOD=0x01;//工作方式1TH0=0x4c;//定时50msTL0=0x00;ET0=1;//允许定时器T0中断EA=1;//开总中断TR0=1;//启动定时器T0}/*******************显示函数*******************/voiddisp_seg(ucharn,uchard_dat){LED_n=0xff;//清位控制状态disp_dat=0xff;//清显示数据LED_n=~(0x01n);//送数据显示位if(n==2)disp_dat=tab_dot[d_dat];//送带小数点显示数据elsedisp_dat=tab[d_dat];//送无小数点显示数据delay(1);}/********************AD转换函数*********************/ucharAD_dat(void){uchartemp;ADC0801=0;//启动AD转换while(INTR);//等待转换结束temp=ADC0801;//读取转换值return(temp);}/*******************中值滤波函数*********************/ucharmedian(uchar*dat,ucharnum_d)//需要排序的数组{uchari,j,temp;for(i=0;inum_d;i++)//采用冒泡法对采样温度进行排序for(j=0;jnum_d-i;j++){if(dat[i]dat[i+1]){temp=dat[i];dat[i]=dat[i+1];dat[i+1]=temp;}}return(dat[(num_d-1)/2]);//取中值并返回}/*******************电阻值计算函数*********************/floataccount_res(void){uchartemp;floattemp_r;temp=median(tem,11);//利用中值法求取中间值temp_r=((float)temp)*150/255+100;return(temp_r);}/*****************计算温度函数*******************/floattemperature(void){floattemp1,T_out;uchartemp2;temp1=account_res();//计算Pt100阻值temp2=(uchar)temp1;//取Pt100阻值高位if(temp2100)T_out=777;//若阻值在小于0℃之间elseif(temp2139)T_out=2.558*temp1-256.02;//若阻值在0~100℃之间elseif(temp2177)T_out=2.637*temp1-267.01;//若阻值在100~200℃之间elseif(temp2214)T_out=2.721*temp1-281.9;//若阻值在200~300℃之间elseif(temp2250)T_out=2.81*temp1-300.94;//若阻值在300~400℃之间elseif(temp2250)T_out=777;//若阻值在大于400℃之间return(T_out);}/*******************调整显示数据函数*******************/voidadj_t(void){floattemp_v;uintvalue;temp_v=10*temperature();//利用计算温度值value=(uint)temp_v;if(value==7770)//超出测量范围{T[0]=11;//显示'E'T[1]=11;//显示'E'T[2]=11;//显示'E'T[3]=11;//显示'E'}else{T[0]=value/1000;//待显示百位T[1]=(value%1000)/100;//待显示十位T[2]=(value%1000)%100;//待显示个位T[3]=(value%1000)%100%10;//待显示小数if(T[0]==0x00){T[0]=10;if(T[1]==0)T[1]=10;}}}/*******************定时T0中断程序*****************/voidsenddat_T0(void)interrupt1{TH0=0x4c;//重载定时器初值TL0=0x00;if(--T_num==0){tem[sam_n]=AD_dat();//读取温度值存入缓冲区sam_n++;//温度采样个数加1T_num=20;//恢复计数值}}
本文标题:基于51单片机的Pt100的温度计程序
链接地址:https://www.777doc.com/doc-5165413 .html