#今天上课突然结合前面的中端知识点思路逐渐清晰#
在这里得用到三个工作方式寄存器,分别是
- 串口通信的寄存器:SCOD
- 中端工作方式寄存器:TMOD(定时器和计数器的控制由两个特殊功能寄存器控制 ,TMOD用于选择其工作方式,TCON用于控制其启动和中断申请)
- 配置波特率得在PCON寄存器中设置SMOD(0或者1)
实例代码如下:
#include <reg52.h>
// 定义LED连接到P1端口的哪两个引脚
sbit led1 = P1^0;
sbit led2 = P1^1;
// USART配置函数
void UsartConfiguration()
{
SCON = 0X50; // 设置为工作方式1,8位数据,可变波特率
TMOD = 0X20; // 定时器1设置为工作方式2,自动重装载模式
PCON = 0X00; // SMOD=0,波特率不加倍
TH1 = 0XFD; // 定时器初始值设置,用于产生9600波特率
TL1 = 0XFD; // 与TH1配合设置波特率
ES = 1; // 打开接收中断
EA = 1; // 打开全局中断
TR1 = 1; // 启动定时器1
}
// 主函数
void main()
{
UsartConfiguration(); // 调用USART配置函数
while(1) // 主循环,等待中断发生
{
// 主循环可以保持为空,所有操作在中断服务程序中处理
}
}
// USART接收中断服务程序
void uart() interrupt 4
{
unsigned char receivedData; //定义一个无符号字符型
receivedData = SBUF; // 从USART缓冲区取出接收到的数据
// 根据接收到的数据控制LED1和LED2的状态
if (receivedData == '0')
{
led1 = 0; // 点亮LED1
led2 = 0; // 同时点亮LED2,表示接收到'0'
}
else if (receivedData == '1')
{
led1 = 1; // 熄灭LED1
led2 = 0; // 点亮LED2,表示接收到'1'
}
else if (receivedData == '2')
{
led1 = 0; // 点亮LED1
led2 = 1; // 熄灭LED2,表示接收到'2'
}
else if (receivedData == '3')
{
led1 = 1; // 熄灭LED1
led2 = 1; // 同时熄灭LED2,表示接收到'3'
}
RI = 0; // 清除接收中断标志位
SBUF = receivedData; // 将接收到的数据放回发送缓冲区,实现数据回显
while(!TI); // 等待数据发送完成
TI = 0; // 清除发送中断标志位
}
现在可以在烧录软件中可以发送0,1,2,3检测前面两个LED灯的亮灭情况
好了