新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > STC12C5A60S2內部PWM模塊程序

        STC12C5A60S2內部PWM模塊程序

        作者: 時間:2016-11-18 來源:網絡 收藏
        /*********************************************************************************************

        程序名:   
        編寫人:  
        編寫時間:  20 年 月 日
        硬件支持:  
        接口說明:  
        修改日志:  
          NO.1-
        /*********************************************************************************************
        說明: 單片機的PCA_PWM使用,60S2只有兩個PWM輸出,分別是1.3和1.4,也可以通過AUXR設置到P4口。

        本文引用地址:http://www.104case.com/article/201611/315834.htm

        /*********************************************************************************************/
        #include
        #include
        #define uchar unsigned char
        #define uint unsigned int

        //新一代 1T 8051系列 單片機PCA/PWM 特殊功能寄存器
        // 7 6 5 4 3 2 1 0 Reset Value
        sfr CCON = 0xD8; //PCA 控制寄存器。 CF CR - - - - CCF1 CCF0 00xx,xx00
        //-----------------------
        sbit CF = CCON^7; //PCA計數器溢出標志,由硬件或軟件置位,必須由軟件清0。
        sbit CR = CCON^6; //1:允許 PCA 計數器計數, 必須由軟件清0。
        //-
        //-
        sbit CCF1 = CCON^1; //PCA 模塊1 中斷標志, 由硬件置位, 必須由軟件清0。
        sbit CCF0 = CCON^0; //PCA 模塊0 中斷標志, 由硬件置位, 必須由軟件清0。
        //-----------------------
        sfr CMOD = 0xD9; //PCA 工作模式寄存器。 CIDL - - - CPS2 CPS1 CPS0 ECF 0xxx,x000
        /*
        CIDL: idle 狀態時 PCA 計數器是否繼續計數, 0: 繼續計數, 1: 停止計數。

        CPS2: PCA 計數器脈沖源選擇位 2。
        CPS1: PCA 計數器脈沖源選擇位 1。
        CPS0: PCA 計數器脈沖源選擇位 0。
        CPS2 CPS1 CPS0
        0 0 0 系統時鐘頻率 fosc/12。
        0 0 1 系統時鐘頻率 fosc/2。
        0 1 0 Timer0 溢出。
        0 1 1 由 ECI/P3.4 腳輸入的外部時鐘,最大 fosc/2。
        1 0 0 系統時鐘頻率, Fosc/1
        1 0 1 系統時鐘頻率/4,Fosc/4
        1 1 0 系統時鐘頻率/6,Fosc/6
        1 1 1 系統時鐘頻率/8,Fosc/8

        ECF: PCA計數器溢出中斷允許位, 1--允許 CF(CCON.7) 產生中斷。
        */
        //-----------------------
        sfr CL = 0xE9; //PCA 計數器低位 0000,0000
        sfr CH = 0xF9; //PCA 計數器高位 0000,0000
        //-----------------------
        // 7 6 5 4 3 2 1 0 Reset Value
        sfr CCAPM0 = 0xDA; //PCA 模塊0 PWM 寄存器 - ECOM0 CAPP0 CAPN0 MAT0 TOG0 PWM0 ECCF0 x000,0000
        sfr CCAPM1 = 0xDB; //PCA 模塊1 PWM 寄存器 - ECOM1 CAPP1 CAPN1 MAT1 TOG1 PWM1 ECCF1 x000,0000

        //ECOMn = 1:允許比較功能。
        //CAPPn = 1:允許上升沿觸發捕捉功能。
        //CAPNn = 1:允許下降沿觸發捕捉功能。
        //MATn = 1:當匹配情況發生時, 允許 CCON 中的 CCFn 置位。
        //TOGn = 1:當匹配情況發生時, CEXn 將翻轉。
        //PWMn = 1:將 CEXn 設置為 PWM 輸出。
        //ECCFn = 1:允許 CCON 中的 CCFn 觸發中斷。

        //ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
        // 0 0 0 0 0 0 0 0x00 未啟用任何功能。
        // x 1 0 0 0 0 x 0x21 16位CEXn上升沿觸發捕捉功能。
        // x 0 1 0 0 0 x 0x11 16位CEXn下降沿觸發捕捉功能。
        // x 1 1 0 0 0 x 0x31 16位CEXn邊沿(上、下沿)觸發捕捉功能。
        // 1 0 0 1 0 0 x 0x49 16位軟件定時器。
        // 1 0 0 1 1 0 x 0x4d 16位高速脈沖輸出。
        // 1 0 0 0 0 1 0 0x42 8位 PWM。

        //ECOMn CAPPn CAPNn MATn TOGn PWMn ECCFn
        // 0 0 0 0 0 0 0 0x00 無此操作
        // 1 0 0 0 0 1 0 0x42 普通8位PWM, 無中斷
        // 1 1 0 0 0 1 1 0x63 PWM輸出由低變高可產生中斷
        // 1 0 1 0 0 1 1 0x53 PWM輸出由高變低可產生中斷
        // 1 1 1 0 0 1 1 0x73 PWM輸出由低變高或由高變低都可產生中斷

        //-----------------------
        sfr CCAP0L = 0xEA; //PCA 模塊 0 的捕捉/比較寄存器低 8 位。 0000,0000
        sfr CCAP0H = 0xFA; //PCA 模塊 0 的捕捉/比較寄存器高 8 位。 0000,0000
        sfr CCAP1L = 0xEB; //PCA 模塊 1 的捕捉/比較寄存器低 8 位。 0000,0000
        sfr CCAP1H = 0xFB; //PCA 模塊 1 的捕捉/比較寄存器高 8 位。 0000,0000
        //-----------------------
        // 7 6 5 4 3 2 1 0 Reset Value
        sfr PCA_PWM0 = 0xF2; //PCA 模塊0 PWM 寄存器。 - - - - - - EPC0H EPC0L xxxx,xx00
        sfr PCA_PWM1 = 0xF3; //PCA 模塊1 PWM 寄存器。 - - - - - - EPC1H EPC1L xxxx,xx00
        //PCA_PWMn: 7 6 5 4 3 2 1 0
        // - - - - - - EPCnH EPCnL
        //B7-B2: 保留
        //B1(EPCnH): 在 PWM 模式下,與 CCAPnH 組成 9 位數。
        //B0(EPCnL): 在 PWM 模式下,與 CCAPnL 組成 9 位數。

        /*********************************************************************************************/
        void pwm_init(void) //PWM初始化函數,初始占空比為0
        {
        CMOD=0x02; //0000 0010 空閑時不計數,不產生中斷,時鐘源為fosc/2,因此輸出占用率為fosc/512
        CL=0x00;
        CH=0x00;
        CCAPM0=0x42; //0100 0010, 8位 PWM

        CCAP0L=0x00;
        CCAP0H=0x00; //PWM實現方法,因為是8位,CL基礎計數器從0xFF遞減到0x00,溢出后將CCAP0H
        //的值加載到CCAP0L,若CL遞減過程中,若大于CCAP0L,則輸出高電平,否則為低電平

        CCAPM1=0x42;
        CCAP1H=0x00;
        CCAP1L=0x00;

        CR=1; //開啟PCA計數器
        }
        /*********************************************************************************************/
        void pwm_set(uchar x,uchar y) //占空比設置函數
        {
        CCAP0H=x; //設置比較值
        CCAP0L=x;

        CCAP1H=y;
        CCAP1L=y;
        }
        /*********************************************************************************************/
        void main(void)
        {
        pwm_init();
        pwm_set(0xff,0x0c); //設置為25%的占空比 1100 0000, 12*16(低電平):3×16(高電平)

        while(1){;}
        }
        /*********************************************************************************************/
        /*********************************************************************************************/
        /*********************************************************************************************/



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 西青区| 佛学| 灌云县| 孟村| 西畴县| 社旗县| 阿瓦提县| 韶关市| 和顺县| 尉氏县| 墨竹工卡县| 龙陵县| 舟曲县| 保定市| 建宁县| 兴山县| 霍山县| 昌图县| 澎湖县| 陇南市| 衡阳县| 南康市| 滕州市| 安平县| 青河县| 临邑县| 庄河市| 客服| 乐至县| 福海县| 通江县| 江源县| 曲周县| 明星| 齐河县| 兰溪市| 自贡市| 沧州市| 太仓市| 沾化县| 郯城县|