×
嵌入式 > 技术百科 > 详情

配置PCA的一点总结12单片机

发布时间:2020-06-17 发布时间:
|

先看代码


#include "stc12.h"


unsigned int Last_Capture_Data=0; 

unsigned int New_Capture_Data=0;  

unsigned int g_Period=0;      

unsigned int g_Frequency=0;  

unsigned char str1[12];

unsigned char str2[12]; 

bit Capture_over = 0;



sbit KEY_1 = P2^7;


extern void InitLcd1602();

extern void LcdShowStr(unsigned char x, unsigned char y, unsigned char *str);


void Delay50ms();

void PCA_Init (bit module);

void IntToString(unsigned char *str, unsigned int dat);


void main (void)

{

    PCA_Init(0);

    InitLcd1602();

    P2 = 0xF7;


    while(1)

    {

        if(!KEY_1)

        {

            Delay50ms();

            if(!KEY_1)      

            {

                while(!KEY_1);

                CCAPM0 = 0x11;

                CR = 1;

            }

        }


        if(Capture_over)

        {

            Capture_over = 0;

//                           g_Frequency = (long)1000000 / g_Period; 

            g_Frequency = (long)11059200 / (g_Period * 12);


            IntToString(str1, g_Period);

            IntToString(str2, g_Frequency);

            LcdShowStr(1, 0, "length:");

            LcdShowStr(8, 0, str1);

            LcdShowStr(1, 1, "freque:");

            LcdShowStr(8, 1, str2);


        }

    }

}



void PCA_Init (bit module)

{

    //CIDL    -       -       -       CPS2    CPS1    CPS0    ECF

    CMOD = 0x80;


    //CF      CR      -       -       -       -       CCF1    CCF0

    CCON = 0x00;


    if (module == 0)                

    {

        CCAPM0 = 0x10;

        CCAP0L = 0x00;

        CCAP0H = 0x00;

    }

    else                                 

    {

        CCAPM1 = 0x11;

        CCAP1L = 0x00;

        CCAP1H = 0x00;

    }



    CL = 0x00;                

    CH = 0x00;


    EA = 1;


    //CR = 1;                     

}


void IntToString(unsigned char *str, unsigned int dat)

{

    unsigned char buf[12];

    unsigned char i = 0;

    do{

        buf[i++] = dat % 10;

        dat /= 10; 

    }while(dat > 0);


    while(i-- > 0)

    {

        *str++ = buf[i] + '0';//数组转换成ASCII反向拷贝到字符串指针

    }

    *str = '\0';

}


void PCA_Int(void) interrupt 7

{

    if (CCF0)                   

    {

        CCF0 = 0; 

        if(Last_Capture_Data == 0)

        {

              Last_Capture_Data = CCAP0H; 


              Last_Capture_Data = (Last_Capture_Data << 8) + CCAP0L; 

        }

        else 

        {            

            New_Capture_Data = CCAP0H;         


            New_Capture_Data = (New_Capture_Data << 8) + CCAP0L;

            g_Period = New_Capture_Data - Last_Capture_Data;

            CR = 0;

            CCAPM0 = 0x10;


            Last_Capture_Data=0;  

            CCAP0L = 0x00;

            CCAP0H = 0x00;

            CL = 0x00;                 

            CH = 0x00;


            Capture_over = 1;

        }

    }


}


void Delay50ms()        //@11.0592MHz

{

    unsigned char i, j, k;


    i = 3;

    j = 26;

    k = 223;

    do

    {

        do

        {

            while (--k);

        } while (--j);

    } while (--i);

}


配置流程:


CMOD 设置禁止溢出中断


设置CCAPMx设置开启捕获中断,以及上升沿捕获还是下降沿捕获


清零CCnPL、CCnPH以及CH、CL



其实最重要的还得看手册,介绍的真心很详细!!!


一个非常详细的电路图,分分享一下:



很明显,图的意思就是设置好上升沿捕获或者下降沿捕获后,由于CL、CH直在走,一旦满足条件就把CL./CH的值分别装入CCAPL以及CCAPH中,如果此时使能PCA中断的话,会触发中断进入中断。




『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
NS推出采用第二代PowerWise技术的能源管理单元及先进电源控制器