使用51单片机输出PWM控制舵机
用单片机的P2^7引脚输出PWM波形,使用P2^4,P2^5引脚操作独立按键来控制舵机的角度
使用KEIL 4平台,代码如下:
主函数:
// GYZ
// 1路PWM波形输出,可以控制舵机和电调
#include
//引脚位定义
sbit key1 = P2^5;
sbit key2 = P2^4; //独立按键引脚
sbit pwm1 = P2^7;
//全局变量定义
unsigned int target =6,percent = 0;
// 头文件包含
#include
#include
#include
//函数声明
void Timer0Initial();
void initial_Timer();
void delay(unsigned int x);
void keyscan();
void main()
{
initial();
while(1)
{
keyscan();
}
}
独立按键扫描
key.h
void keyscan()
{
if(key1 == 0)
{
delay(3);
if(key1 == 0)
{
if(target >= 7)
{
target -= 1;
}
while(key1 == 0)
{P1 = 0x00;}
}
P1 = 0xFF;
}
if(key2 == 0)
{
delay(3);
if(key2 == 0)
{
if(target <= 26)
{
target += 1;
}
while(key2 == 0)
{P1 = 0x00;}
}
P1 = 0xFF;
}
}//按键检测程序
void initial()
{
key1 = 1;
key2 = 1;
P1 = 0xff;
initial_Timer();
}
定时器程序
Timer.h
//Timer Configuration
//使用12Mhz晶振
//理论上,12Mhz晶振12分频之后
//应该是100次计数时间是100us
//通过示波器实测
//选用65次计数产生一次中断
void Timer0Initial()
{
TH0 = (65536-65)/256;
TL0 = (65536-65)%256;
} //该初值使每0.1ms产生一次中断
void initial_Timer()
{
EA = 1; //开启总中断
ET0 = 1; //允许T0中断
TMOD = 0x01; //定时器模式,T0使用工作方式1
Timer0Initial(); //装初值,0.1ms产生一次中断
TR0 = 1; //打开T0定时器
}
void delay(unsigned int x)
{
unsigned int i,j;
for(i = 0;i< x; ++i)
for(j = 120; j >0 ; --j)
;
}
最后,中断的程序
interrupt.h
void Timer0() interrupt 1 using 0
{
percent += 1;
if(percent == 200)
{
percent = 0;
pwm1 = 1;//拉高电平的引脚,来维持50hz的频率
}
if(percent == target)
{
pwm1 = 0;
}
Timer0Initial();
}
TAG:
{aspcms:comment}