完整版 电路图和程序代码 下载地址
https://pan.baidu.com/s/1v8B4nV3gwMcnr_u_KTu5SQ?pwd=8888
部分代码展示
#include <reg51.h>
#include <stdio.h>
#include "lcd1602.h"
sbit RS485E=P3^2; //定义485的使能脚
void uart_init()
{
SCON = 0x50; //REN=1允许串行接受状态,串口工作模式1
TMOD|= 0x20; //定时器工作方式2
PCON|= 0x80;
TH1 = 0xFD; //baud*2 /* reload value 19200、数据位8、停止位1。效验位无
TR1 = 1;
ES = 1; //开串口中断
EA = 1; // 开总中断
}
void delay()
{
int i,j;
for(i=0;i<200;i++)
for(j=0;j<200;j++);
}
void uart_send(unsigned char dat)
{
RS485E=1; // RS5485E=0为接收状态 RS5485E=1为发送状态
SBUF=dat; //发送数据
while(!TI); //等待发送数据完成
TI=0; //清除发送完成标志位
RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态
}
void lcd1602_show_init()
{
lcd_write_com(0x80);
lcd_write_data('U');
lcd_write_data('1');
lcd_write_data(':');
lcd_write_data(' ');
lcd_write_data(' ');
lcd_write_data(' ');
lcd_write_com(0xC0);
lcd_write_data('U');
lcd_write_data('2');
lcd_write_data(':');
lcd_write_data(' ');
lcd_write_data(' ');
lcd_write_data(' ');
}
void lcd1602_show_dat1(unsigned char num)
{
char dat[3]={0};
dat[0]=num%10+'0';
dat[1]=num/10%10+'0';
dat[2]=num/100%10+'0';
lcd_write_com(0x84);
lcd_write_data(dat[2]);
lcd_write_data(dat[1]);
lcd_write_data(dat[0]);
}
void lcd1602_show_dat2(unsigned char num)
{
char dat[3]={0};
dat[0]=num%10+'0';
dat[1]=num/10%10+'0';
dat[2]=num/100%10+'0';
lcd_write_com(0xC4);
lcd_write_data(dat[2]);
lcd_write_data(dat[1]);
lcd_write_data(dat[0]);
}
int rev_flag=0;
char rev_dat=0;
void main(void)
{
RS485E=0; // RS5485E=0为接收状态 RS5485E=1为发送状态
delay();
lcd_init();
lcd1602_show_init();
uart_init();
while (1)
{
uart_send(0xa1);
while(!rev_flag)
;
rev_flag=0;
lcd1602_show_dat1(rev_dat);
delay();
P1=0x00;
uart_send(0xa2);
while(!rev_flag)
;
rev_flag=0;
lcd1602_show_dat2(rev_dat);
delay();
P1=0xff;
}
}
/****************************************************
串口中断程序
******************************************************/
void ser_int (void) interrupt 4 using 1
{
if(RI == 1) //RI接受中断标志
{
RI = 0; //清除RI接受中断标志
rev_dat = SBUF; //SUBF接受/发送缓冲器
rev_flag=1;
}
}