【毕业设计】19-基于单片机的物件计数控制系统设计(原理图工程+源代码工程+仿真工程+答辩论文)

news2024/11/23 22:44:28

typora-root-url: ./

【毕业设计】19-基于单片机的物件计数控制系统设计(原理图工程+源代码工程+仿真工程+答辩论文)

文章目录

    • typora-root-url: ./
  • 【毕业设计】19-基于单片机的物件计数控制系统设计(原理图工程+源代码工程+仿真工程+答辩论文)
    • 任务书
    • 设计说明书
      • 摘要
      • 设计框架架构
      • 设计说明书及设计文件
      • 源码展示

任务书

本设计是基于单片机的物件计数系统设计,依据相关传感器对经过的物件进行计数,以实现对流水线上的产品进行实时的、有效率的、精确计数。

1、利用相关的传感器完成物品的接近检测和技术。

2、单片机利用传感器输出的信号进行计数并显示该计数值

3、设计相关的硬件电路

4、自行设计软件编程
资料链接
原理图工程文件
原理图截图
仿真模型工程文件
仿真截图
答辩论文低重复率文档,25714字
英文文献及翻译
visio流程图

设计说明书

摘要

基于单片机的物件计数控制系统。采用STC89C52单片机控制系统的整体运行状态,红外发射和接收传感器负责监测当前是否有物体经过传感器,有无物体经过,传感器输出相应的跳变信号,经脉冲整形电路处理后,转换成标准的方波信号传送给单片机,单片机通过对脉冲的跳变沿进行计数,从而得知当前经过传感器物件的个数,完成基本的计数功能。为丰富系统的功能,该系统能实时显示当前物品的个数,也支持按键设定系统的上限计数功能,装箱计数功能等操作,当计数达到设定值时,系统自动给出报警提示。

设计框架架构

前 言… 1

第一章 绪论… 2

第一节 研究背景… 2

第二节 国内外研究情况… 3

第三节 本文的主要研究内容… 5

第四节 本章小结… 6

第二章 系统方案设计… 7

第一节 系统实现功能分析… 7

第二节 系统主要元器件方案选择… 7

一、单片机方案选择… 7

二、显示器方案选择… 8

第三节 系统各个功能模块原理介绍… 8

第四节 系统结构总框图… 9

第五节 本章小结… 10

第三章 系统硬件电路设计… 11

第一节 主控系统硬件设计… 11

一、单片机介绍… 11

二、单片机最小系统电路设计… 13

第二节 电源模块电路设计… 14

第三节 按键电路模块电路设计… 14

第四节 光学报警模块电路设计… 15

第五节 显示模块电路设计… 15

一、LCD1602介绍… 15

二、LCD1602的工作原理… 17

三、LCD1602模块电路设计… 18

第六节 声学报警模块电路设计… 19

第七节 物件检测模块电路设计… 19

第八节 系统总电路图… 20

第九节 本章小结… 21

第四章 系统的软件设计… 22

第一节 Keil软件介绍… 22

第二节 软件总设计流程… 23

第三节 按键模块程序设计… 24

第四节 显示模块程序设计… 25

第五节 物件检测模块程序设计… 26

第六节 报警模块程序设计… 26

第七节 本章小结… 27

第五章 系统的仿真实现… 28

第一节 仿真软件介绍… 28

第二节 系统仿真调试… 28

第三节 系统功能测试… 29

第四节 本章小结… 32

总 结… 33

致 谢… 34

参考文献… 35

附 录… 36

一、英文原文… 36

二、英文翻译… 43

三、工程图纸… 48

四、程序源码… 49

设计说明书及设计文件

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

源码展示

