📄 main.c
字号:
#include <reg52.h>
#include <absacc.h>
#define uchar unsigned char
#define uint unsigned int
#define AdLenth 3
sbit D_CLOCK =P1^0;
sbit D_IN =P1^1;
sbit D_OUT =P1^3;
sbit D_CS =P1^4;
uint AdBuff[];
uint Read2543(uchar port);
uint GetMidAd(uchar port);
void AdMoveAverage(uchar Port);
uint AdAverage(void);
void Delay(uint i);
//TI TLC2543 12位AD驱动程序,51晶振是11.0592MHz的。
/*-----------------------------------------------------------------------------
调用方式:uint Read2543(uchar port)
函数说明:port是采样的通道号 0-----10
-------------------------------------------------------------------------------*/
//当前返回的测量值是上一次输入的结果。
uint Read2543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
uchar mRetADHi,mRetADLo; //返回的测量值的高位、8低位
uchar mTemp;
D_CLOCK=0;
D_CS=0;
mRetADHi=0;
mRetADLo=0;
//把通道号(4位)打入2543 **代码虽然麻烦,但编译后的执行速度很快**
D_IN=(bit)(port&0x08);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<3;
D_CLOCK=0;
D_IN=(bit)(port&0x04);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<2;
D_CLOCK=0;
D_IN=(bit)(port&0x02);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp<<1;
D_CLOCK=0;
D_IN=(bit)(port&0x01);
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADHi|=mTemp;
D_CLOCK=0;
//参数设定开始
//注意:参数的设定只对下一周期的测量有效,对本次取样没有作用
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<7;
D_CLOCK=0; //选择12位的数据长度
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<6;
D_CLOCK=0;
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<5;
D_CLOCK=0; //高位在前输出
D_IN=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<4;
D_CLOCK=0; //单极性输出
//参数设定结束
D_CLOCK=1; //填充4个任意位
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<3;
D_CLOCK=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<2;
D_CLOCK=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp<<1;
D_CLOCK=0;
D_CLOCK=1;
mTemp=(uchar)D_OUT;
mRetADLo|=mTemp;
D_CLOCK=0;
D_CS=1;
return (uint)(mRetADHi*256+mRetADLo);
}
/*****************************************/
uint GetMidAd(uchar port )
{
uint FirstAd;
uint SecondAd;
uint ThirdAd;
uint Temp;
Read2543(port);
FirstAd=Read2543(port);
Delay(20);
SecondAd=Read2543(port);
Delay(20);
ThirdAd=Read2543(port);
//由小到大排列
if(FirstAd>=SecondAd)
{
Temp=FirstAd;
FirstAd=SecondAd;
SecondAd=Temp;
}
if(SecondAd>=ThirdAd)
{
Temp=SecondAd;
SecondAd=ThirdAd;
ThirdAd=Temp;
}
if(FirstAd>=SecondAd)
{
Temp=FirstAd;
FirstAd=SecondAd;
SecondAd=Temp;
}
//得到中值。
return(SecondAd);
}
//*****************************************************************
//移动平均
void AdMoveAverage(uchar Port)
{
uint TempAd;
uchar i;
TempAd=GetMidAd(Port);
for(i=AdLenth;i>0;i--)
{
AdBuff[i]=AdBuff[i-1];
}
AdBuff[0]=TempAd;
}
//****************************************************************
uint AdAverage(void)
{
uchar i;
uint AdValue;
unsigned long Sum=0;
for(i=0;i<AdLenth;i++)
{
Sum+=AdBuff[i];
}
AdValue=Sum/AdLenth;
return(AdValue);
}
//****************************************************************
void Delay(uint i)
{
while(i--);
}
//****************************************************************
void main(void)
{
uchar aa;
while(1)
{
// uint AdValue;
// AdMoveAverage(0);
// AdValue=AdAverage();
aa=GetMidAd(0);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -