📄 pwm2.c
字号:
/////////PCA CEX0为50HZ PWM 输出模式,PCA时钟为外部输入//////////////
/////////PWM2.c//////////////////////////
#include <C8051F040.h>
#define T3RUN temppage=SFRPAGE;SFRPAGE=0x01;TR3=1;SFRPAGE=temppage
#define T3STOP temppage=SFRPAGE;SFRPAGE=0x01;TR3=0;SFRPAGE=temppage
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
sfr16 RCAP2=0xca;
sfr16 RCAP3=0xca;
sfr16 RCAP4=0xca;
sfr16 TMR4=0xcc;
sfr16 TMR3=0xcc;
sfr16 TMR2=0xcc;
sfr16 PCA0CP0=0xfb;
sfr16 PCA0CP1=0xfd;
sfr16 PCA0CP2=0xe9;
sfr16 PCA0CP3=0xeb;
sfr16 PCA0CP4=0xed;
sfr16 PCA0CP5=0xe1;
uchar temppage;
void t3_fre_set(uint val){//T3频率设置,计算公式为:(T3时钟频率/(2*val))
temppage=SFRPAGE;
SFRPAGE=0x01;
RCAP3=~val+1;
TMR3=RCAP3;
SFRPAGE=temppage;
}
void t3_ini(){//t3为频率输出模式
temppage=SFRPAGE;
SFRPAGE=0x01;
TMR3CN=0x00;//TR3=0,T3尚未启动
TMR3CF=0x06;//T3采用系统时钟12分频,TOG3=1,T3不计数时输出为1,DCEN=0
SFRPAGE=temppage;
}
void delay1ms(uint time){//延迟1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void pca0ini(){//CEX0为8bit PWM输出模式
SFRPAGE = 0x00;
PCA0CPM0=0X42;
}
void PWM0_set(uchar low){//占空比设置,高电平占空比为(256-low)/256
SFRPAGE = 0x00;
PCA0CPH0=low;
}
void pcaini(){
SFRPAGE=0x00;
PCA0MD=0x06;//PCA采用ECI输入时钟,且PCA溢出中断禁止
PCA0CN=0x40;//启动PCA计数器
//EIE1|=0x08;//将此代码屏蔽,禁止PCA中断
}
void config(){
//看门狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉开关配置,CEX0-CEX5配置到P0.0-P0.5,ECI为P0.6口,T3为P0.7口
XBR0 = 0x70;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x01;
//管脚输出配置,P0口为开漏输出,其中P0.6接上拉电阻,P0为数字输入口
SFRPAGE = 0x0F;
P0MDOUT = 0x00;
P1MDIN = 0xFF;
//晶振配置,采用内部晶振4分频
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x81;
}
void main(void){
xdata uchar lowset;
config();
t3_ini();
t3_fre_set(239);//T3产生约为12800HZ的方波
T3RUN;
pcaini();
pca0ini();
lowset=0;
PWM0_set(lowset);
while(1){
delay1ms(1000);
lowset+=10;
PWM0_set(lowset);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -