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