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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2690|回復: 17
打印 上一主題 下一主題
收起左側

一個關于C語言for循環做的延時問題

  [復制鏈接]
跳轉到指定樓層
樓主
ID:284226 發表于 2022-10-1 11:47 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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延時。想請教各位大佬為什么會出現這個問題。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1034262 發表于 2022-10-1 13:37 | 只看該作者
unsigned int  i,i的最大值就是32767,你整個32768,就亂了。
回復

使用道具 舉報

板凳
ID:332444 發表于 2022-10-1 17:16 | 只看該作者
不要希望這種延時能一直準確無異于異想天開受程序其它影響甚大否則的話就不需要中斷了
回復

使用道具 舉報

地板
ID:41656 發表于 2022-10-1 17:42 | 只看該作者
keil仿真要設置正確的時鐘
回復

使用道具 舉報

5#
ID:161164 發表于 2022-10-1 18:42 | 只看該作者
進調試模式看看運行一次走多少步
回復

使用道具 舉報

6#
ID:91150 發表于 2022-10-1 21:15 | 只看該作者
coody_sz 發表于 2022-10-1 13:37
unsigned int  i,i的最大值就是32767,你整個32768,就亂了。

    ?
回復

使用道具 舉報

7#
ID:624769 發表于 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++);       //單循環微調整
}
回復

使用道具 舉報

8#
ID:824490 發表于 2022-10-2 03:52 | 只看該作者

沙發說的沒錯,uint 的取值范圍是0到32767,你要設32768時,變量值溢出了。因為永遠到不了32768,所以你這個延時就亂了。你把變量類型改為u32 就可以了
回復

使用道具 舉報

9#
ID:332444 發表于 2022-10-2 06:58 | 只看該作者
無論是否寫錯希望這種延時的準確是癡心妄想,否則要時鐘芯片何用。
回復

使用道具 舉報

10#
ID:284226 發表于 2022-10-2 11:41 | 只看該作者
感謝各位大佬指點,但是unsigned int 不是16位的嗎?65536?
是的,我發現一旦改成32768,單步調試一看轉匯編代碼就不對了。比32767時匯編就多少很多步,多用了幾個R寄存器。
但是呢,我寫成i--居然就正常了。不太理解為什么會這樣。感謝大佬提供新的思路。
回復

使用道具 舉報

11#
ID:121859 發表于 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      
回復

使用道具 舉報

12#
ID:883242 發表于 2022-10-2 17:04 | 只看該作者
這是單片機內核指令體系太過于原始的問題,跟c語言有個毛關系???
回復

使用道具 舉報

13#
ID:491577 發表于 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);
}
回復

使用道具 舉報

14#
ID:382454 發表于 2022-10-2 22:08 | 只看該作者
延時用官方的程序計算。
回復

使用道具 舉報

15#
ID:276663 發表于 2022-10-2 22:45 | 只看該作者
編譯器對代碼的處理方式不同導致的。
回復

使用道具 舉報

16#
ID:1046742 發表于 2022-10-5 22:51 | 只看該作者
延時用官方的程序計算。
回復

使用道具 舉報

17#
ID:284226 發表于 2022-10-6 15:47 | 只看該作者
嗯,不管他了。知道有這么個問題就好了,感謝各位大佬指點
回復

使用道具 舉報

18#
ID:1047187 發表于 2022-10-10 17:46 | 只看該作者
51單片機做不了精準延時,用定時器也只是比for語句好一點
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 中文字幕视频在线观看 | 久久国产精品一区二区三区 | 成人亚洲网 | 国产精品欧美一区二区三区 | 毛片电影 | 伊人久久免费视频 | 天堂综合网久久 | 日韩国产精品一区二区三区 | 黄色成人在线观看 | 欧美αv | 色婷婷激情 | 国产一区免费视频 | 国产精品一区二区视频 | 老司机成人在线 | 国产福利免费视频 | 亚洲成人av在线播放 | 日韩高清不卡 | 台湾佬成人网 | 精品国模一区二区三区欧美 | 久久日韩精品一区二区三区 | 久久成人一区 | 羞羞午夜 | 日韩精品在线播放 | 亚洲综合一区二区三区 | 精品一区二区三区在线观看 | 欧美一级毛片在线播放 | 久久福利 | 国产av毛片 | 五月天婷婷狠狠 | 久久久久无码国产精品一区 | 日韩欧美精品一区 | 99综合| 蜜臀av日日欢夜夜爽一区 | 男女在线免费观看 | 九九久久久 | 欧美freesex黑人又粗又大 | 欧美精品一区二区三区四区 在线 | 欧美综合久久久 | 亚洲成人动漫在线观看 | 天天射天天操天天干 | 国产精品欧美一区二区三区不卡 |