久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4655|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产一区在线 | 久久黄色精品视频 | 综合色婷婷 | 亚洲三区在线观看 | 99re66在线观看精品热 | 精品欧美一区二区精品久久久 | 国产成人综合av | 欧美一区二区二区 | 亚洲一区二区三区久久久 | 国产大学生情侣呻吟视频 | 日本三级在线 | 在线伊人网 | 99pao成人国产永久免费视频 | 国产精品久久久久久久免费大片 | 欧美久久久久久久久中文字幕 | 一区二区三区在线免费观看 | 午夜小电影| 久久精品久久久久久 | 国产精品一区二区在线播放 | 影视先锋av资源噜噜 | 情侣酒店偷拍一区二区在线播放 | 久久国产精品99久久久大便 | 国产综合在线视频 | 91精品久久久久久久久久入口 | 久草在线 | 黄色大片毛片 | 色资源站 | 风间由美一区二区三区在线观看 | 一区二区视频在线 | 中文字幕日韩一区 | 国产精品揄拍一区二区 | 亚洲精品区 | 亚洲欧美视频 | 亚洲综合在线视频 | 成人在线a | 香蕉国产在线视频 | av无遮挡 | 国产成人精品免费 | 久久精品日产第一区二区三区 | 紧缚调教一区二区三区视频 | 午夜视频一区二区三区 |