某溫度數據采集系統有主、從機進行串行通訊,假定雙機的系統時鐘頻率fosc=11.0592MHz,通訊速率9600bps,主機每次將溫度數據temperature的值發送給從機,從機則將收到的數據送到顯示器上顯示,試完成雙機通信程序設計。
分析:設定時器1工作於方式2,TMOD=00100000b=0x20。
定時器的初值計算:9600=K*fosc/[32*12*(256-TH1)],這裏設SMOD=0,則K=1。fosc=11.0592MHz,計算得到:TH1=253=0x0fd。
SCON的確定:串口工作在方式1,允許接收。?所以:SCON=01010000b=0x50。
主機采集數據,並發送給從機的參考程序如下(這裏沒有考慮通信協議):
#include<reg51.h>
#define?uchar?unsigned?char
#define?uint?unsigned?int?
uchar?Temperature;
void?InitSystem(void);
void?CollectData(void);
void?Delay(void);
/*系統初始化*/
void?InitSystem(void)
{
TMOD=0x20;/*?T1工作於方式2*/
TH1=0xfd;/*?通信速率2400bps*/
TL1=0xfd;
PCON=0x00;/*?SMOD=0*/
SCON=0x50;/*?允許接收*/
ES=0;/*?開串口中斷*/
ET1=0;
TR1=1;?/*?啟動定時器1*/
RI=0;
TI=0;
}void?CollectData(void)?/*數據采集程序*/
{;//?此程序將采集的溫度數據送入Temperature變量,限於篇幅,省去該程序代碼。?
}void?Delay()?/*延時子程序*/
{int?i;
for(i=0;i<10000;i++);
}void?main(void)
{InitSystem();
while(1)
{
Delay();
SBUF=Temperature;/*發送溫度數據*/
while(!TI);
TI=0;
CollectData();?/*?采集溫度數據*/
}
}從機程序如下:
#include<reg51.h>
#define?uchar?unsigned?char
#define?uint?unsigned?int?
uchar?Temperature;
void?InitSystem(void);
void?Comm(void)?;
void?Display(void);
void?InitSystem(void)?/*系統初始化程序*/
{
TMOD=0x20;/*?T1工作於方式2*/
TH1=0xfd;/*?通信速率2400bps*/
TL1=0xfd;
PCON=0x00;/*?SMOD=0*/
SCON=0x50;/*?允許接收*/
EA=1;
ES=1;/*?開串口中斷*/
ET1=0;
TR1=1;?/*?啟動定時器1*/
RI=0;
TI=0;
}void?Comm(void)?interrupt?4?using?0?/*串行中斷服務程序*/
{ Temperature=SBUF;?/*?保存數據*/ RI=0;/*清中斷標誌*/ }void?Display(void)/*顯示程序*/
{;
/*此程序將收到的Temperature?通過顯示器顯示出來*/
}void?main(void)
{InitSystem();
while(1)
{
Display();
;
}
}註意:晶振和波特率壹定按照程序中給出的那樣設置,否則會有很大的誤碼率導致通信失敗。。。程序中用的是11.0592妳就別用12M的,否則妳就等著後悔吧