单片机串口通信实验 实现串口接收字符:如果接收到A,led1闪烁,如果接收到B,led2闪烁,如果接收到D,两个一起闪烁。如果接收到P,蜂鸣器蜂鸣,如果接收到M蜂鸣器停止。 当按下按键KEY0时发送你的学号到上位机。 定时器实验: 利用通用定时器6,定时2秒钟,时间到,通过串口向上位机发送发送你的学号,同时,led0亮灭一次。的详细代码
时间: 2023-07-16 09:14:05 浏览: 51
以下是基于STC89C52单片机的串口通信和定时器实验代码:
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED1 = P1^0; // LED1连接的IO口
sbit LED2 = P1^1; // LED2连接的IO口
sbit BUZZER = P1^2; // 蜂鸣器连接的IO口
sbit KEY0 = P3^2; // KEY0连接的IO口
uchar receivedData; // 用于存储接收到的字符
// 定时器6初始化函数
void initTimer6() {
TMOD &= 0xF0; // 将T0模式设置为0
TMOD |= 0x01; // 将T0模式设置为1
TL0 = 0x70; // 设置定时器初值低字节
TH0 = 0xFC; // 设置定时器初值高字节
TR0 = 1; // 启动定时器
}
// 串口初始化函数
void initSerial() {
SCON = 0x50; // 设置串口工作模式
TMOD &= 0x0F; // 将T1模式设置为0
TMOD |= 0x20; // 将T1模式设置为1
TH1 = 0xFD; // 设定波特率为9600bps
TL1 = 0xFD;
ET1 = 0; // 关闭T1中断
ES = 1; // 打开串口中断
EA = 1; // 打开总中断
}
// 串口发送一个字符
void sendChar(uchar ch) {
SBUF = ch;
while(TI == 0);
TI = 0;
}
// 串口发送一个字符串
void sendString(uchar *str) {
while(*str) {
sendChar(*str++);
}
}
// 串口中断服务函数
void serialInterrupt() interrupt 4 {
if(RI) { // 接收中断
receivedData = SBUF; // 读取接收到的数据
RI = 0; // 清除接收中断标志
}
}
// 延时函数
void delay(uint time) {
uint i, j;
for(i = time; i > 0; i--) {
for(j = 110; j > 0; j--);
}
}
// 主函数
void main() {
P1 = 0x00; // 将P1口初始化为输出模式
P3 |= 0x04; // 将P3.2口初始化为输入模式
initSerial(); // 初始化串口
initTimer6(); // 初始化定时器6
while(1) {
if(receivedData == 'A') {
LED1 = ~LED1; // LED1闪烁
} else if(receivedData == 'B') {
LED2 = ~LED2; // LED2闪烁
} else if(receivedData == 'D') {
LED1 = ~LED1;
LED2 = ~LED2; // LED1和LED2一起闪烁
} else if(receivedData == 'P') {
BUZZER = 1; // 蜂鸣器响
} else if(receivedData == 'M') {
BUZZER = 0; // 蜂鸣器停止
}
if(KEY0 == 0) { // 检测按键是否按下
delay(10); // 稍微延时一下,防止按键抖动
if(KEY0 == 0) { // 再次确认按键是否按下
sendString("123456789\n"); // 发送学号到上位机
}
}
}
}
// 定时器中断服务函数
void timer6Interrupt() interrupt 13 {
static uchar count = 0; // 静态变量,每次调用函数都保留上一次的值
TH0 = 0xFC; // 设置定时器初值高字节
TL0 = 0x70; // 设置定时器初值低字节
count++; // 计数器加1
if(count == 20) { // 计数器到达20时,代表定时2秒钟
count = 0; // 计数器清零
LED0 = ~LED0; // LED0亮灭一次
sendString("123456789\n"); // 发送学号到上位机
}
}
```
需要注意的是,上述代码中的串口波特率为9600bps,而定时器6的计时时间为2秒,因此波特率和计时时间可以根据实际需要进行调整。另外,由于单片机的串口通信需要与上位机配合,因此需要在上位机端设置好对应的串口参数、打开串口等操作。