前言
最近写avr时候发现网上教程太少,本着为各位的学习提供帮助的心理,把自己写的程序发出来,一起探讨学习,希望我们共同努力,为梦想奋斗。
功能
在AVR开发板上模拟一台吊车的操作控制和状态显示功能。将开发板上独立按键设定
为使能键、急停键、电压采集键,将开发板上的按键或遥杆方向键设定为车的前进、后退、
提起和放下等控制键,使用LCD1602作为车的状态显示屏,使用LED(红、绿)作为车的
状态指示灯,使用蜂鸣器作为车的报警器。通过编程,实现以下功能:
-在按下使能键的同时,可通过指定按键模拟吊车操作,松开使能键,则操作按键无效;
-按下急停按钮,停止一切动作;
-控制配套的直流电机旋转,模拟吊车的前进、后退、提起、放下等功能;
-按下指定按键进行电压采集,通过电位计调节电压,模拟吊车的电量显示功能,同时
控制电机加速;
-根据按键输入,控制LED绿灯和红灯的亮、灭,模拟吊车的正常运行、急停或警示
状态;
-根据按键输入,控制蜂鸣器不响、响一声、连续响,模拟吊车的正常运行、使能键按
下、急停或警示等状态;
-根据按键输入,控制LCD显示多种状态信息,如:按秒更新显示系统累计运行时间、
暂停更新系统累计运行时间、显示采集的输出电压值(保留小数点后一位)、显示吊车执行
的工作状态。
程序
/*
* test.c
*
* Created: 2020/4/20 15:55:49
* Author : zjlc
PC0 使能键 | PC1 电机前进(可调)| PC2 电机后退(可调)| PC3 提起(可调,软件调) |PC4 放下(可调,硬件调)
|PD2 急停键 |PC5 电压采集 |PA6 蜂鸣器|PA5 红灯|PA4 绿灯|PA0 电压采集脚|
PD7 PD6 电机 PD4,5 电机 PD3 1602 EN PD1,0 RS,RW |
PB0-PB7 1602数据口
*/
#define F_CPU 8000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
char number[]={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
#define sreg _SFR_IO8(0X3F)
#define rs 0
#define rw 1
#define en 3
#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();
_delay_us(5);
while((PINB&0x80)&&(cishu--));
clren();
DDRB=0xff;
}
void write(char data,int or)//写指令或者数据
{
hungray();
PORTB=data;
if (or==0)//指令
{
clrrs();
}
else
{
setrs();
}
clrrw();
seten();
_delay_us(5);
clren();
}
void move(int x,int y)
{
if(x==0)
write(0x80|y,0);
else
write(0xc0|y,0);
}
void display