84串行通信编程实例.docx

上传人:b****7 文档编号:16044372 上传时间:2023-07-10 格式:DOCX 页数:20 大小:125.91KB
下载 相关 举报
84串行通信编程实例.docx_第1页
第1页 / 共20页
84串行通信编程实例.docx_第2页
第2页 / 共20页
84串行通信编程实例.docx_第3页
第3页 / 共20页
84串行通信编程实例.docx_第4页
第4页 / 共20页
84串行通信编程实例.docx_第5页
第5页 / 共20页
84串行通信编程实例.docx_第6页
第6页 / 共20页
84串行通信编程实例.docx_第7页
第7页 / 共20页
84串行通信编程实例.docx_第8页
第8页 / 共20页
84串行通信编程实例.docx_第9页
第9页 / 共20页
84串行通信编程实例.docx_第10页
第10页 / 共20页
84串行通信编程实例.docx_第11页
第11页 / 共20页
84串行通信编程实例.docx_第12页
第12页 / 共20页
84串行通信编程实例.docx_第13页
第13页 / 共20页
84串行通信编程实例.docx_第14页
第14页 / 共20页
84串行通信编程实例.docx_第15页
第15页 / 共20页
84串行通信编程实例.docx_第16页
第16页 / 共20页
84串行通信编程实例.docx_第17页
第17页 / 共20页
84串行通信编程实例.docx_第18页
第18页 / 共20页
84串行通信编程实例.docx_第19页
第19页 / 共20页
84串行通信编程实例.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

84串行通信编程实例.docx

《84串行通信编程实例.docx》由会员分享,可在线阅读,更多相关《84串行通信编程实例.docx(20页珍藏版)》请在冰点文库上搜索。

84串行通信编程实例.docx

84串行通信编程实例

8.4串行通信编程实例

本节给出较规范的用08汇编语言及08C语言编的串行通信子程序,包括SCI初始化、发送一个字节、接收一个字节、发送N个字节、接收N个字节等子程序,然后给出一个使用这些子程序的测试程序,并给出PC机方程序。

读者可以直接使用这些子程序进行08系列MCU的串行通信编程。

8.4.108汇编语言串行通信子程序

(1)SCI初始化汇编子程序

对串行口的初始化一般在主循环之前进行,即使以中断方式接收或发送,在初始化子程序中只定义查询方式收发。

允许中断的设置,在进入主循环之前进行。

下面给出的初始化程序,将在本教程的各个实例中使用。

串行口初始化汇编语言例

*SCIInit.asm:

串行口初始化子程序------------------------*

*功能:

对串行口进行初始化,允许SCI,正常码输出,8位数据,*

*无校验等,允许发送器允许接收器。

查询方式收发,*

*波特率为9600(设fBUS=2.4576MHz)*

*入口:

无*

*出口:

无*

*------------------------------------------------------*

SCIInit:

PSHA

;总线频率fBUS=2.4576MHz,定义波特率Bt=9600

LDA#%00000010

STASCBR

;设置允许SCI,正常码输出、8位数据、无校验

LDA#%01000000

STASCC1

;设置允许发送、允许接收,查询方式收发

LDA#%00001100

STASCC2

PULA

RTS

(2)串行发送与接收汇编通用子程序

仔细分析可以发现,与串行通信相关的程序,发送与接收使用同一个寄存器的不同位作为测试标志,发送与接收的数据寄存器地址相同。

而在串行通信中,发送一个字节与发送N个字节、接收一个字节与接收N个字节的子程序是最基本的,因此这里给出这些基本子程序。

为了方便实际应用,对程序做了规范,可以应用于08系列的任何一个型号MCU。

读者应仔细理解这些子程序的编程思路,以便为后面的学习打下扎实的基础。

串行发送与接收汇编通用子程序HC08SCI.ASM

*H08SCI.ASM--------------------------------------------*

*文件描述:

本文件包含了HC08串行通信子程序,分别为:

*

*

(1)SCISend1:

串行发送A中的1个字节*

*

(2)SCISendN:

串行发送N个字节*

*(3)SCIRe1:

串行接收一个字节->A*

*(4)SCIReN:

串行接收N个字节*

*------------------------------------------------------*

*[寄存器及相关位定义]

