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

標題: 單片機程序一般用什么做延時 [打印本頁]

作者: guoqiang881245    時間: 2022-7-20 09:21
標題: 單片機程序一般用什么做延時
是用定時器做延時還是直接在主程序里面做延時,都有什么弊端和優點?定時器數量有限,怎么只用一個定時器,完成其他時間的定時,比如100ms  10ms  1000ms,能用一個定時器嗎?方法是什么?本人是新手,忘各位大佬多多指教,謝謝

作者: munuc_w    時間: 2022-7-20 11:02
用一個定時器即可,將定時器設置成標準節拍,如1MS。需要多少定時時間,在定時器中斷服務程序中計數就可以了。
作者: xianfajushi    時間: 2022-7-20 11:03
不同變量獲得不同時間
作者: lkc8210    時間: 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中斷函數() 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. }
復制代碼





作者: Hephaestus    時間: 2022-7-20 11:28
ms級別的延遲用定時器就行了,100ms  10ms  1000ms就是加一個變量的問題,你覺得挺難,單片機在延遲的萬分之一時間就能把變量算明白。
作者: jjwangxu2008    時間: 2022-7-20 11:39
你看是單任務還是多任務。 就是說你在延時的時候還要響應其他的事件嗎?如果延時時候不干其他的時間,那用軟件延時方便,還容易理解。
作者: Y_G_G    時間: 2022-7-20 11:54
超過1mS的,基本都是用定時器
像while這種等待的延時,一般是用在延時幾個時鐘或者精度并不高的延時中,像有的延時要求并不高,只要是超過一定的時間就行的
比如IIC延時,只要延時在10uS以上,對其它的就沒有什么要求的,就用軟件延時
作者: guoqiang881245    時間: 2022-7-20 19:49
lkc8210 發表于 2022-7-20 11:26
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

謝謝 大佬
作者: guoqiang881245    時間: 2022-7-22 19:07
lkc8210 發表于 2022-7-20 11:26
100us以下用delay
100us~1ms看情況用delay或定時器
1ms以上用定時器

你好,大佬,可以用這種方法延時5秒到10秒嗎?另外問下,我想獲取一個ADC的值,但是想10秒獲取一次,請問具體要怎么做,是延時10秒去獲取一下數據嗎?
作者: Hephaestus    時間: 2022-7-22 19:12
guoqiang881245 發表于 2022-7-22 19:07
你好,大佬,可以用這種方法延時5秒到10秒嗎?另外問下,我想獲取一個ADC的值,但是想10秒獲取一次,請問 ...

就是一個變量的事兒,1ms中斷一次,8位單片機unsigned int最大65535,可以控制65秒以內的延時,有必要問那么多嗎?
作者: guoqiang881245    時間: 2022-7-22 19:44
Hephaestus 發表于 2022-7-22 19:12
就是一個變量的事兒,1ms中斷一次,8位單片機unsigned int最大65535,可以控制65秒以內的延時,有必要問 ...

謝謝指教!
作者: fanxiaoyi    時間: 2022-7-23 18:51
guoqiang881245 發表于 2022-7-22 19:07
你好,大佬,可以用這種方法延時5秒到10秒嗎?另外問下,我想獲取一個ADC的值,但是想10秒獲取一次,請問 ...

做一個時間觸發器。
作者: lkc8210    時間: 2022-7-23 22:56
guoqiang881245 發表于 2022-7-22 19:07
你好,大佬,可以用這種方法延時5秒到10秒嗎?另外問下,我想獲取一個ADC的值,但是想10秒獲取一次,請問 ...

我給的例程展示了用1ms心跳產生10ms,20ms,50ms,100ms心跳的方法
10s的也是一樣方法
作者: 飛熊入夢    時間: 2022-7-24 22:01
用systemtick用于粗略的定時,用定時器較為精準,要是延時用delay較為合適,用_nop()也可以,想要定時100ms 10ms這樣子的話用定時器就可以了,在定時器里加上一個標志位,每10ms加1,判斷標志位的數字即可擴大倍數,實現你提出的問題
作者: guoqiang881245    時間: 2022-7-26 20:46
lkc8210 發表于 2022-7-23 22:56
我給的例程展示了用1ms心跳產生10ms,20ms,50ms,100ms心跳的方法
10s的也是一樣方法

大佬,你這個函數我遇到了個問題,就是當其他函數調用這個延時的時候,有時不管用。比如延時3秒,定時器10ms中斷一次,有時會錯開這個延時,我不是放在main函數下執行的。
作者: lkc8210    時間: 2022-7-26 21:04
guoqiang881245 發表于 2022-7-26 20:46
大佬,你這個函數我遇到了個問題,就是當其他函數調用這個延時的時候,有時不管用。比如延時3秒,定時器1 ...

上代碼看看
作者: guoqiang881245    時間: 2022-7-27 20:57
lkc8210 發表于 2022-7-26 21:04
上代碼看看

/*定時器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;
                        }
                }               
        }                       
               
}
/*主函數****************************************************************************************************/
void main(void)
{
#ifdef LVD_RST_ENABLE
        LVDCON = 0xE1;                                        //設置LVD復位電壓為2V
#endif

#if (SYSCLK_SRC == PLL)
        Sys_Clk_Set_PLL(PLL_Multiple);        //設置系統時鐘為PLL,PLL_Multiple為倍頻倍數
#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電壓值               
        }

}
作者: guoqiang881245    時間: 2022-7-27 21:00
飛熊入夢 發表于 2022-7-24 22:01
用systemtick用于粗略的定時,用定時器較為精準,要是延時用delay較為合適,用_nop()也可以,想要定時100ms ...

好的 謝謝大佬回答。
作者: univers    時間: 2022-7-28 17:42
精確的幾十ms的,用STC官方軟件計算出來,這樣才是精確的,比如寫一些單總線的驅動程序要求非常精確。長時間的比如幾秒,幾分鐘的用定時器定好時間長數。最好做好時基,比如0.5秒,1秒,10秒 60秒 10分,20分 30分 1小時,這樣你在寫代碼的時候就很靈活的調用了。
作者: 羽風Mike    時間: 2022-7-28 18:42
定時器定一個最小單位時間,其他時間分頻得到
作者: akesking    時間: 2022-7-30 15:26
定時器,穩定精度度高




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