#include "STM8S103F3U.h" //自定义的布尔类型233 typedef enum _bool{false = 0,true}bool; //同步方波电平 _Bool Pin_Sync @PB_ODR:4; //PWM占空比更新周期 unsigned char period=0; //当前PWM出来的占空比 unsigned char duty_cycle=0; //正弦表 unsigned char pwm[159]={5,10,15,20,25,30,35,40,45,50,54,59, 64,69,74,79,84,88,93,98,102,107,111,116,120,125,129,133,138, 142,146,150,154,158,162,166,170,173,177,181,184,188,191,194, 198,201,204,207,210,212,215,218,220,223,225,228,230,232,234, 236,238,239,241,243,244,245,247,248,249,250,251,252,252,253, 253,254,254,254,254,254,254,254,254,253,253,252,252,251,250, 249,248,247,245,244,243,241,239,238,236,234,232,230,228,225, 223,220,218,215,212,210,207,204,201,198,194,191,188,184,181, 177,173,170,166,162,158,154,150,146,142,138,133,129,125,120, 116,111,107,102,98,93,88,84,79,74,69,64,59,54,50,45,40,35,30 ,25,20,15,10,5,0}; //延时函数 貌似没用 不过留着 void DelayMS(unsigned int ms) { unsigned char i; while(ms != 0) { for(i=0;i<250;i++); for(i=0;i<75;i++); ms--; } } //TIM4的初始化 void Init_50Hz(void){ TIM4_IER = 0x00; // 禁止中断 TIM4_EGR = 0x01; // 允许产生更新事件 TIM4_PSCR = 0x02; // 2^2=4分频 TIM4_ARR = 0xF7; // 设定重装载时的寄存器值,最大值FF TIM4_CNTR = 0xF7; // 设定计数器的初值 TIM4_CR1 = 0x01; // b0 = 1,允许计数器工作 TIM4_IER = 0x01; // 允许更新中断 } //TIM2的初始化 用于PWM发生 void Init_PWM(void){ // CC1P = CC2P = 1,高电平为有效电平 // CC1E = CC2E = 1,开启输出引脚 TIM2_CCER1 = 0x33; // 通道1,2 被设置成比较输出方式 // OC2M = 111,为PWM 模式2, // 向上计数时,若计数器小于比较值,为无效电平 // 即当计数器在0 到比较值时,输出为1,否则为0 TIM2_CCMR1 = 0x70; TIM2_CCMR2 = 0x70; //设定频率----------------------------- //2^1=2分频 TIM2_PSCR = 0x01; //初始化自动装载寄存器 //Fpwm=fMaster/TIM2_PSCR/TIM2_ARR //=16000KHz/0xFF/(2^0x01)=31.25KHz TIM2_ARRH = 0x00; TIM2_ARRL = 0xFF; //初始化比较寄存器,决定PWM 方波的占空比 TIM2_CCR1H = 0; TIM2_CCR1L = 0; TIM2_CCR2H = 0; TIM2_CCR2L = 0; TIM2_CR1 = 0x01;// 启动计数 } //装占空比 产生50Hz方波的TIM4中断程序 @far @interrupt void TIM4_UPD_OVF_IRQHandler (void) { TIM4_SR = 0x00; // 清除更新标志 //设置占空比 duty_cycle=pwm[period]; //更新占空比 if(Pin_Sync){ TIM2_CCR1L=0; TIM2_CCR2L=duty_cycle; }else{ TIM2_CCR1L=duty_cycle; TIM2_CCR2L=0; } period++; if(period>160){ period=0; Pin_Sync=~Pin_Sync; //反向50Hz同步方波 } } //猪程序 void main(void) { CLK_CKDIVR = 0x00; //CPU全速工作>_< 16MHz! Init_50Hz(); Init_PWM(); _asm("rim"); //开中断 //GPIO初始化 PB_DDR=0x30; PB_CR1=0x30; PB_CR2=0x00; while (1); }