📄 51
字号:
#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int#define ADC0801 XBYTE[0x7fff]#define disp_dat P1#define LED_n P2sbit 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<n;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<<n); //送数据显示位 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<num_d;i++) //采用冒泡法对采样温度进行排序 for (j=0;j<num_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]); //取中值并返回}/*******************电阻值计算函数*********************/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) T_out=777; //若阻值在小于0℃之间 else if(temp2<139) T_out=2.558*temp1-256.02; //若阻值在0~100℃之间 else if(temp2<177) T_out=2.637*temp1-267.01; //若阻值在100~200℃之间 else if(temp2<214) T_out=2.721*temp1-281.9; //若阻值在200~300℃之间 else if(temp2<250) T_out=2.81*temp1-300.94; //若阻值在300~400℃之间 else if(temp2>250) T_out=777; //若阻值在大于400℃之间 return(T_out);}/*******************调整显示数据函数*******************/void adj_t(void){ float temp_v; uint value; 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中断程序*****************/void senddat_T0(void) interrupt 1{ TH0=0x4c; //重载定时器初值 TL0=0x00; if(--T_num==0) { tem[sam_n]=AD_dat(); //读取温度值存入缓冲区 sam_n++; //温度采样个数加1 T_num=20; //恢复计数值 }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -