|
//MADE BY TANG BIN.2019
//MG90S舵機,發送信號寬度>20ms,高電平0.5ms:0度,1ms:45,1.5ms:90。。。
//備注:模擬舵機,需要不斷發送信號驅動!
#include<reg52.h>
#include <intrins.h>
#define TIME_WAVE 20000 //20ms
#define JUMP 70 //1s跳動晶振11059200,100us計算跳動1106,1106/12=92,可實際舵機有偏差
#define TIME 100 //100us
#define DOWN 0
#define TRUE 1
#define FALSE 0
#define uchar unsigned char
#define uint unsigned int
sbit pwm=P1^0;
sbit key0=P3^4;
sbit key45=P3^5;
sbit key90=P3^6;
sbit key180=P3^7;
void delay(uint);
void delay500(uint n);
void send(uint);
//void set_time(uint);
void wait_time(uint);
uchar finish=FALSE;
uchar count=0;
sbit led=P1^7;
//主程序
void main(){
//中斷-------------------------
TMOD=0x01; //設置為T0中斷模式
//set_time(500);//初始時間
//50us的定時
TH0=(65536-JUMP)/256;
TL0=(65536-JUMP)%256;
EA=1; //開總中斷
ET0=1; //開TO中斷
TR0=1; //啟動T0
pwm=0;
led=1;
//-----------------------------
while(1)
{
uint i=0;
uchar down=FALSE;
//有鍵按下
if(key0==DOWN)
{
down=TRUE;
for(i=0;i<50;i++)//50*20ms=1,000ms=1s
send(500);
}
if(key45==DOWN)
{
down=TRUE;
for(i=0;i<50;i++)
send(1000);
}
if(key90==DOWN)
{
down=TRUE;
for(i=0;i<50;i++)
send(2000);
}
if(key180==DOWN)
{
down=TRUE;
for(i=0;i<50;i++)
send(2500);
}
led=down?0:1;
delay(50+down*500);
led=1;
}
}
//
/*
void set_time(uint n){
TH0=(65536-n)/256;
TL0=(65536-n)%256;
}*/
//
void send(uint us){
pwm=1;
wait_time(us);
pwm=0;
wait_time(TIME_WAVE-us);
}
void wait_time(uint us){
//uint jump=(us/25)*23;///500;
//TH0=(65536-jump)/256;
//TL0=(65536-jump)%256;
//nish=FALSE;
//TR0=1;
//while(finish==FALSE);
//delay500(2);
count=us/TIME;
while(count>0);
//TR0=0;
//_nop_();
}
//
void delay(uint xms){
uint i,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
void delay500(uint n){
uint i,j;
for(i=n;i>0;i--)
for(j=11;j>0;j--);
}
//中斷不應占用過多CPU時間
//在這做需要穩定時間處理的操作,不受主程序影響的操作
void T0_time() interrupt 1
{
TH0=(65536-JUMP)/256;
TL0=(65536-JUMP)%256;
//finish=TRUE;
if(count>0)count--;
}
|
-
-
舵機.rar
2019-3-28 20:51 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
1.12 KB, 下載次數: 52, 下載積分: 黑幣 -5
評分
-
查看全部評分
|