久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
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.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
视频一区二区在线观看
|
国产情侣在线看
|
亚洲一二三在线观看
|
91性高湖久久久久久久久_久久99
|
91精品国产综合久久久久久丝袜
|
国产免费一区二区
|
福利av在线
|
一区二区三区四区在线播放
|
伊人在线
|
精品国产18久久久久久二百
|
日本精品久久久久久久
|
aaa国产大片
|
台湾佬久久
|
妹子干综合
|
美女视频黄的免费
|
sese视频在线观看
|
黄色免费在线观看网站
|
成人三级视频
|
中文字幕av在线播放
|
国产精品久久久久久久久久久久
|
国产日韩精品视频
|
久久久久亚洲
|
久久国产综合
|
一区二区三区欧美大片
|
在线中文视频
|
免费日韩av网站
|
精品国产欧美
|
国产成人精品一区二区在线
|
久久精品视频在线观看
|
亚洲精品久久久一区二区三区
|
91欧美激情一区二区三区成人
|
欧美一级久久
|
91极品视频
|
久久综合伊人一区二区三
|
最近最新中文字幕
|
午夜一区二区三区在线观看
|
99精品国自产在线
|
亚洲 成人 在线
|
午夜精品久久久久久久久久久久久
|
天天艹逼网
|
麻豆精品国产91久久久久久
|