?? moto_pwm.c
字號:
/////////直流電機驅動調試電路//////////////
/////////moto_PWM.c//////////////////////////
#include <C8051F040.h>
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long ulong;
#define MOTO_BREAK DIR1A=DIR1B
#define MOTO_FORD DIR1A=0;DIR1B=1
#define MOTO_BACK DIR1A=1;DIR1B=0
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;
sbit DIR1A=P3^0;//方向控制管腳
sbit DIR1B=P3^1;
void pca0ini(){//CEX0為8bit PWM輸出模式
SFRPAGE = 0x00;
PCA0CPM0=0X42;
}
void delay1ms(uint time){//延遲1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void PWM0_set(uchar val){//高電平占空比為val/256
SFRPAGE = 0x00;
PCA0CPH0=~val+1;
}
void pcaini(){
SFRPAGE=0x00;
PCA0MD=0x08;//PCA采用系統時鐘,且PCA溢出中斷禁止
PCA0CN=0x40;//啟動PCA計數器
}
void config(){
//看門狗禁止
WDTCN = 0x07;
WDTCN = 0xDE;
WDTCN = 0xAD;
SFRPAGE = 0x0F;
//交叉開關配置,CEX0-CEX5配置到P0.0-P0.5
XBR0 = 0x30;
XBR1 = 0x00;
XBR2 = 0x40;
XBR3 = 0x00;
//管腳輸出配置,P0口為開漏輸出,其中P0.6接上拉電阻,P0為數字輸入口
SFRPAGE = 0x0F;
P0MDOUT = 0x00;
P1MDIN = 0xFF;
//晶振配置,采用內部晶振8分頻
SFRPAGE = 0x0F;
CLKSEL = 0x00;
OSCXCN = 0x00;
OSCICN = 0x84;
}
void main(void){
config();
pcaini();
pca0ini();
while(1){
//慢速反向運行2秒
MOTO_BACK;
PWM0_set(10);
delay1ms(2000);
MOTO_BREAK;//急停
//慢速正向運行2秒
MOTO_FORD;
PWM0_set(10);
delay1ms(2000);
MOTO_BREAK;//急停
delay1ms(2000);
//快速反向運行2秒
MOTO_BACK;
PWM0_set(200);
delay1ms(2000);
MOTO_BREAK;//急停
delay1ms(500);
//快速正向運行2秒
MOTO_FORD;
PWM0_set(200);
delay1ms(2000);
MOTO_BREAK;//急停
delay1ms(2000);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -