📄 adc11p.c
字号:
//-------------------------------------------------------------------------*
//文件描述:本文件包含了AD采集的2子程序,分别为: *
//(1)ADC11P:1片2543-11路AD采集 *
//(2)TLC2543:TLC2543芯片A/D转换子程序 *
//-------------------------------------------------------------------------*
#include "ADC11P.h"
//A/D转换并求平均值(11路)子程序(AD22P.ASM)---------------------------------*
//功 能:采集TLC2543,共11通道,取16次平均值放入内存ADValue *
//参 数:cs:片选,cs=0~7对应PTC0~7 *
// ADValue:存放11路AD转换结果的数组首地址 *
//返 回:内存ADValue开始连续的11个地址内即为转换的结果 *
//调 用:TLC2543 *
//修 改:*ADValue是传址,一般在子程序中不直接修改参数,应另声明一个局部 *
// 变量地址,代其执行,最后将结果赋到参数地址带回 (ZY 2007.05.11) *
//-------------------------------------------------------------------------*
void ADC11P(INT8U cs,INT16U *ADValue)
{
INT8U i,j,channel,flag,buff[2];
INT16U temp,tmp[3];
INT16U ADVal[11];
//1 将A/D数据存放区清0
for(flag=0;flag<=10;flag++)
ADVal[flag]=0;
//3 对11个通道采集数据,每一路采集16次,16次的数据总和-->ADValue
for(j=1;j<=16;j++)
{
flag=0;
//3.1第0片TLC2543的0~10通道转换
for(channel=0;channel<=10;channel++)
{
//3.1.1将通道j的AD转换结果存入内存buff
for(i=0;i<3;i++) //中值滤波
{
TLC2543(cs,channel,buff); //得到"空数据"--不要
TLC2543(cs,channel,buff);
//3.1.2从内存buff取出数据-->ADValue[flag]中
tmp[i]=*((unsigned int *)buff);
}
temp=MidVal(tmp);
ADVal[flag]=ADVal[flag]+temp;
flag++;
}
}
//4 求22路A/D数据的16次平均值
for(flag=0;flag<=10;flag++)
ADVal[flag]=ADVal[flag]/16;
for(i=0;i<11;i++)
ADValue[i] =ADVal[i];
}
//
INT16U MidVal(INT16U *x)
{
INT8U i,j;
INT16U tmp;
//冒泡法
for(i = 0; i < 3; i ++)
for(j = i; j < 3; j ++)
if( x[i] > x[j] )
{
tmp=x[i];
x[i]=x[j];
x[j]=tmp;
}
return x[1];
}
//TLC2543芯片A/D转换子程序(TLC2543.c)--------------------------------------*
//TLC2543的接线: *
// ① I/O LOCK(18)接MC08HC908GP32的SPSCK(18) *
// ② DATA INPUT(17)接MC08HC908GP32的MOSI(17) *
// ③ DATA OUT (16)接MC08HC908GP32的MISO(16) *
// ④ 0-1片的片选CS(15)接分别接MC08HC908GP32的PTC0~1 *
//参 数:cs-片号,cs=0~7对应PTC0~7 *
// channel-通道号0,1,2 ...10 buf-存放数据的首址 *
//返 回:内存buf开始连续两个地址为取出的数(高4位、低8位) *
//说 明:(070418)将CS_D=0xff; CS_P=0xff *
// 改为CS_D|=1<<cs; CS_P|= 1<<cs;以避免影响PTC其他口 *
//-------------------------------------------------------------------------*
void TLC2543(INT16U cs,INT16U channel,INT8U *buf)
{
INT8U temp;
//1 初始化片选信号为1
CS_D |=1<<cs; //定义PTC的第cs引脚为输出
CS_P |=1<<cs; //C口的第cs引脚为高电平
//2 相应片TLC2543的选CS=0,产生高到低的变化
CS_P &= ~(1<<cs);
//3 写控制字到相应片TLC2543
SPDR = (channel<<4) | 0x0C;//入口通道、16位格式、MSB先送出、二进制
//4 等待发送器空
while ((SPSCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
//5 等待接收器满
while ((SPSCR & (1<<ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
//6 取出上次转换结果高字节
*buf = SPDR; //*buf中存放的是D11~D4位
SPDR = *buf; //上次转换结果低字节(后四位为0),握手信号
//7 等待发送结束
while ((SPSCR & (1<<SendEmyptBit)) == 0); //为0等待,也就是等待SPTE为1
//8 等待新数据到达
while ((SPSCR & (1<<ReFullBit)) == 0); //为0等待,也就是等待SPRF为1
//9 取出上次转换结果的低4位
*(buf+1) = SPDR;// *(buf+1)中存放D3~D0位(后四位为0)
//10 TLC2543片选CS=1
CS_P |=1<<cs;
//11 整合后*buf存放高四位(D11~D8),*(buf+1)中存放低八位(D7~D0)
*(buf+1) = (*(buf+1)>>4) | (*buf<<4);
*buf = *buf>>4;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -