设为主页 加入收藏 繁體中文 英文

使用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}

在线客服

技术支持
点击这里给我发消息
产品咨询
点击这里给我发消息
客户服务
点击这里给我发消息
售后服务
点击这里给我发消息
销售一号
点击这里给我发消息
销售2号
点击这里给我发消息