源文件:http://www.jh-tec.cn/archives/7104
前言:
之前讲了密码锁,接下来讲一下类似的超市存包密码柜,本次设计的方式是存包之后会自动随机生成一个密码,下次取包的时候输入该密码即可完成取包。
硬件设计
0.本系统采用STC89C52作为单片机
1.显示器采用的是LCD1602液晶,作为人机交互界面,显示密码输入情况
2.按键采用的是矩阵键盘,具有取包 存包 清楚 确认以及数字按键等功能
3.系统采用两个LED作为密码指示灯,红灯亮起表示密码错误,绿灯亮起表示密码正确
4.采用DC002作为电源接口可直接输入5V给整个系统供电
5.电磁锁是通过继电器来控制
以下是整体仿真图,矩阵键盘作为输入,具有蜂鸣器和LED作为声光报警器,采用一路继电器作为模拟密码柜的闭合和开启。
程序设计:
#include <reg51.h>
#include <intrins.h>
#include <stdlib.h>
#include <string.h>
#include<absacc.h>
#include "lcd1602.h"
#include "main.h"
#include "key.h"
sbit Lock = P3^7; //代表锁控的继电器IO 高电平关锁,低电平开锁
sbit LEDRED = P2^0; //代表密码输入错误的红灯IO 高电平熄灭,低电平点亮
sbit LEDGREEN = P2^1; //代表密码输入正确的绿灯IO 高电平熄灭,低电平点亮
sbit beep=P1^5;
uchar genPasswd[4]; //存储生成的四位随机数密码
uchar inpPasswd[4]; //存储取包时输入的四位密码
uchar code welcome[8]="welcome"; //开机显示的欢迎标语
uchar code set[7]="Passwd"; //显示生成的密码标题
uchar code close[12]="close door!"; //提示关门
uchar code input[13] = "input passwd"; //提示请输入密码
/****************定时器设置相关的变量***********************/
unsigned char TL0_temp; /*暂存TL0的初值*/
unsigned char TH0_temp; /*暂存TH0的初值*/
#define INT_CLOCK 10 /*INT_CLOCK为定时值,单位为ms ,此处定义为10ms*/
#define CRY_FREQUENCY 11059200 /*CRY_FREQUENCY为晶振频率,单位为Hz*/
/*延时程序*/
void delay(uint z)
{
unsigned int i,j;
for(i=0;i<z;i++)
for(j=0;j<100;j++);
}
/******************************
显示首页 welcome
******************************/
void display1()
{
unsigned char i;
for(i = 0;i < 7;i++)
{
wr_com(0x85+i);
wr_dat(welcome[i]);
}
}
/************************************
显示密码生成界面
************************************/
void display2()
{
unsigned char i;
for(i = 0;i < 6;i++)
{
wr_com(0x85+i);
wr_dat(set[i]);
}
for(i = 0;i < 4;i++)
{
wr_com(0xc6+i);
wr_dat(genPasswd[i]+0x30);
}
}
/************************************
显示请关门界面
************************************/
void display3()
{
unsigned char i;
for(i = 0;i < 11;i++)
{
wr_com(0x83+i);
wr_dat(close[i]);
}
}
/************************************
显示密码输入界面
************************************/
void display4()
{
unsigned char i;
for(i = 0;i < 12;i++)
{
wr_com(0x82+i);
wr_dat(input[i]);
}
for(i = 0;i < 4;i++)
{
wr_com(0xc6+i);
wr_dat(inpPasswd[i]+0x30);
}
}
/***********************************
定时器0初始化
***********************************/
void Timer0_init()
{
unsigned long T0_temp; /*暂存T0的初始值 */
T0_temp = 65536-((INT_CLOCK *CRY_FREQUENCY /1000)/12); /*T0初始值计算公式,参考教科书*/
TL0_temp = T0_temp & 0xff;
TH0_temp = T0_temp >> 8;
TL0 = TL0_temp;
TH0 = TH0_temp;
TMOD |= 0x01;
TR0 = 1; /*开定时器0中断*/
ET0 = 1;
EA = 1; /*开总中断*/
}
/*主函数*/
uchar global_state = 0;
uchar count_num = 0; //输入的数字个数
void main()
{
uchar i,j;
uchar passwd;