帮我写一段c语言代码实现用 STC89C52 单片机作为核心控制元件,用 1602 液晶显示,设计一个应用系统,可以 由上位机通过串口操作控制单片机模块,具体要求如下: (1) 通过计算机串口调试助手下发三个不同的命令,第一条命令:LED on 可以让最 左边的 LED 小灯以 1s 的频率闪烁;第二条命令:buzz on 可以让蜂鸣器响起来; 第三条命令:showstr 这个命令后可以加任何字符串,使后边的字符串在 1602 液 晶上显示出来。 (2) 不论上位计算机发送什么命令,单片机收到命令后把命令原封不动地再通过串 口发送给计算机,以表示收到命令后的应答。
时间: 2024-03-07 14:49:04 浏览: 90
好的,以下是一个简单的实现代码,仅供参考:
```
#include "reg52.h"
#include "intrins.h"
#define uchar unsigned char
#define uint unsigned int
sbit LED = P0^0; // 最左边的LED小灯
sbit BUZZ = P0^1; // 蜂鸣器
void delay(uint i) // 延时函数
{
while(i--);
}
void send_data(uchar dat) // 将一个字符通过串口发送出去
{
SBUF = dat;
while(TI == 0);
TI = 0;
}
void init_uart() // 初始化串口
{
TMOD = 0x20; // 设置为模式2
TH1 = 0xfd; // 波特率设置为9600
TL1 = 0xfd;
TR1 = 1; // 启动定时器1
SM0 = 0;
SM1 = 1; // 串口工作方式设置为8位异步收发
REN = 1; // 允许接收
ES = 1; // 允许串口中断
EA = 1; // 允许总中断
}
void send_string(uchar *str) // 将一个字符串通过串口发送出去
{
while(*str)
{
send_data(*str++);
}
}
void lcd_write_cmd(uchar cmd) // 向液晶写入命令
{
P2 &= 0x0f; // 高4位清零
P2 |= cmd & 0xf0; // 写入高4位
P1 &= ~0x04; // RS = 0
P1 &= ~0x08; // RW = 0
P1 |= 0x02; // EN = 1
_nop_(); // 短暂延时
P1 &= ~0x02; // EN = 0
delay(10); // 稍微延时一下
P2 &= 0x0f; // 高4位清零
P2 |= (cmd << 4) & 0xf0; // 写入低4位
P1 &= ~0x04; // RS = 0
P1 &= ~0x08; // RW = 0
P1 |= 0x02; // EN = 1
_nop_(); // 短暂延时
P1 &= ~0x02; // EN = 0
delay(10); // 稍微延时一下
}
void lcd_write_dat(uchar dat) // 向液晶写入数据
{
P2 &= 0x0f; // 高4位清零
P2 |= dat & 0xf0; // 写入高4位
P1 |= 0x04; // RS = 1
P1 &= ~0x08; // RW = 0
P1 |= 0x02; // EN = 1
_nop_(); // 短暂延时
P1 &= ~0x02; // EN = 0
delay(10); // 稍微延时一下
P2 &= 0x0f; // 高4位清零
P2 |= (dat << 4) & 0xf0; // 写入低4位
P1 |= 0x04; // RS = 1
P1 &= ~0x08; // RW = 0
P1 |= 0x02; // EN = 1
_nop_(); // 短暂延时
P1 &= ~0x02; // EN = 0
delay(10); // 稍微延时一下
}
void lcd_init() // 初始化液晶
{
lcd_write_cmd(0x02); // 返回液晶的初始状态
lcd_write_cmd(0x28); // 设置液晶为2行显示、5x8点阵字符
lcd_write_cmd(0x0c); // 打开液晶显示,关闭光标显示
lcd_write_cmd(0x06); // 设置文字输入方式为递增,不移动屏幕
}
void lcd_show_str(uchar *str) // 在液晶上显示字符串
{
lcd_write_cmd(0x80); // 光标移动到第一行第一列
while(*str)
{
lcd_write_dat(*str++);
}
}
void main()
{
init_uart(); // 初始化串口
lcd_init(); // 初始化液晶
while(1)
{
// 等待串口接收中断
}
}
void uart() interrupt 4 // 串口中断函数
{
uchar cmd[20] = {0}; // 存储接收到的命令
uchar i = 0;
if(RI == 1) // 判断是否接收到数据
{
RI = 0;
cmd[i++] = SBUF; // 读取接收到的数据
// 处理接收到的命令
if(cmd[0] == 'L' && cmd[1] == 'E' && cmd[2] == 'D' && cmd[3] == ' ' && cmd[4] == 'o' && cmd[5] == 'n') // LED on
{
while(1)
{
LED = ~LED; // 翻转LED小灯状态
delay(50000); // 延时1s
}
}
else if(cmd[0] == 'b' && cmd[1] == 'u' && cmd[2] == 'z' && cmd[3] == 'z' && cmd[4] == ' ' && cmd[5] == 'o' && cmd[6] == 'n') // buzz on
{
BUZZ = 1; // 蜂鸣器响起来
delay(50000); // 延时一下
BUZZ = 0; // 停止响
}
else if(cmd[0] == 's' && cmd[1] == 'h' && cmd[2] == 'o' && cmd[3] == 'w' && cmd[4] == 's' && cmd[5] == 't' && cmd[6] == 'r' && cmd[7] == ' ') // showstr
{
lcd_show_str(cmd + 8); // 在液晶上显示后续字符串
}
send_string(cmd); // 发送原封不动的命令
}
}
```
需要注意的是,以上代码仅供参考,具体实现可能需要根据实际情况进行一些修改。同时,还需要在计算机端编写串口调试助手程序,以发送命令和接收命令应答。
阅读全文