基于51单片机的商场电子存包柜仿真

仿真图:

在这里插入图片描述

芯片/模块的特点:

AT89C52简介:
AT89C52是一款经典的8位单片机,是意法半导体(STMicroelectronics)公司生产的一系列单片机之一。它基于8051内核,并具有许多与其兼容的特性。

AT89C52的主要特点如下:

内部存储器:AT89C52具有8KB的闪存(Flash)存储器,可用于存储用户程序和数据。这些存储器的内容可以通过编程器进行编程和擦除。

RAM存储器:AT89C52配备了256字节的随机存取存储器(RAM),用于暂存数据和程序的变量。

外部扩展性:AT89C52支持多种外部扩展设备的连接,包括外部存储器(如RAM、EEPROM)和外设(如ADC、LCD、UART等),通过外部硬件连接,可以扩展单片机的功能和应用。

通用I/O引脚:AT89C52拥有32个可编程的通用输入/输出引脚,可用于连接外部设备和与其他芯片进行通信。

定时器/计数器:AT89C52内置了3个16位定时器/计数器和一个可编程的串行定时器/计数器。这些计时器/计数器可用于实现定时功能、生成脉冲信号、测量时间间隔等。0

串行通信:AT89C52支持串行通信接口,包括UART(串行异步通信)和SPI(串行外设接口),便于与其他设备进行数据通信和交互。

低功耗模式:AT89C52具有多种低功耗模式,如空闲模式和电源下模式,在不需要执行任务的时候可以将CPU进入低功耗状态以节省能量。

宽电源电压范围:AT89C52的工作电压范围通常为4.0V至5.5V,可以满足大多数应用需求。

主程序:

#include <reg52.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^3;		//代表锁控的继电器IO   高电平关锁,低电平开锁
sbit LEDRED = P1^7;	//代表密码输入错误的红灯IO  高电平熄灭,低电平点亮
sbit LEDGREEN = P1^6; //代表密码输入正确的绿灯IO  高电平熄灭,低电平点亮
sbit beep = P3^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; 
	uchar j;
	uchar passwd;

	uchar key_value = 0;
	uchar temp_key_value = 0xff;
	Lock = 0;	   //刚上电 锁是需要保持闭合
	Timer0_init(); //定时器初始化
	lcd_init();	   //LCD1602初始化

	while (1) //进入不断循环
	{
		temp_key_value = Calkey_scan(); //读取矩阵按键的键值
		if (temp_key_value != 0xff)
		{
			key_value = temp_key_value;
		}
		switch (global_state)
		{
		case 0:			//初始化状态
			display1(); //显示欢迎语句	-- "welcome"

			if (key_value == 13) //存包按键被按下
			{
				key_value = 0xff; //将按键值清除
				Lock = 1;		  //开锁

				display3();					 //显示关门提示语	-- "close door!"
				delay(1900);				 //等待关门 大约3秒
				Lock = 0;					 //关锁
				clear();					 //清屏,准备下一屏的显示
				global_state = 1;			 //切换运行状态
				passwd = TL0;				 //采用定时器寄存器的值作为密码
				genPasswd[0] = passwd / 100; //存储密码
				genPasswd[1] = passwd % 100 / 10;
				genPasswd[2] = passwd % 10;
				genPasswd[3] = (genPasswd[1] + genPasswd[2]) % 10;
			}
			if (key_value == 14) //取包按键被按下
			{
				key_value = 0xff;		//将按键值清除
				clear();				//清屏,准备下一屏的显示
				global_state = 2;		//切换运行状态
				count_num = 0;			//清除数字按键变量
				for (i = 0; i < 4; i++) //清空输入的密码数组
					inpPasswd[i] = ' ' - 0x30;
			}
			break;
		case 1:				  //密码生成状态
			display2();		  //显示密码生成界面
			delay(1900);	  //等待大约3秒
			global_state = 0; //返回到初始界面
			clear();		  //清屏,准备下一屏的显示

			break;
		case 2:										  //输入密码状态
			display4();								  //显示输入密码界面
			if ((key_value >= 0) && (key_value <= 9)) //如果按下的为0-9的数字按键
			{

				if (count_num <= 3) //如果按键次数小于4次
				{
					inpPasswd[count_num] = key_value; //将按键值存入数组,并显示
					count_num++;
				}
				key_value = 0xff; //将按键值清除
			}
			if (key_value == 15) //清除按键被按下
			{
				key_value = 0xff; //将按键值清除
				count_num = 0;
				for (i = 0; i < 4; i++)
					inpPasswd[i] = ' ' - 0x30; //清除刚刚输入的密码
			}
			if (key_value == 16) //确认按键被按下
			{
				key_value = 0xff; //将按键值清除
				for (i = 0; i < 4; i++)
				{
					if (inpPasswd[i] != genPasswd[i])
						break;
				}
				if (i == 4) //密码输入正确
				{
					LEDRED = 1;	  //红灯熄灭
					LEDGREEN = 0; //绿灯亮
					Lock = 1;	  //开锁
					delay(1900);  //等待大约3秒
					Lock = 0;	  //关锁
					LEDGREEN = 1; //绿灯熄灭
				}
				else //密码输入错误
				{

					for (j = 0; j < 200; j++)
					{
						beep = ~beep;
						delay(10);
						LEDRED = 0;	  //红灯亮
						LEDGREEN = 1; //绿灯熄灭
					}
					Lock = 0;	 //关锁
					delay(1900); //等待大约3秒
					LEDRED = 1;	 //红灯熄灭
				}
				clear();		  //清屏,准备下一屏的显示
				global_state = 0; //返回到初始界面
			}
			break;
		}
	}
}

void T0_interrupt(void) interrupt 1
{
	TH0 += TH0_temp;
	TL0 += TL0_temp;
}

设计文件:

链接:https://pan.baidu.com/s/1YptklYt-9ixgGH6v910_CQ?pwd=c94h

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值