?? 單片機(jī)通信程序.c
字號:
/*===========================================================
/= 程序說明:
/= 通信協(xié)議的約定:
/= 假定A機(jī)是發(fā)送者,B機(jī)是接收者.當(dāng)A機(jī)開始發(fā)送時,先送一個"AA"
/= 信號,B機(jī)收到后回答一個"BB",表示同意接收.當(dāng)A機(jī)收到"BB"后,開始
/= 發(fā)送數(shù)據(jù),每發(fā)送一次求"校驗和",假定數(shù)據(jù)塊長度為16個字節(jié),數(shù)據(jù)緩
/= 沖區(qū)為BUF,數(shù)據(jù)塊發(fā)送完后馬上發(fā)送"校驗和".
/= B機(jī)接收數(shù)據(jù)并將其轉(zhuǎn)儲到數(shù)據(jù)緩沖區(qū)BUF,每接收到一個數(shù)據(jù)便計
/= 算一次"校驗和",當(dāng)收齊一個數(shù)據(jù)塊后,再接收A機(jī)發(fā)來的校驗和,并將它
/= 與B機(jī)求出的校驗和進(jìn)行比較.若兩者相等,說明接收正確,B機(jī)回答00H;
/= 若兩者不等,說明說明接收不正確,B機(jī)回答0FFH,請示重發(fā).
/= A機(jī)收到00H的回答后,結(jié)束發(fā)送;若收到的答復(fù)非零,則將數(shù)據(jù)再重
/= 發(fā)一次.雙方約定的傳輸速率若為1200b/s,查表可知,在雙方的
/= fosc=11.0592MHZ下,T1工作在定時器模式2,TH1=TL1=0E8H,PCON寄
/= 存器的SMOD位為0.
=============================================================*/
//A機(jī)發(fā)送程序
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
#define TR 0 //發(fā)送接收差別值TR=0發(fā)送
sbit work_flag=P1^0; //通信工作指示
uchar idata buf[10]={1,2,3,4,5,6};
uchar pf;
void delay(uchar x)
{
uint i;
while(x>0)
{
x--;
for(i=0;i<=2500;i++)
{};
}
}
void init(void)
{
TMOD=0x10; //串行口初始化
TH1=0xfe; //設(shè)T1為定時模式2
TL1=0xeb;
PCON=0x00; //設(shè)波特率
TR1=1; //啟動T1;
SCON=0x50; //串行口工作在方式1并允許接收
}
void send(uchar idata *d)
{
uchar i;
do
{
SBUF=0xaa; //發(fā)送聯(lián)絡(luò)信號“AA”
while(TI==0); //等待發(fā)送出去
TI=0;
while(RI==0); //等待B機(jī)回答
RI=0;
work_flag=1;
}while((SBUF^0xbb)!=0); //B機(jī)未準(zhǔn)備好,繼續(xù)聯(lián)絡(luò)(收到“BB”嗎)
work_flag=0;
do
{
pf=0; //清校驗和
for(i=0;i<16;i++)
{
SBUF=d[i]; //發(fā)送一個數(shù)據(jù)
pf+=d[i]; //求校驗和
while(TI==0);
TI=0;
}
SBUF=pf; //發(fā)送校驗和
while(TI==0);
TI=0;
while(RI==0); //等待B機(jī)回答
RI=0;
work_flag=1;
}while(SBUF!=0); //回答出錯,則重發(fā)
work_flag=0;
}
//B機(jī)接收程序
void receive(uchar idata *d)
{
uchar i;
do
{
while(RI==0);
RI=0;
}while((SBUF^0xaa)!=0); //判A機(jī)請求否
SBUF=0xbb;
while(TI==0);
TI=0;
while(1)
{
pf=0; //清校驗和
for(i=0;i<16;i++)
{
while(RI==0);
RI=0;
d[i]=SBUF; //接收一個數(shù)據(jù)
pf+=d[i]; //求校驗和
}
while(RI==0);
RI=0; //接收A機(jī)校驗和
if((SBUF^pf)==0) //比較絞驗和
{
SBUF=0x00; //校驗和相同則發(fā)“00”
break;
}
else
{
SBUF=0xff; //出錯則發(fā)“FF”,重新接收
while(TI==0);
TI=0;
}
}
}
void main(void)
{
uchar n;
for(n=0;n<=20;n++)
{
delay(20);
work_flag=1;
delay(20);
work_flag=0;
}
init();
while(1)
{
work_flag=0;
if(TR==0)
{
send(buf);
}
else
{
receive(buf);
}
work_flag=1;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -