前言
最近写avr时候发现网上教程太少,本着为各位的学习提供帮助的心理,把自己写的程序发出来,一起探讨学习,希望我们共同努力,为梦想奋斗。
实现功能
系统任意设定四个按键S1,S2,S3,S4,LCD1602显示器第一行显示系统运行状态,第二行
显示运行参数。
控制两路9g舵机,舵机1实现加持功能受控于按键S3和S4,仅当S1按下后再按下S3
时舵机可以逆时针慢速逐步旋转,此时1602第一行显示RUN,第二行显示down。保持S1
按下状态当按下S4时舵机可以实现顺时针旋转,此时1602第一行显示RUN,第二行显示
up。松开S1LCD1602不显示,舵机不工作。
电位器控制舵机2的转动角度,需要将电位器输出0—5V电压对应控制舵机2转动角
度0—180度范围,当S1按下此时1602第一行显示RUN,第二行显示电位器的输出电压,
舵机工作。松开S1LCD1602不显示,舵机不工作。S2为急停功能按键,当S2被按下后所有
功能失效,此时1602第一行仅显示STOP。
附录:9g舵机供电电压5V,角度范围0~189度。
工作电压一般为4.8V或6V,转速也不是很快,一般为0.22/60度或0.18/60度,所以假
如你更改角度控制脉冲的宽度太快时,舵机可能反应不过来。如果需要更快速的反应,就需
要更高的转速了。
该舵机的控制一般需要一个20ms~25ms左右的时基脉冲,该脉冲的高电平部分一般为
0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是
这样的:
0.5ms--------------0度;
1.0ms------------45度;
1.5ms------------90度;
2.0ms-----------135度;
2.5ms-----------180度;
程序源码
/*
* 编程2.c
*
* Created: 2020/3/30 9:33:55
* Author : zjlc
PB0-PB7 1602数据口 | PD0 RS | PD1 RW | PD2 EN | PD3 S2
PD4 舵机2 | PD5 舵机1 | S1 PC0 | S3-S4 PC2-PC3 | ADC PA0 |ADC基准电压 AREF
*/
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
char bit[]={
0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
int i=0,c;
char run[]="RUN";
char down[]="down";
char up[]="up";
char stop[]="stop";
float deam;
int light;
#define sreg _SFR_IO8(0x3f)
#define rs 0
#define rw 1
#define en 2
#define setrs() PORTD |=(1<<rs)
#define setrw() PORTD |=(1<<rw)
#define seten() PORTD |=(1<<en)
#define clrrs() PORTD &=~(1<<rs)
#define clrrw() PORTD &=~(1<<rw)
#define clren() PORTD &=~(1<<en)
int cishu=500;
void hungray()//忙信号
{
DDRB=0x00;
clrrs();
setrw();
seten()