/*
无论是大舵机,还是小舵机,控制方法都一样会
区别在 大舵机只能接P0口(此口外接上拉,驱动电流最大)
小舵机任意口
*/
//#include<reg51.h>
//#define uint unsigned int
//#define uchar unsigned char
//sbit S1=P0^3;
//sbit S2=P0^4;
//sbit S3=P0^5;
//sbit S4=P0^6;
//sbit S5=P0^7;
//
********舵机************//
//uchar count=0,jd=10;
//sbit duoji_pwm=P0^1;
//void Timer1Init();
//void key();
//void delay(uint x);
//void main()
//{
// Timer1Init();
// while(1)
// {
// key();
// }
//}
//void key()
//{
// if(S1==0)
// {
// delay(5);
// if(S1==0)
// {
// jd=13;
// }
// while(!S1);
// }
// else if(S2==0)
// {
// delay(5);
// if(S2==0)
// {
// jd=10;
// }
// while(!S2);
// }
// else if(S3==0)
// {
// delay(5);
// if(S3==0)
// {
// jd=6;
// }
// while(!S3);
// }
//}
///*******************************************************************************
//* 函 数 名 :Timer1Init
//* 函数功能 :定时器1 舵机,PWM
///*******************************************************************************/
void Timer1Init()//舵机 //0.5毫秒@11.0592MHz 定时器时钟12T模式
{
TMOD |= 0x10; //设置定时器模式
// IE = 0X82; // (EA = 1;//开总中断 ET1=1;//开中断)
TH1 = 0xFE; //设置定时初值
TL1 = 0x33; //设置定时初值
TR1 = 1; //定时器1开始计时
ET1=1;//开中断
EA = 1;//开总中断
}
//void Timer1Init(void) //100微秒@12.000MHz
//{
// TMOD |= 0x10; //设置定时器模式
// TL1 = 0x9C; //设置定时初值
// TH1 = 0xFF; //设置定时初值
// TF1 = 0; //清除TF1标志
// TR1 = 1; //定时器1开始计时
// ET1=1;//开中断
// EA = 1;//开总中断
//}
//
//void tiem1() interrupt 3
//{
// static uchar t=1;
TH1 = 0xFE; //设置定时初值
TL1 = 0x33; //设置定时初值
// TL1 = 0x9C; //设置定时初值
// TH1 = 0xFF; //设置定时初值
// t++;
//
if(t>50) t=0;
if(t<SPEED) motor_pwm=1;
else
motor_pwm=0;
//
// if(count<=jd)
// duoji_pwm=1;
// else
// duoji_pwm=0;
// count=count+1; //0.5毫秒 次数加一
// count=count%200; //始终保持40,即周期20毫秒
//}
//void delay(uint x)
//{
// uint i,j;
// for(i=x;i>0;i--)
// for(j=110;j>0;j--);
//}
/*
无论是大舵机,还是小舵机,控制方法都一样会
区别在 大舵机只能接P0口(此口外接上拉,驱动电流最大)
小舵机任意口
*/
#include<reg52.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char
sbit S1=P0^3;
sbit S2=P0^4;
sbit S3=P0^5;
sbit S4=P0^6;
sbit S5=P0^7;
int i=0,k=1;
//int a[3]={700,1500,2200};//700 左极限,2300右极限 (数组的调用和单独写等效, 但为什么实践混乱)
uchar ss1,ss2=1,ss3,ss4;
sbit duoji_pwm=P0^0;
void Init_t0(void);
void delay(uint x);
void key();
void main()
{
duoji_pwm=1;
Init_t0();
while(1)
{
key();
}
}
void key()
{
if(S1==0)
{
delay(5);
if(S1==0)
{
// k=0;
ss1=1;ss2=0;ss3=0;ss4=0;
}
while(!S1);
}
else if(S2==0)
{
delay(5);
if(S2==0)
{
// k=1;
ss1=0;ss2=1;ss3=0;ss4=0;
}
while(!S2);
}
else if(S3==0)
{
delay(5);
if(S3==0)
{
// k=2;
ss1=0;ss2=0;ss3=1;ss4=0;
}
while(!S3);
}
else if(S4==0)
{
delay(5);
if(S4==0)
{
// k=2;
ss1=1;ss2=0;ss3=0;ss4=0; delay(200);
ss1=0;ss2=0;ss3=1;ss4=0; delay(200);
ss1=1;ss2=0;ss3=0;ss4=0; delay(200);
ss1=0;ss2=0;ss3=1;ss4=0; delay(200);
ss1=1;ss2=0;ss3=0;ss4=0; delay(200);
ss1=0;ss2=0;ss3=1;ss4=0; delay(200);
ss1=1;ss2=0;ss3=0;ss4=0; delay(200);
ss1=0;ss2=0;ss3=1;ss4=0; delay(200);
ss1=0;ss2=1;ss3=0;ss4=0; delay(200);
}
while(!S4);
}
}
void Init_t0(void)
{
TMOD|=0x01;
TH0=(65536-700)/256;//初始化值 不起作用
TL0=(65536-700)%256;
EA=1;
ET0=1;
TR0=1;
}
void PWM0() interrupt 1
{
// if(P0_0==1)
// {
// TH0=(65536-(19950-a[k]))/256;
// TL0=(65536-(19950-a[k]))%256;
// }
// else
// {
// TH0=(65536-a[k])/256;
// TL0=(65536-a[k])%256;
//
// }
//
if(ss1==1)
{
if(duoji_pwm==1)
{
TH0=(65536-(19950-1150 ))/256;
TL0=(65536-(19950-1150))%256;
}
else
{
TH0=(65536-1150)/256;
TL0=(65536-1150)%256;
}
}
if(ss2==1)
{
if(duoji_pwm==1)
{
TH0=(65536-(19950-1500))/256;
TL0=(65536-(19950-1500))%256;
}
else
{
TH0=(65536-1500)/256;
TL0=(65536-1500)%256;
}
}
if(ss3==1)
{
if(duoji_pwm==1)
{
TH0=(65536-(19950-1800))/256;
TL0=(65536-(19950-1800))%256;
}
else
{
TH0=(65536-1800)/256;
TL0=(65536-1800)%256;
}
}
duoji_pwm=~duoji_pwm;
// i++;
// if (i>=80)
// {
// i=0;
// k++;
// if(k==8)k=0;
// }
}
void delay(uint x)
{
uint i,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}