标题: 单片机死活不进中断 求分析原因 [打印本页]

作者: 19980813    时间: 2020-1-21 10:37
标题: 单片机死活不进中断 求分析原因
/*****************************************
*函数名:delay_us(u16 i)
**作用*:较高精度的延时,延时范围1~65536us
**传入参数:i,无符号十六位
**传出参数:无
*****************************************/
void delay_us(u16 i)//定时范围1~65536us
{

  AUXR &= 0x7F;  //定时器时钟12T模式
TMOD &= 0xF0;  //设置定时器模式
TMOD |= 0x01;  //设置定时器模式
TL0 = (65536-i)&0x00ff;  //设置定时初值
TH0 = (65536-i)>>8;  //设置定时初值
TF0 = 0;  //清除TF0标志
a=1;
  EA = 1;
  ET0 = 1;                        //使能定时器0中断
TR0 = 1;                        //定时器0开始计时
while(a);
}
/*****************************************
函数名: Timer0Callback()  interrupt 1
作用 :定时器T0的回调函数
传入:无
传出:无
*****************************************/
void Timer0Callback ()   interrupt 1 using 1
{
led=~led;
a=0;
}


作者: 19980813    时间: 2020-1-21 10:39
单片机型号为IAP15F2K61S2
作者: znz43a    时间: 2020-1-21 11:55
主程序main在哪里?
作者: wulin    时间: 2020-1-21 15:38
19980813 发表于 2020-1-21 10:39
单片机型号为IAP15F2K61S2

IAP15F2K61S2端口模式需要初始化,程序中连main入口都没有这么运行?给你补充完整。
  1. #include <STC15F2K60S2.H>

  2. sbit led=P1^0;

  3. unsigned int a,b;

  4. void Timer0Init()                //10毫秒@11.0592MHz
  5. {
  6.         AUXR &= 0x7F;                //定时器时钟12T模式
  7.         TMOD &= 0xF0;                //设置定时器模式
  8.         TL0 = 0x00;                        //设置定时初值
  9.         TH0 = 0xDC;                        //设置定时初值
  10.         TF0 = 0;                                //清除TF0标志
  11.         TR0 = 1;                                //定时器0开始计时
  12.         EA = 1;
  13.         ET0 = 1;  
  14. }

  15. void main()
  16. {
  17.         P0M0 = 0x00;
  18.         P0M1 = 0x00;
  19.         P1M0 = 0x00;
  20.         P1M1 = 0x00;
  21.         P2M0 = 0x00;
  22.         P2M1 = 0x00;
  23.         P3M0 = 0x00;
  24.         P3M1 = 0x00;
  25.         P4M0 = 0x00;
  26.         P4M1 = 0x00;
  27.         P5M0 = 0x00;
  28.         P5M1 = 0x00;
  29.         P6M0 = 0x00;
  30.         P6M1 = 0x00;
  31.         P7M0 = 0x00;
  32.         P7M1 = 0x00;
  33.         Timer0Init();
  34.         b=50;//延时时间=b*10ms
  35.         while(1);
  36. }

  37. void Timer0Callback() interrupt 1 using 1
  38. {
  39.         a++;
  40.         if(a>=b)
  41.         {
  42.                 a=0;
  43.                 led=~led;//闪烁频率1Hz
  44.         }
  45. }
复制代码


作者: lele5211314    时间: 2020-1-21 16:59
你在哪里调用的delay_us函数
作者: lele5211314    时间: 2020-1-21 17:00
你这个中断函数写的有问题,你这个只能进一次中断,没有在终端里面对定时器赋初值,具体可以咨询我1014461948@1qq.com
作者: mffhxa    时间: 2020-1-21 17:42
延时函数里a=1;while(a);执行到这里就死在这了。
作者: 新人菜鸟    时间: 2020-1-21 20:24
建议可以直接在STC那个烧写软件中,直接复制中断或者定时器程序,我有有时候就是寄存器稍微配置弄错了,或者明明想开中断0,但是敲的是中断1的,或者对照着数据手册,好好看一看,应该是那个寄存器弄错了,我有时候调了一天,就是有的位应该写1但是给的0
作者: 19980813    时间: 2020-1-21 20:59
有主程序   主程序调用初始化函数
作者: 19980813    时间: 2020-1-21 21:00
znz43a 发表于 2020-1-21 11:55
主程序main在哪里?

主程序在另一个页面里   主程序调用初始化函数
作者: 19980813    时间: 2020-1-21 21:04
有没有可能是while里的标志识别不了
作者: 19980813    时间: 2020-1-21 23:08
调试发现在while 里出不来但是为什么呢
难道while的优先级还没中断高?
但是不应该呀

作者: 19980813    时间: 2020-1-21 23:56
mffhxa 发表于 2020-1-21 17:42
延时函数里a=1;while(a);执行到这里就死在这了。

调试发现就是死在这里了,但是为什么
作者: LanSeXinQing    时间: 2020-1-22 14:27
你开总中断了么?
作者: lwh999995    时间: 2020-1-22 15:53
1. 16位要在中断里面重赋值
2. 你这函数弄不了
3. IO模式也没设置
4. 重写吧
作者: csmyldl    时间: 2020-1-22 18:20
请别人看程序,有些需要完整的程序,如中断初始化设置,中断程序的写法,上面程序好象在delay_us中设置了定时计数器,主程序是否调用它,是否有另外的初始化程序,不得而知
作者: 19980813    时间: 2020-1-23 14:12
找到原因了,分页里有个相同的回调函数被调用了,编译器没提示




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1