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