⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pca.c

📁 c8051F020 ADC0 用PCA完成16位的PWM 29F040 定时器的设置 外部静态存储器
💻 C
字号:
 #include "c8051F020.h" 
//----------------------------------------------------------------------------- 
// PCA接收发送脉冲功能模块
//----------------------------------------------------------------------------- 
//
#define SAMPLES 500
void PCA0_Detect (void); 
void PCA0_Init0 (void);
void PCA0_Init1 (void);
void PCA0_Init2 (void);

sbit   PWM_OUT = P0^7;                             // 定义PWM输出端口引脚
unsigned int PWM ;                                 // 使波形为高电平的PCA周期数 
unsigned int Frequncy;
static int PCA0_flag = 0;
static int sample = 0;                                                    
xdata unsigned Pulse_catch[SAMPLES][2];            // 存储捕获结果数组

void PCA0_Function (char Puls_mode)                //0为输入检测 1为输出可变占空比脉冲信号
{

   if (Puls_mode==0)
    {
	  PCA0_Init0 ();
    }
   else if (Puls_mode==1)
    {
	  PCA0_Init1 ();
     }
   else if (Puls_mode==2)
    {
      PCA0_Init2 ();                              // 允许PCA计数器
     }
   else  PWM_OUT = 0;                              //保持低电平
   while(1)
    {                      }
}
void PCA0_Init0 (void)
{
      PCA0CN = 0x00;                               //溢出标志清零 禁止计时器
      PCA0MD = 0x88;                               //禁止CF中断 使用系统时钟
      PCA0CPM0 = 0x30;                             //用 CEX0 的电平变化触发捕捉
	  PCA0L	 = 0x00;
      PCA0H	 = 0x00;
      EIE1 |= 0x08;                                //允许PCA中断  
      EA = 1;                                      //允许全局中断
      PCA0CPM0 |= 0x01;                            //允许CEX0捕捉中断
      CR = 1;                                      //允许PCA计数器 
}
void PCA0_Init1 (void)
{
      PCA0CN = 0x00;                               //溢出标志清零 禁止计时器
      PCA0MD = 0x88;                               //禁止CF中断 使用系统时钟
      PCA0CPM1 = 0xCB;                             //用16位脉冲宽度调制器  PCA0CPM1 = 0x4D为高速输出
	  PCA0L	 = 0x00;
	  PCA0H	 = 0x00;
      EIE1 |= 0x08;                                // 允许PCA中断  
      EA = 1;                                      // 允许全局中断
      PCA0CPM1 |= 0x01;                            // 允许比较中断(可变占空比)
      CR = 1;                                      // 允许PCA计数器
}
void PCA0_Init2 (void)
{
	  PCA0_flag = 1;
      PCA0CN = 0x00;                               //溢出标志清零 禁止计时器
      PCA0MD = 0x88;                               //禁止CF中断 使用系统时钟
      PCA0CPM1 = 0x4E;                             //PCA0的频率输出方式
	  PCA0L	 = 0x00;
	  PCA0H	 = 0x00;
      EIE1 |= 0x08;                                // 允许PCA中断  
      EA = 1;                                      // 允许全局中断
      PCA0CPM1 |= 0x01;                            // 允许比较中断
      CR = 1;  
}
void PCA0_Detect (void) interrupt 9
{
   if (CCF0) 
   { 
      CCF0 = 0;                                     // 清除比较标志
	  if(sample > SAMPLES) sample  = 0;
	  else
	  {
	    Pulse_catch[sample][0] = PCA0CPL0;
		Pulse_catch[sample][1] = PCA0CPH0;
	    sample++;
	   }
	}
   else if (!CCF1&PCA0_flag)
   {
      CCF1 = 0;
      PCA0CPL1 = (0xff & PWM);                      // 设置PWM的下一个匹配值 此处可以通过读数组来写PWM
      PCA0CPH1 = (0xff & (PWM >> 8)); 
   }
/* else if (!CCF1&ff) 
    {                                               // 处理其它PCA中断 
      CCF1 = 0; 
      if (PWM_OUT)                                  // 处理上升沿 
        {                                          
          PCA0CPL0 = (0xff & PWM);                  // 设置PWM的下一个匹配值 此处可以通过读数组来写PWM
          PCA0CPH0 = (0xff & (PWM >> 8)); 
        } 
      else                                          // 处理下降沿 
        {                                           
          PCA0CPL0 = 0;                             // 设置下一个匹配值为0 
          PCA0CPH0 = 0; 
        } 
    } 高速输出时的16位PWM */
	else if (CCF1&PCA0_flag)
	{
	   CCF1 = 0;
	   PCA0CPH1 = Frequncy;                          //设置输出频率值  读取数组
    }
}

 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -