串口通信的实现

串口通信的硬件实现


之前使用定时器模拟串口通信了解了串口通信的工作原理.但是现在有一个问题,怎么用上一次的办法实现波特率为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);
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值