0 前言
🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 基于STM32的超市扫码结收银系统
🥇学长这里给一个题目综合评分(每项满分5分)
- 难度系数:3分
- 工作量:3分
- 创新点:5分
🧿 项目分享:见文末!
设计功能:
- ✨由STM32 OLED 扫码模块 储存模块组成
- ✨扫码模块用于扫描商品二维码及结算
- ✨储存模块存储对应的商品汉字库
- ✨付款界面识别二维码 价格够付款成功
1 简介
二维码识别系统是集数据采集,识别,以及显示信息于一体的数据系统。已经成为我们日常生产,生活中不可缺少的一部分。被广泛应用于金融支付、电子商务和团购消费领域、防伪溯源领域,以及工业生产领域。有着十分重要的应用意义。 二维码识别过程包含图像数据收集、图像矫正与处理 、信息显示。图像数据处理主要是通过硬件部分的摄像头对图像数据进行采集。经过图像的预处理得到的二维码图像再进行识别,对图像的处理进行了算法的优化。同时对系统的改进相比于原有的识别系统增加了存储模块,提高了存储空间识别效率。
2 扫码识别的一般过程
一维条形码的二进制表示方法
条形码的编码方法比较常规和普遍。即用模板组合的方式进行编制。那么何为模板宽度,谓模板宽度就是组成条形码宽度的一个基本单位。EAN-13前文已经提到,他的组成字符为0-9这10个阿拉伯数字字符。每个数字字符都是由两个条和两个空构成。共占据7个模板宽度。每个条的宽度范围在1到4个模板宽度之间。并且都是模板长的整数倍。1和0分别表示了条形码的条和空部分。
条码字符集是收集了所有一维条形码的字符集合。他的组成是由三个子集。分别为A子集,B子集,C子集。其部分二进制表示如图9所示。一共组成的编码形式有30种,即每个字符有3个表示形式。至于奇偶形式的表示则由二进制1的个数决定。但是,有三个字符是固定的,分别是条形码的起始符,中间分隔符,终止符。其对应的二进制形式分别是101,01010,101。因此他们三个也不会包含在二进制编码表里面。从图9所示的对应表里面也可以看出,每个数字字符集的奇数子集A和偶数子集C的元素是相反的,偶数子集B和偶数子集C是倒序的。
识别的相关算法
条形码的自动识别技术可以分为两个结构组成。即扫描和译码两部分。扫描结构顾名思义就是将条形码本身携带的信息用一些特殊的设备和技术将其读取出来。比如利用激光,将光信号转换成了电信号。扫描的最终结果是为了得到模板的宽度,也就是条可空的波形的宽度,其方法就是根据条和空的反射不同的效果进行读取。在前文已经提到,条反射回来的是弱信号,而空反射回来的是强信号。译码的原理是接着扫描操作进行的。就是将扫描得到的一些电信号,用一些特定的方式进行翻译,得到最终的数据信息,并且输入客户终端计算机。再将所得到的信息经过一个比较规则的整流电路进行整流处理,最后得到了我们在生活中总能看到的条形码图形。
本文设计的基础是系统识别相应的条码图像到显示在相应的液晶显示器上。系统的运行过程就是是读入图片到识别图片的过程,所以在分析它的功能的时候就按运行的过程进行模块划分。
便携式商品条形码识别器,上面提到主要由四大模块组成。激光扫描,单片机,12864液晶显示器,电源模块。其工作的大致原理为,激光扫描到条形码并进行存储。同时蜂鸣器开始鸣响,然后扫描器将数据信息通过串口通信传输给单片机,单片机收到信息后会与事先设定好的程序进行对比,并将对比后的信息传输给12864液晶显示器。显示器也会根据事先设计好的程序进行相应的显示格式,并完成工作。
3 二维码扫描识别模块
GM65 条形码二维码扫描识别模块是一种基于激光扫描头的识别设备
原理介绍
当GM65模块开始工作时,其内部的激光扫描头会发出一束激光光束,扫描通过镜子透过扫描窗口照射到条形码或二维码上。扫描头将扫描结果转化为电信号,通过模块内置的中央处理器进行解码和校验,最终以数字或文本形式输出结果。不同的码制采用不同的解码算法,因此模块需要具有多种码制解码的能力。
工作流程
工作流程主要包括四个步骤:激光扫描、识别、解码和输出。
激光扫描:当启动GM65 条形码二维码扫描识别模块时,内部的激光扫描头会发出一束激光束扫描条形码或二维码,从而捕捉到码制信息。
-
识别:扫描到码制信息后,GM65模块开始识别码制类型,包括一维码(如EAN-13、CODE-39、ITF-14等)和二维码(如QR码、Data Matrix码等)。
-
解码:确定码制类型后,GM65模块会使用相应的解码算法对码制信息进行解码,从而得到正确的数字或文本。
-
输出:最后,GM65模块将解码后的数字或文本以所设置的输出格式方式(如USB、串口、蓝牙等)输出给外部设备,如电脑、收银机等。
修改配置
因为是扫描二维码的模块,可以通过扫描技术手册提供的二维码进行修改模块的配置。例如修改波特率
代码示例
//初始化串口和中断
void My_USART3_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB时钟
//RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); //开启APB2总线复用时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE); //开启USART1时钟
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB ,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
GPIO_Init(GPIOB ,&GPIO_InitStructure);
USART_InitStructure.USART_BaudRate=9600;//波特率
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//控制流模式
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_InitStructure.USART_Parity=USART_Parity_No;//奇偶效验
USART_InitStructure.USART_StopBits=USART_StopBits_1;//停止位
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_Init(USART3,&USART_InitStructure);
USART_Cmd(USART3,ENABLE);//使能串口
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//打开接收非空中断
NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;//IRQ通道使能
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//子优先级位为1(响应优先级)
NVIC_Init(&NVIC_InitStructure);//设置相应的中断为响应优先级和抢占优先级
}
//编写中断处理函数
void USART3_IRQHandler(void) //串口3中断服务程序
{
uint8_t d;
//检测标志位
if(USART_GetITStatus(USART3, USART_IT_RXNE)==SET)
{
//接收数据
d = USART_ReceiveData(USART3);
//将接收到的数据依次保存到数组里
uart_buf[uart_cnt++] = d;
//GM65模块发完一组数据后会自动发送一个回车符,所以通过检测是否接受到回车来判断数据是否接收完成
if(d == 0x0D)
{
recv_ok = 1; //接收完成
}
//将接收到的数据,通过串口1返发给PC
USART_SendData(USART1, d);
while( USART_GetFlagStatus(USART1, USART_FLAG_TXE)==RESET); //等待发送完成
USART_ClearFlag(USART1,USART_FLAG_TXE); //清空标志位
USART_ClearITPendingBit(USART3,USART_IT_RXNE); //清空标志位
}
}
主函数
int main()
{
My_USART3_Init(); //初始化串口3
uart_init(9600); //初始化串口1
LED_Init(); //初始化LED
OLED_Init(); //初始化OLED
OLED_Clear(); //OLED清屏
printf("================GM65二维码模块测试=================\r\n");
OLED_ShowString(30,0,(u8*)"GM65 TEST!",16);
OLED_Refresh();
while(1)
{
if(recv_ok==1) //接收完成
{
OLED_Clear(); //OLED清屏
OLED_ShowString(30,0,(u8*)"GM65 TEST!",16);
//命令判断,当收到D0关灯,D1开灯
if(strstr((char*)uart_buf,"D0"))
{
GPIO_SetBits(GPIOE,GPIO_Pin_5); //关灯
OLED_ShowString(0,32,(u8*)"LED OFF",16);
}
else if(strstr((char*)uart_buf,"D1"))
{
GPIO_ResetBits(GPIOE,GPIO_Pin_5); //开灯
OLED_ShowString(0,32,(u8*)"LED ON",16);
}
OLED_ShowString(0,16,(u8*)"QRCode:",16);
OLED_ShowString(8*7,16,(u8*)uart_buf,16); //显示二维码内容
OLED_Refresh(); //刷新OLED
uart_cnt = 0; //最后清零,重新计数
recv_ok = 0; //接收完成标志置0
}
}
}
4 项目实现效果
毕业设计 STM32超市扫码收银系统
5 最后
包含内容
🧿 项目分享:见文末!