DZ112PC机与单片机串口通信
DZ112PC机与单片机串口通信,dz112pc,单片机,串口,通信,通讯
/采用异步方式传送数据,偶校验,一位结束位,传输的数据传输速率为9600bit/s。每个数据帧包含10Byte信息,1Byte作为帧起始标志,8Byte数据,1Byte的校验和。/-函数声明,变量定义-#include #define COUNT 10 / 定义接收缓冲区大小 unsigned char bufferCOUNT; /定义接收缓冲区unsigned char point; /定义接收数据个数指示变量void UART_init(); /串口初始化函数void COM_send(void); /串口接收函数unsigned char CLU_checkdata(void); /计算校验位函数/-/ 函数名称: UART_init()串口初始化函数/ 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s/ 串口接收中断允许,发送中断禁止/初始化串行口和波特率发生器/-void UART_init() SCON =0x58; /选择串口工作方式,打开接收允许TMOD =0x21; /定时器1工作在方式2,定时器0工作在方式1TH1 =0xfd; /实现波特率9600(系统时钟11.0592MHZ)TR1 =1; /启动定时器T1ET1 =0; ES=1; /允许串行口中断PS=1; /设计串行口中断优先级EA =1; /单片机中断允许/-/ 函数名称: com_interrup()串口接收中断处理函数/ 函数功能: 接收包括起始位S在内的十位数据到数据缓冲区/-com_interrupt(void) interrupt 4 using 3unsigned char RECEIVR_buffer;if(RI) /处理接收中断RI=0; /清除中断标志位RECEIVR_buffer=SBUF; /接收串口数据if(point=0) /如果还没有接收到起始位if(RECEIVR_buffer=S) /判断是否起始标志位point+; /是准备接收下一位elsepoint=0; /不是,继续等待起始位 else if(point0&point10) /判断是否接收够十位数据bufferpoint+=RECEIVR_buffer; /不够,把接收到的数据放 接收缓 区else point=0; /缓冲区 ,清除缓 区内数据 接收If(TI) /处理发送中断 TI=0;/-/ 函数名称: COM_send()串口发送函数/ 函数功能: 把数据缓冲区的十位数据发送 /-void COM_send(void)for(point=0;point=10,TI=1;point+) / 续发送十位数据 SBUF=bufferpoint; /把缓 区的数据 发送到串口TI=0;/-/ 函数名称: CLU_checkdata()计算校验位函数/ 输 变量: / 输 变量: checkdata,包括起始位在内的 位数据的校验和/ 函数功能: 计算校验和/-unsigned char CLU_checkdata(void) /计算校验位unsigned char checkdata=0;for(point=0;point9,TI=1;point+)checkdata=checkdata|bufferpoint;return(checkdata);/-/ 函数名称: 函数/ 函数功能: 函数, 信 /-void main(void)unsigned char checkdata;doUART_init(); /初始化串口if(point=10) /判断数据是否接收 checkdata=CLU_checkdata; / 用 校验和函数if(checkdata=buffer9) /判断校验和是否 COM_send(); / 用发送 point=0;while(1);基于 VB 实现 PC 机与单片机的串行通讯随着计算机技术尤其是单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行检测和控制。PC 机具有强大的监控和管理功能,而单片机则具有快速及灵活的控制特点,通过 PC 机的 RS-232 串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。因此如何实现 PC 机与单片机之间的通讯具有非常重要的现实意义。本文将论述在 VB 环境下 PC 机与单片机之间实现串行通讯的软硬件方案。PC 机的通讯程序使用 Visual Basic 编写,VB 是 Microsoft 公司推出的 Windows 应用程序开发工具,因其具有界面友好,编程简便等优点而受到广泛的使用,而且 Visual Basic 6.0 版本带有专门实现串行通讯的MSCOMM 控件。1、硬件原理目前的 PC 机都有至少一个串行通讯端口 RS-232,RS-232 端口可用于两台计算机之间进行通讯,RS-232 的逻辑电平用正负电压表示,且信号使用负逻辑,逻辑 0 的电压范围是+5V+15V,而逻辑 1 的电压范围是-5V -15V,RS-232 端口是计算机与其他设备沟通的最常用的接口,不但实作简单,而且价格便宜。在 8051 单片机的内部有一个全双工的异步串行 I/O 口,它的输入和输出使用 5V 逻辑而不是 RS-232 电压,如何进行两种信号的转换,是连接时需要解决的问题,事实上,解决的方法很简单,只需使用一个诸如 MAX232 这样的专用芯片即可。电路结构见下图。MAX232 包含两个将 TTL 输入转换成 RS-232 输出的驱动器,还包含两个将 RS-232 输入翻译成 CMOS 输出的接收器,这些驱动器和接收器具有反向的功能。4 个外置的电容大小为 1uF,如果使用极化电容,注意极性,引脚6 的电压为负,因此它的电容的正极连接到地,电容等级至少为 15V。2、软件设计本次通讯中,我们以一个测控系统的上位机和下位机之间的通信为背景,给出单片机部分和 VB 环境下的通信程序实例,系统中单片机负责数据采集、处理和控制,上位机进行现场可视化检测,通信协议采用半双工异步串行通信方式,通过 RS232 的 RTS 信号进行收发转换,传输数据采用二进制数据,上位机与下位机之间采用主从式通讯。(1)单片机的串行通讯程序8051 单片机从外部采集到的一组数据(30 个),存在片内 RAM20H3DH区域,要求将这个数据块传送给 PC 机,为了保证传送的正确,传送前由单片机先向 PC 机发送数据# 55H(联络信号),PC 机接收到后,向单片机回送数据# 0AAH(回应信号),经检验正确后,单片机才开始向 PC 机传送数据。对串行口的操作可分为以下几步进行:串行口初始化;发送联络信号;接收联络信号;发送数据。以下程序由汇编语言编写:ORG 0030HSTART:MOV SP,#60HMOV TMOD, #20H ;T1 工作模式 2MOV TH1, #72HMOV TL1, #72H ;波特率 110HZSETB TR1MOV PCON, #00H ;SMOD=0MOV SCON, #50H ;串行方式 1MOV R0,#20HMOV R2,#30 ;数据个数XX1:MOV A,#55HMOV SBUF,A ;发送联络信号WAIT1:JBC TI,WAIT2 ;等待发送完毕AJMP WAIT1WAIT2:JBC RI,READ ;等待接收完毕AJMP WAIT2READ:MOV A,SBUF ;接收联络信号CJNE A,# 0AAH,XX1 ;接收数据不正确,重新开始LOOP:MOV A,R0MOV SBUF,AWAIT: JBC TI, LOOP1AJMP WAIT ;等待发送完毕LOOP1:INC R0DJNZ R2,LOOPEND(2)计算机的串行通讯程序为了更方便地实时了解数据采集的情况,我们把从单片机读来的数据分别赋给数组,然后描绘出波形曲线。首先开启一个 VB 项目,并在窗体上安排一个 MSCOMM 控件,作为串行通讯的信道。按下 F4 调出属性窗口,变量 COMPORT 属性为 2,另外将 Rthreshold 属性设为 1,意思就是只要外界传送任何字符串,随即引发事件。安排一个定时器,作为连续动作的执行控件,一旦一位数据发送完就引发中断,发送下一个数据。设置一个 picturebox 对象,把由单片机传送来的数据以线条方式绘制在此图片框控件上。按下 F4 调出属性窗口,其 Name 属性改为“Graph1”。MSCOMM 控件支持以文本和二进制格式传输数据,由于下位机是单片机,处理二进制数据较为方便。因此本例中以二进制格式发送和接受数据,VB支持字节变量类型来存储二进制数据,从串口读入的字节被保存在字节数组变量中,因此定义两个 BYTE 类型的动态数组来存放和接受数据,在接受数据时采用事件驱动法,当接受缓冲区有 Rthreshold 个数据时,引起 ONCOMM事件。本程序接收从单片机发来的 30 个数据,当数据进入 PC 机的输入缓冲区后,程序会不断读取输入缓冲区的数据,并将这些读入的数据收在一起,赋给数组。因为 VB 支持坐标格式,我们用 SCALE 函数作出坐标,定义 X 轴由 0 到30,表示有 30 个数据,Y 轴由-20 到+20,表示采集数据的范围是-20 到+ 20,表达式为 SCALE(0,+20)-(30,-20),为了实时采集数据,可以用定时器不断地更新曲线。这样就可以动态地显示被采集的数据。Private sub form_l oad()Comm1.portopen=trueTimer.interval=1000 定时器时间间隔为 1000sTimer.enabled=trueMscomm1.compore=1 选择通讯口 1Mscomm1.settings=“110,n,8,1” 波特率 110,无奇偶校验,8 个数据位,一个停止位Mscomm1. inputmode=1 通过 input 属性以二进制形式取回数据Mscomm1.inputlen=0 读取接收缓冲区全部内容Mscomm1.rthreshold=1 每收到一个字符位引发 oncomm 事件Graph1.scale(0,10)-(20,0) 定制坐标Grahp1.forecoclr=rgb(0,0,255)End subPrivate Sub Command1_Click()Dim a!(30), b!(30)num = MSComm1.InBufferCount 取输入缓冲区字节个数instring = MSComm1.Input 把输入缓冲区数据送给数组For i = 0 To num - 1a(i) = ib(i) = instring(i)GRAPH1.ClsIf i = 1 ThenGRAPH1.PSet (a(i), b(i)ElseGRAPH1.Line -(a(i), b(i) 将数组数据给绘图函数End IfNext iEnd Sub3、结束语利用 VB6.0 的事件驱动方式可以很方便地开发数据采集与监控系统,用单台 PC 机可以测量和监控多路控制信号,整控制系统设计方便,对小型测控系统的设计具有很大的实用性/采用异步方式传送数据,偶校验,一位结束位,传输的数据传输速率为9600bit/s。每个数据帧包含10Byte信息,1Byte作为帧起始标志,8Byte数据,1Byte的校验和。/-函数声明,变量定义-#include #define COUNT 10 / 定义接收缓冲区大小 unsigned char bufferCOUNT; /定义接收缓冲区unsigned char point; /定义接收数据个数指示变量void UART_init(); /串口初始化函数void COM_send(void); /串口接收函数unsigned char CLU_checkdata(void); /计算校验位函数/-/ 函数名称: UART_init()串口初始化函数/ 函数功能: 在系统时钟为11.059MHZ时,设定串口波特率为9600bit/s/ 串口接收中断允许,发送中断禁止/初始化串行口和波特率发生器/-void UART_init() SCON =0x58; /选择串口工作方式,打开接收允许TMOD =0x21; /定时器1工作在方式2,定时器0工作在方式1TH1 =0xfd; /实现波特率9600(系统时钟11.0592MHZ)TR1 =1; /启动定时器T1ET1 =0; ES=1; /允许串行口中断PS=1; /设计串行口中断优先级EA =1; /单片机中断允许/-/ 函数名称: com_interrup()串口接收中断处理函数/ 函数功能: 接收包括起始位S在内的十位数据到数据缓冲区/-com_interrupt(void) interrupt 4 using 3unsigned char RECEIVR_buffer;if(RI) /处理接收中断RI=0; /清除中断标志位RECEIVR_buffer=SBUF; /接收串口数据if(point=0) /如果还没有接收到起始位if(RECEIVR_buffer=S) /判断是否起始标志位point+; /是准备接收下一位elsepoint=0; /不是,继续等待起始位 else if(point0&point10) /判断是否接收够十位数据bufferpoint+=RECEIVR_buffer; /不够,把接收到的数据放 接收缓 区else point=0; /缓冲区 ,清除缓 区内数据 接收If(TI) /处理发送中断 TI=0;/-/ 函数名称: COM_send()串口发送函数/ 函数功能: 把数据缓冲区的十位数据发送 /-void COM_send(void)for(point=0;point=10,TI=1;point+) / 续发送十位数据 SBUF=bufferpoint; /把缓 区的数据 发送到串口TI=0;/-/ 函数名称: CLU_checkdata()计算校验位函数/ 输 变量: / 输 变量: checkdata,包括起始位在内的 位数据的校验和/ 函数功能: 计算校验和/-unsigned char CLU_checkdata(void) /计算校验位unsigned char checkdata=0;for(point=0;point9,TI=1;point+)checkdata=checkdata|bufferpoint;return(checkdata);/-/ 函数名称: 函数/ 函数功能: 函数, 信 /-void main(void)unsigned char checkdata;doUART_init(); /初始化串口if(point=10) /判断数据是否接收 checkdata=CLU_checkdata; / 用 校验和函数if(checkdata=buffer9) /判断校验和是否 COM_send(); / 用发送 point=0;while(1);基于 VB 实现 PC 机与单片机的串行通讯随着计算机技术尤其是单片微型机技术的发展,人们已越来越多地采用单片机来对一些工业控制系统中如温度、流量和压力等参数进行检测和控制。PC 机具有强大的监控和管理功能,而单片机则具有快速及灵活的控制特点,通过 PC 机的 RS-232 串行接口与外部设备进行通信,是许多测控系统中常用的一种通信解决方案。因此如何实现 PC 机与单片机之间的通讯具有非常重要的现实意义。本文将论述在 VB 环境下 PC 机与单片机之间实现串行通讯的软硬件方案。PC 机的通讯程序使用 Visual Basic 编写,VB 是 Microsoft 公司推出的 Windows 应用程序开发工具,因其具有界面友好,编程简便等优点而受到广泛的使用,而且 Visual Basic 6.0 版本带有专门实现串行通讯的MSCOMM 控件。1、硬件原理目前的 PC 机都有至少一个串行通讯端口 RS-232,RS-232 端口可用于两台计算机之间进行通讯,RS-232 的逻辑电平用正负电压表示,且信号使用负逻辑,逻辑 0 的电压范围是+5V+15V,而逻辑 1 的电压范围是-5V -15V,RS-232 端口是计算机与其他设备沟通的最常用的接口,不但实作简单,而且价格便宜。在 8051 单片机的内部有一个全双工的异步串行 I/O 口,它的输入和输出使用 5V 逻辑而不是 RS-232 电压,如何进行两种信号的转换,是连接时需要解决的问题,事实上,解决的方法很简单,只需使用一个诸如 MAX232 这样的专用芯片即可。电路结构见下图。MAX232 包含两个将 TTL 输入转换成 RS-232 输出的驱动器,还包含两个将 RS-232 输入翻译成 CMOS 输出的接收器,这些驱动器和接收器具有反向的功能。4 个外置的电容大小为 1uF,如果使用极化电容,注意极性,引脚6 的电压为负,因此它的电容的正极连接到地,电容等级至少为 15V。2、软件设计本次通讯中,我们以一个测控系统的上位机和下位机之间的通信为背景,给出单片机部分和 VB 环境下的通信程序实例,系统中单片机负责数据采集、处理和控制,上位机进行现场可视化检测,通信协议采用半双工异步串行通信方式,通过 RS232 的 RTS 信号进行收发转换,传输数据采用二进制数据,上位机与下位机之间采用主从式通讯。(1)单片机的串行通讯程序8051 单片机从外部采集到的一组数据(30 个),存在片内 RAM20H3DH区域,要求将这个数据块传送给 PC 机,为了保证传送的正确,传送前由单片机先向 PC 机发送数据# 55H(联络信号),PC 机接收到后,向单片机回送数据# 0AAH(回应信号),经检验正确后,单片机才开始向 PC 机传送数据。对串行口的操作可分为以下几步进行:串行口初始化;发送联络信号;接收联络信号;发送数据。以下程序由汇编语言编写:ORG 0030HSTART:MOV SP,#60HMOV TMOD, #20H ;T1 工作模式 2MOV TH1, #72HMOV TL1, #72H ;波特率 110HZSETB TR1MOV PCON, #00H ;SMOD=0MOV SCON, #50H ;串行方式 1MOV R0,#20HMOV R2,#30 ;数据个数XX1:MOV A,#55HMOV SBUF,A ;发送联络信号WAIT1:JBC TI,WAIT2 ;等待发送完毕AJMP WAIT1WAIT2:JBC RI,READ ;等待接收完毕AJMP WAIT2READ:MOV A,SBUF ;接收联络信号CJNE A,# 0AAH,XX1 ;接收数据不正确,重新开始LOOP:MOV A,R0MOV SBUF,AWAIT: JBC TI, LOOP1AJMP WAIT ;等待发送完毕LOOP1:INC R0DJNZ R2,LOOPEND(2)计算机的串行通讯程序为了更方便地实时了解数据采集的情况,我们把从单片机读来的数据分别赋给数组,然后描绘出波形曲线。首先开启一个 VB 项目,并在窗体上安排一个 MSCOMM 控件,作为串行通讯的信道。按下 F4 调出属性窗口,变量 COMPORT 属性为 2,另外将 Rthreshold 属性设为 1,意思就是只要外界传送任何字符串,随即引发事件。安排一个定时器,作为连续动作的执行控件,一旦一位数据发送完就引发中断,发送下一个数据。设置一个 picturebox 对象,把由单片机传送来的数据以线条方式绘制在此图片框控件上。按下 F4 调出属性窗口,其 Name 属性改为“Graph1”。MSCOMM 控件支持以文本和二进制格式传输数据,由于下位机是单片机,处理二进制数据较为方便。因此本例中以二进制格式发送和接受数据,VB支持字节变量类型来存储二进制数据,从串口读入的字节被保存在字节数组变量中,因此定义两个 BYTE 类型的动态数组来存放和接受数据,在接受数据时采用事件驱动法,当接受缓冲区有 Rthreshold 个数据时,引起 ONCOMM事件。本程序接收从单片机发来的 30 个数据,当数据进入 PC 机的输入缓冲区后,程序会不断读取输入缓冲区的数据,并将这些读入的数据收在一起,赋给数组。因为 VB 支持坐标格式,我们用 SCALE 函数作出坐标,定义 X 轴由 0 到30,表示有 30 个数据,Y 轴由-20 到+20,表示采集数据的范围是-20 到+ 20,表达式为 SCALE(0,+20)-(30,-20),为了实时采集数据,可以用定时器不断地更新曲线。这样就可以动态地显示被采集的数据。Private sub form_l oad()Comm1.portopen=trueTimer.interval=1000 定时器时间间隔为 1000sTimer.enabled=trueMscomm1.compore=1 选择通讯口 1Mscomm1.settings=“110,n,8,1” 波特率 110,无奇偶校验,8 个数据位,一个停止位Mscomm1. inputmode=1 通过 input 属性以二进制形式取回数据Mscomm1.inputlen=0 读取接收缓冲区全部内容Mscomm1.rthreshold=1 每收到一个字符位引发 oncomm 事件Graph1.scale(0,10)-(20,0) 定制坐标Grahp1.forecoclr=rgb(0,0,255)End subPrivate Sub Command1_Click()Dim a!(30), b!(30)num = MSComm1.InBufferCount 取输入缓冲区字节个数instring = MSComm1.Input 把输入缓冲区数据送给数组For i = 0 To num - 1a(i) = ib(i) = instring(i)GRAPH1.ClsIf i = 1 ThenGRAPH1.PSet (a(i), b(i)ElseGRAPH1.Line -(a(i), b(i) 将数组数据给绘图函数End IfNext iEnd Sub3、结束语利用 VB6.0 的事件驱动方式可以很方便地开发数据采集与监控系统,用单台 PC 机可以测量和监控多路控制信号,整控制系统设计方便,对小型测控系统的设计具有很大的实用性
收藏