基于单片机的数据采集系统设计本科生毕业论文(编辑修改稿)内容摘要:

当 ST 上跳沿 时,所 有 内 部 寄 存 器 清零 ; 下 跳沿 时, 开 始 进行 A/D 转换 ; 在转换 期间 , ST 应保持 低 电 平。 EOC 为 转换 结束 信号。 当 EOC 为高电 平 时, 表明 转换 结束 ; 否 则 , 表明正 在 进行 A/D 转换。 OE为输出允 许信号 , 用于 控制三条输出锁存 器 向 单片机 输出 转换得到的数据。 OE= 1, 输出 转换得到的数据 ; OE= 0, 输出 数据 线呈 高 阻状 态。 D7- D0 为 数 字 量 输出线。 CLK为 时 钟 输入信号线。 因 ADC0809的 内 部没 有 时 钟 电路,所 需 时 钟 信号 必须由 外界提供 ,通常 使 用 频率 为 500KHZ, VREF( + ) , VREF(-)为 参考 电 压输入。 ADC0809 应用说明 : ( 1) ADC0809 内 部带 有输出锁存 器,可以 与 AT89S51 单片机直接 相连。 ( 2) 初始 化 时, 使 ST 和 OE信号 全 为 低 电 平。 ( 3) 送 要 转换的 哪 一通 道 的 地址 到 A, B, C 端 口 上。 ( 4) 在 ST端 给 出 一个 至少 有 100ns 宽 的 正脉冲 信号。 ( 5)是 否 转换 完 毕 ,我们 根 据 EOC 信号 来 判断。 ( 6)当 EOC变为高 电 平 时,这时 给 OE 为高 电 平 ,转换的数据就 输出 给 单片机 了。 74LS74 芯片 74LS74 为带预置和清除端的两组 D 型触发器, 在这次的系统设计中,它为AD0809芯片提供 500KHz的时钟信号,这是利用了触发器的工作。 一个触发器可以 2分频,二个触发器连接可提供 4分频。 原理 其主要电特性的典型值如下: 表二 引出端符号 : 第 16 页 逻辑图 : 图 5 74LS74逻辑图 MAX232 芯片 MAX232 芯片为串口 TTL 电平转换芯片。 接口电路为: 第 17 页 图 6 MAX232 连接图 74LS244 芯片 74LS74 为 八同相三态缓冲器 /线驱动器。 这里主要用于驱动共阴数码管 LED的显示驱动。 结构图和功能图为 : 图 7 74LS244 第 18 页 原理介绍 首先用 PROTEL 软件设计的原理图为 : 图 8 系统原理图 系统总的功能原理, 系统开机, 89C51 芯片工作,由 控制 发光二极管 1指示系统工作状态,亮表 示工作,暗表示不工作 由 控制发光二极管 2指示AD0809 工作状态,亮表示工作,暗表示不工作。 控制转换开始和结束,~ 控制八个按钮用来选择模拟输入转换通道,另外一个复位按钮。 由 P0口输入 AD0809 芯片 的转换数据结果 , 、 、 口接 AD0809 芯片的 ST、EOC、 OE3 个控制信号引脚,用于控制 AD0809 工作。 、 、 接 AD0809的 A、 B、 C 控制转换通道选择,另外 89C51 的 LEA。 数码管方面,有 P0 口输出数据, 、 、 控 制位选。 和微机接口方面, 89C51 的 RX、 TX 接 MAX232,MAX232 的 13和 14 引脚接 DB9 的 2引脚组成串口通信接线。 串口通信原理,单片机和 PC 机通信要经过 TTL 电平转换。 这里串行通信使用RS232 标准,它本是美国电子工业协会的推荐标准,现已在全世界的范围广泛采用。 RS232 实际上是串行通信的总线标准。 它用 3V 到 25V 表示逻辑“ 1” , +3V到 +25V 表示逻辑“ 0”。 这里只用 3个引脚构成串口通信, 2 脚发送数据 TXD, 3第 19 页 脚接收数据 RXD 和 5脚接地。 单片机的串口通信,在单片机芯片中, UART 已 集成在其中,做为组成部分,构成一个串行口,这个串行口是全双工的。 单片机串口通信的波特率设置是有单片机的定时记数器 1 提供时钟。 串口通信用到串口发送缓冲寄存器 SBUF 和 及串行通信控制寄存器 SCON。 串口有 3种工作方式,这里采用工作方式 1。 串口工作方式 1的原理为: TxD 脚发送 , RxD 脚接收 , 每次数据为 10 位 , 一个起始位 0 , 8 个数据位 , LSB 在前及一个停止位 1, 当接收数据时停止位存于 SCON 的 RB8 内波特率可变由定时器 1 溢出速率决定。 串行口工作于模式 1时 , 传输的是 10位 ; 1 位起始位 0, 8位 数据低位在先及一位停止位 1。 由 RxD接收 , TxD发送。 接收时 , 停止位存入 SCON 内 RB8。 80C51 波特率取决于定时器 1的溢出速率。 发送过程是由执行一条以 SBUF 为目的寄存器的指令启动的。 写 SBUF 信号还把 1 TB8 装入发送移位寄存器的第 9 位 , 同时通知发送控制器进行发送。 实际上发送过程开始于 16 分频计数器下次翻转后的那个机器周期的 S1P1 时刻。 每位的发送时序与 16 分频计数器同步 , 而并不与写 SBUF 信号同步。 发送以激活 SEND 端开始 , 向 TxD发送一起始位一位时间以后 DATA端有效 , 使输出 移位寄存器中数据得以送至 TxD。 再过一位 , 产生第一个移位脉冲。 数据向右移出 , 左边不断填以 0, 当数据字节的最高位移到移位寄存器的输出位置时 , 其左边是装入 1的第 9位 , 再左的内容均为 0。 此时通知 TX 控制器作最后一次移位 , 然后禁止 SEND端并置位 TI。 这都发生于写 SBUF后 16分频计时器的第 10次翻转时。 接收在 RxD端检测到负跳变时启动 , 为此 MCU对 RxD不断采样 , 采速率为波特率的 16倍。 当检测到负跳变时 , 16分频计数器立即复位 , 同时将 1FFH 写入输入移位寄存器。 复位 16分频计时器确保计时器翻转时位与输入数据 位时间同步。 计数器的 16个状态将每个位时间分为 16份。 在第 9状态时 , 位检测器对 RxD 端的值采样。 取值为三个采样值中取多数至少 2个作为读入值 , 这样可以抑制噪声。 如果所接收的第一位不为 0, 说明它不是一帧数据的起始位 , 该位被摒弃 , 接收电路被复位 , 等待另一个负跳变的到来。 这用来防止错误的起始位 , 如果起始位有效 , 则被移入输入移位寄存器 , 并开始接收这一帧中的其它位。 当数据位逐一由右边移入时 , 1从左边被移出。 当起始位 0移到最左边时 , 通知接收控制器进行最后一次移位 , 将移位寄存器内容 9 位分别装入 SBUF及 RB8, 并置 RI=1。 仅当最后一第 20 页 位移位脉冲产生时同时满足下述 2个条件 : RI=0, SM2=0或接收到的停止位 =1,才会装载 SBUF和 RB8, 并且置位 RI。 上述两个条件任一不满足 ,所接收到的数据帧就会丢失 , 不再恢复。 两者都满足时 , 停止位就进入 RB88, 位数据进入 SBUF, RI=1。 这时无论上述条件满足与否 , 接收控制单元都会重新等待 RxD的负跳变。 由于采样八百多 MHz,波特率要大于 9600BPS,这里我设置为 9600bps, 由定时器 1工作方式 2提供。 在 80C51 中模式 1 和模式 3 的波特率由定时器 1 的溢出速 率决定。 使用定时器 1 作波特率发生器 当定时器 1 用作波特率发生器模式 1 和 3 中波特率由定时器1 的溢出速率和 SMOD1 的值决定。 模式 1 、3 波特率 2 nS M O D(定时器 1 溢出速率) 在此应用中定时器 1 不能用作中断 , 定时器 1 可以工作在定时或计数方式和 3 种工作模式中任何一个。 在最典型应用中它用作定时器方式工作自动重装载模式TMOD 的高半字节为 0010B, 它的波特率值由下式给出 : 模式 1 、3 波特率 2 nS M O D 振荡器频率1 2 [ 2 5 6 ( T H 1 ) ] 可以定时器 1 的中断实现非常低的波特率将定时器配置为 16 位定时器 TMOD 的高半字节为 0001B, 并使用中断进行 16位软件重装。 LED显示原理,数码管的发光和发 光 2极管的显示原理相同。 这里采用静态显示原理,扫描显示。 软件设计 在这里我用 C 语言编写系统程序,用 C语言写程序的好处前面已经说过,KEILC51 真的是很好的软件,我写的程序在 KEIL 上仿真通过,程序见附录。 软件结构图: 第 21 页 开 机选择通道。 开始转换。 A / D 转换L E D 显示串口发送结束转换。 复 位YYYYNNN 图 9 软件流程图 可 分 为 4 个模块: ( 1)、控制模块 ( 2)、 AD 转换模块 ( 3)、 LED 显示模块 ( 4)、串口发送模块 PC 机上数据接收软件制作 在这里我用 VC++的 MFC 制作数据采集器的上位机数据接收软件。 下面讲述主要制作过程: :打开 VC++ ,建立一个基于对话框的 MFC 应用程序 cg1 MSComm 控件 选择 Project 菜单下 Add To Project子菜单中的 Components and Controls„选项,在弹出的对话框中双击Registered ActiveX Controls 项,则所有注册过的 ActiveX 控件出现在列表框中。 选择 Microsoft Communications Control, version ,单击第 22 页 Insert 按钮将它插入到我们的 Project 中来,接受缺省的选项。 这时在 ClassView视窗中就可以看到 CMSComm 类了,并且在控件工具栏 Controls 中出现了电话图标现在要做的是用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。 ClassWizard 定义 CMSComm 类控制对象 打开 ClassWizard- Member Viariables 选项卡,选择 CGc1Dlg 类,为 IDC_MSCOMM1 添加控制变量: m_ctrlComm,这时你可以看一看,在对话框头文件中自动加入了//{{AFX_INCLUDES() include //}}AFX_INCLUDES (这时运行程序,如果有错,那就再从头开始)。 向主对话框中添加两个编辑框,一个用于接收显示数据 ID为 IDC_EDIT_RXDATA,另一个用于输入发送数据, ID 为 IDC_EDIT_TXDATA,再添加一个按钮,功能是按一次就把发送编辑框中的内容发送一次,将其 ID 设为IDC_BUTTON_MANUALSEND。 别忘记了将接收编辑框的 Properties- Styles 中把 Miltiline 和 Vertical Scroll 属性选上,发送编辑框若你想输 入多行文字,也可选上 Miltiline。 再打开 ClassWizard- Member Viariables 选项卡,选择CGc1g 类, 为 IDC_EDIT_RXDATA 添加 CString 变量 m_strRXData, 为IDC_EDIT_TXDATA 添加 CString 变量 m_strTXData。 OnComm() 打开 ClassWizard- Message Maps,选择类 CGc1Dlg,选择 IDC_MSCOMM1,双击消息 OnComm,将弹出的对话框中将函数名改为 OnComm。 这个函数是用来处理串口消息事件的,如每当串口接收到数据,就会产生一个串口接收数据缓冲区中有字符的消息事件,我们刚才添加的函数就会执行,我们在 OnComm()函数加入相应的处理代码就能实现自已想要的功能了。 在函数中加入如下代码: void CGc1Dlg::OnComm() { VARIANT variant_inp。 COleSafeArray safearray_inp。 LONG len,k。 BYTE rxdata[1024]。 //设置BYTE An 8bit integerthat is not signed. 第 23 页 CString strtemp。 if(()==2) //事件值为 2表示接收缓冲区内有字符 { variant_inp=()。 //读缓冲区 safearray_inp=variant_inp。 //VARIANT 型变量转换为ColeSafeArray 型变量 len=()。 //得到有效数据长度 for(k=0。 klen。 k++) (amp。 k,rxdata+k)。 //转换为 BYTE 型数组 for(k=0。 klen。 k++) //将数组转换为 Cstring 型变量 { char bt=*(char*)(rxdata+。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。