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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5080|回復(fù): 32
打印 上一主題 下一主題
收起左側(cè)

STC 1T單片機(jī)的奇怪情況

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:161164 發(fā)表于 2021-10-24 12:27 | 只看該作者 |只看大圖 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
先上單片機(jī)代碼
  1. #include <reg52.h>

  2. sbit LED=P3^5;

  3. unsigned short TMR_XX_OT;

  4. sfr AUXR = 0x8E;
  5. void Timer0Init(void)                //1毫秒@12.000MHz
  6. {
  7.         AUXR &= 0x7F;                //定時器時鐘12T模式
  8.         TMOD &= 0xF0;                //設(shè)置定時器模式
  9.         TMOD |= 0x01;                //設(shè)置定時器模式
  10.         TL0 = 0x18;                //設(shè)置定時初始值
  11.         TH0 = 0xFC;                //設(shè)置定時初始值
  12.         TF0 = 0;                //清除TF0標(biāo)志
  13.         TR0 = 1;                //定時器0開始計時
  14. }
  15. void timer0_int (void) interrupt 1
  16. {
  17.         TL0 = 0x18;                //設(shè)置定時初始值
  18.         TH0 = 0xFC;                //設(shè)置定時初始值
  19.         if(TMR_XX_OT)TMR_XX_OT--;
  20. }

  21. void main()
  22. {
  23.     Timer0Init();
  24.         IE = 0;
  25.                 ET0 = 1;
  26.                 EA = 1;
  27.     while(1)
  28.                 {                        
  29.                         if(!TMR_XX_OT)
  30.                         {TMR_XX_OT=270;
  31.                                 LED = !LED;
  32.                         }
  33.                 }
  34. }
復(fù)制代碼

這是STC89C52的運(yùn)行情況



這是STC15的運(yùn)行情況



這是STC15改為TMR_XX_OT=250;的運(yùn)行情況




TMR_XX_OT的數(shù)據(jù)類型已經(jīng)是unsigned short (0 to 65535)
賦270不會溢出吧?

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:57657 發(fā)表于 2021-10-24 18:15 | 只看該作者
8位單片機(jī)向16位變量賦值,是分成兩條指令完成的。
先賦值高8位,此時中斷觸發(fā)改變了該變量的值。
中斷返回后再去賦值低8位,導(dǎo)致程序出錯。
回復(fù)

使用道具 舉報

板凳
ID:624769 發(fā)表于 2021-10-24 18:52 | 只看該作者
TMOD = 0x00;     //16位自動重載模式

bit     T_OT_Flag;    //增加一個標(biāo)志位

void timer0_int (void) interrupt 1
{
//        TL0 = 0x18;                //設(shè)置定時初始值
//        TH0 = 0xFC;                //設(shè)置定時初始值    自動重載不需要設(shè)置
        if(--TMR_XX_OT==0)
        {
              TMR_XX_OT = 270;
              T_OT_Flag = 1;
        }
}

while 里面這么寫:

    while(1)
                {                        
                        if(T_OT_Flag)
                        {
                                T_OT_Flag = 0;
                                LED = !LED;
                        }
                }


然后試試看。
回復(fù)

使用道具 舉報

地板
ID:161164 發(fā)表于 2021-10-24 19:06 | 只看該作者
npn 發(fā)表于 2021-10-24 18:15
8位單片機(jī)向16位變量賦值,是分成兩條指令完成的。
先賦值高8位,此時中斷觸發(fā)改變了該變量的值。
中斷返 ...

不太可能
我試過停止定時器再賦值再運(yùn)行定時器都會出現(xiàn)這種情況
TR0 = 0;TMR_XX_OT=270;TR0 = 1;

反而在while(1)底加上4個_nop_()就可以正常運(yùn)作
是因?yàn)?T單片機(jī)太快了嗎?
回復(fù)

使用道具 舉報

5#
ID:624769 發(fā)表于 2021-10-24 19:25 | 只看該作者
lkc8210 發(fā)表于 2021-10-24 19:06
不太可能
我試過停止定時器再賦值再運(yùn)行定時器都會出現(xiàn)這種情況
TR0 = 0;TMR_XX_OT=270;TR0 = 1;

你的問題不是 定時器賦值,而是那個TMR_XX_OT 的判斷,必須放到定時器里判斷是否為0,不能放在外面判斷。
回復(fù)

使用道具 舉報

6#
ID:161164 發(fā)表于 2021-10-24 19:36 來自手機(jī) | 只看該作者
188610329 發(fā)表于 2021-10-24 19:25
你的問題不是 定時器賦值,而是那個TMR_XX_OT 的判斷,必須放到定時器里判斷是否為0,不能放在外面判斷。

為什么?
回復(fù)

使用道具 舉報

7#
ID:624769 發(fā)表于 2021-10-24 21:08 | 只看該作者

你按我寫的改了之后,不就知道了?
回復(fù)

使用道具 舉報

8#
ID:213173 發(fā)表于 2021-10-24 21:16 | 只看該作者

從邏輯上看程序沒有問題,但同一個16位變量在主函數(shù)和中斷中都可以操作容易出錯,有前輩就此問題詳細(xì)闡述過。擇錄如下:
        /* 注釋二:
        * ET0=0;uiTimeCnt=0;ET0=1;----在清零 uiTimeCnt 之前,為什么要先禁止定時中斷?
        * 因?yàn)?uiTimeCnt 是 unsigned int 類型,本質(zhì)上是由兩個字節(jié)組成。
        * 在 C 語言中 uiTimeCnt=0 看似一條指令,實(shí)際上經(jīng)過編譯之后它不只一條匯編指令。
        * 由于定時中斷函數(shù)里也對這個變量進(jìn)行累加操作,如果不禁止定時中斷,
        * 那么 uiTimeCnt 這個變量在 main()函數(shù)中還沒被完全清零的時候,如果這個時候
        * 突然來一個定時中斷,并且在中斷里又更改了此變量,這種情況在某些要求高的
        * 項(xiàng)目上會是一個不容易察覺的漏洞,為項(xiàng)目帶來隱患。當(dāng)然,大部分的普通項(xiàng)目,
        * 都可以不用那么嚴(yán)格,可以不用禁止定時中斷。在這里只是提醒各位初學(xué)者有這種情況。
        */
建議改寫為:
void timer0_int (void) interrupt 1
{
        TL0 = 0x18;                //設(shè)置定時初始值
        TH0 = 0xFC;                //設(shè)置定時初始值
        if(--TMR_XX_OT==0)
        {
                TMR_XX_OT=270;
                flag=1;
        }
}

void main()
{
        Timer0Init();
        IE = 0;
        ET0 = 1;
        EA = 1;
        while(1)
        {
                if(flag)
                {
                        flag=0;
                        LED = !LED;
                }
        }
}
回復(fù)

使用道具 舉報

9#
ID:161164 發(fā)表于 2021-10-24 21:38 來自手機(jī) | 只看該作者
188610329 發(fā)表于 2021-10-24 21:08
你按我寫的改了之后,不就知道了?

改了后可以是可以,但是為什么1T會這樣,12T就正常?
回復(fù)

使用道具 舉報

10#
ID:161164 發(fā)表于 2021-10-24 22:34 | 只看該作者
本帖最后由 lkc8210 于 2021-10-24 23:01 編輯

改用聯(lián)合體又正常了
  1. #include <reg52.h>

  2. sbit LED1=P3^5;

  3. typedef union{
  4.    unsigned char Dat_c[2];
  5.    unsigned int Dat_i;
  6. }EData;

  7. EData TMR_XX;
  8. sfr AUXR = 0x8E;
  9. void Timer0Init(void)                //1毫秒@12.000MHz
  10. {
  11.         AUXR &= 0x7F;                //定時器時鐘12T模式
  12.         TMOD &= 0xF0;                //設(shè)置定時器模式
  13.         TMOD |= 0x00;                //設(shè)置定時器模式
  14.         TL0 = 0x18;                //設(shè)置定時初始值
  15.         TH0 = 0xFC;                //設(shè)置定時初始值
  16.         TF0 = 0;                //清除TF0標(biāo)志
  17.         TR0 = 1;                //定時器0開始計時
  18. }
  19. void timer0_int (void) interrupt 1
  20. {
  21.                 if(TMR_XX.Dat_i)TMR_XX.Dat_i--;
  22. }

  23. void main()
  24. {
  25.     Timer0Init();
  26.                 ET0 = 1;
  27.                 EA = 1;
  28.     while(1)
  29.                 {                        
  30.                         if(!TMR_XX.Dat_c[0] && !TMR_XX.Dat_c[1])
  31.                         {TMR_XX.Dat_i=270;
  32.                                 LED1 = !LED1;
  33.                         }
  34.                 }
  35. }
復(fù)制代碼



編譯出來發(fā)現(xiàn)if(!TMR_XX_OT)是用ORL
  1.     30:                         if(!TMR_01_OT)
  2. C:0x0013    E509     MOV      A,0x09
  3. C:0x0015    4508     ORL      A,TMR_01_OT(0x08)
  4. C:0x0017    70FA     JNZ      C:0013
  5.     31:                         {TMR_01_OT=270;
  6. C:0x0019    750801   MOV      TMR_01_OT(0x08),#0x01
  7. C:0x001C    75090E   MOV      0x09,#0x0E
復(fù)制代碼



if(!TMR_XX.Dat_c[0] && !TMR_XX.Dat_c[1]) 是用兩個JNZ
  1.     34:                         if(!TMR_XX.Dat_c[0] && !TMR_XX.Dat_c[1])
  2. C:0x0013    E508     MOV      A,TMR_XX(0x08)
  3. C:0x0015    70FC     JNZ      C:0013
  4. C:0x0017    E509     MOV      A,0x09
  5. C:0x0019    70F8     JNZ      C:0013
  6.     35:                         {TMR_XX.Dat_i=270;
  7. C:0x001B    750801   MOV      TMR_XX(0x08),#0x01
  8. C:0x001E    75090E   MOV      0x09,#0x0E
復(fù)制代碼



是ORL有問題嗎?
回復(fù)

使用道具 舉報

11#
ID:624769 發(fā)表于 2021-10-25 00:24 | 只看該作者
lkc8210 發(fā)表于 2021-10-24 21:38
改了后可以是可以,但是為什么1T會這樣,12T就正常?

不是 1T 的問題, 12T也會有這個問題,只是相比1T不容易出現(xiàn)(或者說不容易顯現(xiàn)出來)。而且你原程序,不是那么簡單的幾句吧?應(yīng)該有更多的內(nèi)容,這次是為了測試才變那么“迷你”的吧?這是好事,以后程序復(fù)雜了,你沒有注意這點(diǎn)的話,發(fā)生“詭異”事件,反而更麻煩。

其實(shí)道理很簡單,中斷和主程序 或者 高級中斷和低級中斷之間傳參的話,8位機(jī)(51屬于8位機(jī))必須避免16位傳參,因?yàn)椴豢杀孛鈺l(fā)生這樣的事情(程序越簡單發(fā)生概率越高):主程序在處理16位的變量,處理了其中的8位,這個時候中斷打斷,改寫了整個16位,這個時候返回主程序,主程序繼續(xù)處理剩下沒處理的8位(這8位已經(jīng)是新的數(shù)據(jù)了),那么這個結(jié)果會錯的離譜。
所以,一旦有16位甚至32位的數(shù)據(jù)在中斷里累加累減計數(shù),達(dá)到你預(yù)期值的時候,必須轉(zhuǎn)換成一個標(biāo)志(bit),然后讓主程序按這個標(biāo)志去執(zhí)行。
回復(fù)

使用道具 舉報

12#
ID:401564 發(fā)表于 2021-10-25 08:34 | 只看該作者
lkc8210 發(fā)表于 2021-10-24 21:38
改了后可以是可以,但是為什么1T會這樣,12T就正常?

這跟什么T的沒有關(guān)系
12T能正常只是運(yùn)氣好而已,程序本身就是錯誤的
回復(fù)

使用道具 舉報

13#
ID:420836 發(fā)表于 2021-10-25 08:50 | 只看該作者
應(yīng)該是代碼的原因。 請仔細(xì)檢查程序。
回復(fù)

使用道具 舉報

14#
ID:161164 發(fā)表于 2021-10-25 11:12 | 只看該作者
188610329 發(fā)表于 2021-10-25 00:24
不是 1T 的問題, 12T也會有這個問題,只是相比1T不容易出現(xiàn)(或者說不容易顯現(xiàn)出來)。而且你原程序,不 ...

10樓有新發(fā)現(xiàn)但審批遲了

我試過停止定時器再賦值再運(yùn)行定時器
TR0 = 0;TMR_XX_OT=270;TR0 = 1;
已經(jīng)確保定時器中斷不會打斷變量的賦值
也會出現(xiàn)這種情況
回復(fù)

使用道具 舉報

15#
ID:161164 發(fā)表于 2021-10-25 11:16 | 只看該作者
wulin 發(fā)表于 2021-10-24 21:16
從邏輯上看程序沒有問題,但同一個16位變量在主函數(shù)和中斷中都可以操作容易出錯,有前輩就此問題詳細(xì)闡述 ...

10樓有新發(fā)現(xiàn)但審批遲了

我試過停止定時器再賦值再運(yùn)行定時器
TR0 = 0;TMR_XX_OT=270;TR0 = 1;
已經(jīng)確保定時器中斷不會打斷變量的賦值
也會出現(xiàn)這種情況
停止運(yùn)行定時器和禁止定時中斷在防止打斷賦值的功能上是等價的吧?
回復(fù)

使用道具 舉報

16#
ID:161164 發(fā)表于 2021-10-25 11:22 | 只看該作者
TTQ001 發(fā)表于 2021-10-25 08:50
應(yīng)該是代碼的原因。 請仔細(xì)檢查程序。

在STC89上可以正常運(yùn)行
應(yīng)該不會是代碼或邏輯的問題
回復(fù)

使用道具 舉報

17#
ID:624769 發(fā)表于 2021-10-25 13:56 | 只看該作者
lkc8210 發(fā)表于 2021-10-25 11:12
10樓有新發(fā)現(xiàn)但審批遲了

我試過停止定時器再賦值再運(yùn)行定時器

說了,不是賦值的問題,是判斷的問題,
你要關(guān)定時器的話,得在 if 之前關(guān),然后,整個 if 結(jié)束之后開才能徹底杜絕這個問題,而且,在if之前關(guān),因?yàn)槭?5系列,要在ET0=0 之后放一個NOP,

