找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4689|回復(fù): 9
打印 上一主題 下一主題
收起左側(cè)

就這個程序而言,讀程序的順序,是怎么樣的,謝謝

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:105333 發(fā)表于 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里有中斷條件,去執(zhí)行下面那個interrupt()里的函數(shù),執(zhí)行完了interrupt()函數(shù),再去執(zhí)行while里面的函數(shù)。main----interrupt()--------while------interrupt------while------interrupt-----while..............一直循環(huán)下去嗎??????

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:109243 發(fā)表于 2016-3-16 21:41 | 只看該作者
嗯,那個while應(yīng)該是引發(fā)1000次中斷后,cnt到了1000后進(jìn)入,中斷條件是計時器滿,時間到。
回復(fù)

使用道具 舉報

板凳
ID:109243 發(fā)表于 2016-3-16 21:41 | 只看該作者
嗯,那個while應(yīng)該是引發(fā)1000次中斷后,cnt到了1000后進(jìn)入,中斷條件是計時器滿,時間到。
回復(fù)

使用道具 舉報

地板
ID:72781 發(fā)表于 2016-3-17 02:08 | 只看該作者
中斷和main不是順序執(zhí)行的,當(dāng)外設(shè)產(chǎn)生中斷時,CPU會終止在當(dāng)前指令結(jié)束后轉(zhuǎn)到中斷服務(wù)函數(shù)執(zhí)行中斷服務(wù)函數(shù),比如你正在打字(相當(dāng)于main),你媽媽突然喊你過去,你會把當(dāng)前文檔保存一下,然后去你媽媽那做任務(wù),回來后繼續(xù)剛才保存的繼續(xù)打字。而while(1),是個死循環(huán),cpu會循環(huán)執(zhí)行里面的函數(shù),在while中有個if語句,就是條件滿足了才進(jìn)入執(zhí)行。所以整體情況兩條主線,一條就是main——while(1)——if語句滿足執(zhí)行if后的,不滿足繼續(xù)循環(huán)while。另一條就是中斷,定時器是獨立工作的,定時時間到,產(chǎn)生中斷,cpu終止執(zhí)行的函數(shù),調(diào)到中斷函數(shù),執(zhí)行完中斷函數(shù),繼續(xù)回到原來的地方。另外凡是咋main外面定義的變量或者其他東西,都是編譯器即你的PC電腦先“制作”好的,在單片機中就是從main開始執(zhí)行函數(shù)(ps,其實實際單片機在執(zhí)行main前還有一段引導(dǎo)函數(shù),這個不用管是默認(rèn)的)
回復(fù)

使用道具 舉報

5#
ID:79544 發(fā)表于 2016-3-17 10:22 | 只看該作者
定時器到cnt == 1000,就執(zhí)行大循環(huán)里的程序
回復(fù)

使用道具 舉報

6#
ID:105333 發(fā)表于 2016-3-19 15:54 | 只看該作者
暗光 發(fā)表于 2016-3-17 02:08
中斷和main不是順序執(zhí)行的,當(dāng)外設(shè)產(chǎn)生中斷時,CPU會終止在當(dāng)前指令結(jié)束后轉(zhuǎn)到中斷服務(wù)函數(shù)執(zhí)行中斷服務(wù)函 ...

就上面的程序而言,main里有中斷條件,最第一步是不是進(jìn)入中斷函數(shù)里先,還是讀while先,就想弄明白這一點,
回復(fù)

使用道具 舉報

7#
ID:72781 發(fā)表于 2016-3-19 21:28 | 只看該作者
yjydtwtz 發(fā)表于 2016-3-19 15:54
就上面的程序而言,main里有中斷條件,最第一步是不是進(jìn)入中斷函數(shù)里先,還是讀while先,就想弄明白這一 ...

main函數(shù)哪有中斷條件??那個條件判斷不是判斷進(jìn)入中斷的,而是判斷一個變量cnt是否是1000,中斷是中斷,中斷是改變這個值cnt,main里的while是使用這個值,它倆沒有先后關(guān)系,中斷的事件發(fā)生(比如你這個中定時時間到,還有比如外部中斷的引腳有變化,或者其他的事件發(fā)生)才會進(jìn)中斷函數(shù),而while是程序順序執(zhí)行到那就會讀while。所以沒有先后關(guān)系。希望你明白這一點,好吧,回到你糾結(jié)的問題:首先在進(jìn)入while前有三個語句TR0=1;ET0=1;EA=1;前兩個是啟動定時器,和開啟外部中斷,第三個是開總中斷,首先第一個語句執(zhí)行后,定時器開始工作,第三個語句執(zhí)行后,CPU才有資本響應(yīng)中斷。這三個語句的時間不到3us,定時器時間到是你的定的時間肯定大于這個時間,所以肯定先執(zhí)行while。如果你的while每次循環(huán)的時間也很短,那么就會一直執(zhí)行while,直到時間到,執(zhí)行定時器中斷。定時器中斷后會接著循環(huán)while,。。好吧說了這么多,我都糊涂了,反正就是,定時器時間不到就不會執(zhí)行中斷函數(shù),會一直執(zhí)行while里面的,就算里面的if條件不滿足,那就回跳過去返回while,然后在判斷。
回復(fù)

使用道具 舉報

8#
ID:109762 發(fā)表于 2016-3-19 22:44 | 只看該作者
while引發(fā)1000次中斷后,cnt到了1000后進(jìn)入,中斷條件是計時器滿,時間到
回復(fù)

使用道具 舉報

9#
ID:105333 發(fā)表于 2016-3-21 00:47 | 只看該作者
暗光 發(fā)表于 2016-3-19 21:28
main函數(shù)哪有中斷條件??那個條件判斷不是判斷進(jìn)入中斷的,而是判斷一個變量cnt是否是1000,中斷是中斷 ...

呵呵,明白了,謝謝,main里定義的是1ms中斷,假如while里的程序是500us,CPU讀了兩次while,到了1ms的時候,就會跳到中斷里,是這樣理解的吧,呵呵,謝謝老師
回復(fù)

使用道具 舉報

10#
ID:109917 發(fā)表于 2016-3-21 09:14 | 只看該作者
大神好多,我也學(xué)習(xí)了
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表