汇编语言实现串口通信(PC和单片机间)资料

合集下载

VB环境下实现PC机与单片机的串行通讯

VB环境下实现PC机与单片机的串行通讯

VB环境下实现PC机与单片机的串行通讯随着科技的不断发展,PC机和单片机的联系日益密切,特别是在嵌入式系统领域中,单片机已经成为了必不可少的重要组成部分。

而如何实现PC机和单片机之间的通讯,是一项必须要掌握的技能。

本篇文章主要介绍如何运用VB环境下的串口编程,实现PC机与单片机的串行通讯。

一、概述通讯技术日新月异,各种新的通讯技术层出不穷。

而在普通家庭却使用最为广泛的通讯技术,还是传统的串口通讯。

使用传统的串口通讯,可以实现PC机与单片机之间的数据交互,可靠性高,兼容性强,使用便捷。

要实现PC机与单片机之间的串行通讯,需要掌握两个技能:单片机串行通讯的编程和VB环境下串口编程。

二、单片机串行通讯的编程单片机串行通讯主要是通过寄存器和中断实现的。

单片机通过一个IO口与电脑之间建立一个简单的通讯接口,PC机通过该接口向单片机发送数据,单片机接收到数据,就可以通过该接口把数据返回给PC机。

单片机串口通讯编程的内容主要包括串口数据位、停止位、校验位、波特率等信息,这些信息需要设置在单片机的寄存器中。

同时,还要设置中断信息,以免程序在不接收数据时死等。

三、VB环境下串口编程VB环境下串口编程的关键是掌握控件的使用。

实际上,VB环境下的串口编程非常简单,只需要使用微软提供的MSComm控件就可以实现。

通过MSComm控件的事件和方法,可以轻松地实现数据的读取、发送、接收等功能。

需要注意的是,MSComm控件的BaudRate属性需要与单片机编写的程序的波特率一致,不然可能会出现通讯故障。

四、如何实现串口通讯首先需要硬件上建立好通讯接口。

通常情况下,USB串口转换器和单片机板子都会配套出售,只需要把两者插在一起即可。

其次需要编写单片机的串口通讯程序。

单片机数字口与串口的通讯,就是把串口接到单片机的数字口中,通过串口向外发送数据。

因此,编写单片机的串口通讯程序,需要设置停止位、数据位、奇偶校验位、波特率等参数。

单片机与PC的串行通讯 项目实现程序

单片机与PC的串行通讯 项目实现程序

实现单片机的串行通讯的汇编语言程序如下:ORG 0000AJMP MAINORG 0100HMAIN: MOV SP, #06HMOV SCON,#50H //8位UART(1 START ,8 DA TA ,1 STOP),允许接受MOV TMOD,#20H //T1工作方式2MOV TH1, #0FDHMOV TL1, #0FDHSETB TR1KEY: MOV A, #0FFHMOV P0, AMOV A, P0JNB ACC.0, KEY0JNB ACC.1, KEY1AJMP MAINKEY0: MOV P1, #0FFHK0: JB RI,KK //是否接收到数据,有则跳至KKSJMP K0KK: MOV A,SBUF //将接收到的数据保存到累加器MOV P1,A //输出至P1CLR RI //清除RISJMP K0RETKEY1: MOV P2, #0FFHK01: JB RI,KK1 //是否接收到数据,有则跳至KKSJMP K01KK1: MOV A,SBUF //将接收到的数据保存到累加器MOV P2,A //输出至P2CLR RI //清除RISJMP K0RETEND首先是PC机事件过程与程序Dim hand As Boolean'等待回应时间到标志位,为FALSE时时间没有到,TRUE时时间到Private Sub cancel_Click ()Unload MeEndEnd SubPrivate Sub send_Click ()'变量定义Dim strsend$, strbit$Dim intsend% '发送的字符长度Dim writebuff As V ariant '写输出缓冲区Dim readbuff$ '读输入缓冲区数据strsend = txtsend.Textintsend = Len(strsend)If intsend = 0 ThenMsgBox "请输入数字字符!", , "错误"Exit SubEnd If'数据完整性验证For i = 1 To intsend Step 1strbit = Mid(strsend, i, 1)Select Case strbitCase Is < "0", Is > "9"MsgBox "输入的数据中存在非数字字符!" & vbCrLf & "请重新输入!", vbRetryCancel, "错误"txtsend.Text = ""Exit SubEnd SelectNext iOn Error GoTo comrserror'串行通信口参数设置mPort = 1 '使用Com1做为串行通信口MSComm.Settings = "9600,n,8,1" '串口属性设置MSComm.InputLen = 1 '每次从接收缓冲区读取一个字符MSComm.InputMode = comInputModeText '以字符形式从缓冲区中接受字符MSComm.InBufferCount = 0 '清除输入缓冲区MSComm.OutBufferCount = 0 '清除输出缓冲区MSComm.PortOpen = True '打开通行端口txtport.Text = "COM" & mPorttxtmsg.Text = "串口COM" & mPort & "打开成功!波特率=9600bps"'发送握手信号handle:hand = False '开始发送握手信号时回应标志位为FALSEwritebuff = Chr$(&HFF) '准备握手信号&HffhMSComm.Output = writebuff '发送握手信号Timer.Enabled = True '启动应答定时器DoDoEventsIf hand ThenGoTo handle '定时时间到未收到回应信号重发握手信号End IfLoop Until MSComm.InBufferCount '等待回应'收到对方的回应Timer.Enabled = False'读取并判断是否为规定的联络信号readbuff = MSComm.InputIf Asc(readbuff) = 255 Thenwritebuff = Chr$(intsend)MSComm.Output = writebuff '收到正确的回应,发送字符个数和数据writebuff = strsendMSComm.Output = writebuffMSComm.PortOpen = False '发送完数据关闭端口Exit SubElseGoTo handleEnd Ifcomrserror:End SubPrivate Sub Timer_Timer()Timer.Enabled = Falsehand = True '定时间到关闭定时器,设置标志位End SubPrivate Sub txtsend_Click()txtsend.Text = ""End Sub然后是单片机的源程序datanum equ 20h ;存放接收到的数据个数dataadd equ 30h ;接收到的数据存放的地址org 0000hljmp mainorg 000bhljmp t0_intorg 0100h;主程序main: mov sp,#0fh ;从0fh开始设置堆栈mov tmod,#22h ;T0、T1工作于自动重装载方式mov th1,#0fdhmov tl1,#0fdhsetb tr1 ;晶振频率11.059Mhz,波特率设置为9600mov scon,#50h ;设置串行口工作于方式一mov 50h,#40mov 51h,#100mov th0,#6mov tl0,#6 ;1s定时初始化setb tr0 ;开定时器T0setb et0 ;开定时器T0中断setb ea ;开总中断mov datanum,#0 ;初始时接收数据的个数为0 display: mov r7,#6mov r0,#40hcl_next: mov @r0,#0inc r0djnz r7,cl_next ;数据显示区初始化display0: mov r0,#45h ;r0执行待输出的数据地址处mov r7,#6 ;扫描次数mov r6,#0feh ;r6存放数码管的位码,显示初始化display1: mov p0,r6 ;P0口输出位码mov p2,@r0 ;P2口输出段码dec r0 ;r0指向下一个待输出的段码mov a,r6rl a ;位码左移mov r6,ajbc ri,handle ;display_jmp: djnz r7,display1 ;显示未结束继续本次显示sjmp display0handle: mov r5,sbuf ;接收握手信号cjne r5,#0ffh,display_jmp ;非规定的握手信号mov sbuf,#0ffh ;应答握手信号jnb ti,$ ;等待发送结束clr tijnb ri,$ ;等待接受串行传输的字符个数clr rimov a,sbuf ;接收字符个数jz display_jmp ;没有收到数据mov datanum,a ;保存新数据的个数data_ti: setb f0mov r1,#dataadddata_get: jnb ri,$clr rimov @r1,sbuf ;将数据存入数据区inc r1djnz acc,data_get ;接收下一个字符lcall asctoduan ;调用Ascii码转段码程序ljmp display;Ascii码转换成段码子程序asctoduan: mov r1,#dataadd ;r1指向待转换的数据mov r2,datanum ;r2放转换个数mov dptr,#duanma ;dptr指向段码表loop: mov a,@r1 ;取转换数据clr c ;清除借位位subb a,#48movc a,@a+dptr ;取数据的段码mov @r1,ainc r1djnz r2,loop ;数据未转换完,继续setb rs0 ;选用寄存器组一mov r0,#dataaddmov r2,datanum;setb f0 ;新数据送入显示缓冲区clr rs0 ;ret;定时器T0中断子程序,实现数据动态显示t0_int: djnz 51h,intout ;内层循环未结束退出中断程序djnz 50h,intout0 ;外层循环未结束退出中断程序;定时1s时间到执行移位显示操作setb rs0 ;选用工作寄存器组一mov 0fh,40h ;40h单元暂存mov 40h,41hmov 41h,42hmov 42h,43hmov 43h,44hmov 44h,45h ;显示缓冲区数据左移一位jb f0,datamove ;f0=1允许移动数据,否则不允许mov 45h,0fh ;原40h单元数据放入45h中sjmp intout1 ;退出中断程序,为下次左移做准备;将数据区中的数据移动到显示缓冲区的45h单元datamove: mov 45h,@r0 ;将R0指向的数据区中的数据传送到显示缓冲区inc r0 ;r0指向下一个待移动的数据djnz r2,intout1 ;没有全部移入,退出为下次移动做准备mov r3,datanumcjne r3,#6,datamove0 ;不等于6时判定大于还是小于6 datamove1: clr f0 ;等于6时不允许sjmp intout1datamove0: jc datamove1 ;小于6不允许mov r0,#dataadd ;大于6时允许再移mov r2,datanumintout1: clr rs0 ;选用工作寄存器组0mov 50h,#40intout0: mov 51h,#100intout: reti;段码表duanma: db 3fh,06h,5bh,4fh,66h,6dh ;0,1,2,3,4,5db 7dh,07h,7fh,6fh,77h,7ch ;6,7,8,9,A,Bdb 58h,5eh,7bh,71h,00h,40h ;C,D,E,F,(空格),-end最后是6.2中提到的测试程序:mov 30h,#3fhmov 31h,#06hmov 32h,#5bhmov 33h,#4fhmov 34h,#66hmov 35h,#6dhmov 36h,#7dhmov 37h,#07hmov 38h,#7fhmov 39h,#6fhmov 3ah,#77hmov 3bh,#7chmov 3ch,#58hmov 3dh,#5ehmov 3eh,#7bhmov 3fh,#71hmov 08h,#dataaddmov datanum,#3mov 0ah,datanum setb f0。

单片机与PC机串行通信

单片机与PC机串行通信
1.4.1
小键盘选择功能:首先设置定时器及波特率,然后在设计键盘扫描函数和按键检测函数,使之能实现小键盘的选择功能。输入不同的数实现调用不同的函数,从而实现不同的功能。
1.4.2
功能1:设计PC发送函数,此功能还需要有串行口中断函数。目的是实现单片机可以接收PC机发送的数据,并且将其发送给PC机。设置一个返回键,让按键1实现返回小键盘选择功能,可以重新选择功能1还是功能2。
若选择“2”,即要实现功能2,须调用小键盘扫描函数,将数据显示到数码管上,同时然后将该数据转化成acsii码的形式通过串行口发送到PC机上。当从小键盘按键NEXT时,返回初始状态,可以进行功能1和2的重新选择。
2
本课设主要分3个模块,第一个模块是主程序中的键盘扫描,通过键盘扫描程序来获取从小键盘输入的键值,此次课设里面用到的键盘的按键主要有三个,一个是‘0’,一个是‘1’,另一个是‘2’。当输入‘0’时,结束。当输入的是‘1’时,进入第二个功能模块,由PC机发送数据,将数据发送给单片机,然互在传给PC机。当输入数值‘2’时,进入第二个模块,将数据由单片机小键盘输入,发送给PC机。模块调用图如下页图2.1所示
这样就可以通过输出的列码和读取的行码来判断按下的是哪个该模块中键盘扫描的电路图和键盘扫描电路如图32和33所示沈阳航空航天大学课程设计报告32键盘电路图开始初始化地址参数输出列扫描信号列扫描信号移位读入行信号该列有键输入6列扫描完按照行列计算键值查表得键码等待按键释放33键盘扫描流程图沈阳航空航天大学课程设计报告主函数模块首先设置定时器及波特率的选择根据标志位k1的值选择是pc模式发送数据还是小键盘模式发送数据并根据功能选择模块中对各模式的信息的进行相应的初始设置
(2)课程设计要求:
①认真完成课程设计任务;

单片机与pc串口通信(二)2024

单片机与pc串口通信(二)2024

单片机与pc串口通信(二)引言概述:本文将继续介绍关于单片机与PC串口通信的知识,本文主要探讨了在单片机通信程序中如何处理接收和发送数据。

在前一篇文章中,我们已经介绍了单片机与PC之间串口通信的基本原理和通信流程。

接下来,我们将进一步深入探讨如何通过单片机实现数据的接收和发送。

正文内容:1. 数据接收1.1 设定串口参数:设置波特率、数据位数、停止位等参数。

1.2 串口接收中断:使用中断机制来处理接收到的数据,避免阻塞主程序。

1.3 缓存空间:使用缓存空间来存储接收到的数据,以便后续处理。

1.4 数据处理:对接收到的数据进行处理,例如解析数据帧、提取需要的信息等。

1.5 错误处理:处理接收数据时可能出现的错误,例如校验错误、帧格式错误等。

2. 数据发送2.1 设定串口参数:设置波特率、数据位数、停止位等参数。

2.2 数据缓存:使用缓存空间来存储待发送的数据。

2.3 串口发送中断:使用中断机制来处理发送数据,避免阻塞主程序。

2.4 发送数据处理:对发送的数据进行处理,例如封装成数据帧、添加校验码等。

2.5 错误处理:处理发送数据时可能出现的错误,例如发送缓冲溢出等。

3. 常见问题与解决方法3.1 数据丢失:如何防止数据在传输过程中丢失。

3.2 数据粘包与分包:解决因数据传输速度不同而导致的数据粘连或分散问题。

3.3 数据校验:如何使用校验码来验证数据的完整性。

3.4 超时处理:处理接收或发送数据时可能出现的超时情况,避免死锁等问题。

3.5 应用实例:通过实际案例来展示单片机与PC串口通信的应用。

