单片机串口通信问题,有个疑问,SBUF做为发送缓存的时候,把数据填写在里面,后会自动通过串口发送?
4个回答
展开全部
不用很复杂的,就两步:1)设定一个内部定时器作为波特率发生器,例如用T1,做下必要的设置如下:
void InitUart()//串口初始化函数
{
SCON = 0x50; //T1工作于方式1
TMOD = 0x20; //T1 8位自动重装
TH1 = 0xf3; //晶体12MHz\波特率2400,其他波特率要重新计算
TR1 = 1; //启动T1
}
2)写个串口发送程序如下:
void SendData(uint dat)//MCU串口数据输出函数
{
SBUF = dat;
while (!TI);
TI = 0;
}
//这里要注意这三条语句的顺序!
应用如下:
/*********主函数***********************************/
main()
{
InitUart();
while(1)
{
ShowResult(10);//可以发送10进制或16进制数据,串口助手里要设定16进制接收
Delay(50);
}
}
//做演示时,要有一个毫秒延时函数相配合;对于普通C51单片机延时可小些,对于1T单片机延时要大些,视数据显示的速度而定,真实应用时,根据具体情况而定。
void InitUart()//串口初始化函数
{
SCON = 0x50; //T1工作于方式1
TMOD = 0x20; //T1 8位自动重装
TH1 = 0xf3; //晶体12MHz\波特率2400,其他波特率要重新计算
TR1 = 1; //启动T1
}
2)写个串口发送程序如下:
void SendData(uint dat)//MCU串口数据输出函数
{
SBUF = dat;
while (!TI);
TI = 0;
}
//这里要注意这三条语句的顺序!
应用如下:
/*********主函数***********************************/
main()
{
InitUart();
while(1)
{
ShowResult(10);//可以发送10进制或16进制数据,串口助手里要设定16进制接收
Delay(50);
}
}
//做演示时,要有一个毫秒延时函数相配合;对于普通C51单片机延时可小些,对于1T单片机延时要大些,视数据显示的速度而定,真实应用时,根据具体情况而定。
2013-07-11
展开全部
#include <reg51.h>
void InitUART(void)
{
TMOD = 0x20;
SCON = 0x50;
TH1 = 0xFD;
TL1 = TH1;
PCON = 0x00;
EA = 1;
ES = 1;
TR1 = 1;
}
void SendOneByte(unsigned char c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void main(void)
{
InitUART();
}
void UARTInterrupt(void) interrupt 4
{
if(RI)
{
RI = 0;
//add your code here!
}
else
TI = 0;
}
//设定计时器的初值就是设定了波特率 那个sendonebyte函数就是发送(
//发送是按照一个字节一个字节的发送)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
只要在初始化时设置好波特率等,往里面写就会自动发出去了
追问
如果我用C语言控制,不需要关注串口是怎么从缓冲中发的数据,只是设置好波特率就OK了。在请教下,波特率是不是控制计数器产生的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2019-07-12
展开全部
他是串行数据传输,我觉得SUBF可能是在上升\下降沿=时,数据锁存和数据输出(从器件中输出出来),你设置定时器1就是给他一个脉冲,提供上升\下降沿。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询