RS485接收数据并显示到lcd1602单片机代码
时间: 2023-07-26 22:04:38 浏览: 109
以下是一个基本的 RS485 接收数据并显示到 LCD1602 的单片机代码,使用的单片机为 AT89C52,需要连接 MAX485 芯片进行转换。
```c
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit RS = P2^0;
sbit RW = P2^1;
sbit EN = P2^2;
sbit RS485_DIR = P1^0;
uchar receive_buf[20];
uchar receive_len = 0;
void delay(uint xms) {
uint i, j;
for (i = xms; i > 0; i--)
for (j = 110; j > 0; j--);
}
void init_lcd() {
delay(15);
RS = 0;
RW = 0;
EN = 1;
P0 = 0x38;
EN = 0;
delay(5);
EN = 1;
P0 = 0x38;
EN = 0;
delay(5);
EN = 1;
P0 = 0x38;
EN = 0;
delay(5);
EN = 1;
P0 = 0x0c;
EN = 0;
delay(5);
EN = 1;
P0 = 0x06;
EN = 0;
delay(5);
EN = 1;
P0 = 0x01;
EN = 0;
delay(5);
}
void write_com(uchar com) {
RS = 0;
RW = 0;
EN = 1;
P0 = com;
EN = 0;
}
void write_data(uchar dat) {
RS = 1;
RW = 0;
EN = 1;
P0 = dat;
EN = 0;
}
void write_string(uchar *str) {
while (*str) {
write_data(*str++);
}
}
void receive_data() interrupt 4 {
uchar receive_temp;
if (RI) {
RI = 0;
receive_temp = SBUF;
if (receive_temp == 0x0d) {
receive_buf[receive_len] = '\0';
receive_len = 0;
RS485_DIR = 0;
write_com(0x01);
delay(5);
write_com(0x80);
delay(5);
write_string(receive_buf);
} else if (receive_len < 20) {
receive_buf[receive_len++] = receive_temp;
}
}
}
void main() {
TMOD = 0x20;
TH1 = 0xfd;
TL1 = 0xfd;
TR1 = 1;
SCON = 0x50;
ES = 1;
EA = 1;
init_lcd();
while (1);
}
```
代码中定义了一个接收缓冲区 `receive_buf`,当接收到数据时,将数据存储到缓冲区中,直到接收到回车符号时,将缓冲区中的数据显示到 LCD1602 上。
在 `receive_data()` 函数中,通过判断接收到的数据是否为回车符号,来判断是否需要将缓冲区中的数据显示到 LCD1602 上。同时,通过控制 `RS485_DIR` 引脚的电平,来控制 MAX485 芯片的方向,使其既能接收数据,又能发送数据。
在 `main()` 函数中,初始化 LCD1602 和串口通信,然后进入循环等待。当接收到数据时,中断服务程序将被调用,然后将数据显示到 LCD1602 上。
阅读全文