|
//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
1.12 KB, 下载次数: 52, 下载积分: 黑币 -5
评分
-
查看全部评分
|