?? d_485
字號:
/*************************************************************************************************
* 文 件 名:485.c
* 功 能:485主機通信模塊
* 硬件條件: 1.CPU型號:ATMEL2051
* 2.晶振:11.0592
* 作 者:zwb
* 日 期:2009年04月24號
*************************************************************************************************/
//-----------------------函數聲明,變量定義--------------------------------------------------------
#include <reg51.h>
#include <INTRINS.h>
#include <string.h>
#define unchar unsigned char
#define COUNT 10 // 定義接收緩沖區大小
unsigned char Receive_buffer[COUNT]; //定義接收緩沖區
unsigned char Rateflow_buffer[COUNT];//瞬時流量緩沖區
unsigned char Veloflow_buffer[COUNT];//瞬時流速緩沖區
unsigned char Percentageflow_buffer[COUNT];//流量百分比緩沖區
unsigned char Resistanceflow_buffer[COUNT];//流體電阻值緩沖區
unsigned char Positive_buffer[COUNT];//正向總量緩沖區
unsigned char Opposite_buffer[COUNT];//反向總量緩沖區
unsigned char Alarm_buffer[COUNT];//報警狀態緩沖區
unsigned char Diameter_buffer[COUNT];//管道直徑緩沖區
unsigned char Set_buffer[COUNT];//參數設置緩沖區
unsigned char point; //定義接收數據個數指示變量
unsigned char COM_dzdata[2];//定義主機發送地址和命令
//============================================================================
//函數功能;延時子程序
// ===========================================================================
void delay(void)
{
unchar i=124;
while(i--);
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: UART_init()串口初始化函數
// 函數功能: 在系統時鐘為11.059MHZ時,設定串口波特率為9600bit/s
// 串口接收中斷允許,發送中斷禁止
//--------------------------------------------------------------------------------------------------
void UART_init(void)
{
//初始化串行口和波特率發生器
SCON =0x98; //選擇串口工作方式2,打開接收允許
TMOD =0x40; //定時器1工作在方式2
PCON = 0x80;
TH1 =0xfa; //實現波特率9600(系統時鐘11.0592MHZ)
TR1 =1; //啟動定時器T1
ET1 =0;
PS=1; //設計串行口中斷優先級
EA =1; //單片機中斷允許
ES=0; //禁止串行口中斷
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: com_longerrup()串口接收中斷處理函數
// 函數功能: 接收包括起始位'S'在內的十位數據到數據緩沖區
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unchar RECEIVR_buffer;
if(RI) //處理接收中斷
{
RI=0; //清除中斷標志位
RECEIVR_buffer=SBUF; //接收串口數據
if( point==0) //如果還沒有接收到起始位
{ if(point>0&&point<10) //判斷是否接收夠十位數據
Receive_buffer[point++]=RECEIVR_buffer;//不夠,把接收到的數據放入接收緩存區
}
else point=0; //緩沖區已滿,清除緩存區內數據重新接收
}
if(TI) //處理發送中斷
{TI=0;}
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: CLU_checkdata()計算校驗位函數
// 輸入變量: 無
// 輸出變量: checkdata,包括起始位在內的前九位數據的校驗和
// 函數功能: 計算校驗和
//--------------------------------------------------------------------------------------------------
unsigned char CLU_checkdata(void)
{ //計算校驗位
unchar point,checkdata=0;
for(point=2;point<7,TI=1;point++)
{
checkdata=checkdata^Receive_buffer[point];
}
return(checkdata);
}
//====================================================================
//函數名稱:SurveyData(void)
//輸入變量:測量數據
//輸出變量:無
//函數功能:存放從機發來的測量數據
//====================================================================
void SurveyData(void)
{
unchar i;
i=COM_dzdata[1];
switch(i)
{
case 0x00:memcpy(Rateflow_buffer,Receive_buffer,10); break;
case 0x01:memcpy(Veloflow_buffer,Receive_buffer,10); break;
case 0x02:memcpy(Percentageflow_buffer,Receive_buffer,10); break;
case 0x03:memcpy(Resistanceflow_buffer,Receive_buffer,10); break;
case 0x04:memcpy(Positive_buffer,Receive_buffer,10); break;
case 0x05:memcpy(Opposite_buffer,Receive_buffer,10); break;
case 0x06:memcpy(Alarm_buffer,Receive_buffer,10); break;
case 0x07:memcpy(Diameter_buffer,Receive_buffer,10); break;
default:break;}
}
//- - - - - - - - - - - - - - ------------------------------------------------------------------ --------
//函數名稱:發送命令
//函數功能:主機發送通信命令
// --------------------------------------------------------------------------------------------------
void send_COM (void)
{
unchar i;
for(i=0;i<2;i++)
{
SBUF=COM_dzdata[i];
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
ES=1; //允許串行口中斷
}
//=====================================================================
//函數名稱:Converse_data
//函數功能:轉換數據類型
//輸入函數:字符型接收到的數據
//輸出函數:長整形數據
//==================================================================
void Converse_data(void)
{ unchar i;
i=COM_dzdata[1];
switch(i)
{
case 0: Rateflow_buffer[2]=(Rateflow_buffer[2]>>4)*10+(Rateflow_buffer[2]&0x0f);
Rateflow_buffer[3]=(Rateflow_buffer[3]>>4)*10+(Rateflow_buffer[3]&0x0f);
Rateflow_buffer[4]=(Rateflow_buffer[4]>>4)*10+(Rateflow_buffer[4]&0x0f);break;
case 1: Veloflow_buffer[2]=(Veloflow_buffer[2]>>4)*10+(Veloflow_buffer[2]&0x0f);
Veloflow_buffer[3]=(Veloflow_buffer[3]>>4)*10+(Veloflow_buffer[3]&0x0f);
Veloflow_buffer[4]=(Veloflow_buffer[4]>>4)*10+(Veloflow_buffer[4]&0x0f);break;
case 2: Percentageflow_buffer[2]=(Percentageflow_buffer[2]>>4)*10+(Percentageflow_buffer[2]&0x0f);
Percentageflow_buffer[3]=(Percentageflow_buffer[3]>>4)*10+(Percentageflow_buffer[3]&0x0f);break;
case 3: Resistanceflow_buffer[2]=(Resistanceflow_buffer[2]>>4)*10+(Resistanceflow_buffer[2]&0x0f);
Resistanceflow_buffer[3]=(Resistanceflow_buffer[3]>>4)*10+(Resistanceflow_buffer[3]&0x0f);break;
case 4: Positive_buffer[2]=(Positive_buffer[2]>>4)*10+(Positive_buffer[2]&0x0f);
Positive_buffer[3]=(Positive_buffer[3]>>4)*10+(Positive_buffer[3]&0x0f);
Positive_buffer[4]=(Positive_buffer[4]>>4)*10+(Positive_buffer[4]&0x0f);
Positive_buffer[5]=(Positive_buffer[5]>>4)*10+(Positive_buffer[5]&0x0f);
Positive_buffer[6]=(Positive_buffer[6]>>4)*10+(Positive_buffer[6]&0x0f);break;
case 5: Opposite_buffer[2]=(Opposite_buffer[2]>>4)*10+(Opposite_buffer[2]&0x0f);
Opposite_buffer[3]=(Opposite_buffer[3]>>4)*10+(Opposite_buffer[3]&0x0f);
Opposite_buffer[4]=(Opposite_buffer[4]>>4)*10+(Opposite_buffer[4]&0x0f);
Opposite_buffer[5]=(Opposite_buffer[5]>>4)*10+(Opposite_buffer[5]&0x0f);
Opposite_buffer[6]=(Opposite_buffer[6]>>4)*10+(Opposite_buffer[6]&0x0f);break;
default:break;}
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: 主函數
// 函數功能: 調度個子函數,完成通信過程
//--------------------------------------------------------------------------------------------------
void main(void)
{
unchar checkdata;
do
{
UART_init(); //初始化串口
send_COM ();
if(point==9) //判斷數據是否接收完成
{
checkdata=CLU_checkdata(); //調用求校驗和函數
if(checkdata==Receive_buffer[8]) //判斷校驗和是否正確
{
point=0;
SurveyData();
Converse_data();
}
}
}
while(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -