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

標題: c51單片機利用定時器0產生38khz方波的問題 [打印本頁]

作者: macboa    時間: 2021-11-5 03:13
標題: c51單片機利用定時器0產生38khz方波的問題
  1. void khz(uchar aa)
  2. {
  3.     for(a=aa;a>0;a--)       //這個for語句可以得到準確的26.3波特率
  4.     {
  5.         out=0;
  6.         i=7;            
  7.         while(i>0) i--;    //38kHZ  
  8.         out=1;            
  9.     }
  10. }
復制代碼
調用 khz(116);即可產生38.5khz
但如果改成
  1. void khz()
  2. {
  3.     for(a=116;a>0;a--)   
  4.     {
  5.         out=0;
  6.         i=7;            
  7.         while(i>0) i--;   
  8.         out=1;            
  9.     }
  10. }
復制代碼

調用 khz();頻率就會變成50khz
請問兩組代碼為什么會出現這樣的差異?另外下面的一段代碼是像利用定時器生成38khz方波,環境是stc90c51rc+12mhz時鐘,定時器初始化后,這里是13us的溢出中斷,取反各一次后是26us,主函數沒有任何其他語句,按道理應該是獲得38KHZ的方波啊,但是示波器顯示是26KHZ,請大神明示~~~

  1. void Timer0_Routine(void) interrupt 1
  2. {
  3.         TL0=0xF3;
  4.         TH0=0xFF;                                                               
  5.         IR_OUT=~IR_OUT;
  6. }
復制代碼

作者: wulin    時間: 2021-11-5 05:48
輸出高速脈沖用定時器模式2比較合適。
  1. #include<reg52.h>

  2. sbit IR_OUT=P1^0;

  3. void Timer0Init(void)//13微秒@12.000MHz
  4. {
  5.         TMOD= 0x02;                //設置定時器模式
  6.         TL0 = 0xF3;                //設置定時初始值
  7.         TH0 = 0xF3;                //設置定時重載值
  8.         TR0 = 1;
  9.         EA  = 1;
  10.         ET0 = 1;
  11. }

  12. void main()
  13. {
  14.         Timer0Init();
  15.         while(1);
  16. }

  17. void Timer0_Routine(void) interrupt 1
  18. {
  19.         IR_OUT=~IR_OUT;
  20. }
復制代碼

作者: nbhmwj    時間: 2021-11-5 09:42
本帖最后由 nbhmwj 于 2021-11-5 09:56 編輯

1.  38KHZ變成26KHZ的原因是響應中斷程序使用SJMP  #ADDRESS指令  需2個機器周期,進入中斷程序后,由于TL0=0xF3;  TH0=0xFF; 兩條指令需要2*2=4個機器周期,12M晶振,1個機器周期1us,故增加了6us,從而增中了脈沖的周期,故變成了26KHZ。
2.  可以調整程序將IR_OUT=~IR_OUT;移到第一位置,同時將TL0賦值0xF6

; .\T0int.SRC generated from: T0int.c
; COMPILER INVOKED BY:
;        d:\Keil_v4\C51\BIN\C51.EXE T0int.c BROWSE DEBUG OBJECTEXTEND SRC(.\T0int.SRC)

$NOMOD51

NAME        T0INT

P0        DATA        080H
P1        DATA        090H
P2        DATA        0A0H
P3        DATA        0B0H
T0        BIT        0B0H.4
AC        BIT        0D0H.6
T1        BIT        0B0H.5
T2        BIT        090H.0
EA        BIT        0A8H.7
IE        DATA        0A8H
EXF2        BIT        0C8H.6
RD        BIT        0B0H.7
ES        BIT        0A8H.4
IP        DATA        0B8H
RI        BIT        098H.0
INT0        BIT        0B0H.2
CY        BIT        0D0H.7
TI        BIT        098H.1
INT1        BIT        0B0H.3
RCAP2H        DATA        0CBH
PS        BIT        0B8H.4
SP        DATA        081H
T2EX        BIT        090H.1
OV        BIT        0D0H.2
RCAP2L        DATA        0CAH
C_T2        BIT        0C8H.1
WR        BIT        0B0H.6
RCLK        BIT        0C8H.5
TCLK        BIT        0C8H.4
SBUF        DATA        099H
PCON        DATA        087H
SCON        DATA        098H
TMOD        DATA        089H
TCON        DATA        088H
IE0        BIT        088H.1
IE1        BIT        088H.3
B        DATA        0F0H
CP_RL2        BIT        0C8H.0
ACC        DATA        0E0H
ET0        BIT        0A8H.1
ET1        BIT        0A8H.3
TF0        BIT        088H.5
ET2        BIT        0A8H.5
TF1        BIT        088H.7
TF2        BIT        0C8H.7
RB8        BIT        098H.2
TH0        DATA        08CH
EX0        BIT        0A8H.0
IT0        BIT        088H.0
TH1        DATA        08DH
TB8        BIT        098H.3
EX1        BIT        0A8H.2
IT1        BIT        088H.2
TH2        DATA        0CDH
P        BIT        0D0H.0
SM0        BIT        098H.7
TL0        DATA        08AH
SM1        BIT        098H.6
TL1        DATA        08BH
SM2        BIT        098H.5
TL2        DATA        0CCH
PT0        BIT        0B8H.1
PT1        BIT        0B8H.3
RS0        BIT        0D0H.3
PT2        BIT        0B8H.5
TR0        BIT        088H.4
RS1        BIT        0D0H.4
TR1        BIT        088H.6
TR2        BIT        0C8H.2
PX0        BIT        0B8H.0
PX1        BIT        0B8H.2
DPH        DATA        083H
DPL        DATA        082H
EXEN2        BIT        0C8H.3
REN        BIT        098H.4
T2CON        DATA        0C8H
RXD        BIT        0B0H.0
TXD        BIT        0B0H.1
IR_OUT        BIT        090H.0
F0        BIT        0D0H.5
PSW        DATA        0D0H
?PR?Timer0Init?T0INT SEGMENT CODE
?PR?main?T0INT       SEGMENT CODE
?PR?Timer0_Routine?T0INT                 SEGMENT CODE
        EXTRN        CODE (?C_STARTUP)
        PUBLIC        Timer0_Routine
        PUBLIC        main
        PUBLIC        Timer0Init
; #include<reg52.h>
;
; sbit IR_OUT=P1^0;
;
; void Timer0Init(void)//13微秒@12.000MHz

        RSEG  ?PR?Timer0Init?T0INT
Timer0Init:
                        ; SOURCE LINE # 5
; {
                        ; SOURCE LINE # 6
;        // TMOD= 0x02;                //設置定時器模式
;         TL0 = 0xF3;                //設置定時初始值
                        ; SOURCE LINE # 8
        MOV          TL0,#0F3H
;         TH0 = 0xFF;                //設置定時重載值
                        ; SOURCE LINE # 9
        MOV          TH0,#0FFH
;         TR0 = 1;
                        ; SOURCE LINE # 10
        SETB         TR0
;         EA  = 1;
                        ; SOURCE LINE # 11
        SETB         EA
;         ET0 = 1;
                        ; SOURCE LINE # 12
        SETB         ET0
; }
                        ; SOURCE LINE # 13
        RET         
; END OF Timer0Init

;
; void main()

        RSEG  ?PR?main?T0INT
main:
                        ; SOURCE LINE # 15
; {
                        ; SOURCE LINE # 16
;         Timer0Init();
                        ; SOURCE LINE # 17
        LCALL        Timer0Init
?C0002:
;         while(1);
                        ; SOURCE LINE # 18
        SJMP         ?C0002
; END OF main

CSEG        AT        0000BH
        LJMP        Timer0_Routine

; }
;
; void Timer0_Routine(void) interrupt 1

        RSEG  ?PR?Timer0_Routine?T0INT
        USING        0
Timer0_Routine:
                        ; SOURCE LINE # 21
; {
;         TL0=0xF3;
                        ; SOURCE LINE # 23
        MOV          TL0,#0F3H
;         TH0=0xFF;                                                               
                        ; SOURCE LINE # 24
        MOV          TH0,#0FFH
;         IR_OUT=~IR_OUT;
                        ; SOURCE LINE # 25
        CPL          IR_OUT
;                
; }                                                                ; SOURCE LINE # 27
        RETI        
; END OF Timer0_Routine

        END



作者: nbhmwj    時間: 2021-11-5 09:54
本帖最后由 nbhmwj 于 2021-11-5 11:02 編輯

上一層樓已編緝修改完成。
作者: macboa    時間: 2021-11-5 11:05
wulin 發表于 2021-11-5 05:48
輸出高速脈沖用定時器模式2比較合適。

您好,換了模式2 還是那樣
作者: macboa    時間: 2021-11-5 11:13
nbhmwj 發表于 2021-11-5 09:42
1.  38KHZ變成26KHZ的原因是響應中斷程序使用SJMP  #ADDRESS指令  需2個機器周期,進入中斷程序后,由于TL0 ...

感謝您給了專業的解釋。匯編不是很懂。 后來我換成自動重裝模式2,中斷里只有IR_OUT=~IT_OUT 還是26khz。而且如果我改成F6,就會變成55.5khz。簡直要崩潰了。對了我的晶振顯示11.965mhz不是12mhz應該沒問題吧? 新手一枚,還請大神賜教
作者: 188610329    時間: 2021-11-5 13:58
macboa 發表于 2021-11-5 11:13
感謝您給了專業的解釋。匯編不是很懂。 后來我換成自動重裝模式2,中斷里只有IR_OUT=~IT_OUT 還是26khz ...

單片機型號? 如果軟件延時,單片機的型號,直接影響,延時的時間。

按你代碼帶來的結果,初步判斷你是 STC 15系列單片機,

所以, void khz(uchar aa) 的話,編譯以后 是: DJNZ R7  計數, 步進為4
void khz() 的話,編譯以后 是: DJNZ D8  計數, 步進為5,  兩者比例關系差不多就是  4:5     基本吻合 38Khz :  50Khz

最后,除非你會玩匯編,不然要精確計時的話,還是老老實實用定時器吧。
作者: macboa    時間: 2021-11-5 15:33
188610329 發表于 2021-11-5 13:58
單片機型號? 如果軟件延時,單片機的型號,直接影響,延時的時間。

按你代碼帶來的結果,初步判斷你 ...

我是用的st90c51rc 然后晶振是11.0592mhz。快愁死我了
作者: macboa    時間: 2021-11-5 15:40
感覺51hei真好 很活躍。csdn問個問題好久都沒人回。
作者: 188610329    時間: 2021-11-5 15:57
STC90C51RC  有T2定時器, 可以直接方波輸出,你試試那個吧。

另外,如果你開了 6T 模式, 11.0592 的晶振是會翻倍成: 22.1184 的。按你說的各種線索看,不排除這個可能,你最好確認一下。




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