⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 485-master.c

📁 用485实现单片机之间的串行通信。 主机部分发送从机地址
💻 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 + -