keilproject 51单片机通过串口控制单片机,电脑输入1,led闪烁一下,时长一秒,并返回:-1; 输入2,闪烁两下,时长两秒,返回:-2
时间: 2024-05-09 14:20:23 浏览: 68
以下是基于Keil uVision5开发环境的51单片机程序,实现了通过串口控制LED闪烁的功能。
```C
#include <reg51.h>
#define FREQ_OSC 11059200UL
#define BAUD_RATE 9600
sbit LED = P1^0;
void initUART() {
TMOD |= 0x20; // set timer1 as mode 2 (8-bit auto-reload)
TH1 = 256 - FREQ_OSC / (12 * 32 * BAUD_RATE);
TL1 = TH1;
TR1 = 1; // start timer1
SCON = 0x50; // set serial mode 1, enable receiver
ES = 1; // enable serial interrupt
EA = 1; // enable global interrupt
}
void sendChar(char c) {
SBUF = c;
while (!TI);
TI = 0;
}
char receiveChar() {
while (!RI);
RI = 0;
return SBUF;
}
void delay(unsigned int t) {
while (t--);
}
void blinkLED(int count, int duration) {
int i;
for (i = 0; i < count; i++) {
LED = 1;
delay(duration);
LED = 0;
delay(duration);
}
}
void main() {
initUART();
while (1) {
char c = receiveChar();
if (c == '1') {
blinkLED(1, 1000);
sendChar('-');
sendChar('1');
sendChar('\n');
} else if (c == '2') {
blinkLED(2, 1000);
sendChar('-');
sendChar('2');
sendChar('\n');
}
}
}
void serialInterrupt() interrupt 4 {
if (RI) {
RI = 0;
}
if (TI) {
TI = 0;
}
}
```
程序的基本思路是:通过串口接收电脑发送的字符,根据字符的不同控制LED的闪烁,然后再通过串口发送返回值给电脑。其中,串口通信的波特率为9600,使用了中断方式进行数据的发送和接收。LED的控制使用了简单的延时方式。
当电脑发送字符"1"时,程序会调用blinkLED函数,让LED闪烁一次,时长为1秒。然后再通过串口发送返回值"-1"给电脑。
当电脑发送字符"2"时,程序会调用blinkLED函数,让LED闪烁两次,时长为2秒。然后再通过串口发送返回值"-2"给电脑。
注意,由于串口通信是异步的,程序需要等待数据接收完成才能进行下一步操作,否则会出现数据丢失的情况。因此,在发送数据之前需要先判断TI标志位是否为1,表示上一次发送已经完成。在接收数据之后需要及时清除RI标志位,否则会导致下一次接收失败。
另外,由于程序使用了中断方式进行串口通信,因此需要在程序中实现一个串口中断服务函数,用于处理串口接收和发送的中断事件。在本程序中,使用了INTERRUPT宏和interrupt关键字来定义了一个名为serialInterrupt的中断服务函数,用于处理串口中断事件。在main函数中,通过EA和ES标志位的设置,使能了全局中断和串口中断。
阅读全文