#include <reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include "intrins.h"											   
#define     u8  			unsigned char
#define     u16   		unsigned int
#define     uchar  			unsigned char
#define     uint   		unsigned int
uchar yushe_jishu=70,c=70;				//预设值
uint jishu; 								//值全局变量
//运行模式  
uchar Mode=0;				 				//=1是设置阀值  =2是设置阀值	=0是正常监控模式
//管脚声明
sbit Led_Gre
=P2^2;				 //绿灯
sbit Led_Yellow  =P2^4;				 //黄灯
sbit Buzzer    	 =P2^0;				 //蜂鸣器
sbit Fan    	 	 =P3^3;				 //
sbit irlink      =P1^1;        //
/********************************************************************
* 名称 : delay_1ms()
* 功能 : 延时1ms函数
* 输入 : q
* 输出 : 无
***********************************************************************/
void delay_ms(uint q)
{
	uint i,j;
	for(i=0;i<q;i++)
		for(j=0;j<110;j++);
}
/***********************************************************************************************************
LCD1602相关函数
***********************************************************************************************************/
//LCD管脚声明 (RW引脚实物直接接地,因为本设计只用到液晶的写操作,RW引脚一直是低电平)
sbit LCDRS = P2^7;
sbit LCDEN = P2^6;
sbit D0		 = P0^0;
sbit D1		 = P0^1;
sbit D2		 = P0^2;
sbit D3		 = P0^3;
sbit D4		 = P0^4;
sbit D5		 = P0^5;
sbit D6		 = P0^6;
sbit D7		 = P0^7;
//LCD延时
void LCDdelay(uint z)		  //该延时大约100us(不精确,液晶操作的延时不要求很精确)
{
  uint x,y;
  for(x=z;x>0;x--)
    for(y=10;y>0;y--);
}
void LCD_WriteData(u8 dat)	  
{
	if(dat&0x01)D0=1;else D0=0;
	if(dat&0x02)D1=1;else D1=0;
	if(dat&0x04)D2=1;else D2=0;
	if(dat&0x08)D3=1;else D3=0;
	if(dat&0x10)D4=1;else D4=0;
	if(dat&0x20)D5=1;else D5=0;
	if(dat&0x40)D6=1;else D6=0;
	if(dat&0x80)D7=1;else D7=0;
}
//写命令
void write_com(uchar com)
{
  LCDRS=0;				  
	LCD_WriteData(com);
//  DAT=com;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
//写数据
void write_data(uchar date)
{
  LCDRS=1;
	LCD_WriteData(date);
//  DAT=date;
  LCDdelay(5);
  LCDEN=1;
  LCDdelay(5);
  LCDEN=0;
}
/*------------------------------------------------
              选择写入位置
------------------------------------------------*/
void SelectPosition(unsigned char x,unsigned char y) 
{     
	if (x == 0) 
	{     
		write_com(0x80 + y);     //表示第一行
	}
	else 
	{      
		write_com(0xC0 + y);      //表示第二行
	}        
}
/*------------------------------------------------
              写入字符串函数
------------------------------------------------*/
void LCD_Write_String(unsigned char x,unsigned char y,unsigned char *s) 
{     
	SelectPosition(x,y) ;
	while (*s) 
	{     
		write_data( *s);     
		s ++;     
	}
}
//========================================================================
// 函数: void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l)
// 应用: LCD_Write_Char(0,1,366,4) ;
// 描述: 在第0行第一个字节位置显示366的后4位,显示结果为 0366
// 参数: x:行,y:列,s:要显示的字,l:显示的位数
// 返回: none.
// 版本: VER1.0
// 日期: 2013-4-1
// 备注: 最大显示65535
//========================================================================
void LCD_Write_Char(u8 x,u8 y,u16 s,u8 l) 
{     
	SelectPosition(x,y) ;
	if(l>=5)
		write_data(0x30+s/10000%10);	//万位
	if(l>=4)
		write_data(0x30+s/1000%10);		//千位
	if(l>=3)
		write_data(0x30+s/100%10);		//百位
	if(l>=2)
		write_data(0x30+s/10%10);			//十位
	if(l>=1)
		write_data(0x30+s%10);		//个位

}
/*1602指令简介
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x0d);//打开显示 阴影闪烁
  write_com(0x0d);//打开显示 阴影闪烁
*/
//1602初始化
void Init1602()
{
  uchar i=0;
  write_com(0x38);//屏幕初始化
  write_com(0x0c);//打开显示 无光标 无光标闪烁
  write_com(0x06);//当读或写一个字符是指针后一一位
  write_com(0x01);//清屏
	
}

//红外检测//
int irlink_de(void)
{
	if(irlink==0)
	{
				delay_ms(10);//去抖动 
		if(irlink==0)
		{
		c++;
		}
	}
	return c;	
}
void Display_1602(yushe_jishu,c)
{
	//显示预设
	LCD_Write_Char(1,4,yushe_jishu,3) ;
	

	
	//时时
	LCD_Write_Char(1,13,c,3) ;
}
/***********************************************************************************************************
按键检测相关函数
***********************************************************************************************************/
//按键
sbit Key1=P1^6;				 //设置键
sbit Key2=P1^7;				 //加按键
sbit Key3=P3^2;				 //减按键
#define KEY_SET 		1		//设置
#define KEY_ADD			2		//加
#define KEY_MINUS		3		//减
//========================================================================
// 函数: u8 Key_Scan()
// 应用: temp=u8 Key_Scan();
// 描述: 按键扫描并返回按下的键值
// 参数: NONE
// 返回: 按下的键值
// 版本: VER1.0
// 日期: 2015-05-29
// 备注: 该函数带松手检测,按下键返回一次键值后返回0,直至第二次按键按下
//========================================================================
u8 Key_Scan()
{	 
	static u8 key_up=1;//按键按松开标志
	if(key_up&&(Key1==0||Key2==0||Key3==0))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(Key1==0)			return 1;
		else if(Key2==0)return 2;
		else if(Key3==0)return 3;
	}
	else if(Key1==1&&Key2==1&&Key3==1)
		key_up=1; 	    
 	return 0;// 无按键按下
}
void main (void)
{
	u8 key;
 
	Init1602();			  //调用初始化显
  LCD_Write_String(0,0,"Counting System");  //开机界面
	LCD_Write_String(1,0,"SET:000  NOW:000"); 
    jishu=irlink_de(); 
	delay_ms(1000);
	while (1)        					//主循环
	{
		key=Key_Scan();					//按键扫描
    jishu=irlink_de();		
		if(key==KEY_SET)
		{
			Mode++;
		}
		
		switch(Mode)						//判断模式的值
		{
			case 0:								//监控模式
			{
				Display_1602(yushe_jishu,jishu);  //显示预设,预设,值,值
				
				if(jishu>=(yushe_jishu))	  //大于等于预设值时(为什么是大于预设值*10:因为我们要显示的是有小数点后一位,是一个3位数,25.9°C时实际读的数是259,所以判断预设值时将预设值*10)
				{		
					Buzzer=0;			  			//打开蜂鸣器报警
					Led_Yellow=1;		  			//打开报警灯
					Led_Gre   =0;           //关闭未报警指示灯
				}
				else					  					//值小于预设值时
				{
					Led_Yellow=0;		  			//关闭报警灯
					Led_Gre   =1;           //打开未报警指示灯
				}
				if((jishu<(yushe_jishu)))	  //当小于预设值并且也小于预设值时 (&&:逻辑与,左右两边的表达式都成立(都为真,也就是1)时,该if语句才成立)
				{
					Buzzer=1;			  			//停止报警
				}
				break;
			}
			case 1://预设模式
			{
				SelectPosition(1,3) ;					//指定位置
	   		write_com(0x0d);							//阴影闪烁
				if(key==KEY_ADD)							//加键按下
				{
					yushe_jishu++;					    //预设值(阀值)加1
					if(yushe_jishu>=99)			 		//当阀值加到大于等于99时
					yushe_jishu=99;					 		//阀值固定为99
					LCD_Write_Char(1,4,yushe_jishu,3) ;//显示预设
				}
				if(key==KEY_MINUS)				 		//减键按下
				{
					if(yushe_jishu<=1)					//当上限值减小到1时
					yushe_jishu=1;          		//固定为1
					yushe_jishu--;							//预设值减一,最小为0
					LCD_Write_Char(1,4,yushe_jishu,3) ;//显示预设
				}
				break;			  								//执行后跳出switch
			}			
			default	:	
			{
				write_com(0x38);//屏幕初始化
				write_com(0x0c);//打开显示 无光标 无光标闪烁
				Mode=0;			//恢复正常模式
				break;
			}
		}
		
	}
}


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

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

