?? 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 + -