汇编写单片机基于rs485收到中断信号接受数据显示在1602上的实测程序
时间: 2023-07-15 08:10:26 浏览: 81
以下是一个基于STC89C52单片机的RS485接收程序示例,可以通过中断方式接收数据,并将其显示在1602液晶屏上:
```
#include <reg52.h>
#include <intrins.h>
#define LCD1602_DB P0
sbit RS = P2^6;
sbit RW = P2^5;
sbit EN = P2^7;
unsigned char code LCD_INIT[] = {0x38, 0x0c, 0x06, 0x01, 0x80};
volatile unsigned char Data_Buffer[20];
volatile unsigned char Data_Length = 0;
volatile unsigned char Receive_Flag = 0;
void Serial_Init() {
TMOD = 0x20; // Timer1 Mode2
TH1 = 0xFD; // 波特率9600
TL1 = TH1;
TR1 = 1;
SCON = 0x50; // Mode1, 8位数据, 1位停止位
ES = 1; // 启用串口中断
EA = 1; // 启用总中断开关
}
void Timer_Init() {
TMOD = 0x01; // Timer0 Mode1
TH0 = 0xFC; // 定时100us
TL0 = TH0;
ET0 = 1; // 启用定时器中断
TR0 = 1; // 启动定时器
}
void LCD_Write_Cmd(unsigned char Cmd) {
RS = 0;
RW = 0;
LCD1602_DB = Cmd;
EN = 1;
_nop_();
EN = 0;
}
void LCD_Write_Data(unsigned char Data) {
RS = 1;
RW = 0;
LCD1602_DB = Data;
EN = 1;
_nop_();
EN = 0;
}
void LCD_Init() {
int i=0;
for(i=0; i<sizeof(LCD_INIT); i++) {
LCD_Write_Cmd(LCD_INIT[i]);
Delay1ms(5);
}
}
void LCD_Show_String(unsigned char *String) {
int i=0;
while(String[i] != '\0') {
LCD_Write_Data(String[i]);
i++;
}
}
void Delay1ms(unsigned int count) {
unsigned int i, j;
for(i=0; i<count; i++) {
for(j=0; j<110; j++);
}
}
void Serial_ISR() interrupt 4 {
if(RI) {
RI = 0;
Data_Buffer[Data_Length++] = SBUF;
if(Data_Length >= 20) {
Data_Length = 0;
}
Receive_Flag = 1;
}
}
void Timer_ISR() interrupt 1 {
static unsigned char Time_Count = 0;
TH0 = 0xFC;
TL0 = TH0;
if(Time_Count++ >= 20) { // 20*100us = 2ms
Time_Count = 0;
if(Receive_Flag) {
Receive_Flag = 0;
LCD_Show_String(Data_Buffer);
}
}
}
void main() {
Serial_Init();
Timer_Init();
LCD_Init();
while(1) {}
}
```
其中,串口接收中断处理函数 `Serial_ISR()` 会在接收到数据时被触发,将接收到的数据存储在 `Data_Buffer` 数组中,并设置 `Receive_Flag` 标志位。定时器中断处理函数 `Timer_ISR()` 每隔一段时间(本例中为2ms)检查 `Receive_Flag` 标志位,如果接收到数据,则将其显示在1602液晶屏上。
需要注意的是,以上代码仅为示例程序,实际应用中需要根据具体硬件和通讯协议进行调整和修改。
阅读全文