在keil上实现stc89c52RC单片机如何接收来自串口发送来的数据并显示在lcd1602上的c语言完整代码
时间: 2024-01-21 18:16:27 浏览: 182
keil 51 单片机C语言串口发送和接收程序
5星 · 资源好评率100%
以下是一个简单的例子,演示如何在Keil上使用STC89C52RC单片机接收串口数据并将其显示在LCD1602上。
```c
#include <REG52.H>
#include <stdio.h>
#include <string.h>
#define BAUDRATE 9600 // 波特率
#define FREQ_OSC 11059200UL // 晶振频率
#define TIMER_1_PRESCALER 12 // 定时器1分频系数
#define TIMER_1_RELOAD ((65536 - (FREQ_OSC / (BAUDRATE * TIMER_1_PRESCALER))) >> 8) // 定时器1重装值
#define TIMER_1_RELOAD_LOWBYTE (65536 - (FREQ_OSC / (BAUDRATE * TIMER_1_PRESCALER))) // 定时器1重装值低字节
sbit RS = P2^6; // LCD1602引脚定义
sbit RW = P2^5;
sbit EN = P2^7;
void lcd_init(void);
void lcd_write_data(unsigned char dat);
void lcd_write_cmd(unsigned char cmd);
void lcd_show_string(unsigned char x, unsigned char y, unsigned char *str);
void serial_init(void);
void serial_send(unsigned char dat);
unsigned char serial_receive(void);
void delay_ms(unsigned int ms);
void main()
{
unsigned char str[16];
unsigned char ch;
unsigned char i = 0;
lcd_init();
serial_init();
while(1)
{
ch = serial_receive(); // 接收串口数据
str[i++] = ch;
if(ch == '\n') // 如果接收到换行符,则将接收到的字符串显示在LCD上
{
str[i-1] = '\0';
lcd_show_string(0, 0, str);
i = 0;
}
}
}
void lcd_init(void)
{
lcd_write_cmd(0x38); // 初始化8位双行显示模式
lcd_write_cmd(0x0c); // 开启显示,关闭光标
lcd_write_cmd(0x06); // 设定输入方式为移动光标,不移动屏幕
lcd_write_cmd(0x01); // 清屏
}
void lcd_write_data(unsigned char dat)
{
RS = 1;
RW = 0;
P0 = dat;
EN = 1;
delay_ms(5);
EN = 0;
}
void lcd_write_cmd(unsigned char cmd)
{
RS = 0;
RW = 0;
P0 = cmd;
EN = 1;
delay_ms(5);
EN = 0;
}
void lcd_show_string(unsigned char x, unsigned char y, unsigned char *str)
{
unsigned char addr;
if(y == 0)
addr = 0x80 + x;
else
addr = 0xc0 + x;
lcd_write_cmd(addr);
while(*str)
lcd_write_data(*str++);
}
void serial_init(void)
{
TMOD = 0x20; // 定时器1工作在方式2(8位自动重装),定时器0停止计数
TH1 = TIMER_1_RELOAD;
TL1 = TIMER_1_RELOAD_LOWBYTE;
PCON = 0x00; // 波特率不加倍
SCON = 0x50; // 串口工作在模式1(8位数据,可变波特率)
TR1 = 1; // 启动定时器1
ES = 1; // 打开串口中断
EA = 1; // 打开总中断
}
void serial_send(unsigned char dat)
{
SBUF = dat;
while(!TI);
TI = 0;
}
unsigned char serial_receive(void)
{
unsigned char dat;
while(!RI);
dat = SBUF;
RI = 0;
return dat;
}
void delay_ms(unsigned int ms)
{
unsigned int i, j;
for(i=0; i<ms; i++)
for(j=0; j<120; j++);
}
void serial_isr() interrupt 4
{
if(RI)
RI = 0;
}
```
在这个例子中,我们使用了定时器1来生成波特率时钟,并且使用了串口中断来接收数据。当接收到换行符时,我们将接收到的字符串显示在LCD上。你需要根据自己的需求修改引脚定义和波特率。
阅读全文