标题:
51单片机按键控制舵机0-180度自由调节
[打印本页]
作者:
腾飞的龙
时间:
2016-10-29 11:44
标题:
51单片机按键控制舵机0-180度自由调节
按键控制舵机0-180度自由调节
按键控制舵机0-180度.zip
2016-10-29 11:44 上传
点击文件名下载附件
下载积分: 黑币 -5
13.06 KB, 下载次数: 121, 下载积分: 黑币 -5
作者:
wanghaitao
时间:
2016-10-30 13:37
不错的方法
/************************************************************
芯 片:STC12C5A60S2
晶 振:11.0592MHz
功能描述:两个按键控制 舵机从0-180°变化?
在多功能试验板正确实现
遇到问题: 如果使用平常方法给TH0 TL0 赋值 ,那样定时误差比较大。。
平常方法: TH0=(65536-500)/256;
TL0=(65536-500)%256;
而如果使用这种方法:
TH0=-num/256; //高电平时间
TL0=-num%256;
误差就比较小。
*************************************************************/
#include<stc12c5a60s2.h>
#include<math.h>
#define uchar unsigned char
#define uint unsigned int
#define Cycle 4000 //定义周期 180度
#define Cycle1 500 //定义周期 0度
#define juzhong 1500 //定义周期 归中
uint PWM_Value[8];
uchar order=0; //中断步长
sbit key1=P3^7;
sbit key2=P4^6;
//PWM的输出端口
sbit PWM_OUT0=P1^3;
sbit PWM_OUT1=P0^1;
sbit PWM_OUT2=P0^2;
sbit PWM_OUT3=P0^3;
void Init_Timer0() //定时器0 初始化
{
TMOD=0x01;
TH0=(65536-500)/256;
TL0=(65536-500)%256;
EA = 1;//打开总中断
ET0 = 1;//打开定时器0中断
TR0 = 1;//启动定时器0
PT0=1; //定时器0 设置为最高优先中断
PX0=0; // 外部中断0 设置最低中断
}
//延时
void delay(void)
{
uint i=250;
while(i--);
}
//按键检测
void keyscan()
{
if(key1==0) //高电平加
{
if(PWM_Value[0]<Cycle)
PWM_Value[0]+=2;
if(PWM_Value[1]<Cycle)
PWM_Value[1]+=2;
if(PWM_Value[2]<Cycle)
PWM_Value[2]+=2;
if(PWM_Value[3]<Cycle)
PWM_Value[3]+=2;
}
if(key2==0) //高电平减
{
if(PWM_Value[0]>Cycle1)
PWM_Value[0]-=2;
if(PWM_Value[1]>Cycle1)
PWM_Value[1]-=2;
if(PWM_Value[2]>Cycle1)
PWM_Value[2]-=2;
if(PWM_Value[3]>Cycle1)
PWM_Value[3]-=2;
}
delay();
}
//主函数
void main(void)
{
PWM_Value[0]=juzhong;//舵机归中
PWM_Value[1]=juzhong;
PWM_Value[2]=juzhong;
PWM_Value[3]=juzhong;
Init_Timer0();
P4SW=0X70;
while(1)
{
keyscan();
}
}
//定时器0 中断子函数
//这里输出几路波形 就应该为 20MS/N =X 那么X 就是N路平分时间
//在用N-高电平时间 就为该路低电平时间咯。 就这么简单。。。
void timer0(void) interrupt 1
{
switch(order)
{
case 1:PWM_OUT0=1;
TH0=-PWM_Value[0]/256; //第一路输出高电平时长
TL0=-PWM_Value[0]%256;
break;
case 2:PWM_OUT0=0;
TH0=-(5000-PWM_Value[0])/256; //第一路 输出低电平时长
TL0=-(5000-PWM_Value[0])%256;
break;
case 3:PWM_OUT1=1;
TH0=-PWM_Value[1]/256;
TL0=-PWM_Value[1]%256;
break;
case 4:PWM_OUT1=0;
TH0=-(5000-PWM_Value[1])/256;
TL0=-(5000-PWM_Value[1])%256;
break;
case 5:PWM_OUT2=1;
TH0=-PWM_Value[2]/256;
TL0=-PWM_Value[2]%256;
break;
case 6:PWM_OUT2=0;
TH0=-(5000-PWM_Value[2])/256;
TL0=-(5000-PWM_Value[2])%256;
break;
case 7:PWM_OUT3=1;
TH0=-PWM_Value[3]/256;
TL0=-PWM_Value[3]%256;
break;
case 8:PWM_OUT3=0;
TH0=-(5000-PWM_Value[3])/256;
TL0=-(5000-PWM_Value[3])%256;
order=0;
break;
default: order=0;
}
order++;
}
复制代码
作者:
腾飞的龙
时间:
2016-11-5 12:43
谢谢!相互学习进步
作者:
tiny44
时间:
2016-11-7 22:30
谢谢!相互学习进步,我正要写
作者:
20151470
时间:
2017-2-12 15:08
漏洞百出,差评!!!!!
作者:
qjyjack612510
时间:
2017-4-28 09:40
前辈,我也想做个通过远程控制的WIFI带摄像头的小车…………。前后左右、摄像头上下左右(老的说法叫八通道)。驱动最好是无级变速的(是不是叫PWM),能实现吗?
作者:
qjyjack612510
时间:
2017-4-28 09:43
前辈,我也想做个带摄像头的小车。前后左右,摄像头上下左右(八通道),驱动最好是无级变速的(是不是叫PMW),有点基础,能不能指点下,能实现吗?
作者:
tomgay
时间:
2017-5-1 06:30
谢谢!相互学习进步
作者:
lixiaofei
时间:
2017-6-24 10:20
看一下,谢谢
作者:
dxa572862121
时间:
2017-9-18 14:57
看一下
作者:
秋名山老司机666
时间:
2018-4-18 16:51
楼主,厉害了
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1