欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
51單片機(jī) 串口通信 定時(shí)與中斷
[打印本頁]
作者:
_sam
時(shí)間:
2017-7-29 23:03
標(biāo)題:
51單片機(jī) 串口通信 定時(shí)與中斷
各位朋友幫忙看一下
下面是51單片機(jī)串口通信的一個(gè)數(shù)據(jù)發(fā)送例程,想問一下定時(shí)器T0關(guān)閉后程序還會(huì)繼續(xù)運(yùn)行進(jìn)入中斷函數(shù)嗎?主要是中斷函數(shù)中,串行接收處理起始位不為零,終止接收那里不太明白,
else //串行接收數(shù)據(jù)
{
if(cnt == 0) //處理起始位
{
if(!PRXD) //起始位為零時(shí),清零接受緩沖器,準(zhǔn)備接受數(shù)據(jù)位
{
RxdBuf = 0;
cnt++;
}
else //起始位不為零時(shí),終止接收
TR0 = 0; //關(guān)閉T0
}
假設(shè)遇到干擾信號,一開始PRXD=0,而中斷里再次判斷時(shí)PRXD=1,中斷函數(shù)就執(zhí)行上面else那段吧,主函數(shù)停留在while(!RxdEnd); 程序怎樣繼續(xù)往下運(yùn)行呢?我目前想到的是可以再進(jìn)入中斷,但是從哪里開始計(jì)時(shí)就不明白了,或者其他地方我沒考慮到嗎,小白入門望指教
#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é)束標(biāo)志
bit TxdEnd = 0; //發(fā)送結(jié)束標(biāo)志
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); //檢測低電平,如果是高電平,會(huì)一直等待,直到PRXD=0
StartRXD();啟動(dòng)接收
while(!RxdEnd); //RxdEnd=1時(shí),十位數(shù)據(jù)接收完畢
StartTXD(RxdBuf+1); //數(shù)據(jù)接收完畢開始發(fā)送
while(!TxdEnd); //TedEnd=1時(shí),十位數(shù)據(jù)發(fā)送完畢
}
}
void ConfigUART(unsigned int baud) //波特率配置函數(shù)
{
TMOD &= 0xF0; //清零T0控制位
TMOD |= 0x02; // T0 設(shè)置為自動(dòng)重裝模式
TH0 = 256-(11059200/12)/baud; //計(jì)算T0重載值
}
void StartRXD() //接收啟動(dòng)函數(shù)
{
TL0 = 256-((256-TH0)>>1); //接收啟動(dòng)時(shí)T0設(shè)置為半個(gè)波特率周期,以便獲得較穩(wěn)定信號
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動(dòng)T0
RxdEnd = 0; // 清零接受結(jié)束標(biāo)志,開始接收數(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; //定時(shí)器初值重載
ET0 = 1; //使 能T0中斷
TR0 = 1; //啟動(dòng)T0
TxdEnd = 0; //清零發(fā)送結(jié)束標(biāo)志,開始發(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ā)送計(jì)數(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計(jì)數(shù)器
TR0 = 0; //關(guān)閉T0
TxdEnd = 1 ; //置發(fā)送標(biāo)志為結(jié)束
}
}
else //串行接收數(shù)據(jù)
{
if(cnt == 0) //處理起始位
{
if(!PRXD) //起始位為零時(shí),清零接受緩沖器,準(zhǔn)備接受數(shù)據(jù)位
{
RxdBuf = 0;
cnt++;
}
else //起始位不為零時(shí),終止接受
TR0 = 0; //關(guān)閉T0
}
else if(cnt<=8) //處理8位數(shù)據(jù)位
{
RxdBuf >>= 1; //低位在先,將之前接受的數(shù)據(jù)右移
if(PRXD) //接受腳為1時(shí)緩沖器最高位置1,為零時(shí)不處理
RxdBuf|= 0x80;
cnt++;
}
else停止處理
{
cnt = 0; //復(fù)位bit計(jì)數(shù)器
TR0 = 0; //關(guān)閉T0
if(PRXD) //停止位為1時(shí),方認(rèn)為數(shù)據(jù)有效
RxdEnd =1; //設(shè)置接受結(jié)束標(biāo)志
}
}
}
作者:
yzwzfyz
時(shí)間:
2017-7-30 00:05
T0關(guān)閉后。則不能再產(chǎn)生T0中斷,但不妨礙串口中斷。這是兩碼事。
要注意的是:串行“串”是由CLK實(shí)現(xiàn)的,如果CLK停止了,就串不起來了,也就無法中斷的。T0與串口的CLK有關(guān)嗎?
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1