基于51单片机的取餐柜超市存包柜自助快递柜proteus仿真原理图程序

本文主要是介绍基于51单片机的取餐柜超市存包柜自助快递柜proteus仿真原理图程序,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

功能:
0.本项目采用STC89C52作为单片机系统的控制MCU
1.点击存入,LCD显示随机的4位密码,继电器短暂打开,表示开锁
2.点击取出,输入之前的4位密码,再点击确认,继电器短暂打开,表示开锁
3.本系统采用的是5V的电磁锁来模拟演示锁扣的开关状态,继电器通电后会自动弹开,人为合上。
4.采用DC002作为电源接口可直接输入5V给整个系统供电

原理图:
在这里插入图片描述

PCB :
在这里插入图片描述

主程序:

#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 = P1^2;		//代表锁控的继电器IO   高电平关锁,低电平开锁
sbit LED_RED = P1^0;	//代表密码输入错误的红灯IO  高电平熄灭,低电平点亮
sbit LED_GREEN = P1^1; //代表密码输入正确的绿灯IO  高电平熄灭,低电平点亮
sbit BUZZER = P3^7;
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 = 1;	   //刚上电 锁是需要保持闭合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 = 0;		  //开锁display3();					 //显示关门提示语	-- "close door!"delay(1900);				 //等待关门 大约3秒LOCK = 1;					 //关锁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) //密码输入正确{LED_RED = 1;	  //红灯熄灭LED_GREEN = 0; //绿灯亮LOCK = 0;	  //开锁delay(1900);  //等待大约3秒LOCK = 1;	  //关锁LED_GREEN = 1; //绿灯熄灭}else //密码输入错误{for (j = 0; j < 200; j++){BUZZER = ~BUZZER;delay(10);LED_RED = 0;	  //红灯亮LED_GREEN = 1; //绿灯熄灭}LOCK = 1;	 //关锁delay(1900); //等待大约3秒LED_RED = 1;	 //红灯熄灭}clear();		  //清屏,准备下一屏的显示global_state = 0; //返回到初始界面}break;}}
}void T0_interrupt(void) interrupt 1
{TH0 += TH0_temp;TL0 += TL0_temp;
}

仿真演示视频:
https://www.bilibili.com/video/BV1FM411r7ro/

实物演示视频:
https://www.bilibili.com/video/BV1X44y1S7Vz/

这篇关于基于51单片机的取餐柜超市存包柜自助快递柜proteus仿真原理图程序的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/402552

相关文章

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

day-51 合并零之间的节点

思路 直接遍历链表即可,遇到val=0跳过,val非零则加在一起,最后返回即可 解题过程 返回链表可以有头结点,方便插入,返回head.next Code /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}*

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

EMLOG程序单页友链和标签增加美化

单页友联效果图: 标签页面效果图: 源码介绍 EMLOG单页友情链接和TAG标签,友链单页文件代码main{width: 58%;是设置宽度 自己把设置成与您的网站宽度一样,如果自适应就填写100%,TAG文件不用修改 安装方法:把Links.php和tag.php上传到网站根目录即可,访问 域名/Links.php、域名/tag.php 所有模板适用,代码就不粘贴出来,已经打

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机

跨系统环境下LabVIEW程序稳定运行

在LabVIEW开发中,不同电脑的配置和操作系统(如Win11与Win7)可能对程序的稳定运行产生影响。为了确保程序在不同平台上都能正常且稳定运行,需要从兼容性、驱动、以及性能优化等多个方面入手。本文将详细介绍如何在不同系统环境下,使LabVIEW开发的程序保持稳定运行的有效策略。 LabVIEW版本兼容性 LabVIEW各版本对不同操作系统的支持存在差异。因此,在开发程序时,尽量使用

CSP 2023 提高级第一轮 CSP-S 2023初试题 完善程序第二题解析 未完

一、题目阅读 (最大值之和)给定整数序列 a0,⋯,an−1,求该序列所有非空连续子序列的最大值之和。上述参数满足 1≤n≤105 和 1≤ai≤108。 一个序列的非空连续子序列可以用两个下标 ll 和 rr(其中0≤l≤r<n0≤l≤r<n)表示,对应的序列为 al,al+1,⋯,ar​。两个非空连续子序列不同,当且仅当下标不同。 例如,当原序列为 [1,2,1,2] 时,要计算子序列 [

这些心智程序你安装了吗?

原文题目:《为什么聪明人也会做蠢事(四)》 心智程序 大脑有两个特征导致人类不够理性,一个是处理信息方面的缺陷,一个是心智程序出了问题。前者可以称为“认知吝啬鬼”,前几篇文章已经讨论了。本期主要讲心智程序这个方面。 心智程序这一概念由哈佛大学认知科学家大卫•帕金斯提出,指个体可以从记忆中提取出的规则、知识、程序和策略,以辅助我们决策判断和解决问题。如果把人脑比喻成计算机,那心智程序就是人脑的