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

📄 adc_main.c

📁 AD转换的一个例子,对初学者很有帮助的一个例子
💻 C
字号:
#include<reg51.h> 
sfr	ADC_CONTR 	=0XC5;//A/D转换控制寄存器?
sfr	AD_DATAH	=0XC6;//A/D转换结果高八位寄存器
sfr	AD_DATAL	=0XBE;//A/D转换结果低二位寄存器
sfr	P1M0		=0X91;//P1口模式寄存器0
sfr	P1M1		=0X92;//P1口模式寄存器1

unsigned char code MCU_ID = 0x01;//从机模式(现地)机器号,(0x01~0xFF)
unsigned char c[4]; //数组C用来存放主机发来的主机真
unsigned char d[11];//数组D用来存放从机真==

unsigned int ADC_DATA;
unsigned char b[8];//
//unsigned char k;
//unsigned char MydataL;
//unsigned char MydataH;

unsigned long ad2;
unsigned long ad1;

float adcc;
//float sum1=0;

void Delay_10ms(void);           //延时函数,延时10ms
void Set_ADC_P1_7(void);         //将P1.7设置为适宜A/D转化的模式,高阻输入
void Init_UART(void);            //串口初始化
void ADC(void);                  //A/D采样函数。
void Send_Byte(void);            //向主机发送采样结果
void Send_Char(unsigned char ch);//发送一个字符
void Format_ADC_Data(void);        //模拟电压值转化成从机砧
unsigned char Receive_Char(void);//接受一个字符

void operation();//将采样得来的数字值按要求处理成实际模拟值
unsigned char code error[4] = {0x10,0x11,0x00,0x21};

// 函数名称: void main()主函数
void main()
{
	unsigned char i=0;
    unsigned int sdlh = 0;//前二个字节的和
    unsigned char csl = 0; //累加和的低字节
    unsigned char csh = 0; //累加和的高字节

//	MydataL = 0;
//	MydataH = 0;

    Init_UART( );    //串口初始化函数
    Set_ADC_P1_7( ); //设置P1.0为高阻输入   	
	EA=1;            //开放总允许中断

	while(1)
	{
    	for(i = 0;i<4;i++)
	    	c[i] = Receive_Char();   //接受主机命令字
      	sdlh = c[0] + c[1];
      	csl = sdlh & 0x00ff;
      	csh = (sdlh & 0xff00)>>4;  
		if(csh == c[2] && csl == c[3] && c[0] == 0x10 && c[1]==MCU_ID)//正确接受命令
	  	{
			ADC();
//            MydataL = ADC_DATA;
//            MydataH = ADC_DATA>>8;
//		      Send_Char(MydataH);//单测试AD转换数据的高8位
//            Send_Char(MydataL);//单测试AD转换数据的低2位
	        operation();
			Format_ADC_Data();
			Send_Byte(); 
		}
	  	else 
	    { 
		 	for(i = 0;i<4;i++)
	    		Send_Char(error[i]);// 向主机发送从新发送命令字
		}
	}
}

//---------------------------------------------------------------
// 函数名称: delay10ms(void)
// 函数功能: 延时ms函数
//---------------------------------------------------------------
void Delay_10ms(void) 
{ 
	unsigned char k;
    for(k=10;k>0;k--);
} 
//---------------------------------------------------------------
// 函数名称: set_P1_channel()
// 函数功能: 将P1.0设置为适宜A/D转化的模式,高阻输入
//---------------------------------------------------------------
void Set_ADC_P1_7(void)
{
	P1 = 0xff;//
   	ADC_CONTR = ADC_CONTR|0x80;
   	Delay_10ms();
   	P1M0 = 0x80;
   	P1M1 = 0x80;
   	ADC_CONTR = ADC_CONTR|0xC7;
   	Delay_10ms();
}

