网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
12月25日漏签0天
单片机吧 关注:212,933贴子:1,050,382
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 5回复贴,共1页
<<返回单片机吧
>0< 加载中...

请教下有关串口通信遇到的bug

  • 只看楼主
  • 收藏

  • 回复
  • fangding1997
  • 下士
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我在写一个电压反馈的程序,通过单片机adc读数据,再通过串口发送给电脑,然后操作dac输出电压进行调节,但是发现似乎dac会影响串口通信波特率导致电脑接收的数据错误,12位adc转换结果保存在ADCVH和ADCVL寄存器前四位中,因此我每次都把这两个字节直接发送,波特率38400,在不开启DAC的情况下输入正弦信号一切正常,两比特两比特数字正弦波动。
但是开启dac之后结果错误,如果降低传输波特率到9600,则正常,请问这是什么原因,是不是因为在执行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
}


  • fangding1997
  • 下士
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
修改下,现在降到9600也不对


2025-12-25 22:39:47
广告
不感兴趣
开通SVIP免广告
  • lkc8210BD
  • 中校
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
Write_dac()呢?


  • fangding1997
  • 下士
    3
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
dac.c
#include "intrins.h"
#include "SC92F725X_C.H"//引用头文件
void IIC_Start();
void Write_IIC_Byte(unsigned char txd);
unsigned char IIC_Wait_Ack();
void IIC_Stop();
unsigned char Write_dac(unsigned char wdata)
{
IIC_Start();
Write_IIC_Byte(0X98);
if(~IIC_Wait_Ack()) Write_IIC_Byte(wdata>>4);
else return 0;
if(~IIC_Wait_Ack()) Write_IIC_Byte(wdata<<4);
else return 0;
if(~IIC_Wait_Ack()) IIC_Stop();
else return 0;
return 1;
}
iic.c
#include "intrins.h"
#include "SC92F725X_C.H"//引用头文件
sbit SCL=P2^5; //D0(SCLK) 时钟
sbit SDIN=P2^4;//D1(MOSI) 数据
#define SCLK_Clr() SCL=0
#define SCLK_Set() SCL=1
#define SDIN_Clr() SDIN=0
#define SDIN_Set() SDIN=1
void IIC_Start()
{
P2CON|=0X30;
SCLK_Set();
SDIN_Set();
_nop_();
SDIN_Clr();
_nop_();
SCLK_Clr();
_nop_();
}
void IIC_Stop()
{
P2CON|=0X30;
SCLK_Set();
SDIN_Clr();
_nop_();
SDIN_Set();
_nop_();
}
void write1()
{
P2CON|=0X30;
SDIN_Set();
_nop_();
SCLK_Set();
_nop_();
SCLK_Clr();
_nop_();
}
void write0()
{
P2CON|=0X30;
SDIN_Clr();
_nop_();
SCLK_Set();
_nop_();
SCLK_Clr();
_nop_();
}
void Write_IIC_Byte(unsigned char txd)
{
unsigned char i;
for(i=8;i>0;i--)
{
if(txd & 0x80)write1();
elsewrite0();
txd <<=1;
}
}
unsigned char IIC_Wait_Ack()
{
unsigned char errtime;
P2CON &= ~0X10;
P2PH |= 0X10;
SDIN_Set();
_nop_();
SCLK_Set() ;
_nop_();
errtime=0;
while(SDIN)
{
errtime++;
if(errtime>250)
{
IIC_Stop();
return 1;
}
}
SCLK_Clr();
return 0;
}
这是dac相关代码


  • nsush
  • 上士
    5
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
这个复杂了。不过一般单片机最好不要搞太高的波特率。9600通常足够用了。


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 5回复贴,共1页
<<返回单片机吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示