复杂的带按键,蜂鸣器的串口
时间: 2024-03-08 16:47:44 浏览: 13
好的,以下是一个带按键、蜂鸣器和串口的复杂程序,它可以通过串口输入指令来控制蜂鸣器的开关和频率:
```c
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit beep = P1^5; // 蜂鸣器接口
uchar code table[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f}; // 数码管显示0-9
uchar str[10]; // 串口接收缓冲区
uchar cnt; // 串口接收计数器
void delayms(uint x) // 延时函数
{
uint i, j;
for (i = x; i > 0; i--)
for (j = 112; j > 0; j--);
}
void uart_init() // 串口初始化
{
SCON = 0x50; // 8位数据,可变波特率
TMOD &= 0x0f; // 设置定时器1为16位自动重载模式
TMOD |= 0x20;
TH1 = 0xfd; // 波特率设置为9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
ES = 1; // 使能串口中断
EA = 1; // 使能总中断
}
void uart_send(uchar dat) // 串口发送函数
{
SBUF = dat;
while (!TI);
TI = 0;
}
void uart_receive() interrupt 4 // 串口接收中断函数
{
uchar c;
if (RI == 1)
{
RI = 0;
c = SBUF;
if (c == '\r') // 接收到回车符,表示一条指令接收完成
{
str[cnt] = '\0'; // 在字符串结尾添加空字符
cnt = 0; // 计数器清零
if (strcmp(str, "on") == 0) // 如果指令是on,则打开蜂鸣器
{
beep = 1;
}
else if (strcmp(str, "off") == 0) // 如果指令是off,则关闭蜂鸣器
{
beep = 0;
}
else if (strcmp(str, "freq") == 0) // 如果指令是freq,则设置蜂鸣器频率
{
uart_send('\n');
uart_send('\r');
uart_send('P');
uart_send('l');
uart_send('e');
uart_send('a');
uart_send('s');
uart_send('e');
uart_send(' ');
uart_send('i');
uart_send('n');
uart_send('p');
uart_send('u');
uart_send('t');
uart_send(':');
while (1) // 循环等待串口输入
{
if (RI == 1)
{
RI = 0;
c = SBUF;
if (c == '\r') // 接收到回车符,表示输入完成
{
str[cnt] = '\0'; // 在字符串结尾添加空字符
cnt = 0; // 计数器清零
break;
}
else // 否则将字符存储到缓冲区中
{
str[cnt++] = c;
if (cnt >= 10) // 如果输入字符超过10个,则清空缓冲区并退出
{
cnt = 0;
break;
}
uart_send(c); // 回显输入字符
}
}
}
uint freq = atoi(str); // 将输入的字符串转换为数字
if (freq > 10000) // 如果输入的数字大于10000,则限制为10000
{
freq = 10000;
}
uint delay = 1000000 / freq; // 计算延时时间
while (1) // 循环控制蜂鸣器
{
beep = ~beep; // 翻转蜂鸣器电平
delayms(delay); // 延时
}
}
}
else
{
str[cnt++] = c; // 将接收到的字符存储到缓冲区中
if (cnt >= 10) // 如果输入字符超过10个,则清空缓冲区
{
cnt = 0;
}
}
}
}
void main()
{
uchar i, j, k, l, num; // i,j,k,l为四个数码管显示的数值,num为计数器
uart_init(); // 初始化串口
while (1)
{
for (num = 0; num < 500; num++) // 循环500次
{
for (i = 0; i < 10; i++) // 第一位数码管
{
P2 = 0xfe; // 打开第一位数码管
P0 = table[i]; // 显示i对应的数字
delayms(5); // 延时5ms
}
for (j = 0; j < 10; j++) // 第二位数码管
{
P2 = 0xfd; // 打开第二位数码管
P0 = table[j]; // 显示j对应的数字
delayms(5); // 延时5ms
}
for (k = 0; k < 10; k++) // 第三位数码管
{
P2 = 0xfb; // 打开第三位数码管
P0 = table[k]; // 显示k对应的数字
delayms(5); // 延时5ms
}
for (l = 0; l < 10; l++) // 第四位数码管
{
P2 = 0xf7; // 打开第四位数码管
P0 = table[l]; // 显示l对应的数字
delayms(5); // 延时5ms
}
}
}
}
```
这个程序同时实现了时钟、按键控制和串口通信功能。其中,串口通信功能可以通过输入指令来控制蜂鸣器的开关和频率。需要注意的是,由于程序同时运行了时钟和串口通信功能,所以时钟的精度可能会有一些误差。