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

📄 max1274.c

📁 单片机应用系统(光盘内容)
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

#define LED P0						//定义数码管输出端
#define NUM 11                  	//采样数据个数

//引脚定义
sbit  CS=P2^0;						//MAX1274片选
sbit  CLK=P2^1;						//MAX1274时钟输入
sbit  DAT=P2^2;						//MAX1274数据输入

uchar n=0;							//采样数据个数
bit flag=0;							//首次显示标志

uint buffer[NUM];					//采集数据缓冲区
uchar buf[4];
uchar dispbuf[4];

const uchar tab[]={
    0xc0,0xf9,0xa4,0xb0,			//0~3
    0x99,0x92,0x82,0xf8,			//4~7
    0x80,0x98,0x88,0x83,			//8~b
    0xc6,0xa1,0x86,0x8e,			//c~f
    0xff,0xbF						//mie,-
};
const uchar dispbit[]={
	0x7f,0xbf,0xdf,0xef
};									//数码管显示位控制码
/**************************声明函数******************************/
void InitTimer0(void);				//
void delay(void);					//延时程序
uint read_ad(void);					//读取A/D转换数据
uint tem_dat(void);					//将读取数据转换成为温度值
uint median(void);					//进行中值滤波处理
void disp(uchar dis_dat);			//数据显示函数
void init_max1274(void);			//MAX1274初始化函数
/*************************主函数******************************/
main()
{
	uint send_dat;
	init_max1274();
	InitTimer0();	
	while (1)
    {
		if(n==NUM)
		{
			n=0;
			send_dat=median();		//中值滤波
		}
		disp(send_dat);				//显示温度值	
    }
}
/***********************T0初始化函数***************************/
void InitTimer0(void)
{
	TMOD=0x01;
    TH0=0x3C;
    TL0=0x0B0;
    EA=1;
    ET0=1;
    TR0=1;
}
/*************************T0中断函数******************************/
void Timer0(void) interrupt 1
{
    TH0=0x3C;						//重载定时器初值
    TL0=0x0B0;
    buffer[n++]=tem_dat();
}
/*************************延时函数******************************/
void delay(void)
{
    uchar i;
    for(i=0;i<100;i++);
}
/**********************MAX1274初始化函数************************/
void init_max1274(void)
{
	CS=1;
	CLK=0;
	DAT=0;
}
/*******************MAX1274转换数据读取函数*********************/
uint read_ad(void)
{
    uchar i;
	uint temp=0;
	CS=0;
	for(i=0;i<3;i++)
	{
		CLK=1;
		_nop_();_nop_();_nop_();
		CLK=0;
	}
	for(i=0;i<12;i++)
	{
		CLK=1;
		_nop_();_nop_();_nop_();
		if(DAT==1)temp+=1;
		temp<<=1;
		CLK=0;
	}
	CLK=1;
	_nop_();_nop_();_nop_();
	CLK=0;
    return(temp);
}
/******************温度值转换函数****************/
uint tem_dat(void)
{
    uint temp;
    float temp1;
    temp=read_ad();						//读入A/D转换数据
    temp1=((float)temp)*100/4096;		//将数据值转换成温度值
	temp=(uint)(temp1*10);			
	return(temp);
}
/*******************中值滤波*********************/
uint median(void)
{
    uchar i,j;
	uint temp;
    uint tempbuf[NUM];
    for (i=0;i<NUM;i++)					//采用冒泡法对采样温度进行排序
        for (j=0;j<NUM-i;j++)
        {
            if (tempbuf[i]>tempbuf[i+1])
            {
                temp=tempbuf[i];	
                tempbuf[i]=tempbuf[i+1];
                tempbuf[i+1]=temp;
            }
        }
    return(tempbuf[(NUM-1)/2]); //取中值并返回
}
/*******************显示读取数据*********************/
void disp(uchar dis_dat)
{
	uchar i;
	buf[0]=dis_dat/1000;			//计算百位数值
	buf[1]=(dis_dat%1000)/100;		//计算十位数值
	buf[2]=(dis_dat%100)/10;		//计算个位数值	
	buf[3]=dis_dat%10;				//计算小数数值
	if(flag==0)
	{
		for(i=0;i<4;i++)
			dispbuf[i]=0x3F;	
	}
	else
	{
		for(i=0;i<4;i++)
		{
			if((i=0)&(buf[i]==0))
			{
				dispbuf[0]=tab[16];
				if((i==1)&(buf[i]==0))
				{
					dispbuf[1]=tab[16];
				}	
			}
			else
			{
				if(i==2)dispbuf[2]=0x7f&tab[buf[2]];
				dispbuf[i]=tab[buf[i]];
			}
		}
			
	}
	for(i=0;i<4;i++)
	{
		LED=dispbuf[i];
		P2&=dispbit[i];
		delay();
		P2|=0x0f;
	}
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -