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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

死循環(huán)的原因

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:163490 發(fā)表于 2017-2-5 18:49 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
使用STC89C54RD+P1口接8個LED燈,低到高位的流水燈,每次只亮一個燈。
程序如下:
  1. #include<reg52.h>

  2. void Delay(unsigned int t);

  3. void main(void)
  4. {       
  5.         unsigned char i;
  6.         P1=0xFE;
  7.        
  8.         for(i=0;i<8;i++)
  9.         {
  10.                 P1<<=1;
  11.                 Delay(50000);
  12.         }
  13. }

  14. void Delay(unsigned int t)
  15. {
  16.         while(--t);
  17. }
復(fù)制代碼
實際運行結(jié)果是 無限循環(huán),P1.0 P1.1常亮,P1.2口依次被點亮



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

使用道具 舉報

沙發(fā)
ID:7485 發(fā)表于 2017-2-5 20:51 | 只看該作者
#include<reg52.h>

void Delay(unsigned int t);

void main(void)
{      
        unsigned char i;
//        P1=0xFE;
  while(1){
          P1=0x01;      
        for(i=0;i<7;i++)
        {
                P1<<=1;
                Delay(50000);
        }
}
}
void Delay(unsigned int t)
{
        while(--t);
}
回復(fù)

使用道具 舉報

板凳
ID:163490 發(fā)表于 2017-2-5 21:01 | 只看該作者
電路設(shè)計的是低電平 燈才亮的

評分

參與人數(shù) 1黑幣 +5 收起 理由
25786136 + 5 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:100391 發(fā)表于 2017-2-5 22:11 | 只看該作者
你確定你這個程序會無限循環(huán)嗎?按我的理解,應(yīng)該是P1.0到P1.7依次亮,最后的現(xiàn)象就是所有燈都亮了。而且,感覺你這個程序好像有點不規(guī)范,因為單片機做完你說寫的程序就沒事做了。我是一名單片機初學(xué)者,請多多指教。

評分

參與人數(shù) 1黑幣 +5 收起 理由
25786136 + 5 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

5#
ID:163490 發(fā)表于 2017-2-6 00:47 | 只看該作者
感謝大家的回復(fù),找到燈顯示異常的原因了。因為開發(fā)板設(shè)計的低電平亮燈。
  1. P1<<=1
復(fù)制代碼
會造成左移后的地位自動補零,導(dǎo)致顯示異常。
修改后的代碼如下:
  1. #include<reg52.h>

  2. void Delay(unsigned int t);

  3. void main(void)
  4. {       
  5.         unsigned char i;

  6.         B=0xFE;                 
  7.         for(i=8;i>0;i--)
  8.         {                                                                
  9.                 P1=B;
  10.                 B<<=1;
  11.                 B=B|0x1;
  12.                 Delay(50000);
  13.         }
  14. }


  15. void Delay(unsigned int t)
  16. {
  17.         while(--t);
  18. }
復(fù)制代碼

但是把HEX文件燒錄到STC89C54RD+后,仍然是死循環(huán)
DEBUG的時候未發(fā)現(xiàn)i的值有變化
C生成的匯編如下:
  1.                  C_STARTUP:
  2. C:0x0000    020026   LJMP     STARTUP1(C:0026)
  3.                  main:
  4. C:0x0003    75F0FE   MOV      B(0xF0),#0xFE
  5. C:0x0006    750808   MOV      0x08,#0x08
  6. C:0x0009    85F090   MOV      P1(0x90),B(0xF0)
  7. C:0x000C    E5F0     MOV      A,B(0xF0)
  8. C:0x000E    25E0     ADD      A,ACC(0xE0)
  9. C:0x0010    F5F0     MOV      B(0xF0),A
  10. C:0x0012    43F001   ORL      B(0xF0),#0x01
  11. C:0x0015    7F50     MOV      R7,#0x50
  12. C:0x0017    7EC3     MOV      R6,#0xC3
  13. C:0x0019    120032   LCALL    Delay(C:0032)
  14. C:0x001C    1508     DEC      0x08
  15. C:0x001E    E508     MOV      A,0x08
  16. C:0x0020    D3       SETB     C
  17. C:0x0021    9400     SUBB     A,#0x00
  18. C:0x0023    50E4     JNC      C:0009
  19. C:0x0025    22       RET      
  20.                  STARTUP1:
  21. C:0x0026    787F     MOV      R0,#0x7F
  22. C:0x0028    E4       CLR      A
  23.                  IDATALOOP:
  24. C:0x0029    F6       MOV      @R0,A
  25. C:0x002A    D8FD     DJNZ     R0,IDATALOOP(C:0029)
  26. C:0x002C    758108   MOV      SP(0x81),#0x08
  27. C:0x002F    020003   LJMP     main(C:0003)
  28.                  Delay:
  29. C:0x0032    EF       MOV      A,R7
  30. C:0x0033    1F       DEC      R7
  31. C:0x0034    7001     JNZ      C:0037
  32. C:0x0036    1E       DEC      R6
  33. C:0x0037    14       DEC      A
  34. C:0x0038    4E       ORL      A,R6
  35. C:0x0039    70F7     JNZ      Delay(C:0032)
  36. C:0x003B    22       RET      
復(fù)制代碼

回復(fù)

使用道具 舉報

6#
ID:163582 發(fā)表于 2017-2-6 01:45 | 只看該作者
你這個本身就不是只亮一個,左移的時候最低位會是0,第一個和第二個沒延時所以常亮

評分

參與人數(shù) 1黑幣 +5 收起 理由
25786136 + 5 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