相关文章

【深度学习】pix2pix GAN理论及代码实现与理解

灵感&#xff1a;最近也是在看关于GAN方面的代码&#xff0c;也是看到了很多篇博客&#xff0c;都写的挺好的&#xff0c;让我醍醐灌顶&#xff0c;理解了GAN的原理以及代码实现。所以写一下来记载一下&#xff0c;最后有其他好文章的链接。 灵感来源&#xff1a;pix2pixGAN理…

干货 | 提前在开发阶段暴露代码问题,携程Alchemy代码质量平台

作者简介Lyan&#xff0c;携程资深后端开发工程师&#xff0c;负责自动化测试框架及平台类工具开发&#xff0c;关注Devops、研发效能领域。一、背景随着敏捷开发&#xff0c;DevOps开发模式的流行&#xff0c;代码质量分析作为研发质量保证体系的重要组成部分&#xff0c;不仅…

LVS负载均衡群集--NAT

目录 前言 一、对于lvs负载均衡的了解 1、群集&#xff08;集群&#xff09;的概述 1.1 出现的问题 1.2 解决高并发的方法 2、群集的类型 2.1 负载均衡群集 2.2 高可用群集&#xff08;冗余 单点故障&#xff09; 2.3 高性能运算群集&#xff08;分布式&#xff09; …

【C++面向对象程序设计】CH6 多态性与虚函数

目录 一、多态性的概念 二、一个典型的例子——【例6.1】 1.声明基类point类 2.声明派生类circle ​编辑 3.声明circle的派生类cylinder 三、虚函数 1.虚函数的作用 &#xff08;1&#xff09;派生类的对象可以给基类的对象赋值 &#xff08;2&#xff09;派生类的对象…

mmdetection3d SUN RGB-D数据集预处理

SUN RGB-D是普林斯顿大学发布的一种关于室内场景理解的数据集&#xff0c;共包含了10335个样本&#xff0c;其中训练样本和验证测试样本数量分别为5285和5050。每个样本包含了彩色图像&#xff08;RGB&#xff09;和深度&#xff08;D&#xff09;信息&#xff0c;并且分别进行…

智能微型断路器在道路照明、园区照明、隧道照明中的应用-安科瑞 时丽花

智能微型断路器应用场景 九小场所 商场、超市等购物场所 养老院、福利院、孤儿院等社会福利机构 图书馆、博物馆、科技馆、文化馆等文化活动中心 车站、轨道交通等交通枢纽 易燃易爆仓库、木材加工、纺织、喷涂、制药等企业 酒吧&#xff0c;网吧等娱乐场所 幼儿园、小…

B站视频弹幕不挡住人脸效果

前言 有天在B站看二舅的视频时&#xff0c;密密麻麻的弹幕居然没有二舅的人脸&#xff0c;很好奇是怎么做到的&#xff0c;于是决定一探究竟。 高端的效果&#xff0c;往往只需要采用最朴素的实现方式&#xff0c;琢磨了好一会儿&#xff0c;打开了F12&#xff0c;豁然开朗。…

Quartz深度实战

概述 Java语言中最正统的任务调度框架&#xff0c;几乎是首选。后来和Spring Schedule平分秋色&#xff1b;再后来会被一些轻量级的分布式任务调度平台&#xff0c;如XXL-Job取代。另外近几年Quartz的维护和发布几乎停滞&#xff0c;但这并不意味着Quartz被淘汰&#xff0c;还…

【干货】微信私域运营打法和案例拆解(附78页pdf下载链接)

省时查报告-专业、及时、全面的行研报告库省时查方案-专业、及时、全面的营销策划方案库【免费下载】2022年10月份热门报告盘点知识图谱在美团推荐场景中的应用实践.pdf清华大学256页PPT元宇宙研究报告.pdf&#xff08;附下载链接&#xff09;机器学习在B站推荐系统中的应用实践…

【吴恩达机器学习笔记】七、神经网络

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4e3;专栏定位&#xff1a;为学习吴恩达机器学习视频的同学提供的随堂笔记。 &#x1f4da;专栏简介&#xff1a;在这个专栏&#xff0c;我将整理吴恩达机器学习视频的所有内容的笔记&…

数据库设计三范式

数据库设计三范式 范式是数据库设计时遵循的一种规范&#xff0c;不同的规范需要遵循不同的范式&#xff0c;只有充分遵循了数据库设计的范式&#xff0c;才能设计开发出冗余较小、高效、结构合理的数据库。 通常&#xff0c;我们在设计数据库的时候会要求遵循三范式。 第一…

《强化学习周刊》第69期:ICLR2023强化学习论文推荐、MIT实现自动调整内在奖励的强化学习...

No.69智源社区强化学习组强化学习研究观点资源活动周刊订阅告诉大家一个好消息&#xff0c;《强化学习周刊》已经开启“订阅功能”&#xff0c;以后我们会向您自动推送最新版的《强化学习周刊》。订阅方法&#xff1a;方式1&#xff1a;扫描下面二维码&#xff0c;进入《强化学…

使用Python PySNMP模块获取设备指标

一、PySNMP模块介绍&#xff1a; PySNMP 是一个跨平台的纯Python SNMP 引擎实现。它具有功能齐全的 SNMP 引擎&#xff0c;能够充当代理/管理器/代理角色&#xff0c;通过 IPv4/IPv6 和其他网络传输传输 SNMP v1/v2c/v3 协议版本。目前&#xff0c;使用较多的是SNMP v3和v2c版…

Robust Document Image Dewarping Method Using Text-Lines and Line Segments论文学习笔记

1 摘要 传统的基于文本行的文档去扭曲方法在处理复杂布局和/或非常少的文本行时会出现问题。当图像中没有对齐的文本行时&#xff0c;这通常意味着照片、图形和/或表格占据了输入的大部分。因此&#xff0c;对于健壮的文档去扭曲变形&#xff0c;我们建议除了对齐的文本行之外…

Python解题 - CSDN周赛第11期 - 圆桌请客(脑筋急转弯)

本来想着没有all pass就不写题解了&#xff0c;但在赛后对最后一题纠结了好久&#xff0c;然后发现是个类似脑筋急转弯的题&#xff0c;自己与正确答案只差一层纸&#xff0c;实在有点不吐不快。另外本期考了经典的背包问题的模板题&#xff0c;也值得记录下来&#xff0c;加深…

全志科技A40i国产开发板——性能参数综合测试

本次测试板卡是创龙科技旗下,一款基于全志科技A40i开发板,其接口资源丰富,可引出双路网口、双路CAN、双路USB、双路RS485等通信接口,板载Bluetooth、WIFI、4G(选配)模块,同时引出MIPI LCD、LVDS LCD、TFT LCD、HDMI OUT、CVBS OUT、CAMERA、LINE IN、H/P OUT等音视频多媒…

宿主机与开发板网络共享

宿主机网络共享 一、关键步骤 11. 网络共享简介 目标&#xff1a;宿主机可以用ssh连接开发板&#xff0c;开发板可以上网。 步骤&#xff1a;宿主机与目标机用网线直连&#xff0c;宿主机采用IP共享的方式连接开发板&#xff1b; 配置项IP开发板IP192.168.0.232宿主机以太网I…

Java 序列化原理

我的网站 | 我的博客 | 序列化解析工具 概念 Java为我们提供了一种默认的对象序列化机制&#xff0c;通过这种机制可以将一个实例对象写入到IO流中&#xff0c;当然这种IO流可以是文件流、网络流或者其他什么流。 代码的写法 ObjectOutputStream 对象输出流&#xff0c;用…

2022新一代设备维修管理系统助力企业降本增效

设备的维修是指企业或者设备密集型单位为了保持、恢复并提升设备使用寿命而定期对设备进行状态的维护&#xff0c;备件的更换&#xff0c;发生故障后的维修和恢复&#xff0c;从而让设备保证良好的运营状态&#xff0c;提升设备的可利用性并保证产能和设备安全。 大型企业在设…

C++11标准模板(STL)- 算法(std::merge)

定义于头文件 <algorithm> 算法库提供大量用途的函数&#xff08;例如查找、排序、计数、操作&#xff09;&#xff0c;它们在元素范围上操作。注意范围定义为 [first, last) &#xff0c;其中 last 指代要查询或修改的最后元素的后一个元素。 归并两个已排序的范围 st…