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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

這里想問各位大佬一個51單片機的問題 delay函數延時不能達到預期的一秒,反而非常快

  [復制鏈接]
跳轉到指定樓層
樓主
ID:1079470 發表于 2023-5-23 22:34 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
其實代碼是在視頻上抄的,但是delay函數延時不能達到預期的一秒,反而非常快,求解答!

代碼如下

void UART_INIT() {

PCON |= 0x80; //波特率不倍速
SCON = 0x40; //8位數據,可變波特率
TMOD &= 0x0F; //設置定時器模式
TMOD |= 0x20; //設置定時器模式
TL1 = 0xF3; //設置定時初始值
TH1 = 0xF3; //設置定時重載值
ET1 = 0; //禁止定時器中斷
TR1 = 1; //定時器1開始計時
TR0 = 1;

}

void UART_SendByte(unsigned int Byte) {
SBUF = Byte;
while(TI == 0);
TI = 0;
}

unsigned int sec = 0;

void main() {
UART_INIT();

while(1) {
UART_SendByte(sec);
sec++;
P2_0 = ~P2_0;
Delay(1000);
}
}
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:1079470 發表于 2023-5-23 22:35 | 只看該作者
delay函數放在別的代碼里就沒有問題,這里如果把TMOD換成定時器0,就會變得非常慢,總之不管怎么樣都不會按照1秒的預期去執行
回復

使用道具 舉報

板凳
ID:744809 發表于 2023-5-24 09:00 | 只看該作者
delay函數都沒貼出來
回復

使用道具 舉報

地板
ID:526543 發表于 2023-5-24 12:32 | 只看該作者
void Delay(unsigned int ms) {
    unsigned int i, j;
    for (i = 0; i < ms; i++) {
        for (j = 0; j < 120; j++) {
            // 空循環進行延時
        }
    }
}
回復

使用道具 舉報

5#
ID:1079470 發表于 2023-5-24 21:04 | 只看該作者
123156fsadf 發表于 2023-5-24 09:00
delay函數都沒貼出來

void Delay(unsigned int xms) {
        xms = xms * 1000;
        while(xms--);
}
回復

使用道具 舉報

6#
ID:1031129 發表于 2023-5-24 21:12 | 只看該作者
delay函數要貼出來
回復

使用道具 舉報

7#
ID:1079470 發表于 2023-5-24 22:00 | 只看該作者
2763537317 發表于 2023-5-24 21:12
delay函數要貼出來

貼啦,在您樓上
回復

使用道具 舉報

8#
ID:744809 發表于 2023-5-24 22:41 | 只看該作者
2763537317 發表于 2023-5-24 21:12
delay函數要貼出來

你這個delay函數有問題,unsigned int 最大只有65535,你delay(1000),xms = 1000*1000,導致溢出了,你用4樓提供的delay試試
回復

使用道具 舉報

