欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: stc12c5604ad T0中斷與串口不能同時使用,求高人分析 [打印本頁]

作者: taotaoliu199    時間: 2015-1-21 19:51
標題: stc12c5604ad T0中斷與串口不能同時使用,求高人分析

stc12c5604ad T0中斷與串口不能同時使用,求高人分析。
程序結構為時間片輪轉方式,5ms一個中斷,中斷里刷數碼管。
在程序進入串口前P13設高電位,完成串口程序后P13設低電位
,用邏輯分析儀捕捉P13口后看高電位寬度寬達7ms,這是不正常的,也就
是說發送一字節用了7ms時間
把T0中斷屏蔽了用大循環方式串口就正常了,串口發送一字節數據也就1ms不到,

如下代碼,是大概樣子

void Ini_Timer0(void)           //5ms中斷
{
        TMOD &= 0xF0;                //設置定時器模式
        TMOD |= 0x01;                //設置定時器模式
        TL0 = 0x00;                //設置定時初值
        TH0 = 0x28;                //設置定時初值
        TF0 = 0;                //清除TF0標志TR0 = 1;               
        EA = 1;
    ET0 = 1;
    TR0 = 1;
}
//串口初始化
void InitUART(void)                 //9600bps  11.0592mhz
{
    TMOD |= 0x20;
    SCON = 0x40;
    TH1 = 0xDC;
    TL1 = TH1;
    PCON = 0x00;
    TR1 = 1;

}
//串口發送一位數據
void SendOneByte(u8 c)
{
    SBUF = c;
    while(!TI);
    TI = 0;
}
void Timer0() interrupt 1
{
        P14 = 1;                //中斷開始測試
        TL1 = 0x00;                //設置定時初值
        TH1 = 0x00;                //設置定時初值
         
        if(work_count1)work_count1--; //每節拍對任務延時變量減1,減至0后,任務就緒。
        if(work_count2)work_count2--;
        if(work_count3)work_count3--;

        if(++weicon>3) weicon=0;      //顯示位置輪流,需要嚴格限制范圍為0-7                
        P2=0;                          //關段碼顯示                  74LS245               
        switch(weicon)
        {       
            case 0:                                    //第1位顯示內容
                   P2=LED_tab[bai];     //顯示內容   74ls245
                   P17=0;P15=0;P16=1;        //位選  74lLS138
                break;
                case 1:                                    //第2位顯示內容
                   P2=LED_tab[shi];     //顯示內容
                   P17=1;P15=0;P16=1;        //位選
                break;
                case 2:                                    //第3位顯示內容
                   P2=LED_tab[ge];      //顯示內容
                   P20=1;                            //在各位上顯示小數點
                   P17=0; P15=1;P16=1;        //位選
                break;
                case 3:                                    //第4位顯示內容
                   P2=LED_tab[xiaoshu]; //顯示內容
                   P17=1; P15=1;P16=1;        //位選
                break;
                default:break;
        }
                                                                                                                                        
        P14=0;      //中斷結束測試端
          
}


void main(void)
{       
        P2=0;                 //關顯示

        P17=1;                 //數碼管74ls138位選
        P15=1;                 //
        P16=1;                 //

        P14=0;      //測試端口
        P13=0;                //測試端口
        P12=0;                //測試端口
        P11=0;                //測試端口
        AUXR = AUXR|0x80;  // T0, 1T Mode
        AUXR = AUXR|0x40;  // T1, 1T Mode
        convert_T();    //開機先轉換一次溫度
        Ini_Timer0();        //初始化定時器0
        InitUART();
        while(1)
        {         P12=1;
            
                convert_T();            //啟動溫度轉換

                        if(work_count2++==)
                                { P13=1;
                                   SendOneByte(temp>>4);       //發送串口
                                 work_count2=0;
                                   P13=0;
                                }
                        if(work_count1++==100)
                            {
                                  P14=1;
                                  read_T();                        //讀轉換溫度數字
                                   P14=0;


                                 }
                 work_temp(temp); //處理溫度數據
                 P12=0;                 
        }                               
}


作者: taotaoliu199    時間: 2015-1-21 19:53
網上搜了很多都不是他們所說的問題。
作者: taotaoliu199    時間: 2015-1-23 20:14
沒人說兩句嗎?這也不是什么高層次的應用。
作者: jxr0345    時間: 2015-1-23 23:17
這些東西只有試一下,你把T0與T1換了試一下。在做一個調光延時的時候我發現中斷之間也是有影響的,最后還是用示波器一點一點的調整的。
作者: taotaoliu199    時間: 2015-1-24 09:04
T0中斷,T1串口沒開中斷。換過來T0不能做波特率發生器吧?
作者: taotaoliu199    時間: 2015-1-24 09:07
我用stc89c52就沒問題。中斷的處理時間急短
作者: taotaoliu199    時間: 2015-1-24 09:09
現在的現象就是t0開中斷,串口的每一位發送時間就會被拉很長,導致電腦不能接收。
作者: jxr0345    時間: 2015-1-24 15:49
taotaoliu199 發表于 2015-1-24 09:09
現在的現象就是t0開中斷,串口的每一位發送時間就會被拉很長,導致電腦不能接收。

我認為,既然刷顯示都要在中斷內進行,證明中斷對刷新是有影響的;反過來,你延時對串口是否會有影響呢,可否把串口函數也放在中斷內呢,這樣每一個中斷發生時,它會執行這個函數。
作者: taotaoliu199    時間: 2015-1-26 13:46
jxr0345 發表于 2015-1-24 15:49
我認為,既然刷顯示都要在中斷內進行,證明中斷對刷新是有影響的;反過來,你延時對串口是否會有影響呢, ...

發串口放t0中斷里也試過,中斷執行時間一樣被拉長達7ms,而中斷如果只刷數碼管只要幾十微妙執行。
作者: jxr0345    時間: 2015-1-26 20:19
taotaoliu199 發表于 2015-1-26 13:46
發串口放t0中斷里也試過,中斷執行時間一樣被拉長達7ms,而中斷如果只刷數碼管只要幾十微妙執行。

是否是因優先級引起的呢?串口一般級別低一些。這方面考慮一下,再試一下。
作者: ABCD123    時間: 2016-10-1 20:09
您好,您解決了嗎?我也遇到這個問題了。在定時器里發送串口導致不返回主程序
作者: 大雨    時間: 2019-3-18 14:05
這問題我也遇到了,用的是T2做串口1的波特率




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1