51单片机初学问题求解,谢谢!

2019-07-16 04:58发布

大家好,我是51单片机的一名初学者,在学中断时候遇到了一些问题,希望大家能够解答。
代码如下:
//大家请看我下边的程序,想法是流水灯,delay 函数延时,然后加入定时器中断, aa控制定时器进入次数,现在定时器进入一次计时50ms。可是我的delay(1500)值为1.5s,为什么最后结果显示还是进入了if函数?(结果:数码管变化)  
我的想法是delay运行的时候不断定时,最终aa==40的时候在delay里面,也就是说运行完delay后aa必然大于40,但是最终为什么又进入了if呢?  
谢谢大家!!!



#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar t,n,aa;
sbit dula=P2^6;
sbit wela=P2^7;    //数码管声明
uchar code table []=
{0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};    //数码管段选
void delay (uint);
void main ()
{ n=0;

  TMOD=1;
  TH0=19964/256;
  TL0=19964%256;   //定时器50ms中断赋值
  EA=1;
  ET0=1;
  TR0=1;   //中断设置
  t=0xfe;
  P1=t;
  dula=1;
  P0=table [0];
  dula=0;
  wela=1;
  P0=0xfe;
  wela=0;   
   while (1)
   {   
delay (1500);   //重点!!!!!!
if (aa==40)  
{ aa=0;
  n++;
  if (n==16)
   n=0;
  dula=1;
  P0=table [n];
  dula=0;   }
t=_crol_ (t,1);
P1=t;


}


}



void delay (uint x)
{   
  uint y;
  for (;x>0;x--)
    for (y=114;y>0;y--);


}



void timer() interrupt 1
{
  TH0=19964/256;
  TL0=19964%256;
  aa++;


}谢谢!





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
那一方,彼岸花
1楼-- · 2019-07-16 05:49
 精彩回答 2  元偷偷看……
oyl
2楼-- · 2019-07-16 07:30
某一次delay完后的某个时点  aa恰好=40  单片机速度很快,这种可能是可以发生的
Takeashot
3楼-- · 2019-07-16 08:11
那一方,彼岸花 发表于 2012-8-3 12:56
你delay的时间1500ms,中断一次的时间是50,在delay的这段时间里怎么会让它产生40+次中断呢? ...

我想的是下一次delay中aa达到了40,那么出了delay之后就不可能有aa==40 (>)
相思和星辰
4楼-- · 2019-07-16 10:51
这个程序确实有问题,但程序执行速度相当快,可以进去,但每次显示的值是你预算不到的
lstcspring
5楼-- · 2019-07-16 15:53
你的晶振是多少,延时你确定有1.5S吗?
Takeashot
6楼-- · 2019-07-16 17:02
 精彩回答 2  元偷偷看……

一周热门 更多>