ReSendStatusREQUSCS1;SCI状态寄存器1

ReTestBitEQU5;接收缓冲区满标志位

SendTestBitEQU7;发送缓冲区空标志位

ReSendDataREQUSCDR;SCI数据寄存器

*SCISend1:

串行发送A中的1个字节-------------------------*

*功能:

串行口发送A中的1个字节数据*

*入口:

A=待发送的数据*

*出口:

无*

*堆栈深度:

2*

*------------------------------------------------------*

SCISend1:

BRCLRSendTestBit,ReSendStatusR,SCISend1

STAReSendDataR

RTS

*SCISendN:

串行发送N个字节------------------------------*

*功能:

串行发送以HX为首地址的N个字节数据*

*入口:

A=字节个数HX=首地址*

*出口:

无*

*堆栈深度:

2+1=3*

*------------------------------------------------------*

SCISendN:

;在堆栈区开辟1个字节作临时变量

AIS#-!

1

;若发送字节数为0,退出

STA!

1,SP

CMP#!

0

BEQSCISendN_EXIT

SCISendN_1:

LDA,X;从存储器中取出待发送的数据

JSRSCISend1

AIX#!

1

DBNZ!

1,SP,SCISendN_1;N-1≠0转

SCISendN_EXIT:

;释放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:

BRCLRReTestBit,ReSendStatusR,SCIRe1_2;无数据,转

LDAReSendDataR;收到的数据放入A中

CLC;C=0

BRASCIRe1_3;收到数据,退出

SCIRe1_2:

NOP

AIX#-$1

CPHX#$0000

BNESCIRe1_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

;若接受字节数为0,退出

STA!

1,SP

CMP#!

0

BEQSCIReN_EXIT

SCIReN_1:

JSRSCIRe1;调用接收1个字节的子程序

BCSSCIReN_EXIT;C=1未收到数据,退出

STA,X;收到数据,放入内存

AIX#!

1;HX+1->HX

DBNZ!

1,SP,SCIReN_1

SCIReN_EXIT:

;释放1个字节临时变量

AIS#!

1

RTS

8.4.208汇编语言串行通信测试实例

为了验证子程序的正确性,这里给出简明的测试实例。

由于串行通信涉及两个设备,所以本例选用MCU为一方,PC机为另一方,PC机方程序用VB编程。

首先给出MCU方以查询方式进行接收,随后还给出MCU方以中断方式接收的实例,以便比较。

程序中给出了详细的注释。

下列实例中,不论是查询方式,还是中断方式,也不论是汇编语言,还是08C语言,MCU方的程序功能是一致的:

把通过串行口收到的数据发送回去。

PC机方的VB测试程序只有一个,在各实例目录的VB_SCI子目录中。

(1)查询方式MCU方主程序

实例编号:

A02_1路径:

\ASM\A02_1串行通信查询方式(H08SCI_1.ASM)

*------------------------------------------------------------*

*文件名:

H08SCI_1.asm*

*硬件连接:

无*

*程序描述:

利用查询方式把收到的数据发送回去*

*目的:

初步掌握利用查询方式进行串行通信的基本知识*

*--------------《嵌入式应用技术基础教程》教学实例----------------*

*[头文件]

$include"GP32ASM.H";包含GP32的头文件

*[两个起始地址名]

RAMstartAddrequ$0040;RAM的起始地址

FlashStartAddrequ$8000;程序开始地址

*[内存变量]

orgRAMstartAddr;RAM的起始地址

SerialBuffrmb1;数据存储单元

*=======================================================

*[主程序]

orgFlashStartAddr;程序起始地址

MainInit:

;复位后程序从此开始执行

;[系统初始化]

SEI

LDHX#$023F;堆栈初始化

TXS

JSRGP32Init;调系统初始化子程序GP32Init

;[串行口初始化]

JSRSCIInit

;[程序总循环入口]

MainLoop:

;[等待接收1个数据]

LDA#!

1

LDHX#SerialBuff

JSRSCIReN

BCSMainLoop;未收到数据,继续等待

;[发送接到的一个数据]

LDA#!

1

LDHX#SerialBuff

JSRSCISendN

BRAMainLoop

*[外部子程序存放处,这些子程序都在当前目录中]

