51单片机模拟串口实现无SBUF数据发送与接收

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

51单片机、模拟串口、串口发送、串口接收、逻辑分析仪

  • 前言
  • 一、配置定时器
  • 二、串口发送
  • 三、串口接收
  • 四、主函数
  • 五、波形图
  • 5.1串口调试助手
  • 5.2逻辑分析仪抓取波形

  • 前言

    不使用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,再发送给电脑。

    5.2逻辑分析仪抓取波形


    物联沃分享整理
    物联沃-IOTWORD物联网 » 51单片机模拟串口实现无SBUF数据发送与接收

    发表评论