找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4429|回复: 9
打印 上一主题 下一主题
收起左侧

就这个程序而言,读程序的顺序,是怎么样的,谢谢

[复制链接]
跳转到指定楼层
楼主
ID:105333 发表于 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..............一直循环下去吗??????

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:109243 发表于 2016-3-16 21:41 | 只看该作者
嗯,那个while应该是引发1000次中断后,cnt到了1000后进入,中断条件是计时器满,时间到。
回复

使用道具 举报

板凳
ID:109243 发表于 2016-3-16 21:41 | 只看该作者
嗯,那个while应该是引发1000次中断后,cnt到了1000后进入,中断条件是计时器满,时间到。
回复

使用道具 举报

地板
ID:72781 发表于 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前还有一段引导函数,这个不用管是默认的)
回复

使用道具 举报

5#
ID:79544 发表于 2016-3-17 10:22 | 只看该作者
定时器到cnt == 1000,就执行大循环里的程序
回复

使用道具 举报

6#
ID:105333 发表于 2016-3-19 15:54 | 只看该作者
暗光 发表于 2016-3-17 02:08
中断和main不是顺序执行的,当外设产生中断时,CPU会终止在当前指令结束后转到中断服务函数执行中断服务函 ...

就上面的程序而言,main里有中断条件,最第一步是不是进入中断函数里先,还是读while先,就想弄明白这一点,
回复

使用道具 举报

7#
ID:72781 发表于 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,然后在判断。
回复

使用道具 举报

8#
ID:109762 发表于 2016-3-19 22:44 | 只看该作者
while引发1000次中断后,cnt到了1000后进入,中断条件是计时器满,时间到
回复

使用道具 举报

9#
ID:105333 发表于 2016-3-21 00:47 | 只看该作者
暗光 发表于 2016-3-19 21:28
main函数哪有中断条件??那个条件判断不是判断进入中断的,而是判断一个变量cnt是否是1000,中断是中断 ...

呵呵,明白了,谢谢,main里定义的是1ms中断,假如while里的程序是500us,CPU读了两次while,到了1ms的时候,就会跳到中断里,是这样理解的吧,呵呵,谢谢老师
回复

使用道具 举报

10#
ID:109917 发表于 2016-3-21 09:14 | 只看该作者
大神好多,我也学习了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表