📄 main.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 + -