ImageVerifierCode 换一换
格式:DOCX , 页数:20 ,大小:125.91KB ,
资源ID:16044372      下载积分:5 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-16044372.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(84串行通信编程实例.docx)为本站会员(b****7)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

84串行通信编程实例.docx

1、84 串行通信编程实例8.4 串行通信编程实例本节给出较规范的用08汇编语言及08C语言编的串行通信子程序,包括SCI初始化、发送一个字节、接收一个字节、发送N个字节、接收N个字节等子程序,然后给出一个使用这些子程序的测试程序,并给出PC机方程序。读者可以直接使用这些子程序进行08系列MCU的串行通信编程。8.4.1 08汇编语言串行通信子程序()SCI初始化汇编子程序 对串行口的初始化一般在主循环之前进行,即使以中断方式接收或发送,在初始化子程序中只定义查询方式收发。允许中断的设置,在进入主循环之前进行。下面给出的初始化程序,将在本教程的各个实例中使用。串行口初始化汇编语言例*SCIInit

2、.asm:串行口初始化子程序-*功 能:对串行口进行初始化,允许SCI,正常码输出,8位数据, * 无校验等,允许发送器允许接收器。查询方式收发, * 波特率为9600(设fBUS2.4576MHz) *入 口:无 *出 口:无 *-*SCIInit: PSHA ;总线频率fBUS2.4576MHz,定义波特率Bt=9600 LDA #%00000010 STA SCBR ;设置允许SCI,正常码输出、8位数据、无校验 LDA #%01000000 STA SCC1 ;设置允许发送、允许接收,查询方式收发 LDA #%00001100 STA SCC2 PULA RTS(2)串行发送与接收汇编

3、通用子程序仔细分析可以发现,与串行通信相关的程序,发送与接收使用同一个寄存器的不同位作为测试标志,发送与接收的数据寄存器地址相同。而在串行通信中,发送一个字节与发送N个字节、接收一个字节与接收N个字节的子程序是最基本的,因此这里给出这些基本子程序。为了方便实际应用,对程序做了规范,可以应用于08系列的任何一个型号MCU。读者应仔细理解这些子程序的编程思路,以便为后面的学习打下扎实的基础。串行发送与接收汇编通用子程序HC08SCI.ASM*H08SCI.ASM-*文件描述:本文件包含了HC08串行通信子程序,分别为: * *(1)SCISend1:串行发送A中的1个字节 *(2)SCISendN

4、:串行发送N个字节 *(3)SCIRe1:串行接收一个字节-A *(4)SCIReN:串行接收N个字节 *-*寄存器及相关位定义ReSendStatusR EQU SCS1 ;SCI状态寄存器1 ReTestBit EQU 5 ;接收缓冲区满标志位 SendTestBit EQU 7 ;发送缓冲区空标志位 ReSendDataR EQU SCDR ;SCI数据寄存器 *SCISend1:串行发送A中的1个字节-*功 能:串行口发送A中的1个字节数据 *入 口:A=待发送的数据 *出 口:无 *堆栈深度:2 *-* SCISend1: BRCLR SendTestBit,ReSendStatus

5、R,SCISend1 STA ReSendDataR RTS *SCISendN:串行发送N个字节-*功 能:串行发送以HX为首地址的N个字节数据 *入 口:A=字节个数 HX=首地址 *出 口:无 *堆栈深度:2+1=3 *-*SCISendN: ;在堆栈区开辟1个字节作临时变量 AIS #-!1 ;若发送字节数为0,退出 STA !1,SP CMP #!0 BEQ SCISendN_EXIT SCISendN_1: LDA ,X ;从存储器中取出待发送的数据 JSR SCISend1 AIX #!1 DBNZ !1,SP,SCISendN_1 ;N-10转SCISendN_EXIT: ;释

6、放1个字节临时变量 AIS #!1 RTS*SCIRe1:串行接收一个字节-A-*功 能:(1) 串行接收1个字节的数据放在A中 * (2) 约655350时钟周期内收不到数返回, * 若时钟周期=0.4us 大约等待2.6S *入 口:无 *出 口:A=接收的数据 C=是否收到数据标志 0收到 1未收到 *堆栈深度:2+2=4 *-* SCIRe1: PSHH PSHX ;等待接收一个字节数据 LDHX #$FFFF ;循环次数SCIRe1_1: BRCLR ReTestBit,ReSendStatusR,SCIRe1_2 ;无数据,转 LDA ReSendDataR ;收到的数据放入A中

7、CLC ;C=0 BRA SCIRe1_3 ;收到数据,退出 SCIRe1_2: NOP AIX #-$1 CPHX #$0000 BNE SCIRe1_1 ;等待时间到,未收到数据,令c=1,A=FF,返回 LDA #$FF SEC ;C=1 SCIRe1_3: PULX PULH RTS*SCIReN:串行接收N个字节-*功 能:串行接收N个字节放在以HX为首地址的内存中 *入 口:A=待接收数据的字节数N,HX=接收数据存放的首地址 *出 口:C=是否收到数据标志 0收到 1未收到 *堆栈深度:2+4+1=7 *内部调用:SCIRe1 *-* SCIReN: ;在堆栈区开辟1个字节作临时

8、变量 AIS #-!1 ;若接受字节数为0,退出 STA !1,SP CMP #!0 BEQ SCIReN_EXIT SCIReN_1: JSR SCIRe1 ;调用接收1个字节的子程序 BCS SCIReN_EXIT ;C=1未收到数据,退出 STA ,X ;收到数据,放入内存 AIX #!1 ;HX+1-HX DBNZ !1,SP,SCIReN_1SCIReN_EXIT: ;释放1个字节临时变量 AIS #!1 RTS 8.4.2 08汇编语言串行通信测试实例为了验证子程序的正确性,这里给出简明的测试实例。由于串行通信涉及两个设备,所以本例选用MCU为一方,PC机为另一方,PC机方程序用V

9、B编程。首先给出MCU方以查询方式进行接收,随后还给出MCU方以中断方式接收的实例,以便比较。程序中给出了详细的注释。下列实例中,不论是查询方式,还是中断方式,也不论是汇编语言,还是08C语言,MCU方的程序功能是一致的:把通过串行口收到的数据发送回去。PC机方的VB测试程序只有一个,在各实例目录的VB_SCI子目录中。(1)查询方式MCU方主程序 实例编号:A02_1 路径:ASMA02_1串行通信查询方式 (H08SCI_1.ASM)*-*文 件 名:H08SCI_1.asm *硬件连接:无 *程序描述:利用查询方式把收到的数据发送回去 *目 的:初步掌握利用查询方式进行串行通信的基本知识

10、 *-嵌入式应用技术基础教程教学实例-*头文件$include GP32ASM.H ;包含GP32的头文件*两个起始地址名RAMstartAddr equ $0040 ;RAM的起始地址FlashStartAddr equ $8000 ;程序开始地址*内存变量 org RAMstartAddr ;RAM的起始地址SerialBuff rmb 1 ;数据存储单元*=*主程序 org FlashStartAddr ;程序起始地址MainInit: ;复位后程序从此开始执行 ;系统初始化 SEI LDHX #$023F ;堆栈初始化 TXS JSR GP32Init ;调系统初始化子程序GP32In

11、it ;串行口初始化 JSR SCIInit ;程序总循环入口MainLoop: ;等待接收1个数据 LDA #!1 LDHX #SerialBuff JSR SCIReN BCS MainLoop ;未收到数据,继续等待 ;发送接到的一个数据 LDA #!1 LDHX #SerialBuff JSR SCISendN BRA MainLoop *外部子程序存放处,这些子程序都在当前目录中$INCLUDE H08SCI.asm $INCLUDE GP32init.asm$INCLUDE SCIInit.asm*中断向量 ORG $FFFE ;复位矢量 DW MainInit(2)PC机方VB程

12、序 图8-6给出了PC机方VB程序的界面。其功能是:在“发送窗口”的文本框输入字符,单击“发送”按钮,其文本框中的字符被发送出去。任何时候,只要PC机串行口收到数据,则显示在“接收窗口”。“接收窗口”内的两个文本框,分别显示接收数据的字符和十六进制数。这个VB程序在本书的几个串行实例的目录中是一致的。同时,也可方便地用于整个学习过程。实例编号:A02_1 路径:ASMA02_1串行通信查询方式VB_SCI程序描述: (1)把发送窗口中的数据从COM1发送出去 (2)把接收到的数据显示在接收窗口中-Option Explicit 检查未经声明的变量Dim SendData() As Byte 发

13、送数据数组Dim RecvData() As Byte 接收数据数组Private Sub Form_Load() 串行口初始化 Call SCIinit(1, 9600,N,8,1) 清空有关文本框 TxtSEND.Text = TxtRECV.Text = 开放串行中断 MSComm1.RThreshold = 1End SubPrivate Sub CmdSEND_Click() 单击发送按钮 Dim i As Integer If TxtSEND.Text = Then TxtRECV.Text = GoTo CmdSEND_Click_Exit End If ReDim SendDa

14、ta(Len(TxtSEND.Text) - 1) For i = 0 To Len(TxtSEND.Text) - 1 SendData(i) = Asc(Mid$(TxtSEND.Text, i + 1, 1) Next i MSComm1.Output = SendDataCmdSEND_Click_Exit:End SubPublic Sub MSComm1_OnComm() 串行接收中断 Dim i As Integer Static S1 As String If Len(Trim(TxtRECV.Text) = 0 Then S1 = MSComm1.RThreshold = 0

15、 关闭串行中断 RecvData = MSComm1.Input For i = LBound(RecvData) To UBound(RecvData) S1 = S1 & Chr$(RecvData(i) Next i TxtRECV.Text = S1 If Len(S1) = 70 Then S1 = MSComm1.RThreshold = 1 开放串行中断End Sub Private Sub CmdCLR_Click() 单击清空按钮 TxtSEND.Text = TxtRECV.Text = End Sub Private Sub CmdEXIT_Click() 单击退出按钮

16、If MSComm1.PortOpen = True Then MSComm1.PortOpen = False EndEnd SubRem 串行口初始化Private Sub SCIinit(ByVal COMx As Byte, ByVal SCIFormat As String) If MSComm1.PortOpen = True Then MSComm1.PortOpen = False End If MSComm1.CommPort = COMx 串行口号 MSComm1.Settings = SCIFormat 定义传输格式 MSComm1.InputMode = comInpu

17、tModeBinary 二进制数据格式 MSComm1.RThreshold = 0 关闭串行中断 MSComm1.InputLen = 0 一次读取缓冲区全部数据 MSComm1.PortOpen = True 打开串行口 MSComm1.InBufferCount = 0End Sub(3)中断方式MCU方主程序 实例编号:A02_2 路径:ASMA02_2串行通信中断方式 (H08SCI_2.ASM)*-*文 件 名:H08SCI_2.asm *硬件连接:无 *程序描述:利用中断方式把收到的数据发送回去 *目 的:初步掌握利用中断方式进行串行通信的基本知识 *-嵌入式应用技术基础教程教学

18、实例-*/*头文件$include GP32ASM.H ;包含GP32的头文件*两个起始地址名RAMstartAddr equ $0040 ;RAM的起始地址FlashStartAddr equ $8000 ;程序开始地址*内存变量 org RAMstartAddr ;RAM的起始地址SerialBuff rmb 8 ;缓冲区*=*主程序 org FlashStartAddr ;程序起始地址MainInit: ;复位后程序从此开始执行 ;系统初始化 SEI LDHX #$023F ;堆栈初始化 TXS JSR GP32Init ;调系统初始化子程序GP32Init ;串行口初始化 JSR SC

19、IInit BSET 5,SCC2 ;设置接收中断允许 ;开放总中断 CLI ;程序总循环入口MainLoop: NOP NOP BRA MainLoop *接收中断子程序 SCIRecINT: SEI ;关总中断 PSHH ;接收1个数据 JSR SCIRe1 ;发送接到的数据 JSR SCISend1 PULH CLI ;开总中断 RTI ;中断返回 *以下为子程序存放处,这些子程序都在当前目录中$INCLUDE H08SCI.asm$INCLUDE GP32init.asm$INCLUDE SCIInit.asm*-* ORG $FFE4 ;SCI接收中断矢量 DW SCIRecINT

20、ORG $FFFE ;复位矢量 DW MainInit8.4.3 08C语言串行通信子程序与测试实例()SCI初始化08C语言子程序 串行口初始化08C语言例/*SCIInit:串行口初始化子程序-*功 能: 对串行口进行初始化,默认为允许SCI,正常码输出,8位 * 数据,无校验等,允许发送器允许接收器.查询方式收发, * 波特率为9600 (设fBUS2.4576MHz) *参 数:无 *返 回:无 *-*/#include GP32C.Hvoid SCIInit(void) /总线频率fBUS2.4576MHz,定义波特率Bt=9600 SCBR=0b00000010; /设置允许SCI

21、,正常码输出、8位数据、无校验 SCC1=0b01000000; /设置允许发送、允许接收,查询方式收发 SCC2=0b00001100; (2)串行发送与接收08C语言通用子程序串行发送与接收08C语言通用子程序SCI.C/*-*文件描述:本文件包含了串行通信的4子程序,分别为: *(1)SCISend1:串行发送1字节 *(2)SCISendN:串行发送n字节 *(3)SCIRe1:串行接收1字节 *(4)SCIReN:串行接收n字节 *-嵌入式应用技术基础教程-*/以下为子程序源代码/包含头文件#include SCI.h/*SCISend1:串行发送1个字节-*功 能:串行发送1个字节

22、 *参 数:要发送的数据 *返 回:无 *-*/void SCISend1(unsigned char o) /判断ReStatusR的第SendTestBit位是否为1,是1可以发送 while(1) if (ReSendStatusR & (1SendTestBit) != 0) ReSendDataR=o; break; /*SCISendN:串行发送N个字节-*功 能:发送数组中的N个字节数据 *参 数:待发送的数据字节数及其要存放的数组首地址 * *返 回:无 *-*/void SCISendN(unsigned char n,unsigned char ch) int i; for

23、(i=0;in;i+) SCISend1(chi); /*SCIRe1:串行收一个字节数据-*功 能:从串行口接收1个字节的数据 * *参 数:标志指针p *返 回:接收到的数据(若接收失败,返回0xff) * *说 明:参数*p带回接收标志=0收到数据,=1未收到数据 * *-*/unsigned char SCIRe1(unsigned char *p) unsigned int k; unsigned char i; /ReStatusR第ReTestBit位为1表示可接收数据 for(k=0;k0xfbbb;k+) if (ReSendStatusR & (1=0xfbbb) i=0x

24、ff; *p=0x01; return i; /返回接收到的数据 /*SCIReN:HC08串行接收N个字节-*功 能:接收N个字节数据,并存放在ch数组中 * *参 数:待接收的数据字节数及其存放的数组首地址 * *返 回:接收标志=0收到数据,=1未收到数据 * *-*/unsigned char SCIReN(unsigned char n,unsigned char ch) int m; unsigned char fp; m=0; while (mn) chm=SCIRe1(&fp); if (fp=1) return 1; m+; return 0; (3)查询方式08C语言主程序 实例编号:C02_1 路径:CC02_1串行通信查询方式 (H08SCI_1.prj)/*-*工 程 名:H08SCI_1 *硬件连接:无 *程序描述:把收到的数据发送回去 *目 的:初步掌握利用查询方式进行串行通信的基本知识 *-嵌入式应用技术基础教程教学实例-*/头文件#include GP

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2