標題: stc51單片機PCA控制全流程命令 [打印本頁]

作者: hujia    時間: 2015-2-18 01:10
標題: stc51單片機PCA控制全流程命令
定時器頻率
#define   T100Hz   (FOSC / 12 / 100)
方波脈沖頻率
#define   T100KHz   (FOSC / 4 / 100000)
struct PCA_
{//PCA_結構數(shù)據(jù)類型
    unsigned int        Cycle;            //頻率
    unsigned int        Match;            //重裝值容器
    unsigned int        Dou;              //擴展精度自加容器
    unsigned int        Doub;             //擴展精度終點容器
    unsigned char       PWM_Value;        //脈寬值
}PCA_0,PCA_1;                             //結構變量名
void PCA_isr() interrupt 7 using 1
{
    if(CCF0)
    {
        CCF0 = 0;                  //清中斷
        CCAP0L = PCA_0.Match;
        CCAP0H = PCA_0.Match >> 8;  //裝入比較值到比較捕獲寄存器
        PCA_0.Match += T100Hz;      //計算下次需要裝入的值
        if (PCA_0.Dou-- == 0)
            {//如果Dou自減1后為0
            PCA_0.Dou = PCA_0.Doub;  //擴展定時時間
            TI=1;
            Uart1_SendData('0');
        }
    }
    if(CCF1)
    {
        CCF1 = 0;                   //清中斷
        CCAP1L = PCA_1.Match1;
        CCAP1H = PCA_1.Match1 >> 8;  //裝入比較值到比較捕獲寄存器
        PCA_1.Match1 += T100Hz;      //計算下次需要裝入的值
        if (PCA_1.Dou-- == 0)
            {//如果Dou自減1后為0
            PCA_1.Dou = PCA_1.Doub;  //擴展定時時間
            TI=1;
            Uart1_SendData('1');
        }
    }

}
void PCA_Timers_Setup()
{
//清空PCA控制器、計數(shù)器
    CCON = 0;                 //清計數(shù)溢出CF,PCA時鐘停止,清模塊0、1中斷標記
    CL = 0;                   //清PCA16位計數(shù)器
    CH = 0;
//計數(shù)時鐘選擇
    CMOD&=0xF1;               //設置PCA 16位計數(shù)器工作在12T模式
    //CMOD|=0x02;               //設置PCA 16位計數(shù)器工作在2T模式
    //CMOD|=0x04;               //設置PCA 16位計數(shù)器使用定時器1溢出計數(shù)
    //CMOD|=0x06;               //設置PCA 16位計數(shù)器計數(shù)使用P1.2\P4.1輸入脈沖,最高速度2T
    //CMOD|=0x08;               //設置PCA 16位計數(shù)器計數(shù)使用系統(tǒng)時鐘全速
    //CMOD|=0x0A;               //設置PCA 16位計數(shù)器工作在4T模式
    //CMOD|=0x0C;               //設置PCA 16位計數(shù)器工作在6T模式
    //CMOD|=0x0E;               //設置PCA 16位計數(shù)器工作在8T模式
//計數(shù)溢出控制
    CMOD&=0xFE;               //禁止PCA計數(shù)器溢出產生中斷標志CF
    //CMOD|=0x01;               //允許PCA計數(shù)器溢出產生中斷標志CF
//模塊0定時器與高速方波模式設定裝入值
    PCA_0.Match = T100Hz;       //裝入100Hz重裝值
    CCAP0L = PCA_0.Match;
    CCAP0H = PCA_0.Match >> 8;  //裝入比較值到比較捕獲寄存器
    PCA_0.Match += T100Hz;      //重裝值累加
//模塊1定時器與高速方波模式設定裝入值
    PCA_1.Match = T100Hz;       //裝入100Hz重裝值
    CCAP1L = PCA_1.Match;
    CCAP1H = PCA_1.Match >> 8;  //裝入比較值到比較捕獲寄存器
    PCA_1.Match += T100Hz;      //重裝值累加
//模塊0PWM模式設定裝入值
    CCAP0H = CCAP0L = PCA_0.PWM_Value;   //輸出50%PWM波
    CCAP0H = CCAP0L = 0x00;
    PCAPWM0 = 0x00;               //固定輸出高
    CCAP0H = CCAP0L = 0xFF;
    PCAPWM0 = 0x03;               //固定輸出低
//模塊1PWM模式設定裝入值
    CCAP1H = CCAP1L = PCA_1.PWM_Value;   //輸出50%PWM波
    CCAP1H = CCAP1L = 0x00;
    PCAPWM1 = 0x00;               //固定輸出高
    CCAP1H = CCAP1L = 0xFF;
    PCAPWM1 = 0x03;               //固定輸出低

//模塊0捕獲模式設定
    CCAPM0 = 0x11;            //負捕獲,開匹配中斷CCFO
    //CCAPM0 = 0x21;            //正捕獲,開匹配中斷CCFO
    //CCAPM0 = 0x31;            //雙向捕獲,開匹配中斷CCFO
//模塊1捕獲模式設定
    CCAPM1 = 0x11;            //負捕獲,開匹配中斷CCFO
    //CCAPM1 = 0x21;            //正捕獲,開匹配中斷CCFO
    //CCAPM1 = 0x31;            //雙向捕獲,開匹配中斷CCFO
//模塊0定時器模式設定
    CCAPM0 = 0x49;            //開比較器,允許計數(shù)器值與比較器相同時產生中斷CCF0
//模塊1定時器模式設定
    CCAPM1 = 0x49;            //開比較器,允許計數(shù)器值與比較器相同時產生中斷CCF0
//模塊0高速方波模式
    CCAPM0 = 0x4D;            //與定時器模式相同情況下,TOG置1,在發(fā)生匹配時,P1.3\P4.2電位直接翻轉
//模塊1高速方波模式
    CCAPM1 = 0x4D;            //與定時器模式相同情況下,TOG置1,在發(fā)生匹配時,P1.4\P4.3電位直接翻轉
//模塊0PWM模式
    CCAPM0 = 0x42;            //允許比較器比較,選擇PWM開關,硬件產生PWM波,關閉比較中斷CCFO
//模塊1PWM模式
    CCAPM1 = 0x42;            //允許比較器比較,選擇PWM開關,硬件產生PWM波,關閉比較中斷CCF1
//公用
    CR = 1;                   //計數(shù)器開始計數(shù)
    EA = 1;                   //開總中斷
    PCA_0.Dou = 0;
    PCA_1.Dou = 0;             //中斷內擴展定時時間
}





作者: 123@diper    時間: 2015-9-24 23:07
有問題請教




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