|
1黑幣
各位朋友幫忙看一下
下面是51單片機串口通信的一個數(shù)據(jù)發(fā)送例程,想問一下定時器T0關(guān)閉后程序還會繼續(xù)運行進入中斷函數(shù)嗎?主要是中斷函數(shù)中,串行接收處理起始位不為零,終止接收那里不太明白,
else //串行接收數(shù)據(jù)
{
if(cnt == 0) //處理起始位
{
if(!PRXD) //起始位為零時,清零接受緩沖器,準備接受數(shù)據(jù)位
{
RxdBuf = 0;
cnt++;
}
else //起始位不為零時,終止接收
TR0 = 0; //關(guān)閉T0
}
假設(shè)遇到干擾信號,一開始PRXD=0,而中斷里再次判斷時PRXD=1,中斷函數(shù)就執(zhí)行上面else那段吧,主函數(shù)停留在while(!RxdEnd); 程序怎樣繼續(xù)往下運行呢?我目前想到的是可以再進入中斷,但是從哪里開始計時就不明白了,或者其他地方我沒考慮到嗎,小白入門望指教
#include<reg52.h>
sbit PRXD = P3^0; //接收引腳定義
sbit PTXD = P3^1; //發(fā)送引腳定義
unsigned char TxdBuf = 0; //發(fā)送緩沖
unsigned char RxdBuf = 0; //接收緩沖
bit RxdOrTxd = 0; //指示當(dāng)前狀態(tài)是接收還是發(fā)送
bit RxdEnd = 0; //接收結(jié)束標志
bit TxdEnd = 0; //發(fā)送結(jié)束標志
void ConfigUART(unsigned int baud); //配置波特率函數(shù)
void StartRXD();
void StartTXD(unsigned char dat);
void main()
{
EA = 1; //開總中斷
ConfigUART(9600); // 設(shè)置波特率為9600
while(1)
{
while(PRXD); //檢測低電平,如果是高電平,會一直等待,直到PRXD=0
StartRXD();啟動接收
while(!RxdEnd); //RxdEnd=1時,十位數(shù)據(jù)接收完畢
StartTXD(RxdBuf+1); //數(shù)據(jù)接收完畢開始發(fā)送
while(!TxdEnd); //TedEnd=1時,十位數(shù)據(jù)發(fā)送完畢
}
}
void ConfigUART(unsigned int baud) //波特率配置函數(shù)
{
TMOD &= 0xF0; //清零T0控制位
TMOD |= 0x02; // T0 設(shè)置為自動重裝模式
TH0 = 256-(11059200/12)/baud; //計算T0重載值
}
void StartRXD() //接收啟動函數(shù)
{
TL0 = 256-((256-TH0)>>1); //接收啟動時T0設(shè)置為半個波特率周期,以便獲得較穩(wěn)定信號
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
RxdEnd = 0; // 清零接受結(jié)束標志,開始接收數(shù)據(jù)
RxdOrTxd = 0; //當(dāng)前狀態(tài)設(shè)置為接收
}
void StartTXD(unsigned char dir) //數(shù)據(jù)發(fā)送函數(shù)
{
TxdBuf = dir; //待發(fā)送數(shù)據(jù)保存到緩沖區(qū)
TL0 = TH0; //定時器初值重載
ET0 = 1; //使 能T0中斷
TR0 = 1; //啟動T0
TxdEnd = 0; //清零發(fā)送結(jié)束標志,開始發(fā)送數(shù)據(jù)
PTXD = 0; //發(fā)送起始位
RxdOrTxd = 1; //當(dāng)前狀態(tài)設(shè)置為發(fā)送
}
void Interrupt() interrupt 1 //中斷函數(shù)
{
static unsigned char cnt = 0; //接收或發(fā)送計數(shù)
if(RxdOrTxd) //串行發(fā)送數(shù)據(jù)
{
cnt++;
if(cnt <= 8) //低位先依次發(fā)送8位數(shù)據(jù)
{
PTXD = TxdBuf & 0x01;
TxdBuf >>= 1;
}
else if(cnt == 9) //8位數(shù)據(jù)發(fā)送完畢,停止發(fā)送
PTXD = 1;
else //發(fā)送結(jié)束
{
cnt = 0; //復(fù)位bit計數(shù)器
TR0 = 0; //關(guān)閉T0
TxdEnd = 1 ; //置發(fā)送標志為結(jié)束
}
}
else //串行接收數(shù)據(jù)
{
if(cnt == 0) //處理起始位
{
if(!PRXD) //起始位為零時,清零接受緩沖器,準備接受數(shù)據(jù)位
{
RxdBuf = 0;
cnt++;
}
else //起始位不為零時,終止接受
TR0 = 0; //關(guān)閉T0
}
else if(cnt<=8) //處理8位數(shù)據(jù)位
{
RxdBuf >>= 1; //低位在先,將之前接受的數(shù)據(jù)右移
if(PRXD) //接受腳為1時緩沖器最高位置1,為零時不處理
RxdBuf|= 0x80;
cnt++;
}
else停止處理
{
cnt = 0; //復(fù)位bit計數(shù)器
TR0 = 0; //關(guān)閉T0
if(PRXD) //停止位為1時,方認為數(shù)據(jù)有效
RxdEnd =1; //設(shè)置接受結(jié)束標志
}
}
}
|
|