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

標題: 這段單片機程序具體什么意思?為什么先要給TMR0兩個計數 [打印本頁]

作者: guhuawei19    時間: 2021-12-4 11:51
標題: 這段單片機程序具體什么意思?為什么先要給TMR0兩個計數
for(i =y;i>0;i--)
     {
     TMR0 = 0xD9; //延時10ms
     CountOld  = TMR0;
     CountNew = TMR0;
     while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
     }
為什么先要給TMR0兩個計數


作者: 188610329    時間: 2021-12-4 23:44
代碼不全,沒辦法給你解釋清楚。
只能告訴你,有另外一個中斷程序,會改寫 TMR0

     while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
當 TMR0 在另外一個中斷的作用下,減小的時候,會跳出 這個 while, 反之,會死在這個循環里 至于具體如何跳出這個外面這個for, 要看y的定義了。

作者: guhuawei19    時間: 2021-12-6 08:49
int mydelay_ms(int y)  //延時 y*10 ms
{
    uchar i;
   

     for(i =y;i>0;i--)
     {
     TMR0 = 0xD9; //延時10ms
     CountOld  = TMR0;
     CountNew = TMR0;
     while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
     }
}
作者: guhuawei19    時間: 2021-12-6 08:49
int mydelay_ms(int y)  //延時 y*10 ms
{
    uchar i;
   

     for(i =y;i>0;i--)
     {
     TMR0 = 0xD9; //延時10ms
     CountOld  = TMR0;
     CountNew = TMR0;
     while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
     }
}
作者: angmall    時間: 2021-12-6 10:55
PIC16f877a 具有三個獨立的定時器,可用作定時器、計數器或用于 PWM 生成。

Timer 0
TMR0 模塊是一個 8 位定時器/計數器,具有以下特性:





這段單片機程序具體的意思是用定時器實現準確的延時程序





作者: guhuawei19    時間: 2021-12-6 11:02
angmall 發表于 2021-12-6 10:55
PIC16f877a 具有三個獨立的定時器,可用作定時器、計數器或用于 PWM 生成。

Timer 0

單片機用的PIC10F200, 沒有中斷
作者: 188610329    時間: 2021-12-6 16:51
guhuawei19 發表于 2021-12-6 11:02
單片機用的PIC10F200, 沒有中斷

不管有沒有中斷, TMR0 是定時器吧? 理論上 TMR0 向上計數吧? 當TMR0 溢出之后,

while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
這段代碼里面的, CountNew 就 小于 CountOld 了吧? 這個時候 就會跳出這個 while, for 里面的 i 就會減1, 減到0 延時結束,子函數返回。不過,沒明白為啥搞這么復雜……, 感覺這么寫就可以了吧……

int mydelay_ms(int y)  //延時 y*10 ms
{
    while(y--)
     {
     TMR0 = 0xD9; //延時10ms
     while(TMR0>=0xD9);
     }
}


作者: Y_G_G    時間: 2021-12-6 22:53
guhuawei19 發表于 2021-12-6 08:49
int mydelay_ms(int y)  //延時 y*10 ms
{
    uchar i;

XC8編譯器自帶延時函數  __delay_ms()
PICC編譯器好像功能更多,延時函數肯定是有的
已經有現成的,就不需要去折騰那么多
為什么要兩個計數,有可能就是單純的增加指令來消耗時間而已
CountOld CountNew 是全局變量嗎?說不定在其它地方還有用得著的
作者: guhuawei19    時間: 2021-12-11 12:59
Y_G_G 發表于 2021-12-6 22:53
XC8編譯器自帶延時函數  __delay_ms()
PICC編譯器好像功能更多,延時函數肯定是有的
已經有現成的,就不 ...

全局變量
作者: 東方木青龍    時間: 2021-12-11 14:54
一個是保存的0XD9一個保存實時的TMR0值,當溢出時退出while循環即延時10ms
作者: MCU_FANS    時間: 2021-12-29 10:50
188610329 發表于 2021-12-6 16:51
不管有沒有中斷, TMR0 是定時器吧? 理論上 TMR0 向上計數吧? 當TMR0 溢出之后,

while (CountNew  > ...

你的理解是對的,不過這種阻塞延時直接用編譯器的延時宏即可,用定時器反而麻煩且浪費資源。以PIC10F200為例:
  1. #define _XTAL_FREQ                4000000

  2. void DelayXmS(unsigned int _Delay)
  3. {
  4.         unsigned int i;

  5.         for(i = 0; i < _Delay; i++)
  6.         {
  7.                 __delay_ms(1);
  8.                 CLRWDT();
  9.         }
  10. }
復制代碼
__delay_ms(x) 是一個延時宏,并非函數,x只能是立即數,所以得封裝一下。

當然對于大部分應用,很多阻塞延時是可以用狀態機輪詢來實現的,這樣CPU資源不會被阻塞占用,整個系統的實時性會很好控制。





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