久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2919|回復(fù): 1
收起左側(cè)

51單片機 串口通信 定時與中斷

[復(fù)制鏈接]
ID:223209 發(fā)表于 2017-7-29 23:03 | 顯示全部樓層 |閱讀模式
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é)束標志
        }
    }
}

回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2017-7-30 00:05 | 顯示全部樓層
T0關(guān)閉后。則不能再產(chǎn)生T0中斷,但不妨礙串口中斷。這是兩碼事。
要注意的是:串行“串”是由CLK實現(xiàn)的,如果CLK停止了,就串不起來了,也就無法中斷的。T0與串口的CLK有關(guān)嗎?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 久艹在线观看 | 国产小视频网站 | 一级毛片网 | 五月天激情综合网 | 久久精品99久久久久久 | 国产最新av | 视频一区在线观看 | 91tv国产成人福利 | 日本中文字幕在线视频 | 黄色一级视频 | 欧美一区二区在线播放 | 日韩一区在线播放 | 中文字幕一级片 | 欧美精品一区二区三区四区 | 色就是色欧美 | 三级网站免费 | 精品久久一区二区 | 欧美国产日韩一区二区 | 国产区视频在线观看 | 久久精品一二三 | 超碰精品在线 | 亚洲毛片在线 | 九九久久精品视频 | 80日本xxxxxxxxx96| 免费视频黄 | 免费av大片 | 插少妇 | 国产精品久久久精品 | 国产伦精品一区二区免费 | 欧美日韩黄 | 精品一区二区免费视频 | 中文字幕在线观看一区二区 | 国产福利小视频 | a级片网站 | 欧美 日韩 国产 成人 在线 | 久操不卡 | 色av综合 | 欧美精品三区 | 日韩av在线不卡 | 欧美网站在线观看 | 张津瑜国内精品www在线 |