欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 一個關于C語言for循環做的延時問題 [打印本頁]

作者: hepen2002    時間: 2022-10-1 11:47
標題: 一個關于C語言for循環做的延時問題
void delay_ms() //12M晶振,12T為1us
{
unsigned int  i;
    for(i=0; i<32767; i++);
}
上面用的芯片是89C52,仿真用keil51,發現i<32767軟件仿真時查看軟件正常的延時161ms,但是一旦設為i<32768,一下子就變成1.2s的延時了,燒錄代碼到芯片,查看LED也是變成1.2s延時。想請教各位大佬為什么會出現這個問題。
作者: coody_sz    時間: 2022-10-1 13:37
unsigned int  i,i的最大值就是32767,你整個32768,就亂了。
作者: xianfajushi    時間: 2022-10-1 17:16
不要希望這種延時能一直準確無異于異想天開受程序其它影響甚大否則的話就不需要中斷了
作者: aidianzi    時間: 2022-10-1 17:42
keil仿真要設置正確的時鐘
作者: lkc8210    時間: 2022-10-1 18:42
進調試模式看看運行一次走多少步
作者: wjhhhhh    時間: 2022-10-1 21:15
coody_sz 發表于 2022-10-1 13:37
unsigned int  i,i的最大值就是32767,你整個32768,就亂了。

    ?
作者: 188610329    時間: 2022-10-2 00:41
這一類的問題,論壇里  問得很多,我也答過很多,你要有心 搜索一下 都能搜到。
delay 函數本來 就不準, 你用 int / unsigned int   就更不靠譜,
你想要 靠譜 一點的話,必須用 unsigned char
void delay()
{
unsigned char  i,j;
        for(i=0;i<200;i++)          //雙循環粗調整
        {
         for(j=0;j<150;j++);
         }
        for(i=0;i<50;i++);       //單循環微調整
}
作者: 名字不是重點    時間: 2022-10-2 03:52
wjhhhhh 發表于 2022-10-1 21:15
?

沙發說的沒錯,uint 的取值范圍是0到32767,你要設32768時,變量值溢出了。因為永遠到不了32768,所以你這個延時就亂了。你把變量類型改為u32 就可以了
作者: xianfajushi    時間: 2022-10-2 06:58
無論是否寫錯希望這種延時的準確是癡心妄想,否則要時鐘芯片何用。
作者: hepen2002    時間: 2022-10-2 11:41
感謝各位大佬指點,但是unsigned int 不是16位的嗎?65536?
是的,我發現一旦改成32768,單步調試一看轉匯編代碼就不對了。比32767時匯編就多少很多步,多用了幾個R寄存器。
但是呢,我寫成i--居然就正常了。不太理解為什么會這樣。感謝大佬提供新的思路。
作者: zhxiufan    時間: 2022-10-2 13:42
你看看反匯編代碼就知道了,32767時,是按正常匯編語言代碼來編制的延時程序,如果是32768則不然,“無符號”在程序代碼處理方式上有很大不同的。
當為32767時,代碼如下:
C:0x0003    E4       CLR      A
C:0x0004    FF       MOV      R7,A
C:0x0005    FE       MOV      R6,A
C:0x0006    0F       INC      R7
C:0x0007    BF0001   CJNE     R7,#0x00,C:000B
C:0x000A    0E       INC      R6
C:0x000B    BE7FF8   CJNE     R6,#0x7F,C:0006
C:0x000E    BFFFF5   CJNE     R7,#0xFF,C:0006
C:0x0011    22       RET      
當為32768時代碼如下:
C:0x0003    900000   MOV      DPTR,#0x0000
C:0x0006    AF82     MOV      R7,DP0L(0x82)
C:0x0008    AE83     MOV      R6,DP0H(0x83)
C:0x000A    E4       CLR      A
C:0x000B    FC       MOV      R4,A
C:0x000C    FD       MOV      R5,A
C:0x000D    FB       MOV      R3,A
C:0x000E    7A80     MOV      R2,#P0(0x80)
C:0x0010    F9       MOV      R1,A
C:0x0011    F8       MOV      R0,A
C:0x0012    D3       SETB     C
C:0x0013    12001C   LCALL    C?SLCMP(C:001C)
C:0x0016    4003     JC       C:001B
C:0x0018    A3       INC      DPTR
C:0x0019    80EB     SJMP     C:0006
C:0x001B    22       RET      
                 C?SLCMP:
C:0x001C    EB       MOV      A,R3
C:0x001D    9F       SUBB     A,R7
C:0x001E    F5F0     MOV      B(0xF0),A
C:0x0020    EA       MOV      A,R2
C:0x0021    9E       SUBB     A,R6
C:0x0022    42F0     ORL      B(0xF0),A
C:0x0024    E9       MOV      A,R1
C:0x0025    9D       SUBB     A,R5
C:0x0026    42F0     ORL      B(0xF0),A
C:0x0028    EC       MOV      A,R4
C:0x0029    6480     XRL      A,#P0(0x80)
C:0x002B    C8       XCH      A,R0
C:0x002C    6480     XRL      A,#P0(0x80)
C:0x002E    98       SUBB     A,R0
C:0x002F    45F0     ORL      A,B(0xF0)
C:0x0031    22       RET      

作者: Hephaestus    時間: 2022-10-2 17:04
這是單片機內核指令體系太過于原始的問題,跟c語言有個毛關系???
作者: hhh402    時間: 2022-10-2 20:15
延時函數不要自己寫,STC燒錄軟件有現成的,直接使用就好。多長時間都可以。比如:
89C52單片機,12M主頻
1000ms延時:
void Delay1000ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 8;
        j = 154;
        k = 122;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
2000ms延時
void Delay2000ms()                //@12.000MHz
{
        unsigned char i, j, k;

        _nop_();
        i = 16;
        j = 51;
        k = 249;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}

作者: univers    時間: 2022-10-2 22:08
延時用官方的程序計算。
作者: IdeaMing    時間: 2022-10-2 22:45
編譯器對代碼的處理方式不同導致的。
作者: wgd1990    時間: 2022-10-5 22:51
延時用官方的程序計算。
作者: hepen2002    時間: 2022-10-6 15:47
嗯,不管他了。知道有這么個問題就好了,感謝各位大佬指點
作者: 如果在冬夜    時間: 2022-10-10 17:46
51單片機做不了精準延時,用定時器也只是比for語句好一點





歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1