9#
ID:155507 發表于 2023-5-24 22:43 | 只看該作者
dhj646315174 發表于 2023-5-24 21:04
void Delay(unsigned int xms) {
        xms = xms * 1000;
        while(xms--);

你是個變量是unsigned int, 他只能從 0~65535
Delay(1000);
是 1000 * 1000 = 1000000 超過了65535 當然會快
回復

使用道具 舉報

10#
ID:213173 發表于 2023-5-25 06:26 | 只看該作者
dhj646315174 發表于 2023-5-24 21:04
void Delay(unsigned int xms) {
        xms = xms * 1000;
        while(xms--);

相同的代碼在不同的單片機運行結果未必相同。標準51系列12T單片機,12MHz晶振條件下運行這個延時函數t大致延時時間長度 T=t*9+16us
void delay(unsigned int t)
{      
        while(t--);
}
如果是51增強型1T單片機運行上述這個延時函數大致延時時間長度是上述的1/10。可以參考下面程序
void Delay_ms(unsigned int t)//1T@12MHz
{
        unsigned int i,j;
        for(i=t;i>0;i--)
                for(j=1200;j>0;j--);
}

何況你xms = xms * 1000;數據溢出,while(xms--);中xms實際只得到16960,根本得不到1秒延時。
回復

使用道具 舉報

11#
ID:879348 發表于 2023-5-25 10:47 | 只看該作者
定時可以開一個定時器,就非常精確了
回復

使用道具 舉報

12#
ID:647261 發表于 2023-5-25 16:22 | 只看該作者
要精確的1秒,除了樓上各位說的
還要計算一下這個循環需要的指令周期
不過要計算可能不太好算,最好示波器量一下
回復

使用道具 舉報

13#
ID:330059 發表于 2023-5-25 19:46 | 只看該作者
參數xms是unsigned int類型,范圍是0-65535,Delay(1000)的話函數內部參數的計算結果已經大于最大值了,所以會出現問題,可以修改成為unsigned long
回復

使用道具 舉報

14#
ID:1079470 發表于 2023-5-25 21:08 | 只看該作者
感謝樓上各位大佬的講解,這里就不一一回復了,十分感謝!
回復

使用道具 舉報

15#
ID:73833 發表于 2023-5-27 14:34 | 只看該作者
    使用for循環配合  ++,--,之類的語句,是很難得到精確的延時的。
     這里提供一個方法或許有用:
           開一個可以自動重裝的定時器,設好定時時間,比如10毫秒,再定義  一個全局變量TIME,僅 把"TIME++;"放在那個定時器的中斷函數里。這就準備好了。
     在工程的任何地方(函數里),要延時都很方便,比如要延時1秒,只要 TIME=0;while(TIME<100);
這就精確的延時 了 1秒。
   像STC15W系列單片機有模式3的定時器,使用起來會更精確,更方便。
    了1秒。  
回復

使用道具 舉報

16#
ID:73833 發表于 2023-5-27 14:45 | 只看該作者
使用for循環和++,--之類的語句基本很難得到精確的定時。這里提供一個方法或許有用。
比如 要定時一秒:
  開一個能自動重裝的定時器,設定定時時間10毫秒,再定義一個全局變量TIME,僅把TIME++;放在那個定時器的中斷函數里,基本就OK。
  在任何函數里可以:TIME=0;While(TIME<100);這就得到1秒的精切延時。
像STC15W單片機有模式3的定時器,用起來更方便,更精確。
回復

使用道具 舉報

17#
ID:712097 發表于 2023-5-27 15:20 | 只看該作者
用STC-ISP軟件的“軟件延時計算器”功能
選擇對應的指令集,以及延時時長,就可以了。
以下是STC-Y5指令集(適合STC15系列大部分芯片)12MHz下延時1000ms(1秒)的函數

void Delay1000ms()                //@12.000MHz
{
        unsigned char data i, j, k;

        _nop_();
        _nop_();
        i = 46;
        j = 153;
        k = 245;
        do
        {
                do
                {
                        while (--k);
                } while (--j);
        } while (--i);
}
回復

使用道具 舉報

18#
ID:1090832 發表于 2023-8-6 20:30 | 只看該作者
void Delay(unsigned char xms)
{
     unsigned char i,j;
     while(xms--)
     {
           i=2;
           j=199;
          do
          {
               while(--j);
          }while(--i);
     }
}
回復

使用道具 舉報

19#
ID:1090832 發表于 2023-8-6 20:32 | 只看該作者
void Delay(unsigned char xms)
{
     unsigned char i,j;
     while(xms--)
     {
           i=2;
           j=199;
          do
          {
               while(--j);
          }while(--i);
     }
}
那這個呢,有啥問題
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美区日韩区 | 国产精品一区视频 | 欧美精品久久久久 | 狠狠做六月爱婷婷综合aⅴ 国产精品视频网 | 日朝毛片 | 欧美精品日韩精品 | 亚洲精品一区在线 | 久久精品国产一区二区三区不卡 | a网站在线观看 | 四虎首页| 中文成人在线 | 日韩一级欧美一级 | 91精品国产综合久久精品 | 91成人在线视频 | 天天操精品视频 | 日韩欧美三级 | 综合伊人 | 日日干干 | 久久91视频| 成人免费观看网站 | 国产精品99久久久久久www | 久久91av| 午夜影院在线观看免费 | 一区二区三区精品视频 | 毛片a级 | 日本精品视频一区二区三区四区 | 午夜精品91| 日韩蜜桃视频 | 欧美精品video| 天天操操 | 九色91视频 | 亚洲日本中文 | 人人草人人干 | 欧洲免费毛片 | 亚洲日日夜夜 | 国产成人高清视频 | 欧美一区二区三区久久精品视 | 天天玩天天操天天干 | 精品自拍视频在线观看 | 盗摄精品av一区二区三区 | 日本偷偷操 |