鱼C论坛

 找回密码
 立即注册
查看: 2510|回复: 1

关于单片机的串口通信的疑惑

[复制链接]
发表于 2022-11-24 18:29:17 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
采用的时c51编写程序
问题1:两个51单片机之间采用串口异步单工通信,其中的一片(甲机)用导线接TXD端另一片(乙机)接RXD端,采用相同的波特率通信,在甲机的SBUF中写入数据后,此时在TXD端开始一位一位的向乙机发送
           则发送一位(0或1)二进制数所用的时间是波特率的倒数(用u表示),我想知道当甲机经过u秒后在导线上就发送了一位二进制数,此时乙机是在这相同的u内就接受到这一位二进制数(这个过程可以描述为瞬间完成)呢?
          还是这一位二进制数会在导线上传输一定时间后,再到达了乙机,然后乙机在经过u秒后把这位二进制数接收到SBUF中呢?
问题2:当某一个单片机作为串行异步通信的接收端时,在SBUF中接收完一帧数据时,RI置1,允许中断,在中断程序中处理SBUF中的数据,在进入中断服务程序后第一条指令是将RI清零,然后再提去SBUF中的数据,后面继续
         执行其他的指令,直到退出中断,在这个过程中数据的发送端一直处于发送数据的状态,我想知道是否是在中断服务程序中第一条指令执行后,将RI清零后才开始接受下一帧的数据?如果是:那当SBUF又接收完一帧数据时,又
        将RI置1,但此时cpu还执行中断服务程序,因为发送端在不停的发送数据,此时的SBUF的数据会被覆盖掉吗?如果会,SBUF中的数据是一位一位的被覆盖掉,还是接收完一帧同时被覆盖掉呢?
        
       求熟悉51单片机的大佬解惑,刚学51单片机不久,最近学到串口通信这儿,以上是我困惑的地方,求解答。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-11-24 22:57:13 | 显示全部楼层
本帖最后由 桃花飞舞 于 2022-11-24 22:58 编辑

看到没人回帖,虽然不能解决你的问题,
我对串口的看法,
rs232串口工具和单片机的接法tx 接到rx        rx 接到tx ,
剩下的就是初始化串口,和 字符发送函数 也就是把数据写到SBUF这个寄存器,等待发送完成。
/***********************************************
函数名称:Uart0_Init
功    能:串口0初始化函数
入口参数:无
返 回 值:无        
备    注:以下的函数和宏定义,请参考N76E003.H文件中的注释
************************************************/
void Uart0_Init(void)
{
         SCON=0x50;                                                      //0101 0000 模式1: 1 位起始位; 8 位数据;  1 位停止位;允许接收                        
        ClrBits(TMOD,T1_GATE|T1_CT|T1_M0);
        SetBits(TMOD,T1_M1);        //定时器1工作于8位自动重装模式
        SetBits(PCON,SMOD);                                        //波特率加倍
        SetBits(CKCON,T1M);                                        //定时器1时钟选择系统时钟
        ClrBits(T3CON,BRCK);                                //串口0选择定时器1做为波特率发生器
        TH1=256 - (1000000/9600+1);        //波特率9600  16MHz        
        TR1=1;                                                                                        //启动定时器1                                                                                                                
        P0_Quasi_Mode(PIN_6|PIN_7);        //将P06 P07 设置为准双向口
}

字符发送函数
 /***********************************************
*函数名称:Uart0_SendChar
*功    能:串口0发送单个字符函数
*入口参数:Udat:欲发送的数据
*返 回 值:无        
*备    注:无
************************************************/
void Uart0_SendChar(unsigned char Udat) 
{
        SBUF=Udat;                //将要发送的数据放入串口数据缓冲区
        while(!TI);                //等待发送完成
  TI=0;                     //清零TI发送完成标记                
}
把字符发送函数放到主函数里面调用,这样就可以发送数据了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 11:04

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表