51单片机按键控制舵机转动,但是舵机只能转到底,按按键没反应
舵机电路没问题,按键也没问题。用其他程序都是跑得动的,不知道为什么不行
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
sbit PWM=P2^1;
// _nop_()延时一个机器周期
typedef unsigned int u16;
typedef unsigned char u8;
u8 count = 0;
u8 timer1;
u8 angle;
u16 n;
sbit k1=P3^0;//角度增加
sbit k2=P3^1;//角度减小
/*
对于180°舵机
t = 0.5ms——————-舵机会转动 0 °
t = 1.0ms——————-舵机会转动 45°
t = 1.5ms——————-舵机会转动 90°
t = 2.0ms——————-舵机会转动 135°
t = 2.5ms——————-舵机会转动180
*/
/*延时程序*/
void delay(u16 n)//一个n约延时1ms
{
u16 x,y;
for(x=0;x<114;x++)
for(y=0;y<n;y++);
}
void delay1s(void) //误差 0us
{
unsigned char a,b,c;
for(c=167;c>0;c--)
for(b=171;b>0;b--)
for(a=16;a>0;a--);
_nop_(); //if Keil,require use intrins.h
}
/*按键扫描程序*/
void keyscan()
{
if(k1==0)
{
if(k1==0)
delay(100);
{
angle+=5;
}
while(!k1);
}
if(k2==0)
{
if(k2==0)
delay(100);
{
angle-=5;
}
while(!k2);
}
}
/*定时器T0初始化*/
void Timer0_Init()
{
TMOD &= 0x00;
TMOD |= 0x01; //定时器T0设置成方式1
TH0 = 0xff; //定时常数 0.1ms 晶振为11.0592MHz
TL0 = 0xb2;
ET0 = 1;
TR0 = 1;
EA=1;
}
/*T0中断初始化*/
void Time0_Init() interrupt 1
{
TR0 = 0;
TH0 = 0xff; // 0.1ms
TL0 = 0xb2;
if(count <= timer1) //5==0° 15==90°
{
PWM = 1;
}
else
{
PWM = 0;
}
count++;
if (count >= 200) //T = 20ms清零
{
count = 0;
}
TR0 = 1; //开启T0
}
void main()
{
Timer0_Init();
timer1=5;
n=500;
while(1)
{
keyscan();
if(angle>25)
angle=25;
if(angle<5)
angle=5;
timer1=angle;
count=0;
delay1s();
timer1=5;
count=0;
delay1s();
}
}