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

📄 main.c

📁 书中详细说明了多路数据采集的方法,以及怎么样用AD来采集数据哟,大家不妨看看嘛,说不定有所帮助哟?
💻 C
字号:
#include <c8051f020.h>
#include <stdio.h>
#include "CPU_Init.h"
#include "RS485F.h"
//#include "ADISR.h"

void UARTRX_Disp(void);//接收数据处理函数
unsigned char Sum_verify(unsigned char verify[],unsigned char ii);//和检验函数
unsigned int PASS_Disp(unsigned int DATA[],unsigned char ii);

unsigned char  RX[10];//UART0接收数据存放数组
unsigned char  TX[10];
unsigned int xdata AD_data[8][10]; //AD采集数据存储数组 
bit ReceiveBit=0;    //接收完成标志

void main(void)
{
    WDTCN = 0xde;   //关闭看门狗
    WDTCN = 0xad;
    Init_Device();
	TX[0]=0x00;
    TX[1]=0x01;
    TX[2]=0x05;
	ADC0CN = 0xc4;
    TMR3CN |=0x04;//启动定时器3
    EA=1;
	while(1)
	{
	    if(ReceiveBit==1)//接收到一帧数据
		{
		   ReceiveBit=0; //清除接收完成标志
           /*TX[0]=0x00;
           TX[1]=0x01;
		   TX[2]=0x05;
		   TX[3]=0x01;
		   TX[4]=0x01;
		   TX[5]=0x01;
		   TX[6]=0x02;
		   TX[7]=0x03;
           UART0_TX(TX,8);*/
		   UARTRX_Disp();//报文数据处理
		   REN0=1;//重新接收使能
		}
        
	}
}  


void AD_ISR(void) interrupt 15
{
    static unsigned char PASS=0; //通道选择
    static unsigned char i=0; //通道内数据存储切换
    unsigned int ii;
    TMR3CN &=~0x04;//关闭定时器3
    AD_data[PASS++][i] = ADC0;
    if(PASS==0x08)
	{
        PASS=0x00;
		i++;
		if(i==0x0A)
		    i=0x00;
	}
	AMX0SL=PASS;
    TMR3CN |=0x04;//重新启动定时器3
}    






void UARTRX_Disp(void)
{
    unsigned char xdata anew_TX[3]={0x00,0x00,0x00};//要求主机重发指令数组
	unsigned char xdata Verify_data=0;//接收和检验值
    unsigned int Disp_data;
    if(RX[1]==0)  //主机要求重发数据
    {
        UART0_TX(TX,8);
    }         
    else
    {
        if(RX[1]==1)
        {
            Verify_data=Sum_verify(RX+3,1);//对接收的数据(一字节通道字节数据)进行和校验
            if(Verify_data==RX[4]) //和校验正确,处理AD采集数据并将数据发送给主机
            {
                EIE2 &= ~0x02; //关闭AD中断
                switch(RX[3])
				{
				    case 0x00: //发送通道0采集值
                        Disp_data=PASS_Disp(AD_data[0],10);
                        TX[3]=RX[3];
                        TX[4]=Disp_data%100;
                        TX[5]=(Disp_data/10)%10;
                        TX[6]=Disp_data%10;
                        TX[7]=Sum_verify(TX+3,4);
                        UART0_TX(TX,8);
                        break;
                    case 0x01:  //发送通道1采集值
                        Disp_data=PASS_Disp(AD_data[1],10);
                        TX[3]=RX[3];
                        TX[4]=Disp_data%100;
                        TX[5]=(Disp_data/10)%10;
                        TX[6]=Disp_data%10;
                        TX[7]=Sum_verify(TX+3,4);
                        UART0_TX(TX,8);
                        break;
                    case 0x02: //发送通道2采集值
                        Disp_data=PASS_Disp(AD_data[2],10);
                        TX[3]=RX[3];
                        TX[4]=Disp_data%100;
                        TX[5]=(Disp_data/10)%10;
                        TX[6]=Disp_data%10;
                        TX[7]=Sum_verify(TX+3,4);
                        UART0_TX(TX,8);
                        break;
                    case 0x03: //发送通道3采集值
                        Disp_data=PASS_Disp(AD_data[3],10);
                        TX[3]=RX[3];
                        TX[4]=Disp_data%100;
                        TX[5]=(Disp_data/10)%10;
                        TX[6]=Disp_data%10;
                        TX[7]=Sum_verify(TX+3,4);
                        UART0_TX(TX,8);
                        break;
                   case 0x04: //发送通道4采集值
                        Disp_data=PASS_Disp(AD_data[4],10);
                        TX[3]=RX[3];
                        TX[4]=Disp_data%100;
                        TX[5]=(Disp_data/10)%10;
                        TX[6]=Disp_data%10;
                        TX[7]=Sum_verify(TX+3,4);
                        UART0_TX(TX,8);
                        break;
                   case 0x05: //发送通道5采集值
                        Disp_data=PASS_Disp(AD_data[5],10);
                        TX[3]=RX[3];
                        TX[4]=Disp_data%100;
                        TX[5]=(Disp_data/10)%10;
                        TX[6]=Disp_data%10;
                        TX[7]=Sum_verify(TX+3,4);
                        UART0_TX(TX,8);
                        break;
                   case 0x06: //发送通道6采集值
                        Disp_data=PASS_Disp(AD_data[6],10);
                        TX[3]=RX[3];
                        TX[4]=Disp_data%100;
                        TX[5]=(Disp_data/10)%10;
                        TX[6]=Disp_data%10;
                        TX[7]=Sum_verify(TX+3,4);
                        UART0_TX(TX,8);
                        break;
                   case 0x07: //发送通道7采集值
                        Disp_data=PASS_Disp(AD_data[7],10);
                        TX[3]=RX[3];
                        TX[4]=Disp_data%100;
                        TX[5]=(Disp_data/10)%10;
                        TX[6]=Disp_data%10;
                        TX[7]=Sum_verify(TX+3,4);
                        UART0_TX(TX,8); 
                        break;
                   default: //主机发送通道错误
				        UART0_TX(anew_TX,3);//要求主机重发
                }
			EIE2 |= 0x02;//重新开启AD中断
		    }
	        else //和校验错误
		    {
			     UART0_TX(anew_TX,3);//要求主机重发
		    }
        }
        else //命令码错误
	    {
	        UART0_TX(anew_TX,3);//要求主机重发
        }        
    }                     
}

//和检验函数
unsigned char Sum_verify(unsigned char verify[],unsigned char ii)
{
    unsigned char Verify_Sum=0;//和校验值
	unsigned char i;
    for(i=0;i<ii;i++)
	{
	    Verify_Sum^=verify[i];
    }
    return(Verify_Sum);   
}

//数据处理
unsigned int PASS_Disp(unsigned int DATA[],unsigned char ii)
{
    unsigned int MAX;
	unsigned int MIN;
	unsigned int SUM=0;
	unsigned char i=0;
    MAX=DATA[0];
    MIN=DATA[0];
	for(i=0;i<ii;i++)
	{
	   if(DATA[i]>MAX)  
           MAX=DATA[i];
       if(DATA[i]<MIN)
           MIN=DATA[i];
       SUM += DATA[i];
    }
    SUM=(SUM-MAX-MIN)>>6;//平均值=(总和-MIN-MAX)/8,参考电压为2.048,
	                     //AD精度为12位(4096),实际值是测量值的2.5倍
						 //实际电压100倍为: (2094*(X)/4096)*2.5/10;
	return(SUM);       
}

⌨️ 快捷键说明

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