⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mcp3208.c

📁 mcp3208的读写操作
💻 C
字号:
//****************************************************************************
//****************************************************************************
//用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);	
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -