📄 max147的c源码.c
字号:
//12位串行AD(MAX145)的C51源码(ADC+去极值均值滤波+串行通信)
//2007年08月15日 星期三 13:52/*采用11.0592MHz ,9600波特率*/
#include <REG52.h>
#include <intrins.h>
#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();};
sbit SCLK =P1^0; // 将p1.0口模拟时钟输出
sbit DOUT =P1^1; // 将p1.1口模拟主机输出
sbit CS =P1^2; // 将p1.2口模拟片选
void delayMS(unsigned int i)
{ unsigned int j,k;
for(k=0;k<i;k++)
for(j=0;j<60;j++);
}
unsigned int ADC(void)
{ unsigned char n;
unsigned int ADValue;
SCLK = 0;
CS = 1;
delayNOP();
CS = 0;
delayNOP();
SCLK = 0;
while(DOUT==0);
n=16;
while(n--)
{ delayNOP();
SCLK = 1;
{ADValue = ADValue<<1; // 左移一位,或_crol_(temp,1)
if(DOUT == 1)
ADValue = ADValue|0x0001; // 若接收到的位为1,则数据的最后一位置1
else
ADValue = ADValue&0xFFFE; // 否则数据的最后一位置0
}
SCLK=0;
}
delayNOP();
CS=1;
return ADValue;
}
void initUART(void)
{
SCON=0x50; //串口方式1,允许接收
TMOD|=0x20; //定时器1定时方式2
TCON=0x40; //设定时器1开始计数
TH1=0xFD; //11.0592MHz 9600波特率
TL1=0xFD;
TI=1;
TR1=1; //启动定时器
}
void main()
{unsigned int ADValue[15],temp,SumMiddle5,Average;
char n,i,j,min;
initUART();
while(1)
{
delayMS(10);
Average=0;
for (n=0;n<15;n++) //15次采样
{ delayMS(1);
ADValue[n]=ADC()&0x0FFF;
}
n=15; //排序
for (i=0;i<n-1;i++)
{ min=i;
for (j=i+1;j<n;j++)if(ADValue[min]>ADValue[j])min=j;
temp=ADValue[i];
ADValue[i]=ADValue[min];
ADValue[min]=temp;
}
SumMiddle5=0; //对中间5个值求和
for (i=5;i<10;i++) SumMiddle5=SumMiddle5+ADValue[i];
Average= SumMiddle5/5; //对中间5个值求平均
SBUF=Average/256;
while(TI==0);
TI=0;
SBUF=Average%256;
while(TI==0);
TI=0;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -