基于51单片机的Pt100的温度计程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include
#include
#define uchar unsigned char
#define uint unsigned int
#define ADC0801 XBYTE[0x7fff]
#define disp_dat P1
#define LED_n P2
sbit INTR=P3^2;
const uchar tab[]={
0xc0,0xf9,0xa4,0xb0,//0~3
0x99,0x92,0x82,0xf8,//4~7
0x80,0x90,0xff,0x86 //8、9、mie
};
const uchar tab_dot[]={
0x40,0x79,0x24,0x30,//0.~3.
0x19,0x12,0x02,0x78,//4.~7.
0x00,0x10, 0xff,0x86//8.、9.、mie、E
};
uchar T[4]={1,0,4,5};
uchar tem[11]={10,10,20,13,11,11,15,21,18,29,11};
uchar T_num=20,sam_n=0;
/************************函数声明***********************/ void delay(int n); //延时函数
void init_T0(void); //定时器T0初始化void disp_seg(uchar n,uchar d_dat); //显示函数
uchar AD_dat(void); //AD转换函数uchar median(uchar *dat,uchar num_d); //中值滤波函数float account_res(void); //电阻值计算函数
float temperature(void); //计算温度函数
void adj_t(void); //调整显示数据函数void disp(void); //温度显示程序void renovate(void); //更新显示数据
/*********************主程序*********************/
main()
{
init_T0(); //初始化T0
while(1)
{
disp(); //调用显示函数
renovate(); //更新显示数据};
}
/*****************温度显示函数*****************/
void disp(void)
{
uchar i;
for(i=0;i<4;i++)
{
disp_seg(i,T[i]);
}
}
/***、、、、、、、、************更新显示数据函数*******、、、、、、、、、、、、、、、、。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。********/ void renovate(void)
{
if(sam_n==11) //去完11个采样值
{
sam_n=0; //清零采样计数器
adj_t(); //调用数据调整程序
}
}
/******************延时函数********************/
void delay(int n)
{
int i,j;
for (i=0;i for (j=0;j<1000;j++); } /****************定时器T0初始化****************/ void init_T0(void) { TMOD=0x01; //工作方式1 TH0=0x4c; //定时50ms TL0=0x00; ET0=1; //允许定时器T0中断 EA=1; //开总中断 TR0=1; //启动定时器T0 } /*******************显示函数*******************/ void disp_seg(uchar n,uchar d_dat) { LED_n=0xff; //清位控制状态 disp_dat=0xff; //清显示数据 LED_n=~(0x01< if(n==2) disp_dat=tab_dot[d_dat]; //送带小数点显示数据else disp_dat=tab[d_dat]; //送无小数点显示数据 delay(1); } /********************AD转换函数*********************/ uchar AD_dat(void) { uchar temp; ADC0801=0; //启动AD转换 while (INTR); //等待转换结束 temp=ADC0801; //读取转换值 return(temp); } /*******************中值滤波函数*********************/ uchar median(uchar *dat,uchar num_d) //需要排序的数组 { uchar i,j,temp; for (i=0;i { if (dat[i]>dat[i+1]) { temp=dat[i]; dat[i]=dat[i+1]; dat[i+1]=temp; } } return(dat[(num_d-1)/2]); //取中值并返回 } /*******************电阻值计算函数*********************/ float account_res(void) { uchar temp; float temp_r; temp=median(tem,11); //利用中值法求取中间值 temp_r=((float)temp)*150/255+100; return(temp_r); } /*****************计算温度函数*******************/ float temperature(void) { float temp1,T_out; uchar temp2; temp1=account_res(); //计算Pt100阻值 temp2=(uchar)temp1; //取Pt100阻值高位 if(temp2<100)