打印

菜鸟,中断问题请教

[复制链接]
1630|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lzf6929|  楼主 | 2010-10-20 18:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 lzf6929 于 2010-10-20 19:18 编辑

用数码管显示的六位时分秒的计时器,中断程序函数的写法问题。为什么d,num不能自增?
#include <reg52.h>
#define uchar unsigned char
sbit duan=P3^5;
sbit wei=P3^6;
long int num=0;
uchar a;
void delay(uchar);
void display();
void main()
{   
  TMOD=0X10;
  TH1=(65535-50000)/256;
  TL1=(65535-50000)%256;
  IE=0X88;   
  TCON=0X40;  //启动计时器1
        while(1)
    {
  display();
    }
}
void desk() interrupt 3  //中断函数及计时控制
{
uchar d=0;
TH1=(65535-50000)/256;
TL1=(65535-50000)%256;
    d++;
if(d==20)  
{
d=0;
    num++;
if(num==86400)  num=0;
}
}
void display()  //显示数码管的具体计时时间
{
    uchar code table1[]={0x3f,0x06,0x5b,0x4f,0x6d,0x7d,0x07,0x7f,0x6f};
    uchar code table2[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
    uchar table3[6];
uchar c;
table3[0]=table1[num/36000];
table3[1]=table1[num/3600%10];
table3[2]=table1[num%3600/600];
table3[3]=table1[num%3600/60%10];
table3[4]=table1[num%3600%60/10];
table3[5]=table1[num%3600%60%10];
for(c=0;c<=5;c++)
{
  duan=1;
  P0=table3[c];
  duan=0;
  wei=1;
  P1=table2[c];
  wei=0;
  delay(20);   
}

}
void delay(uchar a)  //延时
{
uchar i,j;
for(j=a;j>0;j--)
   for(i=110;i>0;i--);
}

相关帖子

沙发
singleywy| | 2010-10-20 19:37 | 只看该作者
这是由于d,num是局部变量,再次进入函数时会被重新置0,所以不会自增,
解决办法:可以将他们设置为全局变量,或者用staic设为局部变量

使用特权

评论回复
板凳
lzf6929|  楼主 | 2010-10-20 20:40 | 只看该作者
正解,不过我定义了num为全局变量。
关键在于一句话没弄明白,“计时器溢满后,而后申请中断。”从而进入中断程序。而不是结束中断程序(原以为,打开计时器1时,就进入了中断程序),执行主程序,再经delay()刷新。如此,形成循环。

使用特权

评论回复
地板
奇兵| | 2010-10-20 21:17 | 只看该作者
呵呵 如果没进入中断程序,怎么执行中断程序的语句呀!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

16

帖子

0

粉丝