(系统晶振为11.0952MHz,串口接收采用8位通信,波特率为9600)请编程实现以下功能。 (1)编制串口通信程序,每当接收到超级终端发来的一位数字(假设只能是0~9的数字),请把接收到的数字显示在数码管上。 (2)当P2口上的开关状态有变化时,请把P2口的状态通过串口发送给超级终端。
时间: 2024-02-11 21:06:50 浏览: 36
以下是实现上述功能的代码:
```c
#include <reg52.h>
#define FOSC 11059200L // 系统晶振频率
#define BAUD 9600 // 串口波特率
sbit DIO = P1^0; // 数码管数据线
sbit CLK = P1^1; // 数码管时钟线
unsigned char num = 0; // 存储接收到的数字
unsigned char p2_state; // 存储P2口的状态
void init_uart();
void init_p2();
void uart_send(unsigned char dat);
void display_num(unsigned char n);
void main()
{
init_uart(); // 初始化串口
init_p2(); // 初始化P2口
while(1)
{
display_num(num); // 显示接收到的数字
}
}
void init_uart()
{
TMOD = 0x20; // 定时器1工作在模式2,8位自动重装载
TH1 = 256 - FOSC / 32 / BAUD; // 设置波特率
TL1 = TH1;
TR1 = 1; // 启动定时器1
SM0 = 0; // 设置串口为模式1,8位数据,无校验位,1位停止位
SM1 = 1;
EA = 1; // 开启总中断允许
ES = 1; // 开启串口中断允许
}
void init_p2()
{
P2 = 0xff; // P2口上拉
p2_state = P2; // 初始化P2口状态
IT0 = 1; // 外部中断0触发方式为下降沿
EX0 = 1; // 允许外部中断0
EA = 1; // 开启总中断允许
}
void uart_send(unsigned char dat)
{
SBUF = dat; // 将要发送的数据存入SBUF
while(!TI); // 等待发送完成
TI = 0; // 清除发送完成标志位
}
void display_num(unsigned char n)
{
unsigned char i;
unsigned char code table[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
for(i = 0; i < 8; i++)
{
DIO = table[n % 10] & (1 << i); // 从低位开始依次输出数码管段码
CLK = 1;
CLK = 0;
n /= 10;
}
}
void int0_isr() interrupt 0 // 外部中断0的中断服务函数
{
p2_state = P2; // 读取P2口状态
uart_send(p2_state); // 发送P2口状态
}
void uart_isr() interrupt 4 // 串口中断服务函数
{
if(RI) // 判断是否接收到数据
{
RI = 0; // 清除接收中断标志位
num = SBUF - '0'; // 将接收到的字符转换成数字
}
}
```
这段代码中,使用了定时器、外部中断、数码管和串口模块。其中,定时器用来控制数码管的扫描;外部中断用来检测P2口状态的变化;数码管用来显示接收到的数字;串口用来接收超级终端发来的数据,并发送P2口状态。在主循环中,不断地显示接收到的数字。