工业微型条码识别系统的软件设计与实现毕业设计(编辑修改稿)内容摘要:

MCU OID← MCU 长度 23 bits 8 bits 用途 OID 的指标,命令和状态 命令 双向接口 概述:双向接口是用于 OID 控制器和 MCU 之间的,在这个协议中,只有两根线是用于传输数据的,在 SDIO 上数据依次从高位传输到低位,在 双向 接口中 MCU 是主机, OID设备是外围设备。 主从模式:在 双向 接口中,主设备是控制系统的主要部分,只有主机设备才能在 双向 接口上做以下的工作: 1 启动运行周期 2 在 SCK 上生成时钟信号 3 决定一个传输周期的方向 子设备在 双向 接口中是被动设备,它需要对主设备的指令很灵敏,如果已经有一个数据准备要发给主设备了,子设备就会发送一个 转移请求(拉低 SDIO 线)来通知主计算机信息工程学院毕业设计说明书 9 设备。 工作条件: 默认状态:主机让 SCK 保持低电平, SDIO 被外部上拉电阻拉高 开始:主设备通过改变 SCK 的状态(从低到高)发送一个转移周期 结束:如果主设备让 SCK 保持低的状态超过 1024 个时钟,子设备就会认为转移周期结束,接口工作时序图如图 36所示。 图 36 接口 工作时序图 但是有一点需要注意:当主设备让 SCK 保持高的状态,子设备会等待另一个状态改变(高变低)。 在 SDIO 上的数据从 MSb 依次转移到 LSb 上, SDIO 程度的变化只会发生在 SCK 一直保持在高电平, 当 SCK 是低状态, SDIO 的状态改变 是 禁止的。 换句话说, 当 SCK 为低状态时 , 在 SDIO 上可以捕获数据。 当 SCK 为高时,它能把数据放在 SDIO 上。 SDIO 状态的改变会发生在高变低边缘以后。 为了通信成功,主设备必须遵循以下规则去控制 SCK 1 为了 SDIO 的程度改变,主设备必须保持 SCK 的高状态超过 32 个时钟。 2 为了 SDIO 的数据捕获,主设备必须保持 SCK 的低状态超过 8 个时钟低于 1024 个时钟。 获取有效数据时序图如图 37 所示。 图 37 获取有效数据 时序图 子设备传输数据给主设备,读周期如表 33 所示。 表 33 读周期 总线 部分 开始 第 1 个字节 第 2~16 个字节 停止 SDIO 主设备 Z L Z Z 子设备 L Z 16 个比特数据 Z 在 SDIO 上转移的 17 个字节: 第 1个比特: W/R 控制比特,主设备让 SDIO 保持低状态来开启一个读周期。 第 2个比特到第 17个比特:由子设备产生的数据。 计算机信息工程学院毕业设计说明书 10 在接收到 17个比特之后, SDIO 会被外部上拉电阻拉高 在读周期之前,子设备发送一个转移请求(拉低 SDIO)去通知主设备,在主设备产生开始标示并放置读控制标示 在 SDIO 线上时,一个变化边缘后,子设备开始发送数据。 传输过后, SCK 变低状态作为结束标志并且 SDIO 被上拉电阻拉高。 读周期时序图如图 38所示。 图 38 读周期 时序图 主设备传输数据到子设备,写周期如表 34 所示。 表 34 写周期 总线 部分 开始 第 1 个字节 第 2~9 个字节 停止 SDIO 主设备 Z H 8 比特数据 H 子设备 Z/L Z Z Z 在 SDIO 上一个写周期会有 9 位比特: 第 1个比特是:读 /写控制比特,主设备拉高 SDIO 去标志一个写周期 第 2~9 个比特:由主设备产生的比特 在 SDIO 传输完 9 个比特以后,被外部电阻拉高 在写周期中, 主机产生一个上升沿在 SCK 上 , 并放置一个写控制标示 在 SDIO 线上,主设备传输的任何一个比特都要通过 SDIO,并且伴随着写控制 标示 在 SDIO 线上, 当 SCK 下降沿之后 子设备开始接收数据。 在传输结束后, SCK 线保持低状态作为停止 信号, 并且 SDIO线被外部电阻拉高,写周期时序图如图 39所示。 图 39 写周期 时序图 数据形式 从 OID 中得到的连续数据为 16 个比特指令或 16 个比特 标示。 OID 连续数据的规则如表 35所示。 计算机信息工程学院毕业设计说明书 11 表 35OID 连续数据的规则 bit15 bit14 bit13 bit12 bit11 bit10 bit9 bit8 bit7 bit6 bit5 bit4 bit3 bit2 bit1 0 关键标示 标示 1 关键标示 指令 从 OID 到 DSP 的指令: 1 OIDcmdPowerOn=0xfff8 2 OIDcmdPowerDown=0xfff7 3 OIDcmdWakeup=0xfff0 OID 图像处理会通知用户这个设备已经开始接收用户要求的信息 依次接收来自 DSP 的指令 命令从 DSP 到 OID 1UserCmdPowerOnOID=0x53 DSP 设备打开 OID 的 图像处理 2 UserCmdPowerDownOID=0x56 DSP 设备让 OID 图像处理处于休眠状态 3 UserCmd AutoSleepFunEnable=0xA0 DSP 开启自动休眠功能 4 UserCmd AutoSleepFunDisable=0xA3 DSP 不允许开启自动休眠功能 5 UserCmd TriggerToClearAutoSleepTimmer=0xA6 DSP 清除自动休眠时间 6 UserCmd_ClearAutoSleepTimmerIfOIDDetect=0xAC UserCmd_NonClearAutoSleepTimmerIfOIDDetect=0x50 OID 处理器的自动休眠定时器被清 0 7 UserCmd_CheckOIDStatus=0x30 DSP 可以发送这个命令去检查是否 OID 处理器被唤醒或休眠 控制时间 启动 OID 时序图如图 310 所示。 计算机信息工程学院毕业设计说明书 12 图 310 启动 OID 时序图 1 启动 OID:唤醒 OID 通过让 SCK 保持高状态超过 10ms 2 打开程序应该在 2s 内完成 在 OID 开始工作后, MCU 从 OID 读取数据 1 OID 发送的两个数据的时间间隔最少 50ms 2 如果 MCU 忽略了发送请求超过 300ms, OID 将移除发送请求并更新数据。 OID 读取数据时序图如图 311 所示。 图 311OID 读取数据 时序图 关闭: OID 将会直接关闭如果 MCU 忽略了来自 OIDcmdPowerDown 的发送请求超过75ms。 本章小结 本章主要完成硬件的设计, 介绍了这次毕业设计需要使用到的主要硬件设备及相应的各设备引脚功能,主要是 AT89S52(控制芯片), SONIX SN9P701F(图像处理模块) ,SONIX SN9S102C,并列出了系统参数 和 最佳工作状态。 计算机信息工程学院毕业设计说明书 13 第 4 章 系统软件的详细设计 为了实现 条形码的识别 , 本系统软件主要 为 控制 SONIX SN9P701F 模块程序、系统与上位机之间的 RS485 通信。 系统 流 程图 系统 流 程图 主要 分为以下几个部分: 系统 初始化, SONIX SN9P701F 控制及其条码识别 和 RS485 通信。 系统 流程图 如图 41 所示。 开 始关 中 断定 时 器 初 始 化R S 4 8 5 通 信 初始 化模 拟 I 2 C 端 口 初始 化开 中 断扫 描 条 形 码有 数 据发 送 给 上 位 机否是 图 41 系统 流程图 系统 初始化 设计 初始化程序流程图如图 42所示。 计算机信息工程学院毕业设计说明书 14 关 中 断定 时 器 初 始 化RS485通 信 初始 化模 拟 I2C端 口 初始 化开 中 断 图 42 初始 化流程图 初始化程序包括了关中断( EA=0),定时器初始化, RS485 通信初始化,模拟 I2C 端口初始化,开中断( EA=1)。 定时器初始化程序为 void InitT1( void) { TMOD = 0x20。 //定时器 T1 工作于定时器方式 2 TH1 =T1H。 //设置定时器的初值, 10ms TL1 =T1L。 //定义 T1H 0x0C4, T1L 0x00 TR1 =1。 //启动定时器 T1,开始计时 PCON=0x80。 SCON=0x50。 //设置串口工作 方式 } RS485 通信初始化程序 为 void InitRS485 (void) { RSSelect=1。 //默认为发送状态 =0。 //设置 state 初值 } 模拟 I2C 端口初始化程序为 void InitI2C(void) //I2C 总线初始化程序, 作用是 使总线处于空闲状态 { SCK=1。 _nop_()。 计算机信息工程学院毕业设计说明书 15 SDIO=1。 _nop_()。 } SONIX SN9P701F 控制 程序设计 用 IO 总线在 MCU 与 OID 设备之间模拟 I2C 通信,函数功能 实现单片机对 SONIX SN9P701F 的控制。 通信主要通过两根线 SCK(时钟) 和 SDIO(数据) 并 设置 SCK 为 P3^6,SDIO 为 P3^7,并定义数组 dat[]和 sum。 SONIX SN9P701F 控制及其条码识别流程图 如图43所示。 初 始 化 I O 口D e l a y 5 0 m sC l k 输 出 高判 断 D A T 是 否 为 低 , 如 果 2 秒 后还 不 为 低 , 说 明 S O N I X S N 9 S 1 0 2C 没 信 号D e l a y 6 0 m sC l k 输 出 低C l k 输 出 低把 d a t 作 为 输 出口 , 并 输 出 低C l k 输 出 高D e l a y 1 0 u s , 让笔 读 d a t 信 号C l k 输 出 高把 D A T 作 为 输入 口D e l a y 1 0 u sC l k 输 出 高D e l a y 1 0 u sC l k 输 出 低读 取 d a t是 否 读 了 2 3次如 果 收 到 2 3 b i t 数 据 为 0 x 6 0 f f f 8 , 表 示 笔 开 机成 功 , 这 时 候 拿 S O N I X S N 9 S 1 0 2 C 去 点码 , S O N I X S N 9 S 1 0 2 C 会 自 动 发 数 据 过 来否是是开 始结 束否 图 43 SONIX SN9P701F 控制 程序 流程图 本 程 序 包 括 模 拟 I2C 端口 初 始 化 程 序 Initi2c() , I2C 起 始 程 序 void I2CStart(void),I2C结束程序 void I2CStop(void)和 I2C 读取程序 void I2Cwork(void)。 I2C起始程序 功能是产生 I2C 总线的起始条件, 主要程序如下: 计算机信息工程学院毕业设计说明书 16 SDIO=1。 Delays(1)。 SCK=1。 //当时钟线 SCK 处于高电平时, SDIO 出现下降沿时启动 I2C 总线 Delays(1)。 SDIO=0。 //SDIO 由高变低,启动 I2C 总线 Delays(1)。 SCK=0。 Delays(1)。 I2C 读取程序的功能是在检测到 dat 中值为 0x60fff8 后,表示开机成功,然后用SN9S102C 去读取条码。 SN9S102C 会自动发送数据。 主要程序如下: Initi2c()。 //首先初始化 I2C 总线 Delays(5000)。 // 延时 程序 ,延时 60ms SCK = 1。 Delays(6000)。 //延时 60ms SCK=0。 Delays(20xx00)。 //延时 2秒后判断 SDIO 是否为低 if(SDIO == 0)//如果 SDIO 为低,说明 SN9S102C 检测到信号,否则不执行以下程序。 {SCK=1。 SDIO=0。 //把 SDIO 作为输出,并输出低 SCK=0。 Delays(10)。 //延迟 10us, 为了 让 笔读 取信号 SCK=1。 SDIO=1。 //将 SDIO 作为输入口 Delays(10)。 SCK=1。 Delays(10)。 for(i=0。 i23。 i++)//读取 23 次 {sum=sum+dat[i]。 } if(sum==0x60fff8)//如果 dat 读取的数据为 0x60fff8,则可以开始读取。 read()。 }。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。