📄 485.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 + -