本人小白一枚,昨天用51实现了舵机的几个小功能,帮助和我一样初学的朋友~(。・`ω´・) 红电源 棕接地 橙色数据线 希望实现两个功能 程序2和程序1里面count和timer1两个值的功能恰好相反,这个需要注意。。。 使用按键控制角度,这个实现起来比较简单,控制角度只需要修改程序1中timer1的值
舵机(sg90,板子是普中的51)
如有错误不足还请大家指点接线
代码
转速(延时函数有问题,所以控制效果不好)程序1
// _nop_()延时一个机器周期 #include <reg52.h> #include <intrins.h> sbit PWM = P3^7; //设定PWM输出的I/O端口 unsigned char count = 0; unsigned char timer1 ; /* 对于180°舵机 t = 0.5ms——————-舵机会转动 0 ° t = 1.0ms——————-舵机会转动 45° t = 1.5ms——————-舵机会转动 90° t = 2.0ms——————-舵机会转动 135° t = 2.5ms——————-舵机会转动180 */ /*延时程序*/ 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 } /*定时器T0初始化*/ void Timer0_Init() { TMOD &= 0x00; TMOD |= 0x01; //定时器T0设置成方式1 TH0 = 0xff; //定时常数 0.1ms 晶振为11.0592MHz TL0 = 0xa4; ET0 = 1; TR0 = 1; EA=1; } /*T0中断初始化*/ void Time0_Init() interrupt 1 { TR0 = 0; TH0 = 0xff; // 0.1ms TL0 = 0xa4; 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(); while(1) { timer1 =5;//舵机恢复到0°的位置 count=0;//让定时器重新计数 delay1s(); timer1 =15;//舵机旋转90° count=0; delay1s(); } }
程序2
#include <reg52.h> #include <intrins.h> sbit PWM = P3^7; //设定PWM输出的I/O端口 typedef unsigned int u16; typedef unsigned char u8; u8 count = 0; u8 value,timer1;//用于调节占空比 bit DIR; /* 对于180°舵机 t = 0.5ms——————-舵机会转动 0 ° t = 1.0ms——————-舵机会转动 45° t = 1.5ms——————-舵机会转动 90° t = 2.0ms——————-舵机会转动 135° t = 2.5ms——————-舵机会转动180 */ /*延时程序*/ 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 delay100ms(void) //误差 0us { unsigned char a,b,c; for(c=19;c>0;c--) for(b=20;b>0;b--) for(a=130;a>0;a--); } /*定时器T0初始化*/ void Timer0_Init() { TMOD &= 0x00; TMOD |= 0x01; //定时器T0设置成方式1 TH0 = 0xff; //定时常数 0.1ms 晶振为11.0592MHz TL0 = 0xa4; ET0 = 1; TR0 = 1; EA=1; } /*T0中断初始化*/ void Time0_Init() interrupt 1 { TR0=0; TH0 = 0xff; // 0.1ms TL0 = 0xa4; count++; if(count>100) { count=0; if(DIR==1) { value++; delay100ms(); } if(DIR==0) { value--; delay100ms(); } } if(value==25) { DIR=0; } if(value==5) { DIR=1; } if(timer1>200) { timer1=0; } if(timer1<value) { PWM=1; } else { PWM=0; } timer1++; TR0=1; } void main() { Timer0_Init(); while(1) { delay1s(); } }
程序3
// _nop_()延时一个机器周期 #include <reg52.h> #include <intrins.h> sbit PWM = P3^7; //设定PWM输出的I/O端口 typedef unsigned int u16; typedef unsigned char u8; u8 count = 0; u8 timer1; u8 timer; u16 n; sbit k1=P3^1;//角度增加 sbit k2=P3^0;//角度减小 /* 对于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); { timer+=5; } while(!k1); } if(k2==0) { if(k2==0) delay(100); { timer-=5; } while(!k2); } } /*定时器T0初始化*/ void Timer0_Init() { TMOD &= 0x00; TMOD |= 0x01; //定时器T0设置成方式1 TH0 = 0xff; //定时常数 0.1ms 晶振为11.0592MHz TL0 = 0xa4; ET0 = 1; TR0 = 1; EA=1; } /*T0中断初始化*/ void Time0_Init() interrupt 1 { TR0 = 0; TH0 = 0xff; // 0.1ms TL0 = 0xa4; 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(timer>25) { timer=5; } timer1=timer; count=0; delay1s(); timer1=5; count=0; delay1s(); } }
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算