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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2492|回復: 10
收起左側

這段單片機程序具體什么意思?為什么先要給TMR0兩個計數

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

回復

使用道具 舉報

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

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

使用道具 舉報

ID:216579 發表于 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;
     }
     }
}
回復

使用道具 舉報

ID:216579 發表于 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;
     }
     }
}
回復

使用道具 舉報

ID:155507 發表于 2021-12-6 10:55 | 顯示全部樓層
PIC16f877a 具有三個獨立的定時器,可用作定時器、計數器或用于 PWM 生成。

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

  • 8位定時器/計數器
  • 可讀可寫
  • 8 位軟件可編程預分頻器
  • 內部或外部時鐘選擇
  • 從 FFh 溢出到 00h 時中斷
  • 外部時鐘的邊沿選擇

Timer0_Block_Diagram.png


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




回復

使用道具 舉報

ID:216579 發表于 2021-12-6 11:02 | 顯示全部樓層
angmall 發表于 2021-12-6 10:55
PIC16f877a 具有三個獨立的定時器,可用作定時器、計數器或用于 PWM 生成。

Timer 0

單片機用的PIC10F200, 沒有中斷
回復

使用道具 舉報

ID:624769 發表于 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);
     }
}

回復

使用道具 舉報

ID:401564 發表于 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 是全局變量嗎?說不定在其它地方還有用得著的
回復

使用道具 舉報

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

全局變量
回復

使用道具 舉報

ID:990881 發表于 2021-12-11 14:54 | 顯示全部樓層
一個是保存的0XD9一個保存實時的TMR0值,當溢出時退出while循環即延時10ms
回復

使用道具 舉報

ID:962286 發表于 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資源不會被阻塞占用,整個系統的實時性會很好控制。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 欧美精品一区二区免费视频 | 谁有毛片 | 亚洲精品久久嫩草网站秘色 | 天天综合网天天综合 | 国产精品1区2区3区 一区中文字幕 | 国产成人免费 | 久久久999成人 | 国产成人高清在线观看 | 国产在线1 | 午夜影院 | 国产影音先锋 | 国产精品久久久久久久久久免费看 | www.五月婷婷.com | 午夜一区| 美女亚洲一区 | 亚洲va欧美va人人爽午夜 | 国产精品国产三级国产aⅴ中文 | 欧美精品一区在线观看 | 国产精品久久久久久久午夜片 | 国产精品一区在线 | 国产精品免费一区二区三区四区 | 日本三级日产三级国产三级 | 免费视频一区二区三区在线观看 | 欧美一级片免费看 | 国产欧美在线一区二区 | 99精品欧美一区二区蜜桃免费 | 丝袜 亚洲 另类 欧美 综合 | 成人av久久 | 美女视频一区二区 | 欧美日本在线观看 | 国产成人综合在线 | 三级黄色片在线 | 亚洲精品视频在线观看视频 | 国产精品久久久久久久久久久久 | 国产福利在线看 | 婷婷二区 | 国产日韩一区二区三区 | 久久精品久久久久久 | 国产一区在线免费 | 日韩精品免费一区二区在线观看 | 午夜精品久久久 |