UART协议
这里只是简单的让没有UART 接口的单片机使用UART 去打印log ,所以没有深入的研究具体的协议,常用的就是9600 波特率,8 位数据位,没有校验位,停止位是1 位,即1s 传输9600bit ,也就是每一位占据1000000us/9600 ≈ 104us
测试延时
首先需要根据不同的单片机去确定不同的延时时间,如果是定时器就另外说
除非是写汇编,不然不要去计算,写C 语言,使用指令去计算时间,不同的编译器把C 指令转换成汇编指令后得到的结果可能不一样,所以这里不算,直接测试
void main(void)
{
while(1)
{
TXD = 0;
Delay(100);
TXD = 1;
Delay(100);
TXD = 0;
Delay(200);
TXD = 1;
Delay(10000);
}
}
void Delay(uint16 delay)
{
while(delay--);
}
假设上电IO 置位高电平,那么IO 低延时100 个单位,IO 高延时100 个单位,然后IO 低延时200 单位,一段高的长延时,我们需要做的是比较高100 单位和低200 单位的差距
高100 单位延时:
低200 单位延时:
那么得到的是100 单位之间差值为149.6us - 75.6us = 74.0us ,可以计算出每一个单位之间的差值74.0us / 100 = 0.74us
为什么不直接计算器100 单位的时间,75.6us / 100 = 0.756us 呢?因为这个时间包含了函数的调用时间,不准确
那么104us 需要多少单位呢?104us / 0.74us ≈ 141 单位
写一个字节的代码
void WriteByte(uint8 dat)
{
uint8 i=8;
TXD = 0;
Delay2cp(141);
while(i--)
{
TXD = dat& 0x01;
Delay(141);
dat = dat>> 1;
}
TXD = 1;
Delay(141);
}
那么IO 模拟UART 就完成了
|