⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 51

📁 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 + -