功能要求:通过4*4薄膜键盘输入密码,LCD 上显示输入密码,Arduino UNO(Atmega328P)判断密码是否正确。如果密码正确,LCD 上显示开锁成功,绿灯亮,连接继电器的黄灯亮。LCD 第一行显示PASSWORD,第二行显示输入的密码。如果输入密码正确,第二行显示OPEN,如果输入密码错误,第二行显示INVALID。
Arduino是一个开源电子原型平台,拥有灵活、易用的硬件(Arduino开发板)和软件(Arduino IDE)。其中,Arduino UNO是一款最基础的Arduino开发板,采用的芯片是ATMEGA328P。这款开发板(芯片)包含14个数字引脚(带~的数字引脚具有PMW脉冲宽度调制功能),6个模拟引脚;即图片中的0-13以及A0-A5引脚。
Arduino IDE是一款针对Arduino开发板的集成开发环境,可以免费在官网上下载。由于本实验需要用到4*4键盘输入,还需要下载keypad库。首次打开IDE,选择File,preferences,可以将语言修改成英文,同时勾选编译显示详细输出,后续需要。此外,IDE还会自动下载安装一些程序包,如果下载失败可以通过连接手机热点解决。点击项目,选择添加.zip库,将刚才下载的keypad压缩文件添加,后续仿真程序需要用到。
Proteus需要破解下载,可以参考一些微信公众号,如:蓝朋友啊。由于Arduino IDE编写的程序是直接烧写到开发板的,如果没有开发板,就需要使用Proteus并基于Arduino UNO的芯片(ATMEGA328P)搭建电路来模拟开发板进行仿真。本实验提供的Proteus仿真电路如下图所示。
Arduino微控制器电路如下图。IO0~IO13相当UNO的14个数字引脚,在程序中以数字0-13代表。IO14-IO19连接到AD0-AD5,代表6个模拟引脚,在程序中可以以A0-A5代表,也可以以数字14-19代表。IO0和IO1分别与RX和TX相连接,如果要用到串口通信,那么数字引脚0和1不能用于输入输出功能。Arduino下载程序也是通过串口完成的,所以此时USB将占用0和1脚,此时0和1脚不能接任何东西,否则会产生冲突。
继电器电路如下图所示。当IO12输出高电平时,黄灯亮,否则黄灯灭。其余电路不再提及。
Arduino的程序主体包含void函数和loop函数。void函数是对Arduino UNO的初始化,每次复位后执行且只执行一次。loop函数则在void函数执行完毕后重复执行。
//KEYPAD的初始程序,实例化一个4*4的键盘
#include<Keypad.h>//引入库
const byte rows =4;//行数
const byte cols =4;//列数
char akeypad[rows][cols] ={
{'7','8','9','/'},
{'4','5','6','*'},
{'1','2','3','-'},
{'@','0','=','+'}
};
byte rowpins[rows]={3,2,19,18};//连接改键盘每行的引脚编号
byte colpins[cols]={17,16,15,14};//连接改键盘每列的引脚编号
Keypad customKeypad =Keypad(makeKeymap(akeypad),rowpins,colpins,rows,cols);//实例化键盘对象,此函数后四个参数必须是byte类型
//液晶的初始化程序
#include<LiquidCrystal.h>
const int rs=9,en=8,d4=7,d5=6,d6=5,d7=4;
LiquidCrystal lcd(rs,en,d4,d5,d6,d7);//这些参数的值分别代表Arduino UNO连接到LCD的rs、en、d4-d7引脚的引脚编号
int ledyellow = 12;//控制黄色发光二极管的引脚是12引脚
int ledgreen = 11;
int ledred = 10;
void setup() {
pinMode(ledyellow,OUTPUT);//将12引脚的模式设置为输出,必须先设置模式
pinMode(ledgreen,OUTPUT);
pinMode(ledred,OUTPUT);
digitalWrite(ledgreen,HIGH);//绿地和红灯该开始不亮,设置为高电平
digitalWrite(ledred,HIGH);
lcd.begin(16,2);//lcd以两行显示,每行16个字符
lcd.print("PASSWORD");//lcd在第二行显示PASSWORD
}
void loop() {
char truekey[4]={'1','2','3','4'};//设置密码
char thekey[4];
lcd.setCursor(0,1);//将lcd光标移动到第一行第一个字符
for(int x=0;x<=3;x++){
thekey[x] = customKeypad.waitForKey();//这个函数等待键盘输入并获取其值
lcd.print(thekey[x]);//在lcd上显示输入字符
}
//判断输入的密码是否正确
if(truekey[0]==thekey[0]&&truekey[1]==thekey[1]&&truekey[2]==thekey[2]&&truekey[3]==thekey[3]){
digitalWrite(ledgreen,LOW);
digitalWrite(ledyellow,HIGH);
lcd.setCursor(0,1);//lcd第一行显示OPEN
lcd.print("OPEN");
}
//如果输入的密码错误
else{
digitalWrite(ledred,LOW);
digitalWrite(ledyellow,LOW);
lcd.setCursor(0,1);
lcd.print("VALID");
}
}
编写玩程序后,首先需要Arduino IDE中选择工具、开发板,并且选择Arduino UNO。接下来就可以点击左上角的验证图标进行编译,在编译的输出中找到产生的hex文件地址。
打开Proteus的电路图,右击ATMEGA328P,选择EDIT PROPERTIES,在promgram files中选择编译产生的hex文件,即可开始仿真。如果选择EDIT PROPERTIES后弹出错误,可能是没有将工程文件放在电脑文档中的Proteus文件夹中(默认)。如果仿真一会后程序闪退,可能是MODELS文件不匹配导致的。右击Proteus,选择打开文件所在位置,返回上一级Proteus 8 Professional,复制MODELS文件夹;在c盘,programdata文件夹,Labcenter Electronics文件夹,Proteus 8 Professional文件夹中,右击粘贴覆盖原来的MODELS文件即可。
当输入密码为1234时,门锁打开,绿灯和黄灯点亮;否则红灯亮。
Arduino为我们提供了灵活易用的软件和硬件,由于没有开发板,本文采用了Proteus搭建电路来进行仿真。不过,仿真毕竟只是仿真,如果可以,操作实物还是更有意思的。