?? servo1.c
字號:
/////////舵機(jī)調(diào)試程序//////////////
/////////servo1.c/////////
#include <C8051F040.h>
#define CEX0PORT p07//舵機(jī)控制信號管腳,為P0.7管腳
//系統(tǒng)時鐘為24500KHZ/8=3062.5KHZ
//周期為20ms,則頻率為50HZ,則tmph+tmpl=61250可以保證產(chǎn)生50HZ PWM
#define CONST_W 61250
#define FORMAT_ANG temp=6125L*angval;temp/=180;tmph=(uint)temp+1531;tmpl=(uint)CONST_W-tmph
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;
sbit p07=P0^7;
sbit p00=P0^0;
bit iscex0H;
uchar temppage;
xdata uint cex0L,cex0H;
xdata uint tmph,tmpl;
ulong temp;
int xdata angval;//1800表示180度,使得精度為0.1度
//轉(zhuǎn)化計算:tmph=6125*angval/180+1531,但是由于計算時超過65535就會溢出
//,所以不能直接這樣計算,可定義ulong型變量temp,
//temp=6125L*angval;temp/=180;tmph=(uint)temp+1531實現(xiàn)
void delay1ms(uint time){//延遲1ms
uint i;
uint j;
for (i=0;i<time;i++){
for(j=0;j<300;j++);
}
}
void pca0ini(){//CEX0為高速輸出模式
SFRPAGE = 0x00;
PCA0CPM0=0X4d;
}
void CEX0_out(uint h,uint l){//設(shè)置高電平值和低電平值
cex0L=l;
cex0H=h;
CEX0PORT=1;
iscex0H=1;
}
void CEX0_set(uint pram){//設(shè)置高速模式下一次中斷的間隔為pram個PCA時鐘
SFRPAGE = 0x00;
PCA0CP0+=pram;
PCA0CPM0|=0x40;//注意編譯的時候sfr16先寫高地址,再寫低地址
//所以編譯結(jié)果使得最后寫PCA0CPL0,將使得ECOM0清零,故加此句置1
}
void pcaini(){
SFRPAGE=0x00;
PCA0MD=0x09;//PCA時鐘為系統(tǒng)時鐘
PCA0CN=0x40;//開PCA時鐘
EIE1|=0x08;//開PCA中斷
}
void config(){//PCA管腳不配置輸出到crossbar
WDTCN = 0x07; // 看門狗禁止
WDTCN = 0xDE; // Disable WDT
WDTCN = 0xAD;
SFRPAGE = 0x0F;
XBR0 = 0x00; // XBAR0: Initial Reset Value
XBR1 = 0x00; // XBAR1: Initial Reset Value
XBR2 = 0x40; // XBAR2: Initial Reset Value
XBR3 = 0x00; // XBAR3: Initial Reset Value
SFRPAGE = 0x0F;
P0MDOUT = 0x00; // Output configuration for P0
P1MDOUT = 0x00; // Output configuration for P1
P2MDOUT = 0x00; // Output configuration for P2
P3MDOUT = 0x00; // Output configuration for P3
P4MDOUT = 0x00; // Output configuration for P4
P5MDOUT = 0x00; // Output configuration for P5
P6MDOUT = 0x00; // Output configuration for P6
P7MDOUT = 0x00; // Output configuration for P7
P1MDIN = 0xFF; // Input configuration for P1
P2MDIN = 0xFF; // Input configuration for P2
P3MDIN = 0xFF; // Input configuration for P3
SFRPAGE = 0x0F;
CLKSEL = 0x00; // Oscillator Clock Selector
OSCXCN = 0x00; // EXTERNAL Oscillator Control Register
OSCICN = 0x84; // Internal Oscillator Control Register
}
void main(void){
config();
pca0ini();
pcaini();
CEX0PORT=0;//將控制信號輸出置0
//0度對應(yīng):tmph=1531,tmpl=CONST_W-tmph
//180度對應(yīng):tmph=7656,tmpl=CONST_W-tmph,
angval=0;
FORMAT_ANG;//計算出tmph和tmpl的值
EA=1;
CEX0_out(tmph,tmpl);
delay1ms(1000);
while(1){
for(angval=0;angval<=180;angval+=30){//每隔2秒正轉(zhuǎn)30度
FORMAT_ANG;
CEX0_out(tmph,tmpl);
delay1ms(2000);
}
for(angval=180;angval>=0;angval-=30){//每隔2秒反轉(zhuǎn)30度
/*注意angval不能定義成uint型,否則angval>=0條件恒真*/
FORMAT_ANG;
CEX0_out(tmph,tmpl);
delay1ms(2000);
}
}
}
void PCA_ISR(void) interrupt 9 {
temppage=SFRPAGE;
SFRPAGE = 0x00;
if(CF){
CF=0;
}
if(CCF0){
if(iscex0H){
CEX0_set(cex0L);//隔cex0L個PCA時鐘后發(fā)生中斷,則低電平持續(xù)時間為
//cex0L個PCA時鐘
iscex0H=0;
}
else{
CEX0_set(cex0H);//隔cex0H個PCA時鐘后發(fā)生中斷,則高電平持續(xù)時間為
//cex0H個PCA時鐘
iscex0H=1;
}
CEX0PORT=iscex0H;
CCF0=0;
}
SFRPAGE=temppage;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -