找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4722|回復(fù): 11
打印 上一主題 下一主題
收起左側(cè)

stc12c5604ad T0中斷與串口不能同時(shí)使用,求高人分析

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:72585 發(fā)表于 2015-1-21 19:51 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

stc12c5604ad T0中斷與串口不能同時(shí)使用,求高人分析。
程序結(jié)構(gòu)為時(shí)間片輪轉(zhuǎn)方式,5ms一個(gè)中斷,中斷里刷數(shù)碼管。
在程序進(jìn)入串口前P13設(shè)高電位,完成串口程序后P13設(shè)低電位
,用邏輯分析儀捕捉P13口后看高電位寬度寬達(dá)7ms,這是不正常的,也就
是說(shuō)發(fā)送一字節(jié)用了7ms時(shí)間
把T0中斷屏蔽了用大循環(huán)方式串口就正常了,串口發(fā)送一字節(jié)數(shù)據(jù)也就1ms不到,

如下代碼,是大概樣子

void Ini_Timer0(void)           //5ms中斷
{
        TMOD &= 0xF0;                //設(shè)置定時(shí)器模式
        TMOD |= 0x01;                //設(shè)置定時(shí)器模式
        TL0 = 0x00;                //設(shè)置定時(shí)初值
        TH0 = 0x28;                //設(shè)置定時(shí)初值
        TF0 = 0;                //清除TF0標(biāo)志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;

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

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


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

        P17=1;                 //數(shù)碼管74ls138位選
        P15=1;                 //
        P16=1;                 //

        P14=0;      //測(cè)試端口
        P13=0;                //測(cè)試端口
        P12=0;                //測(cè)試端口
        P11=0;                //測(cè)試端口
        AUXR = AUXR|0x80;  // T0, 1T Mode
        AUXR = AUXR|0x40;  // T1, 1T Mode
        convert_T();    //開(kāi)機(jī)先轉(zhuǎn)換一次溫度
        Ini_Timer0();        //初始化定時(shí)器0
        InitUART();
        while(1)
        {         P12=1;
            
                convert_T();            //啟動(dòng)溫度轉(zhuǎn)換

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


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

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

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:72585 發(fā)表于 2015-1-21 19:53 | 只看該作者
網(wǎng)上搜了很多都不是他們所說(shuō)的問(wèn)題。
回復(fù)

使用道具 舉報(bào)

板凳
ID:72585 發(fā)表于 2015-1-23 20:14 來(lái)自觸屏版 | 只看該作者
沒(méi)人說(shuō)兩句嗎?這也不是什么高層次的應(yīng)用。
回復(fù)

使用道具 舉報(bào)

地板
ID:19701 發(fā)表于 2015-1-23 23:17 | 只看該作者
這些東西只有試一下,你把T0與T1換了試一下。在做一個(gè)調(diào)光延時(shí)的時(shí)候我發(fā)現(xiàn)中斷之間也是有影響的,最后還是用示波器一點(diǎn)一點(diǎn)的調(diào)整的。
回復(fù)

使用道具 舉報(bào)

5#
ID:72585 發(fā)表于 2015-1-24 09:04 來(lái)自觸屏版 | 只看該作者
T0中斷,T1串口沒(méi)開(kāi)中斷。換過(guò)來(lái)T0不能做波特率發(fā)生器吧?
回復(fù)

使用道具 舉報(bào)

6#
ID:72585 發(fā)表于 2015-1-24 09:07 來(lái)自觸屏版 | 只看該作者
我用stc89c52就沒(méi)問(wèn)題。中斷的處理時(shí)間急短
回復(fù)

使用道具 舉報(bào)

7#
ID:72585 發(fā)表于 2015-1-24 09:09 來(lái)自觸屏版 | 只看該作者
現(xiàn)在的現(xiàn)象就是t0開(kāi)中斷,串口的每一位發(fā)送時(shí)間就會(huì)被拉很長(zhǎng),導(dǎo)致電腦不能接收。
回復(fù)

使用道具 舉報(bào)

8#
ID:19701 發(fā)表于 2015-1-24 15:49 | 只看該作者
taotaoliu199 發(fā)表于 2015-1-24 09:09
現(xiàn)在的現(xiàn)象就是t0開(kāi)中斷,串口的每一位發(fā)送時(shí)間就會(huì)被拉很長(zhǎng),導(dǎo)致電腦不能接收。

我認(rèn)為,既然刷顯示都要在中斷內(nèi)進(jìn)行,證明中斷對(duì)刷新是有影響的;反過(guò)來(lái),你延時(shí)對(duì)串口是否會(huì)有影響呢,可否把串口函數(shù)也放在中斷內(nèi)呢,這樣每一個(gè)中斷發(fā)生時(shí),它會(huì)執(zhí)行這個(gè)函數(shù)。
回復(fù)

使用道具 舉報(bào)

9#
ID:72585 發(fā)表于 2015-1-26 13:46 來(lái)自觸屏版 | 只看該作者
jxr0345 發(fā)表于 2015-1-24 15:49
我認(rèn)為,既然刷顯示都要在中斷內(nèi)進(jìn)行,證明中斷對(duì)刷新是有影響的;反過(guò)來(lái),你延時(shí)對(duì)串口是否會(huì)有影響呢, ...

發(fā)串口放t0中斷里也試過(guò),中斷執(zhí)行時(shí)間一樣被拉長(zhǎng)達(dá)7ms,而中斷如果只刷數(shù)碼管只要幾十微妙執(zhí)行。
回復(fù)

使用道具 舉報(bào)

10#
ID:19701 發(fā)表于 2015-1-26 20:19 | 只看該作者
taotaoliu199 發(fā)表于 2015-1-26 13:46
發(fā)串口放t0中斷里也試過(guò),中斷執(zhí)行時(shí)間一樣被拉長(zhǎng)達(dá)7ms,而中斷如果只刷數(shù)碼管只要幾十微妙執(zhí)行。

是否是因優(yōu)先級(jí)引起的呢?串口一般級(jí)別低一些。這方面考慮一下,再試一下。
回復(fù)

使用道具 舉報(bào)

11#
ID:140800 發(fā)表于 2016-10-1 20:09 | 只看該作者
您好,您解決了嗎?我也遇到這個(gè)問(wèn)題了。在定時(shí)器里發(fā)送串口導(dǎo)致不返回主程序
回復(fù)

使用道具 舉報(bào)

12#
ID:255919 發(fā)表于 2019-3-18 14:05 | 只看該作者
這問(wèn)題我也遇到了,用的是T2做串口1的波特率
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表