基于51单片机超市快递寄存自动柜设计源程序

news2024/11/20 2:39:27

一、系统方案
1、本设计采用这51单片机作为主控器。
2、存包,GSM短信取件码。
3、液晶1620显示。
4、矩阵键盘输入取件码,完成取包。
在这里插入图片描述

二、硬件设计
原理图如下:
在这里插入图片描述

三、单片机软件设计
1、首先是系统初始化
/*******************************************************************************

  • 函 数 名 : LcdInit()
  • 函数功能 : 初始化LCD屏
  • 输 入 : 无
  • 输 出 : 无
    *******************************************************************************/
    #ifndef LCD1602_4PINS
    void LcdInit() //LCD初始化子程序
    {
    LcdWriteCom(0x38); //开显示
    LcdWriteCom(0x0c); //开显示不显示光标
    LcdWriteCom(0x06); //写一个指针加1
    LcdWriteCom(0x01); //清屏
    LcdWriteCom(0x80); //设置数据指针起点
    }
    #else
    void LcdInit() //LCD初始化子程序
    {
    LcdWriteCom(0x32); //将8位总线转为4位总线
    LcdWriteCom(0x28); //在四位线下的初始化
    LcdWriteCom(0x0c); //开显示不显示光标
    LcdWriteCom(0x06); //写一个指针加1
    LcdWriteCom(0x01); //清屏
    LcdWriteCom(0x80); //设置数据指针起点
    }
    #endif

2、液晶显示程序
#include"lcd.h"

/*******************************************************************************

  • 函 数 名 : Lcd1602_Delay1ms
  • 函数功能 : 延时函数,延时1ms
  • 输 入 : c
  • 输 出 : 无
  • 说 名 : 该函数是在12MHZ晶振下单片机的延时。
    *******************************************************************************/

void Lcd1602_Delay1ms(uint c) //误差 0us
{
uchar a,b;
for (; c>0; c–)
{
for (b=199;b>0;b–)
{
for(a=1;a>0;a–);
}
}

}

/*******************************************************************************

  • 函 数 名 : LcdWriteCom

  • 函数功能 : 向LCD写入一个字节的命令

  • 输 入 : com

  • 输 出 : 无
    *******************************************************************************/
    #ifndef LCD1602_4PINS //当没有定义这个LCD1602_4PINS时
    void LcdWriteCom(uchar com) //写入命令
    {
    LCD1602_E = 0; //使能
    LCD1602_RS = 0; //选择发送命令
    LCD1602_RW = 0; //选择写入

    LCD1602_DATAPINS = com; //放入命令
    Lcd1602_Delay1ms(1); //等待数据稳定

    LCD1602_E = 1; //写入时序
    Lcd1602_Delay1ms(5); //保持时间
    LCD1602_E = 0;
    }
    #else
    void LcdWriteCom(uchar com) //写入命令
    {
    LCD1602_E = 0; //使能清零
    LCD1602_RS = 0; //选择写入命令
    LCD1602_RW = 0; //选择写入

    LCD1602_DATAPINS = com; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1; //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;

// Lcd1602_Delay1ms(1);
LCD1602_DATAPINS = com << 4; //发送低四位
Lcd1602_Delay1ms(1);

LCD1602_E = 1;	 //写入时序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;

}
#endif
/*******************************************************************************

  • 函 数 名 : LcdWriteData

  • 函数功能 : 向LCD写入一个字节的数据

  • 输 入 : dat

  • 输 出 : 无
    *******************************************************************************/
    #ifndef LCD1602_4PINS
    void LcdWriteData(uchar dat) //写入数据
    {
    LCD1602_E = 0; //使能清零
    LCD1602_RS = 1; //选择输入数据
    LCD1602_RW = 0; //选择写入

    LCD1602_DATAPINS = dat; //写入数据
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1; //写入时序
    Lcd1602_Delay1ms(5); //保持时间
    LCD1602_E = 0;
    }
    #else
    void LcdWriteData(uchar dat) //写入数据
    {
    LCD1602_E = 0; //使能清零
    LCD1602_RS = 1; //选择写入数据
    LCD1602_RW = 0; //选择写入

    LCD1602_DATAPINS = dat; //由于4位的接线是接到P0口的高四位,所以传送高四位不用改
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1; //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;

    LCD1602_DATAPINS = dat << 4; //写入低四位
    Lcd1602_Delay1ms(1);

    LCD1602_E = 1; //写入时序
    Lcd1602_Delay1ms(5);
    LCD1602_E = 0;
    }
    #endif

3、按键程序
void KeyDown()
{
char a = 0;
GPIO_KEY=0x0f;

while(1)
{

	if(GPIO_KEY!=0x0f)//读取按键是否按下
	{		
		Delay10ms(1);//延时10ms进行消抖
		if(GPIO_KEY!=0x0f)//再次检测键盘是否按下
		{		
			//测试列
			GPIO_KEY=0X0F;
			switch(GPIO_KEY)
			{
				case(0X07):	KeyValue=0;break;
				case(0X0b):	KeyValue=4;break;
				case(0X0d): KeyValue=8;break;
				case(0X0e):	KeyValue=12;break;
			}
			//测试行
			GPIO_KEY=0XF0;
			switch(GPIO_KEY)
			{
				case(0X70):	KeyValue=KeyValue+3;break;
				case(0Xb0):	KeyValue=KeyValue+2;break;
				case(0Xd0): KeyValue=KeyValue+1;break;
				case(0Xe0):	KeyValue=KeyValue;break;
			}
				
				while((a<50) && (GPIO_KEY!=0xf0))	 //检测按键松手检测
				{
					BEEP = 0;

					Delay10ms(1);
					a++;
				}

				switch(KeyValue)
				{	
				case 0:	 num = 10;
					break;
				case 1:	 num = 7;
					break;
				case 2:	 num = 4;
					break;
				case 3:	 num = 1;
					break;
				case 4:	 num = 0;
					break;
				case 5:	 num = 8;	
					break;		 	
				case 6:	 num = 5;
					break;
				case 7:	 num = 2;
					break;
				case 8:	 num = 11;
					break;
				case 9:	 num = 9;
					break;
				case 10: num = 6;
					break;
				case 11: num = 3;
					break;
				case 12: num = 15;
					break;
				case 13: num = 14;
					break;
				case 14: num = 13;
					break;
				case 15: num = 12;
					break;
				}				    
				BEEP = 1;
				break;				
		}
	}
}

}

4、核心算法程序
void one_data(uchar *str) //显示第一行数据
{
unsigned char y;
for(y=0;y<16;y++)
{
PuZh_1[y]=*str;
str++;
}
}
void two_data(uchar *str) //显示第一行数据
{
unsigned char y;
for(y=0;y<16;y++)
{
PuZh_2[y]=*str;
str++;
}
}
四、 proteus仿真设计
Proteus软件是一款应用比较广泛的工具,它可以在没有硬件平台的基础上通过自身的软件仿真出硬件平台的运行情况,这样就可以通过软件仿真来验证我们设计的方案有没有问题,如果有问题,可以重新选择器件,连接器件,直到达到我们设定的目的,避免我们搭建实物的时候,如果当初选择的方案有问题,我们器件都已经焊接好了,再去卸载下去,再去焊接新的方案的器件,测试,这样会浪费人力和物力,也给开发者带来一定困惑,Proteus仿真软件就很好的解决这个问题,我们在设计之初,就使用该软件进行模拟仿真,测试,选择满足我们设计的最优方案。最后根据测试没问题的仿真图纸,焊接实物,调试,最终完成本设计的作品。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1252251.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

#BUG SHOW# 深挖一个6年前的老“bug”