4. 调试与测试技巧4.1 使用调试工具:介绍常用的串口调试工具,用于验证通信是否正常。

4.2 日志记录:使用日志记录调试信息,以便分析问题。

4.3 基础问题排查:介绍常见问题的排查方式,例如检查硬件连接、确认代码逻辑等。

4.4 问题定位与修复:介绍如何定位并修复通信问题。

5. 总结本文从数据接收和发送两个方面详细介绍了单片机与PC串口通信的实现方法。

采用MA232实现MCS51单片机与PC机的通信

采用MA232实现MCS51单片机与PC机的通信

采用MA232实现MCS51单片机与PC机的通信一、本文概述随着微处理器技术的飞速发展,单片机作为一种集成度高、功能强大的微控制器,在工业自动化、智能仪表、嵌入式系统等领域得到了广泛应用。

MCS51单片机作为其中的佼佼者,以其稳定的性能和广泛的适应性受到了工程师们的青睐。

然而,单片机与PC机之间的通信一直是困扰工程师们的难题之一。

本文旨在探讨采用MA232串口通信模块实现MCS51单片机与PC机之间通信的方法,为工程师们提供一种可靠的解决方案。

本文将首先介绍MCS51单片机的特点及其在嵌入式系统中的应用,然后详细阐述MA232串口通信模块的工作原理及其与MCS51单片机的接口方法。

在此基础上,本文将重点分析采用MA232实现MCS51单片机与PC机通信的硬件电路设计和软件编程实现。

通过实例演示和测试结果分析,验证采用MA232实现MCS51单片机与PC机通信的可行性和可靠性,为工程师们在实际项目中应用提供参考和借鉴。

通过本文的学习,读者可以深入了解MCS51单片机与PC机通信的原理和实现方法,掌握采用MA232串口通信模块实现通信的关键技术,为实际应用提供有力的技术支持。

二、MCS51单片机简介MCS51单片机,又称为Intel 8051微控制器,是Intel公司在1980年代初推出的一款8位CISC(复杂指令集计算机)单片机。

自推出以来,由于其出色的性能、合理的价格和广泛的应用场景,MCS51单片机在全球范围内得到了广泛的使用,成为了嵌入式系统领域的经典之作。

MCS51单片机采用了典型的微处理器结构,包括中央处理器(CPU)、内部数据存储器(RAM)、外部数据存储器(外部RAM)、各种I/O 接口电路以及时钟电路等。

其中,CPU是单片机的核心部分,负责执行程序中的指令,进行数据的运算和处理。

内部数据存储器用于存放程序和数据,而外部数据存储器则提供了更大的存储空间,用于存放更多的数据或程序。

MCS51单片机还提供了丰富的I/O接口电路,包括并行I/O口、串行通信口、定时/计数器、中断系统等,使得单片机可以与外部设备进行通信和控制。

实验6 单片机与PC机间的串行通信

实验6  单片机与PC机间的串行通信

实验6 单片机与PC机间的串行通信一、实验目的1、掌握电平转换器件RS-232的使用方法;2、掌握Proteus VSM虚拟终端(VITUAL TERMINAL)的使用;3、掌握单片机与PC机间的串行通信软硬件设计方法。

二、实验内容实现利用虚拟终端仿真单片机与PC机间的串行通信。

PC机先发送从键盘输入的数据,单片机接收后回发给PC机。

单片机同时将收到的30~39H间的数据转换成0~9的数字显示,其他字符的数据直接显示为其ASCII码。

单片机和PC机进行通信时,要求使用的波特率、传送的位数等相同。

要能够进行数据传送也必须首先测试双方是否可以可靠通信。

可在PC机和单片机上各编制非常短小的程序,具体可分成PC机串行口发送接收程序、单片机串行口发送程序和单片机串行口发送接收程序。

这三个程序能运行通过,即可证明串行口工作正常。

PC机串行口发送接收程序设置串行口为波特率9600、8位数据、1位停止位、无奇偶校验的简单设置。

从键盘接收的字符可从串行口发送出去,从串行口接收的字符在屏幕上显示。

通过让串行口发送线和接收线短接可测试微机串行口,通过让串行口和单片机系统相接,使用此程序可进一步测试单片机的串行通信状况。

具体程序用BASIC编制,简单易懂。

直接输入即可运行。

程序RS232.三、实验电路原理图图7-1 单片机与PC机间电路原理图四、实验步骤1、在PROTEUS中画好电路原理图。

2、串口模型属性设置串口模型属性设置为:波特率―4800;数据位―8;奇偶校验―无;停止位-1,如图7-2所示。

图7-2 串口模型属性设置3、虚拟终端属性设置PCT代表计算机发送数据,PCR用来监视PC接收到的数据,它们的属性设置完全一样,如图7-3所示。

SCMT和SCMR分别是单片机的数据发送和接收终端,用来监视单片机发送和接收的数据,它们的属性设置也完全一样,如图7-4所示。

单片机和PC机双方的波特率、数据位、停止位和检验位等要确保和串口模型的设置一样,并且同单片机程序中串口的设置一致。

PC机与单片机之间的串行通讯、数据的发送和接收

PC机与单片机之间的串行通讯、数据的发送和接收

PC机与单片机之间的串行通讯、数据的发送和接收【摘要】本文以MCS-51单片机为例,详细介绍了PC机与单片机之间的串行通讯、数据的发送和接收。

在Windows98下利用VB的串行通讯控件可实现PC机与单片机之间的通讯。

其数据的发送和接收采用红外线通信方式,其优点是:省去了有线通信信号线的直接连接,使用简单,移动方便,微机与单片机无直接连接,属完全隔离状态,两者间不会因为电平的不同而造成数据传输的失误,抗干扰能力强。

本设计主要应用AT89C51作为控制核心,并与LED数码显示管、双向可控硅、红外发射与接收相结合的系统,充分发挥了单片机的性能。

其优点硬件电路简单,软件功能完善,控制系统可靠,性价比较高等特点,具有一定的使用和参考价值。

【关键字】MSC-51(单片机),红外,RS-232,电平转换器,串行通信半双工【Abstract】This text take one-chip computer MCS-51 for example , introduce a serial communication, data’s sending and receiving . Under the Windows98 we make use of a communication control of VB to achieve the communication of the machine of PC and one-chip computer. Its data’s sending and receiving adopts the method of the infrared ray communication, its advantage is that it exclude the direct link of signal line of with-wired communication ,and usage are simple, and move is convenience etc. The tiny machine have no direct conjunction with single a machine, belonging to the complete insulation appearance, can't result in the error that data deliver both because give or get an electric shock even and different, the antijam ability is strong.This design is a system that it applies AT89C51 as control core and combine the LED figures manifestation tube, MAX232CPE level changer, infrared’s sending and receiving. The system completely exerts the function of one-chip computer. Its advantage is that the hardware circuit is simple; the software function is perfect; the control system is dependable; the rate of price and function is high etc. So the system has certainly consult value.【Keyword】MSC-51(One-chip computer), infrared, RS-232, Level changer, serial communication,half duplex目录前言3第一章系统分析4 1.1 系统功能的概述 5 1.2 系统要求及主要内容 5 1.3 系统技术指标 5第二章系统总体设计6 2.1硬件设计思路 6 2.2软件设计思路 7第三章硬件电路设计7 3.1 单片机模块设计 8 3.2 红外通信(发射与接收)电路的设计 14 3.3 PC机模块的设计 17第四章串行口通信技术20 4.1 单片机串行口通信 21 4.2 PC机串口通信 24第五章软件设计25 5.1 单片机通信程序设计 25 5.2 PC机通信程序设计 29第六章系统调试30 6.1 硬件调试 30 6.2 软件调试 31 6.3 综合调试 33 6.4 故障分析及解决方案 33 6.5 结论与经验 34结束语35附录36 附录1 电路原理图 36 附录2程序流程图 38 附录3程序清单 41 附录4元器件清单 44 附录5 英文资料 45 附录6 中文翻译 52参考文献56前言单片机的英文名称是Micro Controller unit,缩写为MCU,又称为微控制器,它是一种面向控制的大规模集成电路芯片。

Basic实现PC与89C51单片机之间的串行通信

Basic实现PC与89C51单片机之间的串行通信

运用Visual Basic实现PC与89C51单片机之间的串行通信作者:沈飙夏海燕摘要在Visual Basic开发环境下,运用VB提供的通信控件,实现PC机与89C51单片机之间的串行通信。

关键词Visual Basic89C51单片机串行通信A/D D/A转换Serial Communication between PCand 89C51 with Visual BasicAbstract:Serial communication between PC and 89C51 single-chip-computer by MSCOMM control box of Visual Basic is introduced.Key Words:Visual Basic89C51Serial communication A/D D/A1系统简介在中科院等离子体物理研究所受控核聚变物理实验装置控制系统中,我们开发设计了以计算机控制为基础的各种信号予置系统,系统原理如图1所示。

图1系统原理图系统上位机由一台(PC586)微机构成,软件采用Visual Basic编程,作出十分直观的人机界面,并通过串行口将所需的各种予置信号(数字信号)传给单片机系统,再由单片机系统产生实际的模拟信号经线性光电隔离器送到现场。

予置数值可以分别显示在PC机软件窗口和单片机系统的予置数字表头上。

同时,现场实测信号经过线性光电隔离器,也可以实时显示在本系统的检测数字表头上和PC机的界面上。

如此设计界面直观,而且利于对现场信号进行实时监测。

因此,采用本系统,大大提高了现场信号予置精度,对实验操作人员来说人机界面良好,简单易懂。

我们将分硬件和软件两方面分别介绍该系统的情况。

2硬件介绍从系统原理图上可见,本系统关键的硬件部分是单片机系统的设计,上位机PC机则直接利用它的RS232串行口即可。

系统硬件原理如图2所示。

图2系统硬件原理图本系统采用CPU为89C51的单片微机,89C51本身带有2K的内存储器,可以在编程器上实现闪烁式的电擦写达几万次以上,比以往惯用的8031CPU外加EPROM为核心的单片机系统在硬件上具有更加简单、方便等优点,而且完全兼容MCS 51系列单片机的所有功能。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

8.用C语言或汇编语言实现串口通信(PC和单片机间)上位机和下位机的主从工作方式为工业控制及自动控制系统所采用。

由于PC 机分析能力强、处理速度更快及单片机使用灵活方便等特点,所以一般都将PC 机作为上位机,单片机作为下位机,二者通过RS-232或者RS-485接收、发送数据和传送指令。

单片机可单独处理数据和控制任务,同时也将数据传送给PC机,由PC机对这些数据进行处理或显示1 硬件电路的设计MCS-51单片机有一个全双工的串行通讯口UART,利用其RXD和TXD与外界进行通信,其内部有2个物理上完全独立的接收、发送缓冲器SBUF,可同时发送和接收数据。

所以单片机和PC机之间可以方便地进行串口通讯。

单片机串口有3条引线:TXD(发送数据),RXD(接收数据)和GND(信号地)。

因此在通信距离较短时可采用零MODEM方式,简单三连线结构。

IBM-PC机有两个标准的RS-232串行口,其电平采用的是EIA电平,而MCS-51单片机的串行通信是由TXD(发送数据)和RXD(接收数据)来进行全双工通信的,它们的电平是TTL电平;为了PC机与MCS-51机之间能可靠地进行串行通信,需要用电平转换芯片,可以采用MAXIM公司生产的专用芯片MAX232进行转换。

电路如图1所示。

硬件连接时,可从MAX232中的2路发送器和接收器中任选一路,只要注意发送与接收的引脚对应关系即可。

接口电路如图3.5所示。

总体设计按照整体设计思路方案绘制原理图如下所示:2 系统软件设计软件设计分上位机软件设计和下位机软件设计。

这两部分虽然在不同的机器上编写和运行,但它们要做的工作是对应的:一个发送,另一个接收。

为了保证数据通信的可靠性,要制定通信协议,然后各自根据协议分别编制程序。

现约定通信协议如下:PC机和单片机都可以发送和接收。

上位机和下位机均采用查询方式发送控字符和数据、中断方式接收控制字符和数据。

采用RS-232串口异步通信,1上位PC机与下位单片机异步串行通信的通信协议其中,单片机号代表现场第几台单片机,占用1个字节,发送两次的目的是为了防止干扰;命令码则代表上位机向下位机发布的工作命令,它也占用1个字节,发送两次的目的也是为了防止干扰。

而停止标志则表明一次命令发送完毕。

使用时可依据该标志判断上位机该格式中,数据块为下位机上传到上位PC机的数据。

校验位则用于PC机对收到的数据进行奇偶校验(占1个字节)。

校验正确后,可将数据写入内存,否则发出数据传输错误信息,以要求单片机重新传输数据。

另外,作为一个完整的通信协议,只有上述约定还不够,还必须在发送和接收数据的时间间隔上加以限制。

否则,很可能由于某些原因而造成无限制的等待对方应答,使整个系统处于工作不正常状态,或者延误其它动作的处理。

具体时间限制可根据通信内容、CPU处理速度,再加上适当的余量来确定。

2 单片机通信程序设计单片机的数据通信由串行口完成,定时器T1 作为波特率发生器,其波特率要与PC 机一致。

数据的传送格式为1 位起始位、8 位数据位和1 位停止位。

采用中断方式发送和接收数据,定时器T1 设置为工作工作模式2,串行口设置为工作方式3,由第9位判断停止。

具体的程序流程图见下。

①单片机中断方式接收程序当PC 机不发送任何数据的时候,从机单片机始终处于等待状态(P.),直到PC 机发送数据过来。

由于PC 机在发送有效数据之前会加一个开始符(FFH),在有效数据之后会加一个开始符(7FH),所以单片机接收到主机发送来的FFH 之后,置RAM 存贮单元的初始地址30H 单元,用来放紧接着接收的数据,程序中还用了一个计数器COUNTER 来计接收到的数据位数,直到接收到7FH 为止。

单片机接收主程序MAIN 及中断服务程序STR 清单如下:COUNTER EQU 40HPOINT EQU 41HORG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H ;定时器T1 的方式2MOV PCON,#00H ;串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R1,#30HSETB TR1 ;开始计数CLR ET1 ;清定时中断MOV SCON,#50H ;串行口控制寄存器给值SETB EA ;开总中断SETB ES ;开串行口中断MOV IP,#10HMAIN1: ACALL DISPSJMP MAIN1SRT: PUSH ACCPUSH 01HJBC RI,GETSJMP EXITGET: MOV A,SBUFCJNE A,#0FFH,GET1 ;判断是否为开始字符,不是跳GET1 放数据存贮MOV R0,#30H ;是开始符就置存贮区首地址30H,计数器清0 并跳出中断MOV COUNTER,#0SJMP EXITGET1: CJNE A,#07FH,GET2 判断是否为结束符,不是跳GET2 放数据存贮区MOV R5,COUNTER ;是结束符,放发送缓存区开始字符INC R5MOV POINT,#30HMOV SBUF,#255SJMP EXITGET2: MOV @R0,AINC R0INC COUNTEREXIT: POP 01HPOP ACCRETI②单片机中断方式发送程序由于本次设计的系统要实现的功能是将PC 机送到单片机的数据回送到PC机,所以单片机要在接收完PC 机数据后立即将数据回送到PC 机。

也就是说要将RAM 存贮单元的初始地址30H 单元内数据逐一发送出去。

程序框图见下。

单片机发送主程序MAIN 及中断服务程序SEND清单如下:COUNTER EQU 40HPOINT EQU 41HORG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H ;定时器T1 的方式2MOV PCON,#00H ;串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R1,#30HSETB TR1 ;开始计数CLR ET1 ;清定时中断MOV SCON,#50H ;串行口控制寄存器给值SETB EA ;开总中断SETB ES ;开串行口中断MOV IP,#10HMAIN1: ACALL DISPSJMP MAIN1SRT: PUSH ACCPUSH 01HJBC RI,GET ;判断是否为接收,是跳GET 接收程序,否执行发送程序CLR TIDJNZ R5,SEND1SJMP EXITSEND1: MOV R1,POINTMOV A,@R1MOV SBUF,AINC R1MOV POINT,R1SJMP EXITEXIT: POP 01HPOP ACCRETI③单片机显示程序单片机显示部分可以用来检测接收到的数据是否正确,单片机显示程序主要将接AT89C51 从串行口收到的数据显示出来。

在程序设计中,在AT89C51RAM 存贮器中的四个显示缓冲器单元30H-34H,分别存放着由PC 机方发送过来的数据,AT89C51 的P2 口扫描输出总是只有一位为高电平,即4 位显示器中仅有一位公共阴极为低电平,其它位为高电平,AT89C51 的P0 口相应位(阴极为低)的显示数据的段数据,使该位显示出一个字符,其它们为暗,依次地改变P2 口输出为高的位,P0 口输出对应的段数据,4 位显示器就显示出由缓冲器中显示数据所确定的字符。

程序框图见下:单片机显示子程序清单如下:DISP: PUSH ACCMOV DPTR,#TABMOV R1,#30HMOV A,COUNTERJZ DISP2 ;没有接收到数据,跳出DISP 继续显示P.等待状态MOV R2,AMOV R6,#08HDISP1:MOV A,@R1CPL AANL A,#0FHMOVC A,@A+DPTRMOV P0,A ;送字形码到P0 口MOV A,R6MOV P2,A ;送位控制到P2 口RR AMOV R6,ADJNZ R7,$INC R1DJNZ R2,DISP1 ;判断接收位数DISP2:MOV R1,#30HPOP ACCRETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDB 77H,7CH,39H,5EH,79H,0F3HEND3 PC机通信程序PC 通信程序采用Visual Basic 语言编程,VB 提供了串行端口控制Mscomm来为应用程序提供串行通讯。

该控件屏蔽了通信过程中的底层操作,我们可以设置、监视Mscomm 控件的属性和事件,结合Timer 控件即可完成对串行口的初始化和数据的输入输出工作。

主程序按照通信协议的要求,首先确定波特率和信息帧格式,然后调用发送子程序将键盘输入的数据发送出去,为了使主机能够对整个检测过程进行控制,须要在发送命令以后设定等待的时间,也可以通过条件判断下一步是发送还是接收命令。

对发送的命令,可能是文本方式或二进制代码。

在发送二进制代码时,应特别注意发送的格式。

PC 机通信程序清单:Private Sub Command1_Click()Dim outstring As StringDim i As IntegerDim de As Integeroutstring = Text1.TextMSComm1.RThreshold = Len(Text1.Text) + 2MSComm1.Output = Chr(255)For i = 1 To Len(outstring)MSComm1.Output = Chr(Asc(Mid(outstring, i, 1)) - 48)Next iMSComm1.Output = Chr(127)End SubPrivate Sub Command2_Click()Text2.Text = ""End SubPrivate Sub Command3_Click()If MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueCommand3.Caption = "关闭端口"ElseMSComm1.PortOpen = FalseCommand3.Caption = "打开端口"End IfEnd SubPrivate Sub Form_Load()mPort = 1 '定义用端口COM1MSComm1.Settings = "2400,n,8,1" '波特率,无奇偶校验,8 位数据,1 位停止位MSComm1.PortOpen = True '打开端口Command3.Caption = "关闭端口"End SubPrivate Sub MSComm1_OnComm()Dim lenth As Integer, i As Integerlenth = Len(Text1.Text) + 2ReDim instring(1 To lenth) As IntegerSelect Case mEventCase comEvReceiveFor i = 1 To lenthinstring(i) = MSComm1.Input(0)Next iEnd SelectText2.Text = ""For i = 1 To lenthIf instring(i) <> 255 And instring(i) <> 127ThenText2.Text = Text2.Text & instring(i)End IfNext iEnd SubPrivate Sub Timer1_Timer()Text3.Text = DateText4.Text = Time()End SubPrivate Sub Timer2_Timer()Text1 = Text1 + 1If Text1 > 9999 Then Text1 = 1000Command1_Click7End Sub单片机通信程序清单:COUNTER EQU 40HPOINT EQU 41HORG 0000HLJMP MAINORG 0023HLJMP SRTMAIN:MOV SP,#60HMOV TMOD,#20H ;定时器T1的方式2MOV PCON,#00H ;串行口波特率控制位MOV TH1,#0F4H ;2400Kb/sMOV TL1,#0F4HMOV 30H,#15MOV COUNTER,#1MOV R0,#30H ;接收数据存放区MOV R1,#30HSETB TR1 ;开始计数CLR ET1 ;清定时中断MOV SCON,#50H ;串行口控制寄存器给值SETB EA ;开总中断SETB ES ;开串行口中断MOV IP,#10HMAIN1:ACALL DISPSJMP MAIN1;********中断服务子程序**********SRT: PUSH ACCPUSH 01HJBC RI,GET ;判断是否为接收,是跳GET 接收程序,否执行发送程序CLR TIDJNZ R5,SEND1SJMP EXITSEND1: MOV R1,POINTMOV A,@R1MOV SBUF,AINC R1MOV POINT,R1SJMP EXITGET: MOV A,SBUFCJNE A,#0FFH,GET1;判断是否为开始字符,不是跳GET1 放数据存贮区MOV R0,#30H ;是开始符就置存贮区首地址30H,计数器清0 并跳出中断MOV COUNTER,#0SJMP EXITGET1: CJNE A,#07FH,GET2 ;判断是否为结束符,不是跳GET2 放数据存贮区MOV R5,COUNTER ;是结束符,放发送缓存区开始字符INC R5MOV POINT,#30HMOV SBUF,#255SJMP EXITGET2: MOV @R0,AINC R0INC COUNTEREXIT: POP 01HPOP ACCRETI;*********显示程序**********DISP: PUSH ACCMOV DPTR,#TABMOV R1,#30HMOV A,COUNTERJZ DISP2 ;没有接收到数据,跳出DISP 继续显示P.等待状态MOV R2,AMOV R6,#08HDISP1:MOV A,@R1ANL A,#0FHMOVC A,@A+DPTRMOV P0,A ;送字形码到P0 口MOV A,R6MOV P2,A ;送位控制到P2 口RR AMOV R6,ADJNZ R7,$INC R1DJNZ R2,DISP1 ;判断接收位数DISP2:MOV R1,#30HPOP ACCRETTAB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FHDB 77H,7CH,39H,5EH,79H,0F3HENDPC 机通信程序清单:Private Sub Command1_Click()Dim outstring As StringDim i As IntegerDim de As Integeroutstring = Text1.TextMSComm1.RThreshold = Len(Text1.Text) + 2MSComm1.Output = Chr(255)For i = 1 To Len(outstring)MSComm1.Output = Chr(Asc(Mid(outstring, i, 1)) - 48)Next iMSComm1.Output = Chr(127)End SubPrivate Sub Command2_Click()Text2.Text = ""End SubPrivate Sub Command3_Click()If MSComm1.PortOpen = False ThenMSComm1.PortOpen = TrueCommand3.Caption = "关闭端口"ElseMSComm1.PortOpen = FalseCommand3.Caption = "打开端口"End IfEnd SubPrivate Sub Form_Load()mPort = 1 '定义用端口COM1MSComm1.Settings = "2400,n,8,1" '波特率,无奇偶校验,8 位数据,1 位停止位MSComm1.PortOpen = True '打开端口Command3.Caption = "关闭端口"End SubPrivate Sub MSComm1_OnComm()Dim lenth As Integer, i As Integerlenth = Len(Text1.Text) + 2ReDim instring(1 To lenth) As IntegerSelect Case mEventCase comEvReceiveFor i = 1 To lenthinstring(i) = MSComm1.Input(0)Next iEnd SelectText2.Text = ""For i = 1 To lenthIf instring(i) <> 255 And instring(i) <> 127 ThenText2.Text = Text2.Text & instring(i)End IfNext iEnd SubPrivate Sub Timer1_Timer()Text3.Text = DateText4.Text = Time()End SubPrivate Sub Timer2_Timer()Text1 = Text1 + 1If Text1 > 9999 Then Text1 = 1000Command1_Click7End Sub。

相关文档
最新文档