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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機程序一般用什么做延時

  [復制鏈接]
跳轉到指定樓層
樓主
ID:959051 發(fā)表于 2022-7-20 09:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
是用定時器做延時還是直接在主程序里面做延時,都有什么弊端和優(yōu)點?定時器數(shù)量有限,怎么只用一個定時器,完成其他時間的定時,比如100ms  10ms  1000ms,能用一個定時器嗎?方法是什么?本人是新手,忘各位大佬多多指教,謝謝
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:752974 發(fā)表于 2022-7-20 11:02 | 只看該作者
用一個定時器即可,將定時器設置成標準節(jié)拍,如1MS。需要多少定時時間,在定時器中斷服務程序中計數(shù)就可以了。
回復

使用道具 舉報

板凳
ID:332444 發(fā)表于 2022-7-20 11:03 | 只看該作者
不同變量獲得不同時間
回復

使用道具 舉報

地板
ID:161164 發(fā)表于 2022-7-20 11:26 | 只看該作者
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

一個定時器產生不同時間心跳例子
  1. bit Flag10ms = 0;
  2. bit Flag20ms = 0;
  3. bit Flag50ms = 0;
  4. bit Flag100ms = 0;
  5. void 1ms中斷函數(shù)() interrupt x
  6. {
  7.         static unsigned char SysDiv10ms=0;
  8.         static unsigned char SysDiv20ms=0;
  9.         static unsigned char SysDiv50ms=0;
  10.         static unsigned char SysDiv100ms=0;
  11.         if(++SysDiv10ms>=10)
  12.         {
  13.                 SysDiv10ms = 0;
  14.                 Flag10ms = 1;//10ms心跳
  15.         }
  16.         if(++SysDiv20ms>=20)
  17.         {
  18.                 SysDiv20ms = 0;
  19.                 Flag20ms = 1;//20ms心跳
  20.         }
  21.         if(++SysDiv50ms>=50)
  22.         {
  23.                 SysDiv50ms = 0;
  24.                 Flag50ms = 1;//50ms心跳
  25.         }
  26.         if(++SysDiv100ms>=100)
  27.         {
  28.                 SysDiv100ms = 0;
  29.                 Flag100ms = 1;//100ms心跳
  30.         }
  31. }
  32. void main()
  33. {
  34.         while(1)
  35.         {
  36.                 if(Flag10ms)
  37.                 {
  38.                                 Flag10ms = 0;
  39.                                 //your code
  40.                 }
  41.                 if(Flag20ms)
  42.                 {
  43.                                 Flag20ms = 0;
  44.                                 //your code
  45.                 }
  46.                 if(Flag50ms)
  47.                 {
  48.                                 Flag50ms = 0;
  49.                                 //your code
  50.                 }
  51.                 if(Flag100ms)
  52.                 {
  53.                                 Flag100ms = 0;
  54.                                 //your code
  55.                 }
  56.         }       
  57. }
復制代碼




回復

使用道具 舉報

5#
ID:883242 發(fā)表于 2022-7-20 11:28 | 只看該作者
ms級別的延遲用定時器就行了,100ms  10ms  1000ms就是加一個變量的問題,你覺得挺難,單片機在延遲的萬分之一時間就能把變量算明白。
回復

使用道具 舉報

6#
ID:86450 發(fā)表于 2022-7-20 11:39 | 只看該作者
你看是單任務還是多任務。 就是說你在延時的時候還要響應其他的事件嗎?如果延時時候不干其他的時間,那用軟件延時方便,還容易理解。
回復

使用道具 舉報

7#
ID:401564 發(fā)表于 2022-7-20 11:54 | 只看該作者
超過1mS的,基本都是用定時器
像while這種等待的延時,一般是用在延時幾個時鐘或者精度并不高的延時中,像有的延時要求并不高,只要是超過一定的時間就行的
比如IIC延時,只要延時在10uS以上,對其它的就沒有什么要求的,就用軟件延時
回復

使用道具 舉報

8#
ID:959051 發(fā)表于 2022-7-20 19:49 | 只看該作者
lkc8210 發(fā)表于 2022-7-20 11:26
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

謝謝 大佬
回復

使用道具 舉報

9#
ID:959051 發(fā)表于 2022-7-22 19:07 | 只看該作者
lkc8210 發(fā)表于 2022-7-20 11:26
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

你好,大佬,可以用這種方法延時5秒到10秒嗎?另外問下,我想獲取一個ADC的值,但是想10秒獲取一次,請問具體要怎么做,是延時10秒去獲取一下數(shù)據(jù)嗎?
回復

使用道具 舉報

