找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2584|回復(fù): 10
收起左側(cè)

這段單片機(jī)程序具體什么意思?為什么先要給TMR0兩個(gè)計(jì)數(shù)

[復(fù)制鏈接]
ID:216579 發(fā)表于 2021-12-4 11:51 | 顯示全部樓層 |閱讀模式
for(i =y;i>0;i--)
     {
     TMR0 = 0xD9; //延時(shí)10ms
     CountOld  = TMR0;
     CountNew = TMR0;
     while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
     }
為什么先要給TMR0兩個(gè)計(jì)數(shù)

回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-12-4 23:44 | 顯示全部樓層
代碼不全,沒辦法給你解釋清楚。
只能告訴你,有另外一個(gè)中斷程序,會(huì)改寫 TMR0

     while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
當(dāng) TMR0 在另外一個(gè)中斷的作用下,減小的時(shí)候,會(huì)跳出 這個(gè) while, 反之,會(huì)死在這個(gè)循環(huán)里 至于具體如何跳出這個(gè)外面這個(gè)for, 要看y的定義了。
回復(fù)

使用道具 舉報(bào)

ID:216579 發(fā)表于 2021-12-6 08:49 | 顯示全部樓層
int mydelay_ms(int y)  //延時(shí) y*10 ms
{
    uchar i;
   

     for(i =y;i>0;i--)
     {
     TMR0 = 0xD9; //延時(shí)10ms
     CountOld  = TMR0;
     CountNew = TMR0;
     while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
     }
}
回復(fù)

使用道具 舉報(bào)

ID:216579 發(fā)表于 2021-12-6 08:49 | 顯示全部樓層
int mydelay_ms(int y)  //延時(shí) y*10 ms
{
    uchar i;
   

     for(i =y;i>0;i--)
     {
     TMR0 = 0xD9; //延時(shí)10ms
     CountOld  = TMR0;
     CountNew = TMR0;
     while (CountNew  >= CountOld)   
     {
         CountOld = CountNew;
         CountNew = TMR0;
     }
     }
}
回復(fù)

使用道具 舉報(bào)

ID:155507 發(fā)表于 2021-12-6 10:55 | 顯示全部樓層
PIC16f877a 具有三個(gè)獨(dú)立的定時(shí)器,可用作定時(shí)器、計(jì)數(shù)器或用于 PWM 生成。

Timer 0
TMR0 模塊是一個(gè) 8 位定時(shí)器/計(jì)數(shù)器,具有以下特性:

  • 8位定時(shí)器/計(jì)數(shù)器
  • 可讀可寫
  • 8 位軟件可編程預(yù)分頻器
  • 內(nèi)部或外部時(shí)鐘選擇
  • 從 FFh 溢出到 00h 時(shí)中斷
  • 外部時(shí)鐘的邊沿選擇

Timer0_Block_Diagram.png


這段單片機(jī)程序具體的意思是用定時(shí)器實(shí)現(xiàn)準(zhǔn)確的延時(shí)程序




回復(fù)

使用道具 舉報(bào)

ID:216579 發(fā)表于 2021-12-6 11:02 | 顯示全部樓層
angmall 發(fā)表于 2021-12-6 10:55
PIC16f877a 具有三個(gè)獨(dú)立的定時(shí)器,可用作定時(shí)器、計(jì)數(shù)器或用于 PWM 生成。

Timer 0

單片機(jī)用的PIC10F200, 沒有中斷
回復(fù)

使用道具 舉報(bào)

ID:624769 發(fā)表于 2021-12-6 16:51 | 顯示全部樓層
guhuawei19 發(fā)表于 2021-12-6 11:02
單片機(jī)用的PIC10F200, 沒有中斷

不管有沒有中斷, TMR0 是定時(shí)器吧? 理論上 TMR0 向上計(jì)數(shù)吧? 當(dāng)TMR0 溢出之后,

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

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

回復(fù)

使用道具 舉報(bào)

ID:401564 發(fā)表于 2021-12-6 22:53 | 顯示全部樓層
guhuawei19 發(fā)表于 2021-12-6 08:49
int mydelay_ms(int y)  //延時(shí) y*10 ms
{
    uchar i;

XC8編譯器自帶延時(shí)函數(shù)  __delay_ms()
PICC編譯器好像功能更多,延時(shí)函數(shù)肯定是有的
已經(jīng)有現(xiàn)成的,就不需要去折騰那么多
為什么要兩個(gè)計(jì)數(shù),有可能就是單純的增加指令來(lái)消耗時(shí)間而已
CountOld CountNew 是全局變量嗎?說(shuō)不定在其它地方還有用得著的
回復(fù)

使用道具 舉報(bào)

ID:216579 發(fā)表于 2021-12-11 12:59 | 顯示全部樓層
Y_G_G 發(fā)表于 2021-12-6 22:53
XC8編譯器自帶延時(shí)函數(shù)  __delay_ms()
PICC編譯器好像功能更多,延時(shí)函數(shù)肯定是有的
已經(jīng)有現(xiàn)成的,就不 ...

全局變量
回復(fù)

使用道具 舉報(bào)

ID:990881 發(fā)表于 2021-12-11 14:54 | 顯示全部樓層
一個(gè)是保存的0XD9一個(gè)保存實(shí)時(shí)的TMR0值,當(dāng)溢出時(shí)退出while循環(huán)即延時(shí)10ms
回復(fù)

使用道具 舉報(bào)

ID:962286 發(fā)表于 2021-12-29 10:50 | 顯示全部樓層
188610329 發(fā)表于 2021-12-6 16:51
不管有沒有中斷, TMR0 是定時(shí)器吧? 理論上 TMR0 向上計(jì)數(shù)吧? 當(dāng)TMR0 溢出之后,

while (CountNew  > ...

你的理解是對(duì)的,不過這種阻塞延時(shí)直接用編譯器的延時(shí)宏即可,用定時(shí)器反而麻煩且浪費(fèi)資源。以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. }
復(fù)制代碼
__delay_ms(x) 是一個(gè)延時(shí)宏,并非函數(shù),x只能是立即數(shù),所以得封裝一下。

當(dāng)然對(duì)于大部分應(yīng)用,很多阻塞延時(shí)是可以用狀態(tài)機(jī)輪詢來(lái)實(shí)現(xiàn)的,這樣CPU資源不會(huì)被阻塞占用,整個(gè)系統(tǒng)的實(shí)時(shí)性會(huì)很好控制。
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表