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所用时间)
|
代码
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();
}
}
声明
这种写法只是为了便于理解,在实际工程中不推荐使用,因为延时准确性问题,到能会导致数据丢失。另外,这只是个人理解,若有错误,还望各位指出!