微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 初学菜鸟问题,理清定时器中断C程序

初学菜鸟问题,理清定时器中断C程序

时间:10-02 整理:3721RD 点击:
下面这段程序的功能是1s改变一次共阴数码管示数,
从TR0=1开始就开始加数了对吧,同时程序不断运行,运行到数加满就停下来,执行中断服务,中断服务结束再回到主函数.对吧?
问题:
1.假如主函数运行结束(没有while(1)的话)还没加满是不是就不执行中断服务了?
2.下面理清程序执行的顺序,希望你能帮我看看有没有细节的问题:
程序中当计时器加满溢出,不断加数,并开始执行中断服务,中断服务程序(如下)中又把TH0,TL0重新赋值,原来的计时结束,重新开始新的计时,然后tt自加1,完了就返回主函数判断if(tt==100) ,tt!=100则继续判断,直到计时器加满,则执行中断服务,tt自加,完了就返回主函数判断 if(tt==100) ,tt!=100则继续判断,直到计时器加满,则执行中断服务 ....直到tt==100,就改变一次数码管示数.然后tt清0,与此同时定时器还在加数,直到下一次tt==100,于是就达到一秒钟变一次数码管示数的效果了.这个过程有问题没有?
void time0() interrupt 1{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        tt++;
}

/****************程序********************/
#define uchar unsigned char
/****************************************/
//数码管接在P0口
sbit dula=P2^6;//数码管段选锁存器
sbit wela=P2^7;//数码管位选锁存器
uchar num,tt;
uchar code table[]={//数码管数字123456789abcdef对应编码
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
/****************************************/void main()
{
        num=0;
        tt=0;
        TMOD=0x01;//设置定时器0为工作方式1
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        EA=1;//开总中断
        ET0=1;//开定时器0中断
        TR0=1;//启动定时器0
        wela=1;
        P0=0xfe;//11111110
        wela=0;
        dula=1;
        P0=0x3f;//数码管显示0
        dula=0;
        while(1)
        {
                if(tt==100)//1s改变一次数码管示数
                   {
                                tt=0;
                                num++;
                                if(num==16)
                                num=0;
                                dula=1;
                                P0=table[num];
                                dula=0;       
                        }
        }
}
/***************************************/
void time0() interrupt 1
{
        TH0=(65536-10000)/256;
        TL0=(65536-10000)%256;
        tt++;
}

问题1.main()有死循环相当于在单片机ROM里有效程序结尾加了个jmp跳回指令,类似goto。如果没有死循环,IP往指执行ROM里那些nop,一样会当TF位有置位后进去中断服务函数。朋友你汇编指令学了就会好很多,理解。
2.目测单片机复位后闪显0后乱码。看你的代码应该硬件结构是共DATAPORT,两片573之类的锁存,应该有8个数码管。只能用动态扫描显示,你不扫位码怎么会正常显示。

1.哦~学习了
2.嗯~是有两个锁存器, 它只亮一个数码管啊,我说的那个过程,有问题木有
        wela=1;
        P0=0xfe;//11111110
        wela=0;
谢谢前辈,给你拜年了

上一篇:二维插补
下一篇:大家好!

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top