找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 791|回复: 2
收起左侧

为什么单片机T0的中断无法执行,只可执行T1的中断

[复制链接]
ID:1083701 发表于 2023-6-13 03:19 | 显示全部楼层 |阅读模式
#include "reg52.h"                        
#include<intrins.h>               

typedef unsigned int uint;         
typedef unsigned char uchar;

sbit moto=P1^0;                  
sbit k2=P3^0;         
sbit k3=P3^2;         
//sbit k00=P2^2;        

unsigned char timer1;
unsigned char timer0;
uint n=1;
uint m=2;
uint sunumber;
uint worksign;

void TimeConfig();
void delay1ms(uint t);
void sudu();
void moshi();
void ziran();

void main(void)
{
        TimeConfig();
        while(1)
        {
                moshi();
        }
}

void delay1ms(uint t){
        char i;
        while(t--)
                {
                 for(i=0;i<50;i++);
        }
}


void TimeConfig()
{
        TMOD|= 0x11;   

  
        TH1 = 0xFE;
        TL1 = 0x0C;
        ET1 = 1;
        EA = 1;
        TR1 = 1;   
     
  TH0=0xD8;//(65536-10000)/256;
        TL0=0xF0;//(65536-10000)%256;//10ms
        ET0=1;      
        TR0=1;
}



void Time1(void) interrupt 3   
{        
        TR0=0;
        TH1 = 0xFE;  
        TL1 = 0x0C;
        TR0=1;
        timer1++;   
}

void Time0(void) interrupt 1   
{
        TR1=0;
        TH0=0xD8;
        TL0=0xF0;
        TR1=1;
        timer0++;
        if(timer0>1200)  
        {
                timer0=0;
        }        
}

void sudu()
{
         if(k2==0)
         {
                 delay1ms(10);
                 if(k2==0)
                {
                        n+=1;
                        if(n>3)
                        {n=1;
                        }
                  while(!k2);
           }
         }
                switch(n)
                 {
                        case 1:sunumber=15;break;
                        case 2:sunumber=50;break;
                        case 3:sunumber=90;break;
                 }
                if(timer1>100)  
                {
                        timer1=0;
                }
                if(timer1<sunumber)      
                {
                        moto=1;
                }
                else
                {
                        moto=0;
                }

}

void moshi()
{
        if(k3==0)
        {
         delay1ms(10);
         if(k3==0)
                {
                  m+=1;
                        if(m>2)
                        {m=1;
                        }
                  while(!k3);
                }
        }
                switch(m)
                {
                        case 1:sudu();break;
                        case 2:ziran();break;
//                        case 3:sunumber=90;break;
                }
}

void ziran()
{               
          ET0=1;         
                TR0=1;
                if(timer0<400)        
                {
                        sudu();
                }
                else
                {
                        
                        moto=0;
                }
               
        }


回复

使用道具 举报

ID:116103 发表于 2023-6-13 05:35 | 显示全部楼层
两个定时器都用方式1,16位,自然优先级是T0高于T1, 但在中断程序中,有错误,T0中断 INTERRUPT1
  子程序里,停止了T0空断.
   void Time1(void) interrupt 3   
{        
        TR0=0;   //应是TR1=0
        TH1 = 0xFE;  
        TL1 = 0x0C;
        TR0=1;
        timer1++;   
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:94031 发表于 2023-6-13 09:33 | 显示全部楼层
你定义:unsigned char timer0;
判断要求,if(timer0>1200),后边程序不能执行。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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