?? slave.c
字號:
//-----------------------函數聲明,變量定義--------------------------------------------------------
#include <reg51.h>
sbit RE_DE=P1^0;
#define COUNT 10 // 定義接收緩沖區大小
#define ADD 5 //定義設備地址
unsigned char buffer[COUNT]; //定義接收緩沖區
unsigned char point; //定義接收數據個數指示變量
void UART_init(); //串口初始化函數
void COM_send(void); //串口接收函數
unsigned char CLU_checkdata(void);//計算校驗位函數
//--------------------------------------------------------------------------------------------------
// 函數名稱: UART_init()串口初始化函數
// 函數功能: 在系統時鐘為11.059MHZ時,設定串口波特率為9600bit/s
// 串口接收中斷允許,發送中斷禁止
//--------------------------------------------------------------------------------------------------
void UART_init()
{
//初始化串行口和波特率發生器
SCON =0x0F0; //選擇串口工作方式為3,打開接收允許
TMOD =0x21; //定時器1工作在方式2,定時器0工作在方式1
TH1 =0xfd; //實現波特率9600(系統時鐘11.0592MHZ)
TL1 =0xfd; //實現波特率9600(系統時鐘11.0592MHZ)
TR1 =1; //啟動定時器T1
ET1 =0;
ES=1; //允許串行口中斷
PS=1; //設計串行口中斷優先級
EA =1; //單片機中斷允許
SM2=1; //設備處于地址監聽狀態
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: com_interrup()串口接收中斷處理函數
// 函數功能: 接收包括起始位0xFE,地址位和終止位0xEF在內的十位數據到數據緩沖區,
// 地址不匹配,則接收到的是無效數字,不寫到接收緩沖區
//--------------------------------------------------------------------------------------------------
com_interrupt(void) interrupt 4 using 3
{
unsigned char RECEIVR_buffer;
if(RI)
{ //處理接收中斷
RI=0; //清除中斷標志位
RECEIVR_buffer=SBUF; //接收串口數據
if(point==0) //如果還沒有接收到起始位
{
if(RECEIVR_buffer==0xFE) //判斷是否起始標志位
buffer[point++]=RECEIVR_buffer;//起始正確,接收起始位
else
point=0; //不是,繼續等待起始位
}
else if(point==1) //是否地址位
{
if(RECEIVR_buffer==ADD) //判斷地址是否匹配
buffer[point++]=RECEIVR_buffer;//地址匹配,接收開始接收
else
point=0; //不匹配,繼續下一個起始位
}
else if(point>0&&point<10) //判斷是否接收夠十位數據
buffer[point++]=RECEIVR_buffer; //不夠,把接收到的數據放入接收緩存區
else point=0; //緩沖區已滿,清除緩存區內數據重新接收
}
if(TI) //串口發送中斷
{
TI=0; //清除發送中斷
}
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: COM_send()串口發送函數
// 函數功能: 把數據緩沖區的十位數據發送出去
//--------------------------------------------------------------------------------------------------
void COM_send(void)
{
RE_DE=1; //設置MAX483進入發送狀態
for(point=0;point<=10,TI=1;point++) //連續發送十位數據
//把緩存區的數據都發送到串口
{
SBUF=buffer[point];
TI=0;
}
RE_DE=0; //設置MAX483進入接收狀態
}
//--------------------------------------------------------------------------------------------------
// 函數名稱: 主函數
// 函數功能: 調度個子函數,完成通信過程
//--------------------------------------------------------------------------------------------------
void main(void)
{
UART_init(); //初始化串口
do
{
}
while(point!=10); //判斷數據是否接收完成
COM_send(); //地址匹配,數據完整接收,調用發送程序通知主機
SM2=0; //設置為點對點通信狀態
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -