久久久久久久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久久久久久 |