其實(shí),一個簡單的傳標(biāo)志搞定的事情,不知道為啥你非要傳short……
回復(fù)

使用道具 舉報

18#
ID:959346 發(fā)表于 2021-10-25 16:07 | 只看該作者
lkc8210 發(fā)表于 2021-10-25 11:22
在STC89上可以正常運(yùn)行
應(yīng)該不會是代碼或邏輯的問題

TR0 = 0;TMR_XX_OT=270;TR0 = 1;
你在關(guān)閉定時器后清除一下定時器中斷標(biāo)志,然后加2個NOP,看看。
按你10樓回復(fù),你把TMR_XX.Dat_i=270;改成插入?yún)R編,然后先賦值低字節(jié)的,然后賦值高字節(jié)的,
MOV      0x09,#0x0E
MOV      TMR_XX(0x08),#0x01
或者直接TMR_XX.Dat_i=270;TMR_XX.Dat_i=270;寫2次,
看看是什么情況?
回復(fù)

使用道具 舉報

19#
ID:123289 發(fā)表于 2021-10-25 17:31 | 只看該作者
都是不認(rèn)真讀手冊的結(jié)果:

15.        TMOD &= 0xF0;                //設(shè)置定時器模式

在89C52中,這是13位定時器模式(注意不是16位),TH0TL0=FC18,中只有13位起作用,即時常數(shù)不是真正的FC18!
在STC中,設(shè)計者將定時器做了改進(jìn),增加了一個TH0TL0,的影子TH0TL0’,它們共用一個地址,這樣做的好處是,可以進(jìn)行16自動重裝,所以在
在STC中,它是16位自動重裝模式,時常數(shù)是真正的16位:FC18!
回復(fù)

