【51单片机】 模拟法写串口程序用于理解串口的原理(实际中不建议用此方法)

Author: Manba Cople
专业:IOT
说明:记录和输出学习内容

问题

  最近,在学习串口时,看到一种便于理解的模拟法写串口程序。记录于此,供大家一起学习!  

理解

  发送和接收类似,此处只写发送。首先在时序图中找关键点。下图中,A点(起始位)为高电位,即TXD引脚的电状态为1,到B点时电位拉低,TXD状态为0,延时一段时间到达C点,即发送了"Start Bit"’;C点以后开始按“先发低位再发高位”的规则发送数据,每一位都要相隔一段时间t;到达D点时,8位数据发送完毕,接着将TXD拉高,延时一段时间,即相当于发送了“Stop Bit”。
  其中,每一位的间隔时间t是个波特率有关,t = 1 / Baud (Baud的意思是指,bit/s, 所以1/Baud是指1bit所用时间)  

图1 8位UART协议格式时序图

代码

		sbit uart_TxD = P3^1; //模拟法设置标志位
		
		// 波特率选1200时,每一位的时间是1/1200 ≈ 833us
		void Delay833us()		//@11.0592MHz
		{
			unsigned char i,j;
			i = 9;
			j = 243;
			do
			{
				while (--j);
			} while (--i);
		}
		
		
		// 模拟法写串口通信 --> 便于理解,不推荐实际应用(延时部分可以用定时器较为准确)
		void UartSendChar(unsigned char uart_data)
		{
			unsigned char i;
			uart_TxD = 1;
			uart_TxD = 0;  //拉低P30,StartBit
			Delay833us();
			for(i=0;i<8;i++)
			{
				if(uart_data & 0x01) uart_TxD = 1; //判断第一位是1还是0
				else uart_TxD = 0;
				Delay833us();
				uart_data >>= 1;
			}
			uart_TxD = 1;   // StopBit
			while(i--)           //拉长最后一位的时间便于观察
			{
				Delay833us(); 
			}
		}

声明

  这种写法只是为了便于理解,在实际工程中不推荐使用,因为延时准确性问题,到能会导致数据丢失。另外,这只是个人理解,若有错误,还望各位指出!  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值