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

📄 pcalvd.c

📁 基于KEIL51的一款高性能的数字功放的完整代码
💻 C
字号:
 
#include "config.h"


#define IN_PCALVD

#if  PCALVD_USING

sbit   EPCA = IE^6;	 // PCA中断屏蔽位
sfr    CH   = 0xf9;	 // PCA计数器高8位
sfr    CL   = 0xe9;	 // PCA计数器低8位

sfr    CCON = 0xd8;	   // PCA控制寄存器
sbit   CCF0 = CCON^0;  // PCA模块0中断标志
sbit   CCF1 = CCON^1;  // PCA模块1中断标志
sbit   CR   = CCON^6;  // PCA计数器容许标志
sbit   CF   = CCON^7;  // PCA计数器溢出标志 

sfr    CMOD =0xd9;	  // PCA工作模式寄存器
//sbit   CIDL = CMOD^7;
//sbit   CPS1 = CMOD^2;
//sbit   CPS0 = CMOD^1;
//sbit   ECF  = CMOD^0;

sfr    CCAP0H = 0xfa;  // PCA捕捉模块比较寄存器
sfr    CCAP1H = 0xfb;
sfr    CCAP0L = 0xea;
sfr    CCAP1L = 0xeb;
//------------------------
sfr    PCA_PWM0 = 0xf2;	  // PCA模块pwm寄存器
sfr    PCA_PWM1 = 0xf3;

sfr    CCAPM0  = 0xda;  // PCA 模块0的工作模式寄存器 
sfr    CCAPM1  = 0xdb;  // PCA 模块1的工作模式寄存器 

unsigned char idata  timer_100ms=0x00;  //秒钟的定时标志
//unsigned char idata  timer_ff_fb_flag=0x00;  //快进快退的标志,当快进快退的的按键松开后一段时间要切换到play

//  本系统外部晶振为22.1184M ,时钟源实际为22.1184M/12=1843200
//  则: TIMER_100uS= 1843200 * 0.0001 = 184  = 0X00B8
//       TIMER_500uS= 1843200 * 0.0005 = 921  = 0X0399
//		 TIMER_1mS=   1843200 * 0.001  = 1843 = 0X0733

void pcalvd_initialize(void) 
{
 // 开放低压中断
  AUXR |= 0X00;   //开放低压中断   BIT2 ELVDI -> 0:禁止低压中断  1:开放低压中断
  
// 将pca设定为定时器
//C P S 1 C P S 0 选择P C A 时钟源输入
//0 0      0 , 内部时钟, F o s c / 1 2
//0 1      1 , 内部时钟, F o s c / 2
//1 0	   2 , 定时器0 溢出, 由于定时器0 可以工作在1 T 方式, 所以可以
//              达到计一个时钟就溢出, 频率反而是最高的, 可达到F o s c
//1 1      3 , E C I / P 3 . 4 脚的外部时钟输入( 最大速率= F o s c / 2 )
  CMOD = 0x01;    // 选择时钟为内部时钟的1/12,开启定时
  CCAPM0 = 0x48;  // 16bit软件定时,容许中断
 // CCAPM1 = 0x48;  // 16bit软件定时,容许中断
  CH     = 0xF8;  // 定时时间
  CL     = 0xCC;  //
//  CCAP0H = 0xFC;
//  CCAP0L = 0x66; 
//  CCAP1H = 0xFC;
//  CCAP1L = 0x66; 

  CCON   = 0x40;  // 清除中断标志,启动PCA模式
  EPCA   = 0x01;  // 开放PCA中断


}


// PCA/LVD  中断向量为 033H 中断查询次序 6
// 中断优先级设置 PPCA_LVDH,PPCA_LVD
// 中断请求标志: CF + CCF0 + CCF1 +LVDF
bit timersecond_flag=0x00;  // 秒的标志
bit timer500ms_flag=0x00;   // 500ms的标志
#define  TIMER_SECOND_COUNT  1000
#define  TIMER_500MS_COUNT   400   //主要是为了错开ESS的500MS的发送

void pcalvd_isr(void)  interrupt 6
{ unsigned char idata i=0x00;
  static unsigned int  idata timer_count=0x00;   //秒的计算

  if(CF==0x01)
    {// ---------利用定时器来发送通讯波形------------------------------------------------------------
	 // ---- 每次进入此定时需要1ms,则每隔1.96ms需要进入4次
     // ---------处理1ms事件--------------------
	 timer_count++;
	 if(timer_count==TIMER_500MS_COUNT)
	    {timer500ms_flag=0x01;
		 }
	 if(timer_count>=TIMER_SECOND_COUNT)
	    {timer_count=0x00;
		 timersecond_flag=0x01;	   // 1S的标志
		 timer500ms_flag=0x01; 	   // 每500ms的整数倍
         // -----------------------------------------------------------------------
		 // ---- 1S的定时 -------	
		 }
		  
     CH =0xF8;
     CL =0xCC;
     CCON   = 0x40;
	 } 
  else // if((CCF0==0x01)||(CCF1==0x01))
    {CCON   = 0x40;
	 }
}


#endif

⌨️ 快捷键说明

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