?? main.c
字號:
# include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
void keyscan(void);
uint a,b,c,d;
/*a為舵機1的脈沖寬度,b為舵機2的脈沖寬度,單位1/1000 ms */
/*c、d為中間變量*/
/*以下定義輸出管腳*/
sbit p12=P1^2;
sbit P13=P1^3;
sbit p16=P1^6;
sbit p15=P1^5;
sbit p17=P1^7;
void delay(void);
/*以下兩個函數為定時器中斷函數*/
/*定時器1,控制舵機1,輸出引腳為P12,可自定義*/
void timer0(void) interrupt 1 using 1
{p12=!p12; /*輸出取反*/
c=18432-c; /*20000代表20 ms,為一個周期的時間*/
TH0=-(c/256); TL0=-(c%256); /*重新定義計數初值*/
if(c>=470&&c<=2300)c=a;
else c=18432-a; /*判斷脈寬是否在正常范圍之內*/
}
/*定時器2,控制舵機2,輸出引腳為P13,可自定義*/
void timer1(void) interrupt 3 using 1
{P13=!P13;
d=18432-d;
TH1=-(d/256); TL1=-(d%256);
if(d>=470&&d<=2304)d=b;
else d=18432-b;
}
/*主程序*/
void main(void)
{TMOD=0x11; /*設初值*/
p12=1;
P13=1;p17=1;
a=2000;
b=566; /*數值1500即對應1.5ms,為舵機的中間90度的位置*/
c=a;d=b;
TH0=-(a/256); TL0=-(a%256);
TH1=-(b/256); TL1=-(b%256); /*設定定時器初始計數值*/
EA=1;
ET0=1; TR0=1;EX0=1;EX1=1;
ET1=1; TR1=1;
PX0=0;PX1=0;PT1=1;PT0=1;/*設定中斷優先級*/
for(;;)
{
keyscan();
}
}
/*在這個for循環中,可以根據程序需要
在任何時間改變a、b值來改變脈寬的輸
出時間,從而控制舵機*/
void keyscan(void)
{
if(p16==0)
{
delay();
if(p16==0)
{
if(500<=a&&a<=2100)a+=50;
p17=!p17;
while(p16==0);
}
}
if(p15==0)
{
delay();
if(p15==0)
{
if(550<=a&&a<=2150)a-=30;
p17=!p17;
while(p15==0);
}
}
}
void delay (void)
{
uint uidata;
for(uidata=1;uidata<=500;uidata++);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -