打印

请教下有关串口通信波特率的问题。

[复制链接]
218|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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
}


屏幕截图 2022-09-24 132636.png (12.87 KB )

屏幕截图 2022-09-24 132636.png

屏幕截图 2022-09-24 132214.png (16.76 KB )

屏幕截图 2022-09-24 132214.png

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

2

帖子

0

粉丝