10#
ID:883242 發(fā)表于 2022-7-22 19:12 | 只看該作者
guoqiang881245 發(fā)表于 2022-7-22 19:07
你好,大佬,可以用這種方法延時5秒到10秒嗎?另外問下,我想獲取一個ADC的值,但是想10秒獲取一次,請問 ...

就是一個變量的事兒,1ms中斷一次,8位單片機unsigned int最大65535,可以控制65秒以內的延時,有必要問那么多嗎?
回復

使用道具 舉報

11#
ID:959051 發(fā)表于 2022-7-22 19:44 | 只看該作者
Hephaestus 發(fā)表于 2022-7-22 19:12
就是一個變量的事兒,1ms中斷一次,8位單片機unsigned int最大65535,可以控制65秒以內的延時,有必要問 ...

謝謝指教!
回復

使用道具 舉報

12#
ID:1040352 發(fā)表于 2022-7-23 18:51 | 只看該作者
guoqiang881245 發(fā)表于 2022-7-22 19:07
你好,大佬,可以用這種方法延時5秒到10秒嗎?另外問下,我想獲取一個ADC的值,但是想10秒獲取一次,請問 ...

做一個時間觸發(fā)器。
回復

使用道具 舉報

13#
ID:161164 發(fā)表于 2022-7-23 22:56 | 只看該作者
guoqiang881245 發(fā)表于 2022-7-22 19:07
你好,大佬,可以用這種方法延時5秒到10秒嗎?另外問下,我想獲取一個ADC的值,但是想10秒獲取一次,請問 ...

我給的例程展示了用1ms心跳產生10ms,20ms,50ms,100ms心跳的方法
10s的也是一樣方法
回復

使用道具 舉報

14#
ID:963677 發(fā)表于 2022-7-24 22:01 | 只看該作者
用systemtick用于粗略的定時,用定時器較為精準,要是延時用delay較為合適,用_nop()也可以,想要定時100ms 10ms這樣子的話用定時器就可以了,在定時器里加上一個標志位,每10ms加1,判斷標志位的數(shù)字即可擴大倍數(shù),實現(xiàn)你提出的問題
回復

使用道具 舉報

15#
ID:959051 發(fā)表于 2022-7-26 20:46 | 只看該作者
lkc8210 發(fā)表于 2022-7-23 22:56
我給的例程展示了用1ms心跳產生10ms,20ms,50ms,100ms心跳的方法
10s的也是一樣方法

大佬,你這個函數(shù)我遇到了個問題,就是當其他函數(shù)調用這個延時的時候,有時不管用。比如延時3秒,定時器10ms中斷一次,有時會錯開這個延時,我不是放在main函數(shù)下執(zhí)行的。
回復

使用道具 舉報

16#
ID:161164 發(fā)表于 2022-7-26 21:04 | 只看該作者
guoqiang881245 發(fā)表于 2022-7-26 20:46
大佬,你這個函數(shù)我遇到了個問題,就是當其他函數(shù)調用這個延時的時候,有時不管用。比如延時3秒,定時器1 ...

上代碼看看
回復

使用道具 舉報

17#
ID:959051 發(fā)表于 2022-7-27 20:57 | 只看該作者