7#
ID:163589 發(fā)表于 2017-2-6 08:40 | 只看該作者
mark                                                
回復(fù)

使用道具 舉報

8#
ID:163490 發(fā)表于 2017-2-6 23:20 | 只看該作者
本帖最后由 nicktf 于 2017-2-6 23:23 編輯

最后自己找到原因了。
換成XP用Keil uv2,去掉延時代碼,如下
  1. #include <STC89C5xRC.H>

  2. void main(void)
  3. {      
  4.         unsigned char i;

  5.         B=0xFE;                 
  6.         for(i=8;i>0;i--)
  7.         {                                                               
  8.                 P1=B;
  9.                 B<<=1;
  10.                 B=B|0x1;
  11.         }
  12. }
復(fù)制代碼


Debug后 匯編代碼如下:
  1. C:0x0003    75F0FE   MOV      B(0xF0),#0xFE
  2. C:0x0006    7F08     MOV      R7,#0x08
  3. C:0x0008    85F090   MOV      P1(0x90),B(0xF0)
  4. C:0x000B    E5F0     MOV      A,B(0xF0)
  5. C:0x000D    25E0     ADD      A,ACC(0xE0)
  6. C:0x000F    F5F0     MOV      B(0xF0),A
  7. C:0x0011    43F001   ORL      B(0xF0),#0x01
  8. C:0x0014    DFF2     DJNZ     R7,C:0008
  9. C:0x0016    22       RET      
  10. C:0x0017    787F     MOV      R0,#0x7F
  11. C:0x0019    E4       CLR      A
  12. C:0x001A    F6       MOV      @R0,A
  13. C:0x001B    D8FD     DJNZ     R0,C:001A
  14. C:0x001D    758107   MOV      SP(0x81),#0x07
  15. C:0x0020    020003   LJMP     main(C:0003)
復(fù)制代碼


注意看0x0017之后的代碼是編譯器自動加上的,不知道為啥,代碼如下:
  1. MOV R0,#0x7F
  2. CLR        A
  3. MOV        @R0,A
  4. DJNZ        R0,C:001A
  5. MOV         SP(0x81),#0x07
  6. LJMP        main(C:0003)
復(fù)制代碼

R0為127
A置零
零傳送給地址為127的內(nèi)存單元
把上面重復(fù)127次
。。。
又跳回開頭的main函數(shù)入口繼續(xù)執(zhí)行(這里是死循環(huán)的更本原因)

最后改為匯編重新編寫,代碼如下:
  1. ORG 0
  2. START:MOV A,#0FEH
  3. MOV R3,#8

  4. LOOP:MOV P1,A
  5. CALL DELAY
  6. RL A
  7. DJNZ R3,LOOP

  8. DELAY:MOV R4,#20
  9. D1:MOV R5,#20
  10. D2:MOV R6,#248
  11. DJNZ R6,$
  12. DJNZ R5,D2
  13. DJNZ R4,D1
  14. RET

  15. END
復(fù)制代碼

然后燒錄程序,終于世界安靜了,只執(zhí)行了一次。8個燈從P1.0到P1.7依次點亮,目標達成。
使用12Mhz晶振,算了下延時為199660us,也就是0.199660s。
最后,弄不明白為什么編譯器會自動加上那些多余的匯編代碼





回復(fù)

使用道具 舉報

9#
ID:163669 發(fā)表于 2017-2-6 23:27 | 只看該作者
這個錯誤好像我也犯過。。值得警惕
回復(fù)

使用道具 舉報

10#
ID:163490 發(fā)表于 2017-2-6 23:50 | 只看該作者
1971417800 發(fā)表于 2017-2-6 23:27
這個錯誤好像我也犯過。。值得警惕

請問這是什么錯誤,又該如何解決呢?如果都用匯編寫復(fù)雜度就太高了,謝謝!
回復(fù)

使用道具 舉報

11#
ID:144931 發(fā)表于 2017-2-7 11:02 | 只看該作者
清沒清零。。
回復(fù)

使用道具 舉報

12#
ID:163789 發(fā)表于 2017-2-7 16:43 | 只看該作者
    mark
回復(fù)

使用道具 舉報

13#
ID:163490 發(fā)表于 2017-2-8 18:27 | 只看該作者
不知道這種情況用C怎么解決,有大大知道么,萬分感謝!
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 天天色天天色 | 久久国产精品视频 | 99久久成人 | 亚洲天堂一区 | 久久久亚洲 | 亚洲最大的黄色网址 | 免费观看黄网站 | 日韩精品一区二区三区在线播放 | 在线观看h视频 | 日韩在线一区二区 | 久久草在线视频 | 婷婷久久久久 | 国产福利91精品一区二区三区 | 亚洲视频 欧美视频 | 成人av一区 | 欧美一区二区三区视频在线 | 欧美精品成人一区二区三区四区 | 五月天国产视频 | 在线成人免费视频 | 国产一区www| 亚洲一区 中文字幕 | 欧美日高清 | 国产99久久久国产精品下药 | 亚洲精品久久视频 | 亚洲欧美视频一区 | 欧美日韩在线一区二区三区 | 一区中文字幕 | 一级片免费视频 | 精品成人69xx.xyz | 欧美精品乱码久久久久久按摩 | 黄网站在线播放 | 亚洲精品国产电影 | 日韩免费一区二区 | 国产亚洲欧美在线 | 日韩在线观看一区 | 超碰人人艹 | a在线免费观看视频 | 97免费在线视频 | 日本精品一区二区在线观看 | 国产1区 | 国产日韩一区二区三免费高清 |