找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3985|回复: 11
打印 上一主题 下一主题
收起左侧

stc12c5604ad T0中断与串口不能同时使用,求高人分析

[复制链接]
跳转到指定楼层
楼主
ID:72585 发表于 2015-1-21 19:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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;                 
        }                               
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:72585 发表于 2015-1-21 19:53 | 只看该作者
网上搜了很多都不是他们所说的问题。
回复

使用道具 举报

板凳
ID:72585 发表于 2015-1-23 20:14 来自手机 | 只看该作者
没人说两句吗?这也不是什么高层次的应用。
回复

使用道具 举报

地板
ID:19701 发表于 2015-1-23 23:17 | 只看该作者
这些东西只有试一下,你把T0与T1换了试一下。在做一个调光延时的时候我发现中断之间也是有影响的,最后还是用示波器一点一点的调整的。
回复

使用道具 举报

5#
ID:72585 发表于 2015-1-24 09:04 来自手机 | 只看该作者
T0中断,T1串口没开中断。换过来T0不能做波特率发生器吧?
回复

使用道具 举报

6#
ID:72585 发表于 2015-1-24 09:07 来自手机 | 只看该作者
我用stc89c52就没问题。中断的处理时间急短
回复

使用道具 举报

7#
ID:72585 发表于 2015-1-24 09:09 来自手机 | 只看该作者
现在的现象就是t0开中断,串口的每一位发送时间就会被拉很长,导致电脑不能接收。
回复

使用道具 举报

8#
ID:19701 发表于 2015-1-24 15:49 | 只看该作者
taotaoliu199 发表于 2015-1-24 09:09
现在的现象就是t0开中断,串口的每一位发送时间就会被拉很长,导致电脑不能接收。

我认为,既然刷显示都要在中断内进行,证明中断对刷新是有影响的;反过来,你延时对串口是否会有影响呢,可否把串口函数也放在中断内呢,这样每一个中断发生时,它会执行这个函数。
回复

使用道具 举报

9#
ID:72585 发表于 2015-1-26 13:46 来自手机 | 只看该作者
jxr0345 发表于 2015-1-24 15:49
我认为,既然刷显示都要在中断内进行,证明中断对刷新是有影响的;反过来,你延时对串口是否会有影响呢, ...

发串口放t0中断里也试过,中断执行时间一样被拉长达7ms,而中断如果只刷数码管只要几十微妙执行。
回复

使用道具 举报

10#
ID:19701 发表于 2015-1-26 20:19 | 只看该作者
taotaoliu199 发表于 2015-1-26 13:46
发串口放t0中断里也试过,中断执行时间一样被拉长达7ms,而中断如果只刷数码管只要几十微妙执行。

是否是因优先级引起的呢?串口一般级别低一些。这方面考虑一下,再试一下。
回复

使用道具 举报

11#
ID:140800 发表于 2016-10-1 20:09 | 只看该作者
您好,您解决了吗?我也遇到这个问题了。在定时器里发送串口导致不返回主程序
回复

使用道具 举报

12#
ID:255919 发表于 2019-3-18 14:05 | 只看该作者
这问题我也遇到了,用的是T2做串口1的波特率
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表