找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2290|回复: 10
收起左侧

为什么这个单片机程序中两个中断同时发生?

[复制链接]
ID:905299 发表于 2021-4-13 21:46 | 显示全部楼层 |阅读模式
#include <reg52.h>

void timer0(unsigned char ms);
void timer1(unsigned char ms);

sbit LED = P1^1;
sbit FM = P1^3;

unsigned char T0RH,T0RL ;
unsigned char T1RH,T1RL ;


void main ()

{
        /*中断*/
        EA = 1 ; //总中断

        timer1(100);
        timer0(100);

        while(1)
        {
        }
}



//T0  1.1
void timer0(unsigned char ms)
{
           unsigned long tmp ;
        
        ET0 = 1 ;

        
        TMOD &= 0xf0 ;
        TMOD |= 0x01 ;

        tmp = 11059200/12;
        tmp = (65536*ms)/1000;
        tmp = 65536-tmp ;
        T0RH = tmp/256 ;
        T0RL = tmp%256 ;

        TH0 = T0RH ;
        TL0 = T0RL ;

        TR0 = 1 ;


}



//T1 1.3
void timer1(unsigned char ms)
{
           unsigned long tmp ;


        ET1 = 1 ;


        TMOD &= 0x0f ;
        TMOD |= 0x10 ;


        tmp = 11059200/12;
        tmp = (65536*ms)/1000;
        tmp = 65536-tmp ;
        T1RH = tmp/256 ;
        T1RL = tmp%256 ;



        TH1 = T1RH ;
        TL1 = T1RL ;

        TR1 = 1 ;

}







/*T0 1.1 */
void InterruptTimer0() interrupt 1
{
        static unsigned char deng ;        
        


        TH0 = T0RH ;
        TL0 = T0RL ;

        deng++;


        if(deng>=200)
        {
                deng = 0 ;
                LED = !LED ;
        }

}





/*T1 1.3*/
void InterruptTimer1() interrupt 3

{
        static unsigned int feng ;        


        TH1 = T1RH ;
        TL1 = T1RL ;

        feng++;

        if(feng>=200)
        {
                feng = 0 ;
                FM = !FM ;
                }
}

为什么这个程序中两个中断同时发生  麻烦大神详解一下   顺便问一下怎么设置两个中断分别运行   谢谢


回复

使用道具 举报

ID:584814 发表于 2021-4-13 23:56 | 显示全部楼层
单片机有几个定时器,可以火力全开的
回复

使用道具 举报

ID:68800 发表于 2021-4-14 00:59 | 显示全部楼层
两个中断同时运行参数一样那你为什么不放到一个定时器里面?如果需要分别运行有两个方案,第一个启动定时器一到时间中断内关闭定时器一,运行程序然后打开定时器二,定时器二中断后关闭定时器二运行程序二打开定时器一。如此循环。还可以就一个定时器,第一次进入运行程序1,第二次进入运行程序二。如此循环也可以
回复

使用道具 举报

ID:905299 发表于 2021-4-14 07:12 | 显示全部楼层
liugao888 发表于 2021-4-14 00:59
两个中断同时运行参数一样那你为什么不放到一个定时器里面?如果需要分别运行有两个方案,第一个启动定时器 ...

我的本意是让定时器一运行完才运行定时器二,并且两个定时器定时时间不一样,但是上面的程序不知道为什么会同时运行  麻烦问一下定时器启动到一段时间后怎么关闭  是把中断标志位置零吗   试了一下也不行  
回复

使用道具 举报

ID:905299 发表于 2021-4-14 07:14 | 显示全部楼层
man1234567 发表于 2021-4-13 23:56
单片机有几个定时器,可以火力全开的

不知道怎么配置定时器  具体参数有什么涵义了解的也不深入  还在学习中  小白一枚
回复

使用道具 举报

ID:743654 发表于 2021-4-15 08:55 | 显示全部楼层
因为你总中断打开了,而且两个定时器的定时时间又一样,所以会同时触发定时器0 和定时器1,你要不同时就像二楼说的两种方法。至于如何配置,就是配置初值,楼主要好好看看定时器章节,有详细介绍,还可以用软件配置。
回复

使用道具 举报

ID:905299 发表于 2021-4-16 10:42 | 显示全部楼层
cheney03 发表于 2021-4-15 08:55
因为你总中断打开了,而且两个定时器的定时时间又一样,所以会同时触发定时器0 和定时器1,你要不同时就像 ...

好的好的   谢谢啦
回复

使用道具 举报

ID:207421 发表于 2021-4-16 11:17 | 显示全部楼层
两个定时器本来就是各干各的事情,什么叫同时。
你要控制定时器中断,可以用ETX=0; TRX=0;  相互关闭都可以。
回复

使用道具 举报

ID:883031 发表于 2021-4-16 15:47 | 显示全部楼层
中断是有优先级的,同时触发中断,但是处理的时候也是按顺序处理的。t0比t1的优先级高,先处理,处理完再处理t1
回复

使用道具 举报

ID:905299 发表于 2021-4-16 20:37 | 显示全部楼层
lwh999995 发表于 2021-4-16 11:17
两个定时器本来就是各干各的事情,什么叫同时。
你要控制定时器中断,可以用ETX=0; TRX=0;  相互关闭都可 ...

谢谢啦这样设置也可以吗  我设置了一次但是发现没什么反应  再去试一下
回复

使用道具 举报

ID:905299 发表于 2021-4-16 20:39 | 显示全部楼层
cn_zhx 发表于 2021-4-16 15:47
中断是有优先级的,同时触发中断,但是处理的时候也是按顺序处理的。t0比t1的优先级高,先处理,处理完再处 ...

我用ip设置了一次   怎么看不出来差别
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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