引言 最近参与了一个业务迁移的项目&#xff0c;需要把站点A迁移到站点B。不同的站点拥有各自独立的服务和数据库&#xff0c;可以说是毫无关联。为了兼容迁移过程中的存在的一部分特殊交易数据&#xff08;正向[支付]交易在站点A&#xff0c;但逆向[退款]操作在站点B操作&…

Oracle 最终抛弃了 Sun !

随着 Solaris 团队的彻底完蛋&#xff0c;看起来 Sun 微系统公司最终连块骨头都没剩下。 来自前 Sun 社区的消息表明&#xff0c;一月份的传闻&#xff08;Oracle 裁员 450 人&#xff09;成为了现实&#xff0c;上周五&#xff0c;Oracle 裁掉了 Solaris 和 SPARC 团队的核心员…

交换机的VRRP主备配置例子

拓朴如下&#xff1a; 主要配置如下&#xff1a; [S1] vlan batch 10 20 # interface Vlanif10ip address 10.1.1.1 255.255.255.0vrrp vrid 1 virtual-ip 10.1.1.254vrrp vrid 1 priority 200vrrp vrid 1 preempt-mode timer delay 20 # interface Vlanif20ip address 13.1.1…

QT visual stdio加载动态库报错126问题

报错126是找不到指定的模块 QT 查看构建目录&#xff0c;将依赖的动态库放到该目录下即可成功 visual stdio将依赖的动态库放到运行目录 在vs中使用导出类的动态库时&#xff0c;不但需要将对应的.dll放到对应的目录下&#xff0c;还需要将该动态库对应的.lib添加到如下配置才…

ChatGLM-6B下载安装

ChatGLM-6B下载安装 项目指向 想把模型下载本地微调 通过官网指引需要先下载git-lfs #Linux 下载安装 curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash sudo apt-get install git-lfs git lfs install如果是docker中的虚拟机…

物流单打印模板下载,佳易王物流托运单打印软件

物流单打印模板下载&#xff0c;佳易王物流托运单打印软件 上图是常用的物流单打印模板&#xff0c;佳易王物流单打印软件打印格式可以根据需要定制更改。 软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff…

Halcon [fill_up_shape],[close_circle],[dilation_circle]和[shape_trans]图像处理时填充区别

文章目录 文章专栏前言两者的区别fill_up_shapeshape_transclose_circledilation_circle 总结 文章专栏 我的Halcon开发 CSDN专栏 前言 本文用的案例是&#xff1a;Example: %HALCONEXAMPLES%/hdevelop/Applications/Completeness-Check/ball.hdev 两者的区别 [shape_trans]是…

【LLM】chatglm3的agent应用和微调实践

note 知识库和微调并不是冲突的&#xff0c;它们是两种相辅相成的行业解决方案。开发者可以同时使用两种方案来优化模型。例如&#xff1a; 使用微调的技术微调ChatGLM3-6B大模型模拟客服的回答的语气和基础的客服思维。接着&#xff0c;外挂知识库将最新的问答数据外挂给Chat…

vue2-006——使用脚手架搭建vue2项目+项目结构分析

一、创建项目&#xff1a;vue create 项目名 D:\EnyiWang\Documents\myStudy\vue>vue create vue_testVue CLI v5.0.8 ? Please pick a preset: Default ([Vue 2] babel, eslint)Vue CLI v5.0.8 ✨ Creating project in D:\EnyiWang\Documents\myStudy\vue\vue_test. &am…

批量按顺序1、2、3...重命名所有文件夹里的文件

最新&#xff1a; 最快方法&#xff1a;先用这个教程http://文件重命名1,2......nhttps://jingyan.baidu.com/article/495ba841281b7079b20ede2c.html再用这个教程去空格&#xff1a;利用批处理去掉文件名中的空格-百度经验 (baidu.com) 以下为原回答 注意文件名有空格会失败…

张弛声音变现课,惊悚电影配音篇

