标题: 就这个程序而言,读程序的顺序,是怎么样的,谢谢 [打印本页]

作者: yjydtwtz    时间: 2016-3-16 19:42
标题: 就这个程序而言,读程序的顺序,是怎么样的,谢谢
#include <reg52.h>

unsigned char ledchar[] ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
                              0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

unsigned char ledbuff[6] = {0xff,0xff,0xff,0xff,0xff,0xff};

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;

unsigned int cnt = 0;
unsigned long sec = 0;
unsigned char i=0;

void main()
{
        ENLED = 0;
        ADDR3 = 1;
        TMOD = 0x01;
        TH0 = 0xfc;
        TL0 = 0x00;
        TR0 = 1;
        ET0 = 1;
        EA = 1;
        while(1)
        {         
                if(cnt == 1000)
                {
                        cnt = 0;
                        sec++;
                        ledbuff[0]= ledchar[sec%10];
                        ledbuff[1]= ledchar[sec/10%10];
                        ledbuff[2]= ledchar[sec/100%10];
                        ledbuff[3]= ledchar[sec/1000%10];
                        ledbuff[4]= ledchar[sec/10000%10];
                        ledbuff[5]= ledchar[sec/100000%10];
                }
        }       
}
void interrupttime0() interrupt 1
{
        TH0 = 0xfc;
        TL0 = 0x00;
        cnt++;
        P0 = 0xff;
        switch(i)
        {
                case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=ledbuff[0];break;
                case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=ledbuff[1];break;
                case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=ledbuff[2];break;
                case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=ledbuff[3];break;
                case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=ledbuff[4];break;
                case 5: ADDR2=1; ADDR1=0; ADDR0=1; i=0; P0=ledbuff[5];break;
                default :break;
        }
}



就这个程序而言 是不是CPU从main开始,main里有中断条件,去执行下面那个interrupt()里的函数,执行完了interrupt()函数,再去执行while里面的函数。main----interrupt()--------while------interrupt------while------interrupt-----while..............一直循环下去吗??????


作者: 36756435    时间: 2016-3-16 21:41
嗯,那个while应该是引发1000次中断后,cnt到了1000后进入,中断条件是计时器满,时间到。
作者: 36756435    时间: 2016-3-16 21:41
嗯,那个while应该是引发1000次中断后,cnt到了1000后进入,中断条件是计时器满,时间到。
作者: 暗光    时间: 2016-3-17 02:08
中断和main不是顺序执行的,当外设产生中断时,CPU会终止在当前指令结束后转到中断服务函数执行中断服务函数,比如你正在打字(相当于main),你妈妈突然喊你过去,你会把当前文档保存一下,然后去你妈妈那做任务,回来后继续刚才保存的继续打字。而while(1),是个死循环,cpu会循环执行里面的函数,在while中有个if语句,就是条件满足了才进入执行。所以整体情况两条主线,一条就是main——while(1)——if语句满足执行if后的,不满足继续循环while。另一条就是中断,定时器是独立工作的,定时时间到,产生中断,cpu终止执行的函数,调到中断函数,执行完中断函数,继续回到原来的地方。另外凡是咋main外面定义的变量或者其他东西,都是编译器即你的PC电脑先“制作”好的,在单片机中就是从main开始执行函数(ps,其实实际单片机在执行main前还有一段引导函数,这个不用管是默认的)
作者: 腾飞的龙    时间: 2016-3-17 10:22
定时器到cnt == 1000,就执行大循环里的程序
作者: yjydtwtz    时间: 2016-3-19 15:54
暗光 发表于 2016-3-17 02:08
中断和main不是顺序执行的,当外设产生中断时,CPU会终止在当前指令结束后转到中断服务函数执行中断服务函 ...

就上面的程序而言,main里有中断条件,最第一步是不是进入中断函数里先,还是读while先,就想弄明白这一点,
作者: 暗光    时间: 2016-3-19 21:28
yjydtwtz 发表于 2016-3-19 15:54
就上面的程序而言,main里有中断条件,最第一步是不是进入中断函数里先,还是读while先,就想弄明白这一 ...

main函数哪有中断条件??那个条件判断不是判断进入中断的,而是判断一个变量cnt是否是1000,中断是中断,中断是改变这个值cnt,main里的while是使用这个值,它俩没有先后关系,中断的事件发生(比如你这个中定时时间到,还有比如外部中断的引脚有变化,或者其他的事件发生)才会进中断函数,而while是程序顺序执行到那就会读while。所以没有先后关系。希望你明白这一点,好吧,回到你纠结的问题:首先在进入while前有三个语句TR0=1;ET0=1;EA=1;前两个是启动定时器,和开启外部中断,第三个是开总中断,首先第一个语句执行后,定时器开始工作,第三个语句执行后,CPU才有资本响应中断。这三个语句的时间不到3us,定时器时间到是你的定的时间肯定大于这个时间,所以肯定先执行while。如果你的while每次循环的时间也很短,那么就会一直执行while,直到时间到,执行定时器中断。定时器中断后会接着循环while,。。好吧说了这么多,我都糊涂了,反正就是,定时器时间不到就不会执行中断函数,会一直执行while里面的,就算里面的if条件不满足,那就回跳过去返回while,然后在判断。
作者: JJAD    时间: 2016-3-19 22:44
while引发1000次中断后,cnt到了1000后进入,中断条件是计时器满,时间到
作者: yjydtwtz    时间: 2016-3-21 00:47
暗光 发表于 2016-3-19 21:28
main函数哪有中断条件??那个条件判断不是判断进入中断的,而是判断一个变量cnt是否是1000,中断是中断 ...

呵呵,明白了,谢谢,main里定义的是1ms中断,假如while里的程序是500us,CPU读了两次while,到了1ms的时候,就会跳到中断里,是这样理解的吧,呵呵,谢谢老师
作者: arun210    时间: 2016-3-21 09:14
大神好多,我也学习了




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