/*定時器1中斷****************************************************************************************************/
void TIMER1_ISR (void) interrupt 3                  //每10ms產生中斷
{
        static unsigned int SysDiv1000ms=0;

        static unsigned int SysDiv50ms=0;

        TH1 = TH_VAL;
        TL1 = TL_VAL;
        if(++SysDiv1000ms>=10)  //燈閃時間
        {
                        SysDiv1000ms = 0;
                        Flag1000ms = 1;//100ms心跳
        }
       
        if(++SysDiv50ms>=30)  //SOS閃燈時間
        {
                        SysDiv50ms = 0;
                        Flag50ms = 1;//100ms心跳
        }

        if(P35)   
        {
        if (fangdianCount < 20)
        {
                fangdianCount += 2;
        }               
        }
        else   
        {               
                if (fangdianCount>0)
                {
                        fangdianCount--;
                }               
        }

        Key2_Server_YDD (); //定時器刷新按鍵
        Key1_Server_SDT();
        FangdianDisp();  //放電指示燈
        Led_shan(); //閃燈

//        maichongCheck();
       
}
void Charge_lamp()
{
         
        if (P03 == 0)
        {               
                if (Flag1000ms == 1)
                {
                        Flag1000ms = 0;

                        if (Adc_celiang() >= 1.473)
                        {       
                                chongdian4 = 0;chongdian3 = 0;chongdian2 = 0;chongdian1 = 0;P10 = 1;P11 = 1;P12 = 1;P13 = 1;
                        }
                        else if (Adc_celiang() >= 1.423 && Adc_celiang() <= 1.471) //閃第四顆燈
                        {
                                chongdian4 = 1;chongdian3 = 0;chongdian2 = 0;chongdian1 = 0;                       
                        }
                        else if (Adc_celiang()>=1.360 && Adc_celiang()<=1.420)  //閃第三顆燈
                        {
                                chongdian4 = 0;chongdian3 = 1;chongdian2 = 0;chongdian1 = 0;
                        }
                        else if (Adc_celiang()>=1.283 && Adc_celiang()<=1.358)         //閃第二顆燈
                        {
                                chongdian4 = 0;chongdian3 = 0;chongdian2 = 1;chongdian1 = 0;
                        }
                        else if (Adc_celiang() <= 1.280)  //閃第一顆燈
                        {
                                chongdian4 = 0;chongdian3 = 0;chongdian2 = 0;chongdian1 = 1;
                        }
                }               
        }                       
               
}
/*主函數(shù)****************************************************************************************************/
void main(void)
{
#ifdef LVD_RST_ENABLE
        LVDCON = 0xE1;                                        //設置LVD復位電壓為2V
#endif

#if (SYSCLK_SRC == PLL)
        Sys_Clk_Set_PLL(PLL_Multiple);        //設置系統(tǒng)時鐘為PLL,PLL_Multiple為倍頻倍數(shù)
#endif
       
#ifdef UART0_EN
        Uart0_Initial(UART0_BAUTRATE);        //初始化UART0
#endif
       
#ifdef UART1_EN
        Uart1_Initial(UART1_BAUTRATE);        //初始化UART1
#endif

        EA = 1;                                                        //開全局中斷

#ifdef PRINT_EN
        uart_printf("INT2 to INT9 Demo Code\n");
#endif

CKCON |= IHCKE;                                //PWM打開IRCH時鐘
frq = 0x00;
ADC_Init();     //ADC初始化
IO_Init();                //IO初始化
TIM0_Init();          //定時器初始化
TIM1_Init();          //定時器初始化
//INT2_Init();         //中斷初始化
               
        while(1)
        {               
                Charge_lamp(); //充電檢測
                ChongDSD();  //充電閃燈       
                Out_lamp();
                Meideng();//滅燈
                baojin();        //報警聲               
                // uart_printf ("VDD Voltage = %f\n",Adc_celiang());        //打印VDD電壓值               
        }

}
回復

使用道具 舉報

18#
ID:959051 發(fā)表于 2022-7-27 21:00 | 只看該作者
飛熊入夢 發(fā)表于 2022-7-24 22:01
用systemtick用于粗略的定時,用定時器較為精準,要是延時用delay較為合適,用_nop()也可以,想要定時100ms ...

好的 謝謝大佬回答。
回復

使用道具 舉報

19#
ID:382454 發(fā)表于 2022-7-28 17:42 | 只看該作者
精確的幾十ms的,用STC官方軟件計算出來,這樣才是精確的,比如寫一些單總線的驅動程序要求非常精確。長時間的比如幾秒,幾分鐘的用定時器定好時間長數(shù)。最好做好時基,比如0.5秒,1秒,10秒 60秒 10分,20分 30分 1小時,這樣你在寫代碼的時候就很靈活的調用了。
回復

使用道具 舉報

20#
ID:398623 發(fā)表于 2022-7-28 18:42 | 只看該作者
定時器定一個最小單位時間,其他時間分頻得到
回復

使用道具 舉報

21#
ID:993066 發(fā)表于 2022-7-30 15:26 | 只看該作者
定時器,穩(wěn)定精度度高
回復

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产日产久久高清欧美一区 | 91在线视频观看 | 欧美成人免费在线视频 | 黑人精品| 九色91视频 | 毛片一区二区 | 91精品国产乱码麻豆白嫩 | 国产视频久久久 | 国产一区二区三区久久久久久久久 | 欧美综合国产精品久久丁香 | 91九色婷婷 | 久久久这里都是精品 | 伊人精品一区二区三区 | 欧美久久综合 | 中文字幕成人 | 国产精品日韩高清伦字幕搜索 | 97精品久久| 爱爱无遮挡 | 91成人精品| 欧美日韩国产精品一区 | 色噜噜狠狠色综合中国 | av黄色国产 | 久久精品一区二区三区四区 | 91视频在线看 | 国产一区91精品张津瑜 | 亚洲日韩中文字幕一区 | 成人免费黄色 | 九九热久久免费视频 | 日韩中文字幕 | 国产精品一区二区三区在线 | 国产精品久久久久久吹潮 | 欧美日韩在线免费观看 | 久久亚洲国产 | 最新一级毛片 | 久久久久国产一区二区三区 | 少妇精品久久久久久久久久 | 在线天堂免费中文字幕视频 | 欧美成人一级 | 亚洲精品国产第一综合99久久 | 99re视频在线 | 国产精品国产a级 |