📄 max1274.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 + -