標題: stc15單片機pca用T0分頻,只能用16位自動重載模式嗎 [打印本頁]

作者: qwa1234    時間: 2020-8-21 22:52
標題: stc15單片機pca用T0分頻,只能用16位自動重載模式嗎



想要實時改變輸出的頻率,比如用按鍵調(diào)節(jié)不同的頻率

想使用T0,模式1,改變重載數(shù)值,的方法來改變,輸出頻率但是不行,

只能象下面一樣用16位自動重載模式嗎


//本示例在Keil開發(fā)環(huán)境下請選擇Intel的8058芯片型號進行編譯
//若無特別說明,工作頻率一般為11.0592MHz


#include "STC15W401AS.h"

//-----------------------------------------------

#define FOSC 11059200L

#define CCP_S0 0x10               //P_SW1.4
#define CCP_S1 0x20               //P_SW1.5
//-----------------------------------------------
#define uint unsigned int
#define uchar unsigned char
/* Timer0 interrupt routine */
void tm0_isr() interrupt 1
{
    //P10 = ! P10;                    //將測試口取反
}

/* Timer2 interrupt routine */
void tm2_isr() interrupt 12
{
    //P11 = ! P11;                    //將測試口取反
}
float PL;
int Xt1,Xt0;
        float t1,t0;
        uchar hZ1,l1,h0,l0;

//-----------------------------------------------

void Init_usart1()
{   
          SCON=0X50;
          T2L=(65536-(FOSC/4/19200));   //這個單片機沒有定時器1,因此,用定時器2作為波特率發(fā)生器。
    T2H=(65536-(FOSC/4/19200))>>8;
    AUXR=0x14;                //T2為1T模式,并啟動定時器2
    AUXR|=0x01;               //選擇定時器2為串口1的波特率發(fā)生器
    ES=1;                     //使能串口1中斷
    EA=1;
}

void dutyANDf(void)
{


        t1=0.5/PL;                             //高電平時長
        t0=(1/PL)-t1;                        //低電平時長
        Xt1=65536-1000000*t1;        //高電平的時長轉(zhuǎn)換成的定時器16位數(shù)
        Xt0=65536-1000000*t0;;  //低電平的時長轉(zhuǎn)換成的定時器16位數(shù)

        hZ1=(uchar)(Xt1>>8);     //高電平高八位保存
        l1=(uchar)Xt1;                //高電平低八位保存
       // h0=(uchar)(Xt0>>8);     //低電平高八位保存
       // l0=(uchar)Xt0;                //低電平低八位保存


}


/* main program */
void main()
{
                P1M1 &= ~1; //P1.x 設(shè)置為推挽輸出
    P1M0 |=  1;
       
               
                ACC=P_SW1;                    //讀取外圍設(shè)備控制切換寄存器
    ACC&=~(CCP_S0|CCP_S1);        //CCP_S0=0 CCP_S1=0,設(shè)置PWM0輸出在P1.1引腳。
    P_SW1=ACC;                    //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
    CCON=0;                       //初始化PCA控制器                                                                      //??CF                                    //????????
    CL=0;                         //復(fù)位PCA寄存器高低位
    CH=0;                         //
    CMOD=0x84;                    //設(shè)置PCA時鐘源為T0的溢出,且禁止所有PCA定時器溢出中斷(PCA不作定時器功能)

       
                /*****************************PWM0 - P1.1***************************************/               
    PCA_PWM0=0x80;                //PCA模塊0為6位模式                                       
    CCAP0H=CCAP0L=0x20;           //PWM0占空比50% ((40H-20H)/40H)
               
//        CCAP0H=CCAP0L=0x00;           //PWM0占空比50% ((40H-20H)/40H)
          CCAPM0=0x42;                  //允許CCAPM1比較器功能和PWM功能       
                /*****************************PWM1 - P1.0***************************************/       
               
                PCA_PWM1=0x80;                //PCA模塊0為6位模式                                       
    CCAP1H=CCAP1L=0x30;           //PWM1占空比25% ((40H-30H)/40H)
          CCAPM1=0x42;                  //允許CCAPM2比較器功能和PWM功能               
               
               
                AUXR |= 0x80;                   //定時器0為1T模式
                 TMOD = 0x00;                    //設(shè)置定時器為模式0(16位自動重裝載)

         TH0 = (65535-156)/256;
                 TL0 = (65535-156)%256;                   //初始化計時值
    TR0 = 1;                        //定時器0開始計時

               
    CR=1;                         //啟動PCA運行
    while (1);


}


作者: wulin    時間: 2020-8-22 06:03
自動重載模式同樣可以隨時改變重載數(shù)值,自動重載模式比非自動重載模式定時更精準。
作者: qwa1234    時間: 2020-8-26 00:36
wulin 發(fā)表于 2020-8-22 06:03
自動重載模式同樣可以隨時改變重載數(shù)值,自動重載模式比非自動重載模式定時更精準。

好的,,謝謝回復(fù)  我用定時器,中斷實現(xiàn)了實時改頻率,有空再按你說的試下,,




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