📄 485-master.c
字号:
/*--------RS485通信程序主机部分----------*/
#include<reg52.h>
#include<string.h>
#define uchar unsigned char
#define uint unsigned int
#define comm 0 //液晶命令
#define dat 1 //液晶数据
/* 以下为程序协议中使用的握手信号 */
#define __SUCC_ 0x0f // 数据传送成功
#define __ERR_ 0xf0 // 数据传送错误
/*以下为所用的从机地址 */
#define addr1 0x01
#define addr2 0x02
sbit de = P2^4;
sbit cs_lcd = P2^7;
sbit std = P2^6;
sbit sclk = P2^5;
uchar buf[16]={"123456789abcdef0"};
uchar code tab1[]={"开始发送"};
uchar code tab2[]={"我发命令"};
uchar code tab3[]={"有人来答"};
void init_serial(); // 串口初始化
void send_data(unsigned char *buf); // 发送数据
void delay10ms(unsigned int count); // 延时子程序(10ms)
void wr_lcd (uchar dat_comm,uchar content); //向液晶写数据
void chn_disp (uchar code *chn);
void delay (uint us);
/*------------------初始化液晶-----------------*/
void init_lcd (void)
{
wr_lcd (comm,0x30); /*30---基本指令动作*/
wr_lcd (comm,0x01); /*清屏,地址指针指向00H*/
delay (100);
wr_lcd (comm,0x06); /*光标的移动方向*/
wr_lcd (comm,0x0c); /*开显示,关游标*/
}
/*------------------向LCD发送数据-------------------*/
void wr_lcd (uchar dat_comm,uchar content)
{
uchar a,i,j;
delay (50);
a=content;
cs_lcd=1;
sclk=0;
std=1;
for(i=0;i<5;i++)
{
sclk=1;
sclk=0;
}
std=0;
sclk=1;
sclk=0;
if(dat_comm)
std=1; //data
else
std=0; //command
sclk=1;
sclk=0;
std=0;
sclk=1;
sclk=0;
for(j=0;j<2;j++)
{
for(i=0;i<4;i++)
{
a=a<<1;
std=CY;
sclk=1;
sclk=0;
}
std=0;
for(i=0;i<4;i++)
{
sclk=1;
sclk=0;
}
}
}
/*--------------清DDRAM------------------*/
void clrram (void)
{
wr_lcd (comm,0x30);
wr_lcd (comm,0x01);
delay (180);
}
/*-----------------------------------*/
void delay (uint us) //delay time 微妙
{
while(us--);
}
/*---------------显示汉字或字符----------------*/
void chn_disp (uchar code *chn)
{
uchar i;
wr_lcd (comm,0x30);
wr_lcd (comm,0x80);
for (i=0;i<16;i++)
wr_lcd (dat,chn[i]);
}
/* 初始化串口 */
void init_serial()
{
TMOD = 0x20; //定时器T1使用工作方式2
TH1 = 250; // 设置初值
TL1 = 250;
TR1 = 1; // 开始计时
PCON = 0x00;//80; // SMOD = 1
SCON = 0x50;//d0; //工作方式3,9位数据位,波特率9600bps,允许接收
//de =1; //max485允许发送
}
/* 发送数据 */
void send_data(unsigned char *buf)
{
uint i;
//uchar len; // 保存数据长度
//uchar ecc; // 保存校验字节
//len =strlen(buf); // 计算要发送数据的长度
//ecc = len; // 开始进行校验字节计算
/* 发送数据长度 */
//TI = 0;
//TB8 = 0; // 发送数据帧
//SBUF = len; // 发送长度
//while(!TI);
//TI = 0;
/* 发送数据 */
for(i=0; i<16; i++)
{
//ecc = ecc^(*buf); // 计算校验字节
//TB8 = 0; // 发送数据帧
SBUF = *buf; // 发送数据
buf++;
while(!TI);
TI = 0;
}
/* 发送校验字节 */
//TB8 = 0; // 发送数据帧
//SBUF = ecc; // 发送校验字节
//while(!TI);
//TI = 0;
}
/* 延时10ms,精度较低,参数count为延时时间 */
void delay10ms(unsigned int count)
{
unsigned int i, k;
unsigned char j;
unsigned int tmp;
tmp = (int)((100*11)/12);
for(i=0; i<count; i++)
for(j=0; j<100; j++)
for(k=0; k<tmp; k++);
}
/*------------主程序---------------*/
void main()
{
uchar i = 0;
uchar tmp;
uchar addr; // 该字节用于保存要通信的从机地址
SP=0x5f;
cs_lcd=1;
init_lcd (); //初始化液晶
chn_disp (tab1);
/* 串口初始化 */
init_serial(); // 初始化串口
EA = 0; // 关闭所有中断
/* 读要访问的分机地址 */
addr =addr1;
/* 发送地址帧并接收应答信息,如果接收的信号与发送的地址信息不同,则重新发送地址帧*/
tmp = addr-1;
do {
/* 发送从机地址 */
TI = 0;
TB8 = 1; // 发送地址帧
SBUF = addr;
while(!TI);
TI = 0;
chn_disp (tab2);
/* 接收从机联络应答 */
RI = 0;
while(!RI);
tmp = SBUF;
RI = 0;
chn_disp (tab3);
} while(tmp != addr)
/* 发送数据并接收校验信息,如果接收的信号为0FH,表示从机接收成功,否则将重新发送该组数据 */
tmp = __ERR_;
while(tmp != __SUCC_)
{
send_data(buf); // 发送数据
RI = 0; //接受从机接收完信号用于判断是否需要重发
while(!RI);
tmp = SBUF;
RI = 0;
}
while(1); // 程序结束,进入死循环
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -