//****************************************************************************
//****************************************************************************
//用io口模拟的读写MCP3208子程序(通用),只需修改io口配置即可
//调试通过
//****************************************************************************
//****************************************************************************
#include"include.h"
/*--------------------------------------------------------------------
函数名:滤波函数
函数功能:读ad值并做滤波处理
输入参数:待转换的通道号
输出参数:转换后经滤波后的结果
---------------------------------------------------------------------*/
uint filter(uchr chal) //chal为通道配置
{
uchr count,i,j;
uint value_buf[6];
uint sum=0;
uint tempp;
INTCONbits.GIE=0; //在模数转换中先关闭总中断
for (count=0;count<6;count++)
{
spi_send(chal); //送出命令
value_buf[count] = spi_rec(); //在这里读出ad转换的值
delay(2);
}
//冒泡排序法 :通过循环和交换的方式获得排序
for (j=0;j<6-1;j++)
{
for (i=0;i<6-j;i++)
{
if ( value_buf[i]>value_buf[i+1] )
{
tempp = value_buf[i];
value_buf[i] = value_buf[i+1];
value_buf[i+1] = tempp;
}
}
}
for(count=1;count<5;count++)
sum += value_buf[count];
INTCONbits.GIE=1;//转换完成开放总中断
return(sum/4);
}
/*--------------------------------------------------------------------
函数名:spi发送函数
函数功能:向mcp3208发送一个命令
输入参数:待转换的通道号
输出参数:
---------------------------------------------------------------------*/
void spi_send(uchr com)//写一个命令数据
{
uchr n=4;
PORTCbits.RC7=0; //cs=0从机选择
PORTCbits.RC6=0; //clk=0
PORTCbits.RC5=1; //din=1
PORTCbits.RC6=1; //clk=1
//先送出启动信号
//开始写数据
while(n--)
{
PORTCbits.RC6=0; //clk=0
if((com&0x80)==0x80)
PORTCbits.RC5=1;//dIN=1
else
PORTCbits.RC5=0;//dIN=0
com=com<<1;
PORTCbits.RC6=1; //clk=1
}
}
/*--------------------------------------------------------------------
函数名:spi接收函数
函数功能:接收一个转换结果
输入参数:
输出参数:接收一个转换完成的结果
---------------------------------------------------------------------*/
uint spi_rec(void)//读出16位数据
{
uint ad_temp;
uchr n=15;
ad_temp=0;
while(n--)
{
ad_temp=ad_temp<<1;
PORTCbits.RC6=1; //clk=1
if(PORTCbits.RC4==1) //dOUT=1
ad_temp=ad_temp|0x0001;
else
ad_temp=ad_temp&0xfffe;//din=0
PORTCbits.RC6=0; //clk=0
}
PORTCbits.RC7=1; //cs=1从机不选择
ad_temp=ad_temp&0x0fff;//读取可用的12位数据
return(ad_temp);
}
评论1