从单片机基础到程序框架(全集 2019pdf版) - 第751页
SM0=0; SM1=1; //SM0 与 SM 1 的设置:选择 1 0 位异步通信 ,波特率根据 定时器 1 可变 REN=1; //允许串口接 收数据 //为了保证串 口中断接收的 数据不丢失, 必须设 置 IP = 0x10,相 当于把 串口中断设置 为最高优先级, //这个时候, 串口中断可以 打断任何其他 的中断 服务函数实现 嵌套, IP =0x10; //把串 口中断设置为 最高优先级, 必须的 。 ES=1; //允许…

上图 127.5.1 灌入式驱动 8 个 LED
程序功能如下:
波特率 9600,校验位 NONE(无),数据位 8,停止位 1。在上位机的串口助手里,发送一个十六进制(HEX
模式)的 01,让单片机的一颗 LED“亮”。发送一个十六进制(HEX 模式)的 00,让单片机的一颗 LED“灭”。
上位机的串口助手的使用,请参考前面第 11 节的相关内容,或者自己在网上查找串口助手软件的使用方法,
串口助手软件网上很多,我们的使用要求不高,随便选用一家都可以。代码如下:
#include "REG52.H"
void usart(void);
sbit P0_0=P0^0; //一颗 LED 灯
unsigned char Gu8ReceiveData=0; //接收到一个字节的数据
void main()
{
unsigned char u8_TMOD_Temp=0;
P0_0=1; //LED 灭。1 代表 LED 灭, 0 代表亮
//串口的波特率与内置的定时器 1 直接相关,因此配置此定时器 1 就等效于配置波特率。
u8_TMOD_Temp=0x20; //即将把定时器 1 设置为:工作方式 2,初值自动重装的 8 位定时器。
TMOD=TMOD&0x0f; //此寄存器低 4 位是跟定时器 0 相关,高 4 位是跟定时器 1 相关。先清零定时器 1。
TMOD=TMOD|u8_TMOD_Temp; //把高 4 位的定时器 1 填入 0x2,低 4 位的定时器 0 保持不变。
TH1=256-(11059200L/12/32/9600); //波特率为 9600。11059200 代表晶振 11.0592MHz,
TL1=256-(11059200L/12/32/9600); //L 代表 long 的长类型数据。根据芯片手册提供的计算公式。
TR1=1; //开启定时器 1

SM0=0;
SM1=1; //SM0 与 SM1 的设置:选择 10 位异步通信,波特率根据定时器 1 可变
REN=1; //允许串口接收数据
//为了保证串口中断接收的数据不丢失,必须设置 IP = 0x10,相当于把串口中断设置为最高优先级,
//这个时候,串口中断可以打断任何其他的中断服务函数实现嵌套,
IP =0x10; //把串口中断设置为最高优先级,必须的。
ES=1; //允许串口中断
EA=1; //允许总中断
while(1) //主循环
{
}
}
void usart(void) interrupt 4 //串口接发的中断函数,中断号为 4
{
if(1==RI) //接收完一个字节后引起的中断
{
RI = 0; //及时清零,避免一直无缘无故的进入中断。
Gu8ReceiveData=SBUF; //直接读取“串口专用缓存寄存器”SBUF 的 8 位数据。
if(0x01==Gu8ReceiveData)
{
P0_0=0; //LED 亮。1 代表 LED 灭, 0 代表亮
}
else
{
P0_0=1; //LED 灭。1 代表 LED 灭, 0 代表亮
}
}
else //发送数据引起的中断
{
TI = 0; //及时清除发送中断的标志,避免一直无缘无故的进入中断。
//以下可以添加一个全局变量的标志位的相关代码,通知主函数已经发送完一个字节的数据了。
}
}
【127.6 单片机串口电路的简易分析。】

上图 127.6.1 232 串口电路
单片机串口对外的引脚是与 IO 口的“P3.1、P3.0”共用的。P3.1 是串口的 TX 引脚,即对外发送数据的
引脚。P3.0 是串口的 RX 引脚,即接收外部数据的引脚。一旦项目中用了串口,那么这两个引脚就必须“专
脚专用”,只给串口单独使用,不再做 IO 口。平时通信的时候,跟其它单片机或者系统进行串口通信,除了
接 TX 和 RX 这两根数据线之外,必须一定把双方的负极 GND 也“共地”接上,否则双方建立不了同样的电压
参考点,通信毕然失败。因此,串口通信最低标配是 3 根线:RX,TX,GND。
如果两个甲乙单片机都布在一块板子上,距离不超过半米,他们两个要进行串口通信,怎么接线?把他
们的 GND 连起来,然后 RX 与 TX“交叉”对接,甲的 RX 接到乙的 TX,甲的 TX 接到乙的 RX。这种在短距离通
信的时候,不用增加任何外部辅助压差信号放大芯片,这种方式叫做“串口的 TTL”接线方式。
如果两个系统串口通信的距离比较远,比如在不同的板子上,1 米以上 10 米以下的距离,这时就不能采
用原始的“串口的 TTL”接线方式,因为线缆越长电阻越大,本身就要消耗一些压降,而 3.3V 的压降很容易
就会被消耗完,通信的可靠度和抗扰能力就会降低。为了解决这个问题,可以引用 232 标准的接线方式,外
部需接一个压差放大的芯片,把从原来 3.3V 的压差放大到一两倍左右,通信的距离就大大提高。具体 232
的细节,大家可以网上搜搜“RS232”。注意,采用 232 协议通信,也要注意“共地”和数据线“交叉”的两
个问题,232 通信的最低标配也是 3 根线:R,T,GND。上图 SP232E 就是一个压差信号放大的通信专用芯片。