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

📄 adc.c

📁 基于51单片机系统
💻 C
字号:
#include <at89x52.h>
#include "define.h"

void MUX1_Select(unsigned char Channel)      // 电压信号通道1-8选择
{
	switch(Channel)
	{
		case 1:
			MUX_S2 = 0;
			MUX_S1 = 1;
			MUX_S0 = 0;
			break;
		case 2:
			MUX_S2 = 0;
			MUX_S1 = 0;
			MUX_S0 = 1;
			break;
		case 3:
			MUX_S2 = 0;
			MUX_S1 = 0;
			MUX_S0 = 0;
			break;
		case 4:
			MUX_S2 = 0;
			MUX_S1 = 1;
			MUX_S0 = 1;
			break;
		case 5:
			MUX_S2 = 1;
			MUX_S1 = 0;
			MUX_S0 = 0;
			break;
		case 6:
			MUX_S2 = 1;
			MUX_S1 = 1;
			MUX_S0 = 0;
			break;
		case 7:
			MUX_S2 = 1;
			MUX_S1 = 1;
			MUX_S0 = 1;
			break;
		case 8:
			MUX_S2 = 1;
			MUX_S1 = 0;
			MUX_S0 = 1;
			break;
	}
}

void MUX2_Select(unsigned char Channel)      // 电压信号通道9-16选择
{
	switch(Channel)
	{
		case 9:
			MUX_S2 = 0;
			MUX_S1 = 1;
			MUX_S0 = 0;
			break;
		case 10:
			MUX_S2 = 0;
			MUX_S1 = 0;
			MUX_S0 = 1;
			break;
		case 11:
			MUX_S2 = 0;
			MUX_S1 = 0;
			MUX_S0 = 0;
			break;
		case 12:
			MUX_S2 = 0;
			MUX_S1 = 1;
			MUX_S0 = 1;
			break;
		case 13:
			MUX_S2 = 1;
			MUX_S1 = 0;
			MUX_S0 = 0;
			break;
		case 14:
			MUX_S2 = 1;
			MUX_S1 = 1;
			MUX_S0 = 0;
			break;
		case 15:
			MUX_S2 = 1;
			MUX_S1 = 1;
			MUX_S0 = 1;
			break;
		case 16:
			MUX_S2 = 1;
			MUX_S1 = 0;
			MUX_S0 = 1;
			break;
	}
}

void MUX3_Select(unsigned char Channel)      // 电压信号通道17-21选择
{
	switch(Channel)
	{
		case 17:
			MUX_S2 = 0;
			MUX_S1 = 1;
			MUX_S0 = 0;
			break;
		case 18:
			MUX_S2 = 0;
			MUX_S1 = 0;
			MUX_S0 = 1;
			break;
		case 19:
			MUX_S2 = 0;
			MUX_S1 = 0;
			MUX_S0 = 0;
			break;
		case 20:
			MUX_S2 = 0;
			MUX_S1 = 1;
			MUX_S0 = 1;
			break;
		case 21:
			MUX_S2 = 1;
			MUX_S1 = 0;
			MUX_S0 = 0;
			break;
	}
}

unsigned int ADC_CH2()      // 电压信号1-8测量 
{
	unsigned char CtrlByte = 0xa7;
	unsigned int Data = 0x00;
	bit bData;

	unsigned char Temp1;
	unsigned int Temp2;
	unsigned char i;

	AD_CS = 0;    // 开始一次AD转换

	for(i=0; i<8; i++)    // 发送控制字节
	{
		AD_DCLK = 0;		

		if(CtrlByte & 0x80)
		{
			AD_DIN = 1;
		}
		else
		{
			AD_DIN = 0;
		}

		AD_DCLK = 1;    // DCLK上升延,送出一位数据

		Temp1 = CtrlByte << 1;
		CtrlByte = Temp1;
	}

	AD_DCLK = 0;
	AD_DIN = 0;

	for(i=0; i<12; i++)    // 读入转换结果
	{
		AD_DCLK = 1;		

		Temp2 = Data << 1;
		Data = Temp2;

		AD_DCLK = 0;    // DCLK下降延,读入一位数据
		bData = AD_DOUT;

		if(bData)
		{
			Data |= 0x0001;
		}
		else
		{
			Data &= 0xfffe;
		}			
	}

	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_CS = 1;    // 完成一次AD转换

	return Data;
}

unsigned int ADC_CH1()      // 电压信号9-16测量 
{
	unsigned char CtrlByte = 0xd7;
	unsigned int Data = 0x00;
	bit bData;

	unsigned char Temp1;
	unsigned int Temp2;
	unsigned char i;

	AD_CS = 0;    // 开始一次AD转换

	for(i=0; i<8; i++)    // 发送控制字节
	{
		AD_DCLK = 0;		

		if(CtrlByte & 0x80)
		{
			AD_DIN = 1;
		}
		else
		{
			AD_DIN = 0;
		}

		AD_DCLK = 1;    // DCLK上升延,送出一位数据

		Temp1 = CtrlByte << 1;
		CtrlByte = Temp1;
	}

	AD_DCLK = 0;
	AD_DIN = 0;

	for(i=0; i<12; i++)    // 读入转换结果
	{
		AD_DCLK = 1;		

		Temp2 = Data << 1;
		Data = Temp2;

		AD_DCLK = 0;    // DCLK下降延,读入一位数据
		bData = AD_DOUT;

		if(bData)
		{
			Data |= 0x0001;
		}
		else
		{
			Data &= 0xfffe;
		}			
	}

	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_CS = 1;    // 完成一次AD转换

	return Data;
}

unsigned int ADC_CH0()      // 电压信号17-21测量 
{
	unsigned char CtrlByte = 0x97;
	unsigned int Data = 0x00;
	bit bData;

	unsigned char Temp1;
	unsigned int Temp2;
	unsigned char i;

	AD_CS = 0;    // 开始一次AD转换

	for(i=0; i<8; i++)    // 发送控制字节
	{
		AD_DCLK = 0;		

		if(CtrlByte & 0x80)
		{
			AD_DIN = 1;
		}
		else
		{
			AD_DIN = 0;
		}

		AD_DCLK = 1;    // DCLK上升延,送出一位数据

		Temp1 = CtrlByte << 1;
		CtrlByte = Temp1;
	}

	AD_DCLK = 0;
	AD_DIN = 0;

	for(i=0; i<12; i++)    // 读入转换结果
	{
		AD_DCLK = 1;		

		Temp2 = Data << 1;
		Data = Temp2;

		AD_DCLK = 0;    // DCLK下降延,读入一位数据
		bData = AD_DOUT;

		if(bData)
		{
			Data |= 0x0001;
		}
		else
		{
			Data &= 0xfffe;
		}			
	}

	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_DCLK = 1;
	AD_DCLK = 0;
	AD_CS = 1;    // 完成一次AD转换

	return Data;
}

⌨️ 快捷键说明

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