串口通信的硬件实现
之前使用定时器模拟串口通信了解了串口通信的工作原理.但是现在有一个问题,怎么用上一次的办法实现波特率为1200的串口通信.
当串口通信为1200时.发送一位数据需要延时833us;这时候就不能用定时器1只装载一次就完成数据位的发送了.可以发现,原来装载一次,发送一位的思想在这里用不了了.那么装载多次,发送一位呢?理论上是可以的吧.但是用软件多次模拟装载显得比较繁琐.所以这里就引出16位分频计数器,这样定时器1的8位重装载工作就够用了........
先引出SCON串行控制寄存器(可位寻址);控制这个寄存器的SM0,SM1选择工作模式.我们选择工作模式1(SM0=0,SM1=1);
(256-初始值)*12/11.0592M(晶振频率)*2*16 = 1/baudRate;
(256-初始值)*12/11.0592M(晶振频率)*1*16 = 1/baudRate;
下式为波特率加倍.
将两个式子用一个式子整理得到: baudRate = 11.0592M(晶振频率)/(12*(256-初始值))*(2^SMOD)/32;
11.0592M(晶振频率)/(12*(256-初始值))位定时器1的溢出率;
#include <reg52.h>
#include <intrins.h>
void Delay500ms();
void main()
{
SM0 = 0;
SM1 = 1;
TMOD &= 0x0f;
TMOD |= 0x20;
TH1 = TL1 =0xe6;
TR1 = 1;
/*
PCON &= 0x7f;
PCON |= 0x80;
*/
while(1)
{
SBUF = 'X';
while(!TI);
TI = 0;
/*
SBUF = 'Y';
while(!TI);
TI = 0;
SBUF = 'Y';
Delay500ms();
*/
Delay500ms();
}
}
void Delay500ms() //@12.000MHz
{
unsigned char i, j, k;
_nop_();
i = 4;
j = 205;
k = 187;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}