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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2742|回復: 1
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:223209 發表于 2017-7-29 23:03 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
1黑幣
各位朋友幫忙看一下
下面是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;               //設置接受結束標志
        }
    }
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:123289 發表于 2017-7-30 00:05 | 只看該作者
T0關閉后。則不能再產生T0中斷,但不妨礙串口中斷。這是兩碼事。
要注意的是:串行“串”是由CLK實現的,如果CLK停止了,就串不起來了,也就無法中斷的。T0與串口的CLK有關嗎?
回復

使用道具 舉報

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

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 浴室洗澡偷拍一区二区 | 丁香六月激情 | 欧美国产视频 | 欧美一区二区三区久久精品视 | 午夜影院网站 | 一区二区三区久久久 | 亚州精品天堂中文字幕 | 日韩视频91 | 国产99在线 | 欧美 | 成人做爰www免费看视频网站 | av大片 | 在线亚洲人成电影网站色www | 久久久久久免费精品一区二区三区 | 一区天堂| 精品久久一区二区 | 黄色国产在线视频 | 国产黄色在线观看 | 羞羞视频在线观免费观看 | 欧美精品久久久 | 国产一区二区精品在线观看 | 浴室洗澡偷拍一区二区 | 在线一级片 | 亚洲精品视频在线看 | 黄色毛片网站在线观看 | 国产夜恋视频在线观看 | 国产精品高 | 伊人网站 | 爱爱免费视频 | 精品日韩一区二区 | 999久久久精品 | 欧美日韩精品一区二区三区视频 | 成人精品免费视频 | 免费国产视频在线观看 | 日日夜夜精品视频 | 日韩国产中文字幕 | 九九伦理片 | 日本高清不卡视频 | 日韩成人在线网址 | 日本成人在线免费视频 | 久久草在线视频 | 欧美日韩在线观看一区二区三区 |