当前位置: 首页 > news >正文

51单片机课设基于GM65模块的二维码加条形码识别

系统组成

  1. 主控单元:51单片机(如STC89C52)作为核心控制器,协调各模块工作。

  2. 扫描模块:GM65条码扫描头,支持二维码/条形码识别,通过串口(UART)与单片机通信。

  3. 显示模块:LCD1602液晶屏,用于显示扫描结果及系统状态(两行16字符)。

  4. 辅助电路:电源稳压、按键控制(可选)、蜂鸣器(扫描成功提示)等。

硬件设计

  1. GM65与单片机连接

    • GM65的TXD接单片机RXD(P3.0),RXD接单片机TXD(P3.1),共地处理。

    • 模块供电需稳定(5V/3.3V),建议独立电源或添加滤波电容。

  2. LCD1602显示接口

    • 使用并口模式:数据线(D0-D7)接P0口,控制线(RS、RW、EN)接P2口。

    • 或通过I2C转接板(如PCF8574)简化连线,节省IO资源。

  3. 其他外设

    • 按键:用于触发扫描或清除显示(可选)。

    • 蜂鸣器:扫描成功时鸣响反馈。

软件流程

  1. 初始化

    • 配置串口:设置波特率(如9600bps)、数据格式(8N1)匹配GM65。

    • 初始化LCD1602:清屏、设置显示模式及光标。

  2. 扫描与数据处理

    • 触发扫描:GM65设置为自动感应模式(或通过按键触发)。

    • 数据接收:单片机通过串口中断接收GM65发送的条码数据。

    • 数据解析:提取有效信息(如去除帧头帧尾、校验数据完整性)。

  3. 结果显示

    • 短文本直接显示(如商品条码数字)。

    • 长文本滚动显示或截取关键字段(如URL二维码显示首尾字符)。

    • 错误提示:显示“Error”或“Invalid Code”等状态

#include <REGX52.H>
#include "LCD1602.h"
#include "Key.h"
#include "AT24C02.h"
#include "Delay.h"
#include "string.h"
#include "UART.h"
#include <stdio.h>#define BUF_SIZE 64
unsigned char KeyNum;
unsigned int Num;
unsigned char len;
char UartBuf[BUF_SIZE];	   // 串口接收缓冲区
unsigned char UartCnt = 0; // 接收计数器
unsigned char flag;
void main()
{// 初始化LCD屏幕LCD_Init();// 在LCD上显示"Data:"LCD_ShowString(1, 1, "Data:");// 清空第二行,用于后续显示数据LCD_ShowString(1, 6, "                "); // 清空第二行LCD_ShowString(2, 1, "                "); // 清空第二行// 初始化UART1Uart1_Init();while (1){// 获取按键值KeyNum = Key();// 当UART缓冲区中有新数据且标志位为1时if (UartBuf[0] != '\0' && flag == 1) // 有新数据到达{// 计算字符串长度len = strlen(UartBuf);flag = 0;// 清空两行显示,为显示新数据做准备LCD_ShowString(1, 6, "                "); // 清空第二行LCD_ShowString(2, 1, "                "); // 清空第二行//  优先在第一行显示if (len <= 11) // 第一行剩余空间足够时,直接显示在第一行"Data:"之后显示全部字符{// 从第6列开始显示数据LCD_ShowString(1, 6, UartBuf);LCD_ShowString(2, 1, "                "); // 清空第二行}// 第一行剩余空间不足时换到第二行else if (len <= 27) // 11(第一行剩余)+16(第二行){// 显示前11个字符在第一行"Data:"之后char firstLinePart[12];strncpy(firstLinePart, UartBuf, 11);firstLinePart[11] = '\0';LCD_ShowString(1, 6, firstLinePart);// 显示剩余字符在第二行LCD_ShowString(2, 1, UartBuf + 11);}// 超过27字符截断显示else{char displayBuf[28];strncpy(displayBuf, UartBuf, 27);displayBuf[27] = '\0';// 显示前11个字符在第一行"Data:"之后LCD_ShowString(1, 6, displayBuf);// 显示剩余16个字符在第二行LCD_ShowString(2, 1, displayBuf + 11);}// 打印UART缓冲区中的数据printf("UartRoutine: %s\r\n", UartBuf);len = 0;// 清空UART缓冲区memset(UartBuf, '\0', BUF_SIZE); // 清空缓冲区}if (KeyNum == 1) // K1按键,Num自增{KeyNum = 0;P3_4=!P3_4;  //按键切换模块开启// printf("hello\r\n");}}
}void UART_Routine() interrupt 4
{if (RI == 1) // 如果接收标志位为1,接收到了数据{if (UartCnt < BUF_SIZE - 1) // 缓冲区未满{if (SBUF == '\n' || SBUF == '\r' || SBUF == '\x0d') // 接收到换行符{UartBuf[UartCnt] = '\0'; // 字符串结束符flag = 1;// len=UartCnt;UartCnt = 0;}else{UartBuf[UartCnt++] = SBUF; // 存储接收到的字符}}else // 缓冲区已满{UartBuf[BUF_SIZE - 1] = '\0'; // 强制结束字符串UartCnt = 0;}// UART_SendByte(SBUF); // 将收到的数据发回串口RI = 0; // 接收标志位清0}
}

 单片机定制:

相关文章:

  • 无法加载文件 E:\Program Files\nodejs\npm.ps1,因为在此系统上禁止运行脚本
  • 2025年【道路运输企业安全生产管理人员】考试题库及道路运输企业安全生产管理人员考试内容
  • 1688 数据接口调用秘籍:高效获取商品实时信息的开发指南
  • MySQL多条件查询深度解析
  • MySQL 聚簇索引与非聚簇索引:底层原理与实战深度解析
  • Redis设计与实现——Redis命令参考与高级特性
  • 【Java】应对高并发的思路
  • 20250517 我设想一个空间,无限大,空间不与其中物质进行任何作用,甚至这个空间能容纳可以伸缩的空间
  • MySQL中的数据类型和函数
  • 游戏引擎学习第289天:将视觉表现与实体类型解耦
  • 非易失性存储技术综合对比:EEPROM、NVRAM、NOR Flash、NAND Flash和SD卡
  • ORACLE RAC环境REDO日志量突然增加的分析
  • 大麦(Hordeum vulgare)中 BAHD 超家族酰基转移酶-文献精读129
  • 面试真题 - 高并发场景下Nginx如何优化
  • Vue百日学习计划Day21-23天详细计划-Gemini版
  • 【GESP】C++三级真题 luogu-B3867 [GESP202309 三级] 小杨的储蓄
  • 使用Pinia持久化插件-persist解决刷新浏览器后数据丢失的问题
  • Oracle 的 ASSM 表空间
  • 【论文阅读】A Survey on Multimodal Large Language Models
  • 《Immunity》(IF=25.5)| scATAC、scRNA-seq、scVDJ-seq联合分析B细胞亚群
  • 北方首场高温将进入鼎盛阶段,江南华南多地需警惕降雨叠加致灾
  • 特朗普称即将与伊朗达成核协议,外交部:中方愿继续发挥建设性作用
  • 外交部介绍对巴西、阿根廷、智利、秘鲁、乌拉圭等5国试行免签政策
  • 马上评|这种“维权”已经不算薅羊毛,涉嫌犯罪了
  • 跨文化戏剧的拓荒者与传承者——洪深与复旦剧社的百年回响
  • 这个“超强致癌细菌”,宝宝感染率高达40%,预防却很简单