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

📄 485.c

📁 485多机通信+lcd液晶显示
💻 C
字号:
/*************************************************************************************************
* 文 件 名:485.c
* 功    能:485主机通信模块
* 硬件条件: 1.CPU型号:ATMEL2051
*            2.晶振:11.0592
* 作    者:zwb
* 日    期:2009年04月24号
*************************************************************************************************/
//-----------------------函数声明,变量定义--------------------------------------------------------
#include <reg51.h>
#include <lcd1602.h>
#include <string.h>
#define  unchar  unsigned char
#define COUNT 10          // 定义接收缓冲区大小 
unchar Receive_buffer[COUNT]; //定义接收缓冲区
unchar Memory_buff[COUNT];//定义存储区
unchar	Dis_horse[3];
unchar point,ask=0;    //定义接收数据个数指示变量
unchar FIFO;
unchar COM_dzdata[2]={0x41,0x42};//定义主机发送地址和命令
sbit	L0 = P3^5;
sbit	L1 = P3^7;
//========================================================================================
//函数名称:delay()
//输入函数:无
//输出函数:无
//函数功能:延时子函数
//=======================================================================================
void delay(void)
{
	unchar i=30;
	while(i--);
}
//--------------------------------------------------------------------------------------------------
// 函数名称: UART_init()串口初始化函数
// 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s
//            串口接收中断允许,发送中断禁止
//--------------------------------------------------------------------------------------------------
void UART_init()//初始化串行口和波特率发生器 
{                 
	SCON =0xd0;          //选择串口工作方式3,打开接收允许
	TMOD =0x20;          //定时器1工作在方式2
	PCON = 0x80;         //波特率加倍
	TH1 =0xf4;           //实现波特率4800(系统时钟11.0592MHZ)
	TL1 =0xf4;
	TR1 =1;              //启动定时器T1
	ET1 =1; 
	EA = 1;
	PS = 1;
	ES=0;
}

//--------------------------------------------------------------------------------------------------
// 函数名称: serial()串口接收中断处理函数
// 函数功能: 接收十位数据到数据缓冲区
//--------------------------------------------------------------------------------------------------
void SerialInt(void) interrupt 4  
{
	unchar RECEIVR_buffer;

	if(TI)TI=0;
/*
	if(RI)                                //处理接收中断
	{
	RI=0;                              //清除中断标志位
	RECEIVR_buffer=SBUF;            //接收串口数据
	if(point>=0&&point<10)     //判断是否接收够十位数据
	{
	Receive_buffer[point++]=RECEIVR_buffer;//不够,把接收到的数据放入接收缓存区

	else point=0;                   //缓冲区已满,清除缓存区内数据重新接收
		
	}
}
*/            
	if(RI)                                //处理接收中断
	{
	RI=0;                              //清除中断标志位
	RECEIVR_buffer=SBUF;            //接收串口数据
	if((ask>=0)&&(ask<3))      //判断是否接收够十位数据
	{
	Receive_buffer[ask++]=RECEIVR_buffer;//不够,把接收到的数据放入接收缓存区
	}
	else ask=0;     
	}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: CLU_checkdata()计算校验位函数
// 输入变量: 无
// 输出变量: checkdata,包括六位数据的校验和
// 函数功能: 计算校验和
//--------------------------------------------------------------------------------------------------

unsigned char CLU_checkdata()
{           //计算校验位
 	unchar i,checkdata=0;
	for(i=2;i<7;i++)
 	 {
 		checkdata=checkdata^Receive_buffer[i];
   	 }
   return(checkdata);
 }

//====================================================================
//函数名称:SurveyData(void)
//输入变量:测量数据
//输出变量:无
//函数功能:存放从机发来的测量数据
//====================================================================

void SurveyData(void)
{  
	strcpy(Memory_buff,Receive_buffer);//把缓冲区的数据拷贝到指定区域
}
//=====================================================================
//函数名称:Senddata(void)
//输入变量:data
//输出变量:data
//函数功能:发送数据
//=====================================================================
void Senddata(unchar date)
{
	SBUF=date;
	while(TI==0);
	TI=0;
}

//- - - - - - - - - - - - - -  ------------------------------------------------------------------ --------
//函数名称:发送命令
//函数功能:主机发送通信命令
// --------------------------------------------------------------------------------------------------
void send_COM(void)
{
	TB8=1;
	Senddata(COM_dzdata[0]);
	TB8=0;
	delay();
	Senddata(COM_dzdata[1]);
	ES=1;   //允许串行口中断
	L0=1;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: 主函数
// 函数功能: 调度函数,完成通信过程
//--------------------------------------------------------------------------------------------------
 void main(void)
 {
	unchar checkdata;
	L0=0;
	L1=0;
	UART_init();       //初始化串口
	LCD_initial();
	send_COM();
	point=0;	
 do
 {
	  if(ask==3)       //判断数据是否接收完成
	  {	SurveyData();
		L1=1;
		LCD_set_position(0x00);
    	LCD_prints(Memory_buff); 

	  	//checkdata=CLU_checkdata();    //调用求校验和函数
	  //	if(checkdata==Receive_buffer[8])        //判断校验和是否正确
  		{SurveyData();}
		
		//point=0;
		ask=0;
	  }
  } while(1);
}






 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -