欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
stc單片機PCA源碼
[打印本頁]
作者:
maxwang
時間:
2018-4-5 00:06
標題:
stc單片機PCA源碼
/************* 功能說明 **************
輸出3路9~16位變化的PWM信號。類似"呼吸燈"的驅動.
PWM頻率 = MAIN_Fosc / PWM_DUTY, 假設 MAIN_Fosc = 24MHZ, PWM_DUTY = 6000, 則輸出PWM頻率為4000HZ.
******************************************/
#include "PCA.h"
bit B_Capture0,B_Capture1,B_Capture2;
u8 PCA0_mode,PCA1_mode,PCA2_mode;
u16 CCAP0_tmp,PCA_Timer0;
u16 CCAP1_tmp,PCA_Timer1;
u16 CCAP2_tmp,PCA_Timer2;
/************* 功能說明 **************
******************************************/
u16 PWM0_low; //PWM輸出低電平的PCA時鐘脈沖個數, 用戶層不可見。
u16 PWM1_low; //PWM輸出低電平的PCA時鐘脈沖個數, 用戶層不可見。
u16 PWM2_low; //PWM輸出低電平的PCA時鐘脈沖個數, 用戶層不可見。
//========================================================================
// 函數: void PWMn_Update(u8 PCA_id, u16 high)
// 描述: 更新占空比數據。
// 參數: high: 占空比數據,即PWM輸出高電平的PCA時鐘脈沖個數。
// 返回: 無
// 版本: VER1.0
// 日期: 2013-5-15
// 備注:
//========================================================================
void PWMn_Update(u8 PCA_id, u16 high)
{
if(PCA_id == PCA0)
{
if(high > PWM_HIGH_MAX) high = PWM_HIGH_MAX; //如果寫入大于最大占空比數據,強制為最大占空比。
if(high < PWM_HIGH_MIN) high = PWM_HIGH_MIN; //如果寫入小于最小占空比數據,強制為最小占空比。
CR = 0; //停止PCA。
PCA_Timer0 = high; //數據在正確范圍,則裝入占空比寄存器。
PWM0_low = PWM_DUTY - high; //計算并保存PWM輸出低電平的PCA時鐘脈沖個數。
CR = 1; //啟動PCA。
}
else if(PCA_id == PCA1)
{// high=high+250; //左后電機較慢
if(high > PWM_HIGH_MAX) high = PWM_HIGH_MAX; //如果寫入大于最大占空比數據,強制為最大占空比。
if(high < PWM_HIGH_MIN) high = PWM_HIGH_MIN; //如果寫入小于最小占空比數據,強制為最小占空比。
CR = 0; //停止PCA。
PCA_Timer1 = high; //數據在正確范圍,則裝入占空比寄存器。
PWM1_low = PWM_DUTY - high; //計算并保存PWM輸出低電平的PCA時鐘脈沖個數。
CR = 1; //啟動PCA。
}
else if(PCA_id == PCA2)
{
if(high > PWM_HIGH_MAX) high = PWM_HIGH_MAX; //如果寫入大于最大占空比數據,強制為最大占空比。
if(high < PWM_HIGH_MIN) high = PWM_HIGH_MIN; //如果寫入小于最小占空比數據,強制為最小占空比。
CR = 0; //停止PCA。
PCA_Timer2 = high; //數據在正確范圍,則裝入占空比寄存器。
PWM2_low = PWM_DUTY - high; //計算并保存PWM輸出低電平的PCA時鐘脈沖個數。
CR = 1; //啟動PCA。
}
}
//========================================================================
// 函數: void UpdatePwm(u8 PCA_id, u8 pwm_value)
// 描述: 更新PWM值.
// 參數: PCA_id: PCA序號. 取值 PCA0,PCA1,PCA2,PCA_Counter
// pwm_value: pwm值, 這個值是輸出低電平的時間.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
/*
void UpdatePwm(u8 PCA_id, u8 pwm_value)
{
if(PCA_id == PCA0) CCAP0H = pwm_value;
else if(PCA_id == PCA1) CCAP1H = pwm_value;
else if(PCA_id == PCA2) CCAP2H = pwm_value;
}
*/
//========================================================================
// 函數: void PCA_Init(PCA_id, PCA_InitTypeDef *PCAx)
// 描述: PCA初始化程序.
// 參數: PCA_id: PCA序號. 取值 PCA0,PCA1,PCA2,PCA_Counter
// PCAx: 結構參數,請參考PCA.h里的定義.
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void PCA_Init(u8 PCA_id, PCA_InitTypeDef *PCAx)
{
if(PCA_id > PCA_Counter) return; //id錯誤
if(PCA_id == PCA_Counter) //設置公用Counter
{
CR = 0;
CH = 0;
CL = 0;
AUXR1 = (AUXR1 & ~(3<<4)) | PCAx->PCA_IoUse; //切換IO口
CMOD = (CMOD & ~(7<<1)) | PCAx->PCA_Clock; //選擇時鐘源
CMOD = (CMOD & ~1) | (PCAx->PCA_Interrupt_Mode & 1); //ECF
if(PCAx->PCA_Polity == PolityHigh) PPCA = 1; //高優先級中斷
else PPCA = 0; //低優先級中斷
if(PCAx->PCA_RUN == ENABLE) CR = 1;
return;
}
PCAx->PCA_Interrupt_Mode &= (3<<4) + 1;
if(PCAx->PCA_Mode >= PCA_Mode_SoftTimer) PCAx->PCA_Interrupt_Mode &= ~(3<<4);
if(PCA_id == PCA0)
{
CCAPM0 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode; //工作模式, 中斷模式
PCA_PWM0 = (PCA_PWM0 & ~(3<<6)) | PCAx->PCA_PWM_Wide; //PWM寬度
PCA_Timer0 = PCAx->PCA_Value;
B_Capture0 = 0;
PCA0_mode = PCAx->PCA_Mode;
CCAP0_tmp = PCA_Timer0;
CCAP0L = (u8)CCAP0_tmp; //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
CCAP0H = (u8)(CCAP0_tmp >> 8); //后寫CCAP0H
}
if(PCA_id == PCA1)
{
CCAPM1 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;
PCA_PWM1 = (PCA_PWM1 & ~(3<<6)) | PCAx->PCA_PWM_Wide;
PCA_Timer1 = PCAx->PCA_Value;
B_Capture1 = 0;
PCA1_mode = PCAx->PCA_Mode;
CCAP1_tmp = PCA_Timer1;
CCAP1L = (u8)CCAP1_tmp; //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
CCAP1H = (u8)(CCAP1_tmp >> 8); //后寫CCAP0H
}
if(PCA_id == PCA2)
{
CCAPM2 = PCAx->PCA_Mode | PCAx->PCA_Interrupt_Mode;
PCA_PWM2 = (PCA_PWM2 & ~(3<<6)) | PCAx->PCA_PWM_Wide;
PCA_Timer2 = PCAx->PCA_Value;
B_Capture2 = 0;
PCA2_mode = PCAx->PCA_Mode;
CCAP2_tmp = PCA_Timer2;
CCAP2L = (u8)CCAP2_tmp; //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
CCAP2H = (u8)(CCAP2_tmp >> 8); //后寫CCAP0H
}
}
//========================================================================
// 函數: void PCA_Handler (void) interrupt PCA_VECTOR
// 描述: PCA中斷處理程序.
// 參數: None
// 返回: none.
// 版本: V1.0, 2012-11-22
//========================================================================
void PCA_Handler (void) interrupt PCA_VECTOR
{
if(CCF0) //PCA模塊0中斷
{
CCF0 = 0; //清PCA模塊0中斷標志
if(P25) CCAP0_tmp += PCA_Timer0; //輸出為高電平,則給影射寄存器裝載高電平時間長度
else CCAP0_tmp += PWM0_low; //輸出為低電平,則給影射寄存器裝載低電平時間長度
CCAP0L = (u8)CCAP0_tmp; //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
CCAP0H = (u8)(CCAP0_tmp >> 8); //后寫CCAP0H
}
if(CCF1) //PCA模塊1中斷
{
CCF1 = 0; //清PCA模塊1中斷標志
if(P26) CCAP1_tmp += PCA_Timer1; //輸出為高電平,則給影射寄存器裝載高電平時間長度
else CCAP1_tmp += PWM1_low; //輸出為低電平,則給影射寄存器裝載低電平時間長度
CCAP1L = (u8)CCAP1_tmp; //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
CCAP1H = (u8)(CCAP1_tmp >> 8); //后寫CCAP0H
}
// if(CCF2) //PCA模塊2中斷
// {
// CCF2 = 0; //清PCA模塊1中斷標志
// if(P27) CCAP2_tmp += PCA_Timer2; //輸出為高電平,則給影射寄存器裝載高電平時間長度
// else CCAP2_tmp += PWM2_low; //輸出為低電平,則給影射寄存器裝載低電平時間長度
// CCAP2L = (u8)CCAP2_tmp; //將影射寄存器寫入捕獲寄存器,先寫CCAP0L
// CCAP2H = (u8)(CCAP2_tmp >> 8); //后寫CCAP0H
// }
/* if(CF) //PCA溢出中斷
{
CF = 0; //清PCA溢出中斷標志
}
*/
}
void PCA_config(void)
{
PCA_InitTypeDef PCA_InitStructure;
PCA_InitStructure.PCA_Clock = PCA_Clock_1T; //PCA_Clock_1T, PCA_Clock_2T, PCA_Clock_4T, PCA_Clock_6T, PCA_Clock_8T, PCA_Clock_12T, PCA_Clock_Timer0_OF, PCA_Clock_ECI
PCA_InitStructure.PCA_IoUse = PCA_P24_P25_P26_P27; //PCA_P12_P11_P10_P37, PCA_P34_P35_P36_P37, PCA_P24_P25_P26_P27
PCA_InitStructure.PCA_Interrupt_Mode = DISABLE; //ENABLE, DISABLE
PCA_InitStructure.PCA_Polity = PolityHigh; //優先級設置 PolityHigh,PolityLow
PCA_InitStructure.PCA_RUN = DISABLE; //ENABLE, DISABLE
PCA_Init(PCA_Counter,&PCA_InitStructure);
PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value = 65535; //對于軟件定時, 為匹配比較值
PCA_Init(PCA0,&PCA_InitStructure);
PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
PCA_InitStructure.PCA_Value = 65535; //對于軟件定時, 為匹配比較值
PCA_Init(PCA1,&PCA_InitStructure);
// PCA_InitStructure.PCA_Mode = PCA_Mode_HighPulseOutput; //PCA_Mode_PWM, PCA_Mode_Capture, PCA_Mode_SoftTimer, PCA_Mode_HighPulseOutput
// PCA_InitStructure.PCA_PWM_Wide = 0; //PCA_PWM_8bit, PCA_PWM_7bit, PCA_PWM_6bit
//// PCA_InitStructure.PCA_PWM_Wide = PCA_PWM_8bit;
// PCA_InitStructure.PCA_Interrupt_Mode = ENABLE; //PCA_Rise_Active, PCA_Fall_Active, ENABLE, DISABLE
// PCA_InitStructure.PCA_Value = 65535; //對于軟件定時, 為匹配比較值
// PCA_Init(PCA2,&PCA_InitStructure);
}
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1