本帖最后由 fangding1997 于 2022-9-24 13:52 编辑
我在写一个电压反馈的程序,通过单片机adc读数据,再通过串口发送给电脑,然后操作dac输出电压进行调节,但是发现似乎dac会影响串口通信波特率导致电脑接收的数据错误,12位adc转换结果保存在ADCVH和ADCVL寄存器前四位中,因此我每次都把这两个字节直接发送,波特率38400,在不开启DAC的情况下输入正弦信号一切正常C:\Users\fangd\Desktop\屏幕截图 2022-09-24 132214.png,两比特两比特数字正弦波动。
但是开启dac之后C:\Users\fangd\Desktop\屏幕截图 2022-09-24 132636.png结果错误,,请问这是什么原因,是不是因为在执行dac的时间在接收端也被统计在波特率等待时间内了,导致接收端波特率对不上,这种情况怎么办。
没有把16进制数转字符串是因为一方面字符串发送时间长影响反馈速度,另一方面单片机存储区域只有4k,转换放进去就会占3k,先没做反馈只是测试串口adc和dac
以下是代码
main
#include "SC92F725X_C.H"//引用头文件
void ADC_Test();
void sendadc();
void Uart0_Init();
unsigned char Write_dac(unsigned char wdata);
bit UART_ON=1;//串口开关
bit DAC_ON=1;//dac开关
unsigned char scan_low=0X12;//输出低电压
unsigned char scan_high=0XD5;//输出高电压
void main()
{
if (UART_ON) Uart0_Init();//串口初始化
while(1){
if (UART_ON){
ADC_Test();//adc转换
sendadc();//uart发送转换结果
}
if (DAC_ON){
Write_dac(scan_low);//dac输出低电平
Write_dac(scan_high);//dac输出高电平
}
}
}
uart
#include "SC92F725X_C.H"//引用头文件
void Uart0_Init(void);
bit UartSendFlag = 0; //发送中断标志位
bit UartReceiveFlag = 0; //接收中断标志位
//extern bit Sendwait;
/*****************************************************
*函数名称:void Uart0_Test(void)
*函数功能:Uart0测试
*入口参数:void
*出口参数:void
*****************************************************/
/*void Uart0_Test(void)
{
Uart0_Init();
//while(Sendwait)
//{
SBUF = ADCVH;
while(!UartSendFlag);
UartSendFlag = 0;
SBUF = ADCVL;
while(!UartSendFlag);
UartSendFlag = 0;
//Sendwait =0;
//}
}*/
/*****************************************************
*函数名称:void Uart0_Init(void)
*函数功能:Uart0中断初始化
*入口参数:void
*出口参数:void
*****************************************************/
void Uart0_Init(void) //选择Timer1作为波特率信号发生器
{
P1CON &= 0XF3;
P1PH |= 0X0C; //TX/RX为带上拉输入
SCON = 0X50; //方式1,允许接收数据
PCON |= 0X80;
T2CON = 0x00; //使用定时器1作UART时钟
TMOD = 0X20; //定时器1 8位自动重载
TMCON = 0X02; //定时器1 Fsys;
TL1 = 217;
TH1 = 217; //UART 波特率24M情况下=38400;
TR1 = 1; //启动Timer0
EUART = 1; //允许UART中断
EA = 1; //开总中断
}
/*
void Uart0_Init(void) //选择Timer2作为波特率信号发生器
{
P1CON &= 0XF3;
P1PH |= 0X0C; //TX为强推输出,RX为带上拉输入;
SCON = 0X50; //设置通信方式为模式一,允许接收
PCON |= 0X80;
TMCON |= 0X04;
T2MOD = 0X00;
T2CON = 0X30;
RCAP2H = 0xFF;
RCAP2L = 0xB2;
TR2 = 1;
EUART = 1; //开启Uart0中断
EA = 1;
}
*/
/*****************************************************
*函数名称:void UartInt(void) interrupt 4
*函数功能:Uart0中断服务函数
*入口参数:void
*出口参数:void
*****************************************************/
void UartInt(void) interrupt 4
{
if(TI)
{
TI = 0;
UartSendFlag = 1;
}
if(RI)
{
RI = 0;
UartReceiveFlag = 1;
}
}
void sendchar(unsigned char *p){
SBUF=*p;
while(!UartSendFlag);//检查是否到时间
UartSendFlag = 0;
}
void sendadc(){
unsigned char *high;
unsigned char *low;
*high=ADCVH;//发送高8位寄存器
sendchar(high);
*low=ADCVL;//发送低4位寄存器
sendchar(low);//当参考选择内部2.4v,测量范围0.02-1.22
}
|