在提供惊悚片的声音配音服务时&#xff0c;配音员旨在制造一种让观众的心率加快、情绪紧张的气氛。惊悚片侧重于心理层面的紧张和预期的恐怖&#xff0c;声音在塑造这种心理效应中起到了至关重要的作用。演员需通过对声音的精细雕琢和调整来强化电影的悬念和紧迫感。以下是为惊…

SIM卡结构及上电流程详解

SIM卡结构及上电流程详解 1. sim卡概述1.1 什么是SIM卡1.2 Sim卡的作用 2. Sim卡的主要功能2.1存储数据2.2 PIN码保护2.3 用户身份鉴权2.4 Sim卡中的保密算法及密钥2.5 SIM卡的类型2.6 Sim卡物理接口2.7 SIM卡内部结构2.8 SIM卡文件结构2.9 常用的文件操作2.9.1 常用的有如下操…

Java基础(第九期):Java中的集合 ArrayList 集合的增删改查 Java实现学生信息管理系统

⚠️Java基础专栏 文章目录 ⚠ Java基础最后一期&#xff08;第九期&#xff09;到此结束 Java中的集合一、什么是集合二、ArrayList2.1 ArrayList介绍2.2ArrayList使用2.3 ArrayList添加add&#xff08;&#xff09;方法add&#xff08;index&#xff0c;E element&#xff0…

《微信小程序开发从入门到实战》学习二十九

3.4 开发参与投票页面 3.4.4 使用label组件扩大单击区域 radio组件的单击区域很小&#xff0c;只有文字左侧的圆圈可以点击&#xff0c;实际使用者一般会期望点击文字也可以选中选项&#xff0c;用label组件包含radio组件&#xff0c;就可以实现点击文字也可以选项。 label组…

基于WSL2+Docker+VScode搭建机器学习(深度学习)开发环境

基于WSL2DockerVScode搭建机器学习(深度学习)开发环境 内容概述&#xff1a;由于最近配发了新的工作电脑但不想装双系统&#xff0c;因此通过本博文来记录基于Windows子系统WSLDocker搭建机器学习与深度学习开发环境的流程步骤&#xff0c;同时记录该过程中所遇到的相关问题及解…

上新!2023年汉字小达人市级比赛在线模拟题增加2个刷题试卷

各位小学三年级到五年级的上海学霸孩子们&#xff0c;刚刚结束了上海小学生古诗文大会的复赛&#xff0c;就紧锣密鼓地全身心投入到上海小学生汉字小达人的市级比赛的备赛中了。 为了助各位孩子一臂之力&#xff0c;我把在线模拟题进行了更新&#xff0c;新增了两个可以刷题的试…

安卓用SQLite数据库存储数据

什么是SQLite&#xff1f; SQLite是安卓中的轻量级内置数据库&#xff0c;不需要设置用户名和密码就可以使用。资源占用较少&#xff0c;运算速度也比较快。 SQLite支持&#xff1a;null&#xff08;空&#xff09;、integer&#xff08;整形&#xff09;、real&#xff08;小…

深度学习第二天:RNN循环神经网络

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 文章目录 介绍 记忆功能对比展现 任务描述 导入库 处理数据 前馈神经网络 循环神经网络 编译与训练模型 模型预测 可能的问题 梯度消失 梯…

开源称重系统-有源代码

最近发现网上有个不错的开源称重软件&#xff0c;界面做的非常漂亮&#xff0c;收藏一下&#xff1b;还有硬件对接&#xff1a;耀华A9仪表、海康威视监控&#xff0c;IC卡读卡器&#xff0c;控制器对接都有&#xff0c;是个不错的软件&#xff0c;非常感谢作者分享&#xff1b;…

Day45:300.最长递增子序列、674. 最长连续递增序列、718. 最长重复子数组

文章目录 300.最长递增子序列思路代码实现 674. 最长连续递增序列思路代码实现 718. 最长重复子数组思路代码实现 300.最长递增子序列 题目链接 思路 单个字符都是一个长为1的子序列&#xff0c;直接初始化dp为1。先固定一个元素位置i&#xff0c;判断0-i范围内到i的最长子序…