$INCLUDE"H08SCI.asm"

$INCLUDE"GP32init.asm"

$INCLUDE"SCIInit.asm"

*[中断向量]

ORG$FFFE;复位矢量

DWMainInit

(2)PC机方VB程序

图8-6给出了PC机方VB程序的界面。

其功能是:

在“发送窗口”的文本框输入字符,单击“发送”按钮,其文本框中的字符被发送出去。

任何时候,只要PC机串行口收到数据,则显示在“接收窗口”。

“接收窗口”内的两个文本框,分别显示接收数据的字符和十六进制数。

这个VB程序在本书的几个串行实例的目录中是一致的。

同时,

也可方便地用于整个学习过程。

实例编号:

A02_1路径:

\ASM\A02_1串行通信查询方式\VB_SCI

'程序描述:

'

(1)把发送窗口中的数据从COM1发送出去

'

(2)把接收到的数据显示在接收窗口中

'-------------------------------------------------------

OptionExplicit'检查未经声明的变量

DimSendData()AsByte'发送数据数组

DimRecvData()AsByte'接收数据数组

PrivateSubForm_Load()

'串行口初始化

CallSCIinit(1,"9600,N,8,1")

'清空有关文本框

TxtSEND.Text=""

TxtRECV.Text=""

'开放串行中断

MSComm1.RThreshold=1

EndSub

PrivateSubCmdSEND_Click()'单击"发送"按钮

DimiAsInteger

IfTxtSEND.Text=""Then

TxtRECV.Text=""

GoToCmdSEND_Click_Exit

EndIf

ReDimSendData(Len(TxtSEND.Text)-1)

Fori=0ToLen(TxtSEND.Text)-1

SendData(i)=Asc(Mid$(TxtSEND.Text,i+1,1))

Nexti

MSComm1.Output=SendData

CmdSEND_Click_Exit:

EndSub

PublicSubMSComm1_OnComm()'串行接收中断

DimiAsInteger

StaticS1AsString

IfLen(Trim(TxtRECV.Text))=0ThenS1=""

MSComm1.RThreshold=0'关闭串行中断

RecvData=MSComm1.Input

Fori=LBound(RecvData)ToUBound(RecvData)

S1=S1&Chr$(RecvData(i))

Nexti

TxtRECV.Text=S1

IfLen(S1)>=70ThenS1=""

MSComm1.RThreshold=1'开放串行中断

EndSub

PrivateSubCmdCLR_Click()'单击"清空"按钮

TxtSEND.Text=""

TxtRECV.Text=""

EndSub

PrivateSubCmdEXIT_Click()'单击"退出"按钮

IfMSComm1.PortOpen=TrueThenMSComm1.PortOpen=False

End

EndSub

Rem串行口初始化

PrivateSubSCIinit(ByValCOMxAsByte,ByValSCIFormatAsString)

IfMSComm1.PortOpen=TrueThen

MSComm1.PortOpen=False

EndIf

MSComm1.CommPort=COMx'串行口号

MSComm1.Settings=SCIFormat'定义传输格式

MSComm1.InputMode=comInputModeBinary'二进制数据格式

MSComm1.RThreshold=0'关闭串行中断

MSComm1.InputLen=0'一次读取缓冲区全部数据

MSComm1.PortOpen=True'打开串行口

MSComm1.InBufferCount=0

EndSub

(3)中断方式MCU方主程序

实例编号:

A02_2路径:

\ASM\A02_2串行通信中断方式(H08SCI_2.ASM)

*------------------------------------------------------*

*文件名:

H08SCI_2.asm*

*硬件连接:

无*

*程序描述:

利用中断方式把收到的数据发送回去*

*目的:

初步掌握利用中断方式进行串行通信的基本知识*

*-------《嵌入式应用技术基础教程》教学实例------------*/

*[头文件]

$include"GP32ASM.H";包含GP32的头文件

*[两个起始地址名]

RAMstartAddrequ$0040;RAM的起始地址

FlashStartAddrequ$8000;程序开始地址

*[内存变量]

orgRAMstartAddr;RAM的起始地址

SerialBuffrmb8;缓冲区

*======================================================*

*[主程序]

orgFlashStartAddr;程序起始地址

