代码:
#include "reg51.h"
#include "stdio.h" // for <<
sbit P1_0 = 0x90; // 利用地址的形式进行位操作 或者 = P1^0
unsigned char nSendByte;
void init(){
SM0 = SM1 = 0; // 设置串行口通信为工作方式0 默认
EA = 1; // 开启总中断
ES = 1; // 开启串行口中断
P1_0 = 1; // 允许移位寄存器发送数据
}
void serial_port() interrupt 4{
if(TI){
SBUF = nSendByte; // 第一个SBUF是为了实现流水灯的效果
delay();
nSendByte <<= 1; // 实现流水灯效果
if (nSendByte == 0) nSendByte = 1;
SBUF = nSendByte; // 第二个SBUF是为了让下面TI和RI置零,然后TI发送数据置1,再次进入中断
}
TI = 0;
RI = 0;
}
void main(){
init();
nSendByte = 1;
SBUF = nSendByte;
while(1);
}
仿真:
原理:
一、工作方式的选择:SM0 = SM1 = 0 (同步移位寄存器方式)
二、开启中断:总中断EA和串行口中断ES
三、interrupt后面数字的选择
四、发送中断标志TI和接收中断标志RI
-
TI——发送中断标志位
方式0,串行发送的第8位数据结束时TI由硬件置“1”,在其他方式中,串行口发送停止位的开始时置TI为“1”。TI =1,表示一帧数据发送结束。TI的状态可供软件查询,也可申请中断。CPU响应中断后,在中断服务程序中向SBUF写入要发送的下一帧数据。TI必须由软件清“0”。 -
RI—接收中断标志位
方式0时,接收完第8位数据时,RI由硬件置“1”。在其他工作方式中,串行接收到停止位时,该位置“1”。RI = 1,表示一帧数据接收完毕,并申请中断,要求CPU从接收SBUF取走数据。该位的状态也可供软件查询。RI必须由软件清“0”。