51单片机模拟串口实现无SBUF数据发送与接收
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
51单片机、模拟串口、串口发送、串口接收、逻辑分析仪
前言
不使用SBUF模拟串口发送和接受数据,使用定时器实现此功能。
1.mcu向电脑发送数据,电脑接收数据。
2.电脑向mcu发送数据,mcu接收数据,并把接收的数据发送给电脑。
一、配置定时器
设置好定时器的定时时间,波特率9600,也就是每秒钟可以发送9600个0xFF(8bit数据(1byte))。每发送一个数据,TF0位置1,然后软件清零。
void timer0_init(unsigned int u32_baud)
{
SCON = 0x50;
TMOD &= 0XF0;
TMOD |= 0X02; //定时器0的模式2
TH0 = TL0 = 256 - (FOSC/12)/(u32_baud);
TF0 = 0; //定时器0的溢出标志位
TR0 = 0; //初始化先关闭定时器,等要发送数据的时候才打开定时器,这样发送数据不会出错。
PIN_TXD = 1;
}
void wait_TF0(void)
{
while(!TF0);
TF0 = 0;
}
二、串口发送
串口没有时钟线,全靠约定波特率来发送和接收数据,所以串口对波特率要求严格,一但时间对不上,数据就会有误差。所以不用的时候需要关闭定时器,用的时候才打开定时器。
void uart_send_byte(u16 u16_byte)
{
u16 num = 8;
TR0 = 1; //开启定时器0
PIN_TXD = (bit)0; //发送起始位
wait_TF0();
while (num--)
{
PIN_TXD = (bit)(u16_byte & 0x01);
wait_TF0();
u16_byte >>= 1;
}
PIN_TXD = (bit)1; //发送结束位
wait_TF0();
TR0 = 0;
}
三、串口接收
void uart_read_byte()
{
u8 u8_output = 0;
u8 i = 8;
TR0 = 1; //开启定时器0
while(PIN_RXD);
wait_TF0();
while(i--)
{
u8_output >>= 1;
if(PIN_RXD)
{
u8_output |= 0X80; //
}
wait_TF0();
}
if(PIN_RXD == 1)
{
uart_send_byte(u8_output);
}
TR0 = 0;
}
四、主函数
单片机的运行速度很快所以你下载完程序之后不会直接看到0x34,按下复位键后,串口助手才能收到0x34。
void main()
{
timer0_init(9600);
uart_send_byte(0x34);
while(1)
{
if(PIN_RXD == 0)
{
uart_read_byte();
}
}
}
五、波形图
5.1串口调试助手
1.按下复位键后,电脑接收到0x34,电脑发送0x56,单片机接收到0x56,再发送给电脑。