MainInit:

;复位后程序从此开始执行

;[系统初始化]

SEI

LDHX#$023F;堆栈初始化

TXS

JSRGP32Init;调系统初始化子程序GP32Init

;[串行口初始化]

JSRSCIInit

BSET5,SCC2;设置接收中断允许

;[开放总中断]

CLI

;[程序总循环入口]

MainLoop:

NOP

NOP

BRAMainLoop

*[接收中断子程序]

SCIRecINT:

SEI;关总中断

PSHH

;[接收1个数据]

JSRSCIRe1

;[发送接到的数据]

JSRSCISend1

PULH

CLI;开总中断

RTI;中断返回

*[以下为子程序存放处,这些子程序都在当前目录中]

$INCLUDE"H08SCI.asm"

$INCLUDE"GP32init.asm"

$INCLUDE"SCIInit.asm"

*------------------------------------------------------*

ORG$FFE4;SCI接收中断矢量

DWSCIRecINT

ORG$FFFE;复位矢量

DWMainInit

8.4.308C语言串行通信子程序与测试实例

(1)SCI初始化08C语言子程序

串行口初始化08C语言例

/*SCIInit:

串行口初始化子程序--------------------------------------------*

*功能:

对串行口进行初始化,默认为允许SCI,正常码输出,8位*

*数据,无校验等,允许发送器允许接收器.查询方式收发,*

*波特率为9600(设fBUS=2.4576MHz)*

*参数:

无*

*返回:

无*

*-------------------------------------------------------------------------------*/

#include"GP32C.H"

voidSCIInit(void)

{//总线频率fBUS=2.4576MHz,定义波特率Bt=9600

SCBR=0b00000010;

//设置允许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个字节-----------------------------*

*功能:

串行发送1个字节*

*参数:

要发送的数据*

*返回:

无*

*-----------------------------------------------------*/

voidSCISend1(unsignedcharo)

{//判断ReStatusR的第SendTestBit位是否为1,是1可以发送

while

(1)

if((ReSendStatusR&(1<

=0)

{ReSendDataR=o;

break;}

}

/*SCISendN:

串行发送N个字节-----------------------------*

*功能:

发送数组中的N个字节数据*

*参数:

待发送的数据字节数及其要存放的数组首地址*

*返回:

无*

*-----------------------------------------------------*/

voidSCISendN(unsignedcharn,unsignedcharch[])

{inti;

for(i=0;i

SCISend1(ch[i]);

}

/*SCIRe1:

串行收一个字节数据----------------------------*

*功能:

从串行口接收1个字节的数据*

*参数:

标志指针p*

*返回:

接收到的数据(若接收失败,返回0xff)*

*说明:

参数*p带回接收标志=0收到数据,=1未收到数据*

*-----------------------------------------------------*/

unsignedcharSCIRe1(unsignedchar*p)

{unsignedintk;

unsignedchari;

//ReStatusR第ReTestBit位为1表示可接收数据

for(k=0;k<0xfbbb;k++)

if((ReSendStatusR&(1<

=0)

{i=ReSendDataR;

*p=0x00;

break;}

if(k>=0xfbbb)

{i=0xff;

*p=0x01;}

returni;//返回接收到的数据

}

/*SCIReN:

HC08串行接收N个字节---------------------------*

*功能:

接收N个字节数据,并存放在ch数组中*

*参数:

待接收的数据字节数及其存放的数组首地址*

*返回:

接收标志=0收到数据,=1未收到数据*

*-----------------------------------------------------*/

unsignedcharSCIReN(unsignedcharn,unsignedcharch[])

{intm;

unsignedcharfp;

m=0;

while(m

{

ch[m]=SCIRe1(&fp);

if(fp==1)return1;

m++;

}

return0;

}

(3)查询方式08C语言主程序

实例编号:

C02_1路径:

\C\C02_1串行通信查询方式(H08SCI_1.prj)

/*-----------------------------------------------------*

*工程名:

H08SCI_1*

*硬件连接:

无*

*程序描述:

把收到的数据发送回去*

*目的:

初步掌握利用查询方式进行串行通信的基本知识*

*-------《嵌入式应用技术基础教程》教学实例------------*/

//头文件

#include"GP

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

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

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