//---------------------------------------------------------------
// 函数名称: initiate_rs()
// 函数功能: 串口初始化,设置定时器1为波特率发生器,且无奇偶校验,
//            系统外部晶振为11.0592,波特率为9600
//---------------------------------------------------------------
void Init_UART(void)
{
  	SCON = 0x50; 
  	TMOD = 0x20;
  	TH1 = 0xfd;
  	TL1 = 0xfd;
  	TR1 = 1;
  	TI = 1;
  	RI = 0;
}

//---------------------------------------------------------------
// 函数名称: putch(unsigned char ch)
// 函数功能: 发送一个字符函数
//---------------------------------------------------------------
void Send_Char(unsigned char ch)
{
	SBUF = ch;
   	TI = 0;
  	while(!TI);
}

//---------------------------------------------------------------
// 函数名称: ad() A/D采样函数
// 函数功能: 从P1.0口采样模拟电压值,连续采样20次在求其平均值,
//            最后为采样结果
//---------------------------------------------------------------
void ADC(void) // A/D采样函数
{
	unsigned count;  
    unsigned int sum = 0;
    unsigned int sum_Temp = 0;

    unsigned char test;

    for(count=0;count<20;count++)
	{	
		AD_DATAH=0x00;
  		AD_DATAL=0X00;
  		test=0x00;

		ADC_CONTR=ADC_CONTR|0x08;//启动AD转换
        Delay_10ms();
  		do
  		{
  			test=ADC_CONTR&0x10;
  		}while( test == 0);//等待AD转换结束,否则继续等待

    	ADC_CONTR=ADC_CONTR&0xE7;//清AD标志、启动位,停止AS转换

		sum_Temp = AD_DATAH;
        sum_Temp = (sum_Temp<<2)+AD_DATAL;

        sum = sum+sum_Temp;
    }
    ADC_DATA = sum/20;   
}

//---------------------------------------------------------------
// 函数名称: operation()
// 函数功能: 将采样得来的10位数字值按要求处理成模拟电压值
//---------------------------------------------------------------
void operation(void)
{  
	int kk = 0;
    unsigned char i;
    adcc = ADC_DATA * 0.0048828125;
    for(i = 0;i < 6;i++)
    	b[i]  = 0;
    adcc = adcc * 1000000;
	if(adcc == 0)
    	return;
	ad2 =(long)adcc;
    while(ad2 != 0)
	{
	   b[kk++] = ad2%10;
	   ad2 = ad2 / 10;
	}	    
}
//---------------------------------------------------------------
// 函数名称: unsigned char getch(void)
// 函数功能: 从机接受一个字符。
//---------------------------------------------------------------
unsigned char Receive_Char(void)// 接受一个字符
{
	while(!RI);
  	RI = 0;
  	return(SBUF);
}

//---------------------------------------------------------------
// 函数名称: send_uart()
// 函数功能: 将采样得来的模拟电压值转化成从机格式
//---------------------------------------------------------------
void Format_ADC_Data(void)
{
	unsigned int cshcsl;
	d[0] = 0x10;
	d[1] = 0x01;
	d[2] = 0x00;
	d[3] = 0x00;
	d[4] = b[6];
	d[5] = b[5] * 10 + b[4];
	d[6] = b[3] * 10 + b[2];
	d[7] = b[1] * 10 + b[0];
	cshcsl = 0x10 + 0x01 + 0x00 + 0x00 + b[6] + (b[5] * 10 + b[4]) + (b[3] * 10 + b[2]) + (b[1] * 10 + b[0]);
	d[8] = (cshcsl & 0xff00) >> 4; 
	d[9] = cshcsl & 0x00ff;    
}

//---------------------------------------------------------------
// 函数名称: send_byte()
// 函数功能: 将从机机桢发送给主机
//---------------------------------------------------------------
void Send_Byte(void)
{
	unsigned char i;
  	for(i = 0;i < 10;i++)
    	Send_Char(d[i]);           
} 























⌨️ 快捷键说明

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