为上面的代码添加串口通信,波特率9600帧头AABBCCDD,帧尾DDCCBBAA
时间: 2024-05-18 07:12:50 浏览: 117
下面是添加串口通信的代码,串口通信采用的是UART通信,波特率为9600,数据位为8位,无校验位,停止位为1位。帧头为AABBCCDD,帧尾为DDCCBBAA。
```
#include <reg52.h>
#define VREF 5 //参考电压为5V
#define ADC_RES 256 //8位ADC转换器的分辨率为2^8=256
#define HEADER 0xAABBCCDD //帧头
#define TAILER 0xDDCCBBAA //帧尾
sbit ADC_EOC = P1^0; //ADC转换完成标志位
sbit ADC_CS = P1^1; //ADC芯片选择引脚
sbit ADC_CLK = P1^2; //ADC时钟引脚
sbit ADC_DIN = P1^3; //ADC数据输入引脚
sbit ADC_DOUT = P1^4; //ADC数据输出引脚
void UART_Init() //UART初始化函数,波特率9600,数据位8位,无校验位,停止位1位
{
SCON = 0x50;
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = 0xFD;
TL1 = 0xFD;
TR1 = 1;
}
void UART_Send(unsigned char dat) //UART发送函数
{
SBUF = dat;
while(!TI);
TI = 0;
}
void UART_SendInt(unsigned int dat) //UART发送整数函数
{
unsigned char i;
unsigned char buf[6];
buf[0] = dat/10000 + '0';
buf[1] = dat%10000/1000 + '0';
buf[2] = dat%1000/100 + '0';
buf[3] = dat%100/10 + '0';
buf[4] = dat%10 + '0';
buf[5] = '\0';
for(i=0; i<6; i++)
{
UART_Send(buf[i]);
}
}
unsigned int ADC_Read(unsigned char ch) //ADC读取函数,ch为通道号
{
unsigned char i;
unsigned int dat = 0;
ADC_CS = 1;
ADC_CLK = 0;
ADC_DIN = 0;
ADC_CS = 0;
for(i=0; i<3; i++) //发送起始位、单端/差分位、通道号
{
ADC_CLK = 0;
ADC_DIN = (i==2)?(ch&0x01):0;
ADC_CLK = 1;
ch >>= 1;
}
for(i=0; i<8; i++) //读取转换结果
{
ADC_CLK = 0;
ADC_CLK = 1;
dat <<= 1;
dat |= ADC_DOUT;
}
ADC_CS = 1;
return dat;
}
void main()
{
unsigned int adc_data;
float voltage;
unsigned long frame;
unsigned char i;
ADC_EOC = 0; //清除ADC转换完成标志位
UART_Init(); //初始化UART
while(1)
{
adc_data = ADC_Read(0); //读取通道0的数据
voltage = (float)adc_data/ADC_RES*VREF; //将数字量转换为电压
voltage *= 2; //将电压放大2倍,以将0~5V的范围变为0~10V
adc_data = (unsigned int)(voltage/10*ADC_RES); //将电压转换为数字量
frame = HEADER;
frame <<= 16;
frame |= adc_data;
frame <<= 16;
frame |= TAILER;
//发送帧头
for(i=0; i<4; i++)
{
UART_Send((frame>>(24-i*8))&0xFF);
}
//发送数据
UART_SendInt(adc_data);
//发送帧尾
for(i=0; i<4; i++)
{
UART_Send((frame>>(i*8))&0xFF);
}
while(!ADC_EOC); //等待ADC转换完成
ADC_EOC = 0; //清除ADC转换完成标志位
}
}
```
需要注意的是,串口通信还需要在接收端进行解析,以正确地解析出帧头和帧尾,并从中获取到有效数据。
阅读全文