填坑—c语言写单片机中断程序无法返回到中断点—解决办法

在写定时器中断时,想每隔20ms就中断一次,结果怎么都返回不了

原程序

#include<reg51.h>
unsigned char i;
//定时器0初始化
void IT0_INIT()
{
   TMOD=0x01;
   TH0=(65536-2000)/256;
   TL0=(65536-2000)%256;
   EA =1;//先开总中断
   ET0=1;//后开定时器中断
   TR0=1;
}
//中断不会返回
void main(){
    IT0_INIT();
    while(1)
      P0=0x0ff;//数码管全亮
}
void IT0PROC() interrupt 1
{
   i++;
   if(i=10)//20ms到
     P0=0x00;
   else
   {
   TH0=(65536-2000)/256;
   TL0=(65536-2000)%256;
   }
}

修改后程序

 

#include<reg51.h>
unsigned char i;
//定时器0初始化
void IT0_INIT()
{
   TMOD=0x01;
   TH0=(65536-2000)/256;
   TL0=(65536-2000)%256;
   ET0=1;//先开定时器中断
   EA =1;//后开总中断
   TR0=1;
}
//中断会返回
void main(){
    IT0_INIT();
    while(1)
      P0=0x0ff;//数码管全亮
}
void IT0PROC() interrupt 1
{
   i++;
   if(i=10)//20ms到
     P0=0x00;
   else
   {
   TH0=(65536-2000)/256;
   TL0=(65536-2000)%256;
   }
}

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: #include <reg52.h>//定义中断向量 #define INT0_VECTOR 0x03 #define INT1_VECTOR 0x0b//定义外部中断0和1,分别是P3.2和P3.3 #define INT0 P3_2 #define INT1 P3_3//定义中断服务程序入口地址 void INT0_Service(void) interrupt INT0_VECTOR; void INT1_Service(void) interrupt INT1_VECTOR;//中断服务程序实现 void INT0_Service(void) interrupt INT0_VECTOR { //中断服务程序代码 }void INT1_Service(void) interrupt INT1_VECTOR { //中断服务程序代码 }//初始化外部中断 void Init_INT(void) { //配置INT0和INT1的IO口 //... //配置INT0和INT1的中断类型 //... //使能INT0和INT1 //... }void main() { //初始化中断 Init_INT(); while(1) { //程序代码 } }这是一个关于51单片机中断程序的问题,我不是很了解,但可以提供一些建议:首先,应该定义中断向量;然后,定义外部中断0和1,分别是P3.2和P3.3;接着,定义中断服务程序入口地址;最后,初始化外部中断,使能INT0和INT1。 ### 回答2: 下面是使用C语言的基于51单片机的简单中断程序的示例代码: ```c #include<reg51.h> /* 定义中断服务函数 */ void interrupt_isr() interrupt 0 { /* 在此处编中断服务函数的代码 */ /* 中断发生时执行此处代码 */ } /* 主函数 */ void main() { EA = 1; // 开启总中断允许位 EX0 = 1; // 开启外部中断0允许位 while(1) { // 主循环的其他任务 } } ``` 在上面的程序,我们首先定义了一个名为`interrupt_isr`的中断服务函数。在函数主体,你可以编中断处理程序的实际代码,用于处理特定的中断事件。在示例中断服务函数被定义为外部中断0的中断源,即在外部中断0触发时执行。 然后,在主函数,我们首先启用总中断允许位`EA`,这允许中断服务函数被执行。然后,我们还启用外部中断0允许位`EX0`,这使得当外部中断0触发时,中断服务函数被调用。 最后,我们进入一个无限循环`while(1)`,在这个循环执行主程序的其他任务。这个无限循环是为了确保程序不会在中断发生后退出。 ### 回答3: 下面是一段基于51单片机中断程序C语言代码: ```c #include <reg52.h> // 定义中断向量地址 #define TIMER0_VECTOR 1 // 定义全局变量,用于计数 volatile unsigned int count = 0; // 定义中断处理函数 void timer0_isr() interrupt TIMER0_VECTOR { count++; // 每次中断计数器加1 } // 主函数 void main() { // 初始化定时器0,配置为定时模式,设置中断时间间隔 TMOD = 0x01; TH0 = 0xFC; TL0 = 0x67; // 设置中断允许并开启定时器0中断 ET0 = 1; TR0 = 1; EA = 1; while (1) { // 等待中断发生,计数达到一定值后执行相应操作 if (count >= 1000) { // 执行中断处理操作 // ... // 清零计数器 count = 0; } // 继续执行其他主程序操作 // ... } } ``` 以上代码实现了一个基于51单片机中断程序。在主函数,首先配置定时器0为定时模式,并设置中断时间间隔。然后开启中断允许,允许定时器0中断,并开启定时器0。然后进入一个无限循环,等待中断发生。当计数器`count`的值达到一定值(这里设置为1000)时,执行相应的中断处理操作,并将计数器清零。然后继续执行其他主程序操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值