基于51单片机的超市存包密码柜锁proteus仿真程序设计

源文件: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;
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值