使用道具 舉報

20#
ID:57657 發(fā)表于 2021-10-25 19:38 | 只看該作者
你遇到的問題和這個程序一樣,很多新人都會遇到:
  1. #include "reg51.h"
  2. #include "intrins.h"
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. u16 i;
  6. sbit CLK = P3 ^ 0;
  7. sbit ERR = P3 ^ 1;
  8. sbit ERR2 = P3 ^ 2;

  9. void InitTimer0(){
  10.     TMOD = 0x01;
  11.     TH0 = 0xFC;
  12.     TL0 = 0x18;
  13.     EA = 1;
  14.     ET0 = 1;
  15.     TR0 = 1;
  16. }

  17. void main() {
  18.     InitTimer0();
  19.     ERR = 1; ERR2 = 1;
  20.         while (1) {
  21.                 i = 0xABCD;     //16位變量:先賦值高8位,再賦值低8位
  22.                 i = 0x1234;     //觸發(fā)中斷只等待指令執(zhí)行完成,不等待低8位賦值完成,中斷返回后才會去賦值低8位
  23.         //正確寫法:
  24.         //_push_(IE); IE = 0; i = 0xABCD; _pop_(IE);
  25.         //_push_(IE); IE = 0; i = 0x1234; _pop_(IE);
  26.         }
  27. }

  28. void Timer0Interrupt() interrupt 1{
  29.     TH0 = 0xFC;
  30.     TL0 = 0x18;
  31.     CLK = !CLK;
  32.     if (i != 0xABCD && i != 0x1234) {       //中斷讀取變量i,既不是0xABCD,也不是0x1234
  33.         ERR = 0;        //讀取出錯點(diǎn)亮
  34.         if (i != 0xAB34 && i != 0x12CD) {   //如果讀取出錯,會讀到這兩個值
  35.             ERR2 = 0;       //此燈如果被點(diǎn)亮則程序跑飛
  36.         }
  37.     }

  38. }
復(fù)制代碼
回復(fù)

使用道具 舉報

21#
ID:161164 發(fā)表于 2021-10-26 01:02 | 只看該作者
188610329 發(fā)表于 2021-10-25 13:56
說了,不是賦值的問題,是判斷的問題,
你要關(guān)定時器的話,得在 if 之前關(guān),然后,整個 if 結(jié)束之后開才能徹 ...

因?yàn)橐粋TMR_XX就加一個傳標(biāo)志
如果有幾個TMR_XX就要加幾個傳標(biāo)志

借鑒了你的代碼
已找到解決方法
回復(fù)

使用道具 舉報

22#
ID:161164 發(fā)表于 2021-10-26 01:07 | 只看該作者
Jiang_YY 發(fā)表于 2021-10-25 16:07
TR0 = 0;TMR_XX_OT=270;TR0 = 1;
你在關(guān)閉定時器后清除一下定時器中斷標(biāo)志,然后加2個NOP,看看。
按你 ...

不懂如何插入?yún)R編
試了賦值兩次,都是重覆那個問題

已找到解決方法
回復(fù)

使用道具 舉報

23#
ID:161164 發(fā)表于 2021-10-26 01:10 | 只看該作者
yzwzfyz 發(fā)表于 2021-10-25 17:31
都是不認(rèn)真讀手冊的結(jié)果:

15.        TMOD &= 0xF0;                //設(shè)置定時器模式

你是不認(rèn)真看貼子的結(jié)果

就算是用了13位定時器也不會出現(xiàn)閃爍不均勻的情況
回復(fù)

使用道具 舉報

24#
ID:161164 發(fā)表于 2021-10-26 01:14 | 只看該作者
npn 發(fā)表于 2021-10-25 19:38
你遇到的問題和這個程序一樣,很多新人都會遇到:

有點(diǎn)覆雜

