?? scom.c
字號(hào):
#include <reg51.h>
sbit BT_SND = P1^7;//定義連接方式,發(fā)送端
sbit BT_REC = P1^6;//定義連接方式,接受端
#define TIMER0_ENABLE TL0=TH0; TR0=1;//開啟定時(shí)器并裝入初值
#define TIMER0_DISABLE TR0=0;//關(guān)閉定時(shí)器
#define F_TM F0 //定義中斷標(biāo)志
#define FALSE 0 //接收過程錯(cuò)誤標(biāo)志
#define TRUE 1 //接收到正確數(shù)據(jù)標(biāo)志
void Inttime0();
void SendChar(unsigned char);
unsigned char GetChar(char);
main()
{
while(1);
}
//=============初始化定時(shí)器================================
void Inttime0()
{
TMOD=0x02; /*定時(shí)器0為模式2(8位自動(dòng)重裝) */
TR0=0; //在發(fā)送或接收才開始使用
TF0=0; //清定時(shí)器溢出標(biāo)志
TH0=0XA0; //9600是1000000/9600=104.167微秒104.167*11.0592/12=96 (256-96=0XA0)
TL0=TH0;
ET0=1; //開定時(shí)器中斷
EA=1; //開CPU中斷
}
//=========================================================
//=============定時(shí)器中斷子程序============================
void IntTimer0() interrupt 1
{
F_TM=1; //定時(shí)器溢出引起中斷,置標(biāo)志位
}
//=========================================================
//=============發(fā)送一個(gè)字符================================
void SendChar(unsigned char ch)
{
unsigned char i;
i=0;
F_TM=0; //關(guān)中斷標(biāo)志
BT_SND=0; //發(fā)送起始位
TIMER0_ENABLE; //啟動(dòng)定時(shí)器
while(!F_TM); //檢測(cè)到中斷標(biāo)志后開始發(fā)送一個(gè)字符(8位)
while(i<8)
{
if(ch&1)
{
BT_SND=1;
}
else
{
BT_SND=0;
}
F_TM=0; //發(fā)送一位之后關(guān)標(biāo)志準(zhǔn)備發(fā)送下一位
while(!F_TM);
i++;
ch>>=1;
}
BT_SND=1; //發(fā)送停止位
F_TM=0;
while(!F_TM);
TIMER0_DISABLE; //停止定時(shí)器
}
//=========================================================
//=============接收一個(gè)字符================================
unsigned char GetChar(char *ndata)
{
unsigned char i=0,ch=0; //i:位計(jì)數(shù),ch:接收的字符存儲(chǔ)位置
unsigned int count=0; //超時(shí)計(jì)數(shù)器
TIMER0_ENABLE ; //啟動(dòng)定時(shí)器
//=============檢測(cè)起始位和超時(shí)====================
while(1)
{
F_TM=0;
while(!F_TM); //等待中斷
if(!BT_REC) //等待開始位
break;
count++;
if(count>30000)
return FALSE; //超時(shí)后錯(cuò)誤
}
//=================================================
//=============接收一個(gè)字節(jié)的數(shù)據(jù)==================
F_TM=0;
while(!F_TM); //等待溢出準(zhǔn)備接收一個(gè)字節(jié)的數(shù)據(jù)
while(i<8)
{
ch>>=1;
if(BT_REC)
ch|=0x80;
i++;
F_TM=0;
while(!F_TM);
}
//=================================================
F_TM=0;
while(!F_TM) //接收停止位
{
if(BT_REC)
break; //接收完后返回
}
TIMER0_DISABLE ; //停止定時(shí)器
*ndata = ch; //將接收的數(shù)據(jù)以ndata指針返回
return TRUE; //正確接送數(shù)據(jù)
}
//=========================================================
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -