收藏 分销(赏)

飞思卡尔8位单片机MC9S0808程序串行通信编程实例.doc

上传人:xrp****65 文档编号:7666320 上传时间:2025-01-11 格式:DOC 页数:11 大小:2.46MB
下载 相关 举报
飞思卡尔8位单片机MC9S0808程序串行通信编程实例.doc_第1页
第1页 / 共11页
飞思卡尔8位单片机MC9S0808程序串行通信编程实例.doc_第2页
第2页 / 共11页
飞思卡尔8位单片机MC9S0808程序串行通信编程实例.doc_第3页
第3页 / 共11页
飞思卡尔8位单片机MC9S0808程序串行通信编程实例.doc_第4页
第4页 / 共11页
飞思卡尔8位单片机MC9S0808程序串行通信编程实例.doc_第5页
第5页 / 共11页
点击查看更多>>
资源描述

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

2、子程序-*功 能:对串行口进行初始化,允许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:串行发送N个字节 *

4、(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,ReSendStatusR,SCISend1

5、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: ;释放1个字节临时变量 A

6、IS #!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中 CLC ;C=0 BR

7、A 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个字节作临时变量 AIS #-!1

8、 ;若接受字节数为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机方程序用VB编程。首先给出MCU

9、方以查询方式进行接收,随后还给出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 ;调系统初始化子程序GP32Init ;串行口初始化

11、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程序 图8-6给出了PC

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

13、 As Byte 发送数据数组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 Re

14、Dim SendData(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.RThr

15、eshold = 0 关闭串行中断 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

17、 = comInputModeBinary 二进制数据格式 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 ;串行口

19、初始化 JSR SCIInit 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

20、SCIRecINT 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

21、; /设置允许SCI,正常码输出、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个字节-*功

22、能:串行发送1个字节 *参 数:要发送的数据 *返 回:无 *-*/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)

23、int i; for(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=0xf

24、bbb) i=0xff; *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)查询方

25、式08C语言主程序 实例编号:C02_1 路径:CC02_1串行通信查询方式 (H08SCI_1.prj)/*-*工 程 名:H08SCI_1 *硬件连接:无 *程序描述:把收到的数据发送回去 *目 的:初步掌握利用查询方式进行串行通信的基本知识 *-嵌入式应用技术基础教程教学实例-*/头文件#include GP32C.H /包含头文件#include SCI.h /串行通信子程序头文件/函数声明extern void SCIInit(void); /串行口初始化子程序/内存变量声明unsigned char SerialBuff; /存放接收数据的数组/主程序void main() uns

26、igned char i; SCIInit(); /调串行口初始化子程序 while(1) i=SCIReN(1,SerialBuff); /等待接收1个数据 if(i=0) SCISendN(1,SerialBuff); /发送接到的数据 (4)中断方式08C语言主程序 实例编号:C02_2 路径:CC02_2串行通信中断方式 (H08SCI_2.prj)/*-*工 程 名:H08SCI_2 *硬件连接:无 *程序描述:把收到的数据发送回去 *目 的:初步掌握利用中断方式进行串行通信编程 *-嵌入式应用技术基础教程教学实例-*/头文件#include GP32C.H /包含头文件#inclu

27、de SCI.h /串行通信子程序头文件/函数声明extern void SCIInit(void); /串行口初始化子程序/内存变量声明unsigned char SerialBuff; /存放接收数据的数组/主程序void main() asm(SEI); /禁止所有中断 SCIInit(); /串行口初始化 SCC2|=(15); /令SCC2.5=1,允许接收中断 asm(CLI); /开放总中断 /主循环 while(1); (5)08C语言的串行中断方式的矢量表文件 串行中断方式的矢量表文件(vectors08.c)/*-*文件名:vectors08.c *功 能:用于定义中断矢量表 *-*/头文件#include GP32C.H /包含头文件#include SCI.h /串行通信子程序头文件/*isrRe:接收中断处理函数-*功 能:接收1个数据, 发送接到的数据 *-*/#pragma interrupt_handler是编译器的伪指令 #pragma interrupt_handler isrRe void isrRe(void) unsigned char SerialBuff1; /存放接收数据的数组 unsigned char i; asm(SEI); /禁止所有中断 /接收1个数据

展开阅读全文
部分上传会员的收益排行 01、路***(¥15400+),02、曲****(¥15300+),
03、wei****016(¥13200+),04、大***流(¥12600+),
05、Fis****915(¥4200+),06、h****i(¥4100+),
07、Q**(¥3400+),08、自******点(¥2400+),
09、h*****x(¥1400+),10、c****e(¥1100+),
11、be*****ha(¥800+),12、13********8(¥800+)。
相似文档                                   自信AI助手自信AI助手
搜索标签

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服