C51 COMPILER V9.59.0.0 PCA 03/09/2021 14:06:39 PAGE 1 C51 COMPILER V9.59.0.0, COMPILATION OF MODULE PCA OBJECT MODULE PLACED IN .\list\PCA.obj COMPILER INVOKED BY: C:\Keil_v5\C51\BIN\C51.EXE PCA.c OPTIMIZE(8,SPEED) BROWSE DEBUG OBJECTEXTEND PRINT(.\list\PCA.lst) -TABS(2) OBJECT(.\list\PCA.obj) line level source 1 /*---------------------------------------------------------------------*/ 2 /* --- STC MCU Limited ------------------------------------------------*/ 3 /* --- STC 1T Series MCU Demo Programme -------------------------------*/ 4 /* --- Mobile: (86)13922805190 ----------------------------------------*/ 5 /* --- Fax: 86-0513-55012956,55012947,55012969 ------------------------*/ 6 /* --- Tel: 86-0513-55012928,55012929,55012966 ------------------------*/ 7 /* --- Web: www.STCMCU.com --------------------------------------------*/ 8 /* --- Web: www.STCMCUDATA.com ---------------------------------------*/ 9 /* --- QQ: 800003751 -------------------------------------------------*/ 10 /* 如果要在程序中使用此代码,请在程序中注明使用了STC的资料及程序 */ 11 /*---------------------------------------------------------------------*/ 12 13 #include "PCA.h" 14 15 bit B_Capture0,B_Capture1,B_Capture2; 16 u8 PCA0_mode,PCA1_mode,PCA2_mode; 17 u16 CCAP0_tmp,PCA_Timer0; 18 u16 CCAP1_tmp,PCA_Timer1; 19 u16 CCAP2_tmp,PCA_Timer2; 20 21 /************* 功能说明 ************** 22 23 24 ******************************************/ 25 26 u16 PWM0_low; //PWM输出低电平的PCA时钟脉冲个数, 用户层不可见。 27 u16 PWM1_low; //PWM输出低电平的PCA时钟脉冲个数, 用户层不可见。 28 u16 PWM2_low; //PWM输出低电平的PCA时钟脉冲个数, 用户层不可见。 29 30 //======================================================================== 31 // 函数: void PWMn_Update(u8 PCA_id, u16 high) 32 // 描述: 更新占空比数据。 33 // 参数: high: 占空比数据,即PWM输出高电平的PCA时钟脉冲个数。 34 // 返回: 无 35 // 版本: VER1.0 36 // 日期: 2013-5-15 37 // 备注: 38 //======================================================================== 39 void PWMn_Update(u8 PCA_id, u16 high) 40 { 41 1 if(PCA_id == PCA0) 42 1 { 43 2 if(high > PWM_HIGH_MAX) high = PWM_HIGH_MAX; //如果写入大于最大占空比数据,强制为最大占空比。 44 2 if(high < PWM_HIGH_MIN) high = PWM_HIGH_MIN; //如果写入小于最小占空比数据,强制为最小占空比。 45 2 CR = 0; //停止PCA。 46 2 PCA_Timer0 = high; //数据在正确范围,则装入占空比寄存器。 47 2 PWM0_low = PWM_DUTY - high; //计算并保存PWM输出低电平的PCA时钟脉冲个数。 48 2 CR = 1; //启动PCA。 49 2 } 50 1 else if(PCA_id == PCA1) 51 1 { 52 2 if(high > PWM_HIGH_MAX) high = PWM_HIGH_MAX; //如果写入大于最大占空比数据,强制为最大占空比。 53 2 if(high < PWM_HIGH_MIN) high = PWM_HIGH_MIN; //如果写入小于最小占空比数据,强制为最小占空比。 54 2 CR = 0; //停止PCA。 C51 COMPILER V9.59.0.0 PCA 03/09/2021 14:06:39 PAGE 2 55 2 PCA_Timer1 = high; //数据在正确范围,则装入占空比寄存器。 56 2 PWM1_low = PWM_DUTY - high; //计算并保存PWM输出低电平的PCA时钟脉冲个数。 57 2 CR = 1; //启动PCA。 58 2 } 59 1 else if(PCA_id == PCA2) 60 1 { 61 2 if(high > PWM_HIGH_MAX) high = PWM_HIGH_MAX; //如果写入大于最大占空比数据,强制为最大占空比。 62 2 if(high < PWM_HIGH_MIN) high = PWM_HIGH_MIN; //如果写入小于最小占空比数据,强制为最小占空比。 63 2 CR = 0; //停止PCA。 64 2 PCA_Timer2 = high; //数据在正确范围,则装入占空比寄存器。 65 2 PWM2_low = PWM_DUTY - high; //计算并保存PWM输出低电平的PCA时钟脉冲个数。 66 2 CR = 1; //启动PCA。 67 2 } 68 1 } 69 70 //======================================================================== 71 // 函数: UpdatePwm(u8 PCA_id, u16 pwm_value) 72 // 描述: 更新PWM值. 73 // 参数: PCA_id: PCA序号. 取值 PCA0,PCA1,PCA2,PCA_Counter 74 // pwm_value: pwm值, 这个值是输出低电平的时间. 75 // 返回: none. 76 // 版本: V1.0, 2012-11-22 77 //======================================================================== 78 //void UpdatePwm(u8 PCA_id, u16 pwm_value) 79 //{ 80 // if(PCA_id == PCA0) 81 // { 82 // PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9); 83 // CCAP0H = (u8)pwm_value; 84 // } 85 // else if(PCA_id == PCA1) 86 // { 87 // PCA_PWM1 = (PCA_PWM1 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9); 88 // CCAP1H = (u8)pwm_value; 89 // } 90 // else if(PCA_id == PCA2) 91 // { 92 // PCA_PWM2 = (PCA_PWM2 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9); 93 // CCAP2H = (u8)pwm_value; 94 // } 95 //} 96 97 //======================================================================== 98 // 函数: void PCA_Init(PCA_id, PCA_InitTypeDef *PCAx) 99 // 描述: PCA初始化程序. 100 // 参数: PCA_id: PCA序号. 取值 PCA0,PCA1,PCA2,PCA_Counter 101 // PCAx: 结构参数,请参考PCA.h里的定义. 102 // 返回: none. 103 // 版本: V1.0, 2012-11-22 104 //======================================================================== 105 void PCA_Init(u8 PCA_id, PCA_InitTypeDef *PCAx) 106 { 107 1 if(PCA_id > PCA_Counter) return; //id错误 108 1 109 1 if(PCA_id == PCA_Counter) //设置公用Counter 110 1 { 111 2 CR = 0; 112 2 CH = 0; 113 2 CL = 0; 114 2 P_SW1 = (P_SW1 & ~(3<<4)) | PCAx->PCA_IoUse; //切换IO口 115 2 CMOD = (CMOD & ~(7<<1)) | PCAx->PCA_Clock; //选择时钟源 116 2 CMOD = (CMOD & ~1) | (PCAx->PCA_Interrupt_Mode & 1); //ECF C51 COMPILER V9.59.0.0 PCA 03/09/2021 14:06:39 PAGE 3 117 2 if(PCAx->PCA_Polity > Polity_3) return; //错误 118 2 PCA_Polity(PCAx->PCA_Polity); //指定中断优先级(低到高) Polity_0,Polity_1,Polity_2,Polity_3 119 2 if(PCAx->PCA_RUN == ENABLE) CR = 1; 120 2 return; 121 2 } 122 1 123 1 PCAx->PCA_Interrupt_Mode &= (3<<4) + 1; 124 1 if(PCAx->PCA_Mode >= PCA_Mode_SoftTimer) PCAx->PCA_Interrupt_Mode &= ~(3<<4); 125 1 126 1 if(PCA_id == PCA0) 127 1 { 128 2 CCAPM0 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; //工作模式, 中断模式 129 2 PCA_PWM0 = (PCA_PWM0 & ~(3<<6)) | PCAx->PCA_PWM_Wide; //PWM宽度 130 2 131 2 PCA_Timer0 = PCAx->PCA_Value; 132 2 B_Capture0 = 0; 133 2 PCA0_mode = PCAx->PCA_Mode; 134 2 CCAP0_tmp = PCA_Timer0; 135 2 CCAP0L = (u8)CCAP0_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L 136 2 CCAP0H = (u8)(CCAP0_tmp >> 8); //后写CCAP0H 137 2 } 138 1 if(PCA_id == PCA1) 139 1 { 140 2 CCAPM1 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; 141 2 PCA_PWM1 = (PCA_PWM1 & ~(3<<6)) | PCAx->PCA_PWM_Wide; 142 2 143 2 PCA_Timer1 = PCAx->PCA_Value; 144 2 B_Capture1 = 0; 145 2 PCA1_mode = PCAx->PCA_Mode; 146 2 CCAP1_tmp = PCA_Timer1; 147 2 CCAP1L = (u8)CCAP1_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L 148 2 CCAP1H = (u8)(CCAP1_tmp >> 8); //后写CCAP0H 149 2 } 150 1 if(PCA_id == PCA2) 151 1 { 152 2 CCAPM2 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; 153 2 PCA_PWM2 = (PCA_PWM2 & ~(3<<6)) | PCAx->PCA_PWM_Wide; 154 2 155 2 PCA_Timer2 = PCAx->PCA_Value; 156 2 B_Capture2 = 0; 157 2 PCA2_mode = PCAx->PCA_Mode; 158 2 CCAP2_tmp = PCA_Timer2; 159 2 CCAP2L = (u8)CCAP2_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L 160 2 CCAP2H = (u8)(CCAP2_tmp >> 8); //后写CCAP0H 161 2 } 162 1 } 163 164 165 //======================================================================== 166 // 函数: void PCA_Handler (void) interrupt PCA_VECTOR 167 // 描述: PCA中断处理程序. 168 // 参数: None 169 // 返回: none. 170 // 版本: V1.0, 2012-11-22 171 //======================================================================== 172 void PCA_Handler (void) interrupt PCA_VECTOR 173 { 174 1 if(CCF0) //PCA模块0中断 175 1 { 176 2 CCF0 = 0; //清PCA模块0中断标志 177 2 if(P11) CCAP0_tmp += PCA_Timer0; //输出为高电平,则给影射寄存器装载高电平时间长度 178 2 else CCAP0_tmp += PWM0_low; //输出为低电平,则给影射寄存器装载低电平时间长度 C51 COMPILER V9.59.0.0 PCA 03/09/2021 14:06:39 PAGE 4 179 2 CCAP0L = (u8)CCAP0_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L 180 2 CCAP0H = (u8)(CCAP0_tmp >> 8); //后写CCAP0H 181 2 } 182 1 183 1 if(CCF1) //PCA模块1中断 184 1 { 185 2 CCF1 = 0; //清PCA模块1中断标志 186 2 if(P10) CCAP1_tmp += PCA_Timer1; //输出为高电平,则给影射寄存器装载高电平时间长度 187 2 else CCAP1_tmp += PWM1_low; //输出为低电平,则给影射寄存器装载低电平时间长度 188 2 CCAP1L = (u8)CCAP1_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L 189 2 CCAP1H = (u8)(CCAP1_tmp >> 8); //后写CCAP0H 190 2 } 191 1 192 1 if(CCF2) //PCA模块2中断 193 1 { 194 2 CCF2 = 0; //清PCA模块1中断标志 195 2 if(P37) CCAP2_tmp += PCA_Timer2; //输出为高电平,则给影射寄存器装载高电平时间长度 196 2 else CCAP2_tmp += PWM2_low; //输出为低电平,则给影射寄存器装载低电平时间长度 197 2 CCAP2L = (u8)CCAP2_tmp; //将影射寄存器写入捕获寄存器,先写CCAP0L 198 2 CCAP2H = (u8)(CCAP2_tmp >> 8); //后写CCAP0H 199 2 } 200 1 201 1 if(CF) //PCA溢出中断 202 1 { 203 2 CF = 0; //清PCA溢出中断标志 204 2 } 205 1 206 1 } MODULE INFORMATION: STATIC OVERLAYABLE CODE SIZE = 708 ---- CONSTANT SIZE = ---- ---- XDATA SIZE = ---- ---- PDATA SIZE = ---- ---- DATA SIZE = 21 3 IDATA SIZE = ---- ---- BIT SIZE = 3 ---- END OF MODULE INFORMATION. C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)