借鑒了你, 188610329總和wulin總的回覆
得出改善的代碼如下

  1. #include <reg52.h>

  2. typedef         unsigned char        u8;  //0 to 255
  3. typedef         unsigned int        u16;  //0 to 65535
  4. typedef         unsigned long        u32;  //0 to 4294967295
  5. sbit LED1=P3^5;
  6. sbit LED2=P3^4;
  7. sbit LED3=P3^3;
  8. sbit LED4=P3^2;
  9. bit T0_INT;
  10. u16 TMR_01_OT;
  11. u16 TMR_02_OT;
  12. u16 TMR_03_OT;
  13. u16 TMR_04_OT;

  14. sfr AUXR = 0x8E;
  15. void Timer0Init(void)                //1毫秒@12.000MHz
  16. {
  17.         AUXR &= 0x7F;                //定時器時鐘12T模式
  18.         TMOD &= 0xF0;                //設(shè)置定時器模式
  19.         TMOD |= 0x00;                //設(shè)置定時器模式
  20.         TL0 = 0x18;                //設(shè)置定時初始值
  21.         TH0 = 0xFC;                //設(shè)置定時初始值
  22.         TF0 = 0;                //清除TF0標(biāo)志
  23.         TR0 = 1;                //定時器0開始計時
  24. }
  25. void timer0_int (void) interrupt 1
  26. {
  27.         INT0_EN = 1;
  28. }

  29. void main()
  30. {
  31.     Timer0Init();
  32.                 ET0 = 1;
  33.                 EA = 1;
  34.     while(1)
  35.                 {                       
  36.                         if(!TMR_01_OT)
  37.                         {TMR_01_OT=270;
  38.                                 LED1 = !LED1;
  39.                         }
  40.                         if(!TMR_02_OT)
  41.                         {TMR_02_OT=273;
  42.                                 LED2 = !LED2;
  43.                         }
  44.                         if(!TMR_03_OT)
  45.                         {TMR_03_OT=277;
  46.                                 LED3 = !LED3;
  47.                         }
  48.                         if(!TMR_04_OT)
  49.                         {TMR_04_OT=281;
  50.                                 LED4 = !LED4;
  51.                         }
  52.                         if(INT0_EN)
  53.                         {
  54.                                 INT0_EN = 0;
  55.                                 if(TMR_01_OT)TMR_01_OT--;
  56.                                 if(TMR_02_OT)TMR_02_OT--;
  57.                                 if(TMR_03_OT)TMR_03_OT--;
  58.                                 if(TMR_04_OT)TMR_04_OT--;
  59.                         }
  60.                 }
  61. }
復(fù)制代碼
回復(fù)

使用道具 舉報

25#
ID:624769 發(fā)表于 2021-10-26 17:59 | 只看該作者
lkc8210 發(fā)表于 2021-10-26 01:14
有點(diǎn)覆雜

借鑒了你, 188610329總和wulin總的回覆

雖然,你這個修正解決了你目前的問題,但是,這個方案是有缺陷的:如果你程序比較長,定時器定時比較短,會出現(xiàn)掉幀的問題,即:當(dāng)定時器把 INT0_EN 置1之后,你的主程序還沒有來的及判斷 INT0_EN 是否為1,你的定時器再次觸發(fā),又一次把 INT0_EN 置一, 這個時候,你的主程序 才開始第一次判斷,那么就會少減一次(那么頻率就會不對)。所以這時候,通常會用傳char來避免這樣的情況發(fā)生。

代碼如下:

unsigned char INT0_Times,Temp;

void timer0_int (void) interrupt 1
{
        INT0_Times++;
}

void main()
{
    Timer0Init();
                ET0 = 1;
                EA = 1;
    while(1)
                {                        
                         if(INT0_Times != 0)                        {
                               Temp = INT0_Times;                               INT0_Times  -= Temp;     //防止這個時候中斷觸發(fā)又改寫了  INT0_Times  所以不直接 = 0,而用減法
                               TMR_01_OT  -= Temp;
                               if(CY)                       //有借位則反轉(zhuǎn)LED以及賦新值
                               {
                                   TMR_01_OT  +=270;
                                   LED1 = !LED1;
                                }
                                TMR_02_OT -=  Temp;
                                if(CY)
                               {         
                                    TMR_02_OT   +=273;
                                    LED2 = !LED2;
                                }                                TMR_03_OT -=  Temp;
                                if(CY)
                               {
                                     TMR_03_OT   +=277;
                                     LED3 = !LED3;
                               }                               TMR_04_OT -=  Temp;
                               if(CY)
                               {
                                     TMR_04_OT   +=281;
                                      LED4 = !LED4;
                               }
                        }
                }
}




這樣,就能避免掉幀的問題,并且如果這次少了1拍,下次會補(bǔ)回來,總的頻率不會發(fā)生變化,你可以參考一下。
回復(fù)

使用道具 舉報

26#
ID:161164 發(fā)表于 2021-10-28 00:55 | 只看該作者
188610329 發(fā)表于 2021-10-26 17:59
雖然,你這個修正解決了你目前的問題,但是,這個方案是有缺陷的:如果你程序比較長,定時器定時比較短, ...

受教了
回復(fù)

使用道具 舉報

27#
ID:235055 發(fā)表于 2022-1-5 22:23 | 只看該作者
怎么后面的幾個程序中定時器中斷響應(yīng)后沒有重復(fù)初值了?
回復(fù)

使用道具 舉報

28#
ID:155507 發(fā)表于 2022-1-5 22:52 | 只看該作者
sunny118 發(fā)表于 2022-1-5 22:23
怎么后面的幾個程序中定時器中斷響應(yīng)后沒有重復(fù)初值了?

因?yàn)槭?自動重裝
回復(fù)

使用道具 舉報

29#
ID:161164 發(fā)表于 2022-1-5 22:54 | 只看該作者
sunny118 發(fā)表于 2022-1-5 22:23
怎么后面的幾個程序中定時器中斷響應(yīng)后沒有重復(fù)初值了?


回復(fù)

使用道具 舉報

30#
ID:235055 發(fā)表于 2022-1-6 22:49 | 只看該作者
受教了,還以為是13位的方式0呢!
回復(fù)

使用道具 舉報

31#
ID:476652 發(fā)表于 2022-1-28 12:50 | 只看該作者
大神過招,我只能看來看去,啥也看不懂!!
回復(fù)

使用道具 舉報

32#
ID:849913 發(fā)表于 2024-7-7 16:42 | 只看該作者
引腳設(shè)置了 嗎?P0M0 P0M1--P7M0 P7M1
回復(fù)

使用道具 舉報

33#
ID:161164 發(fā)表于 2024-7-7 23:10 | 只看該作者
老董 發(fā)表于 2024-7-7 16:42
引腳設(shè)置了 嗎?P0M0 P0M1--P7M0 P7M1

不知道為啥舊帖子被推上來了
問題已經(jīng)解決很久了
就是8樓wulin 說的原因
8位機(jī)要避免同時在中斷和主循環(huán)運(yùn)算和比較多于8位的變量
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美亚洲国产一区二区三区 | re久久| 国产成人精品免费 | 91精品国产综合久久久动漫日韩 | 国产精品一区一区 | 毛片视频网址 | 久久精品一区二区三区四区 | 成人免费毛片在线观看 | 久久福利电影 | 久久久久久亚洲国产精品 | 成人在线免费电影 | 91麻豆产精品久久久久久 | av毛片免费| 久久精品一区二区三区四区 | www.久久久| 美女久久视频 | 亚洲一区二区三区视频免费观看 | 欧美6一10sex性hd | 日本a在线 | 亚洲精品中文在线观看 | 玖玖视频 | 亚洲香蕉在线视频 | 日本人爽p大片免费看 | 久久九| 黄色91在线 | 国产激情三区 | av乱码| 久久专区 | 成人精品一区 | 午夜小电影 | 国产精品久久久久久久久久三级 | 欧美成人激情 | 亚洲精品九九 | av资源中文在线天堂 | 在线观看电影av | 亚洲在线 | 看特级黄色片 | 亚洲欧美中文日韩在线v日本 | 国产精品久久av | 狠狠狠色丁香婷婷综合久久五月 | 欧美一级二级在线观看 |