文档详情

SCI串行通信例程.doc

re****.1
实名认证
店铺
DOC
55.01KB
约6页
文档ID:547675198
SCI串行通信例程.doc_第1页
1/6

SCI程序串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化初始化主要包括波特率设置、通信格式的设置、发送接收数据方式的设置等对SCI进行初始化,需要设置如下几部分:(1) 定义波特率 一般选内部总线时钟为串行通信的时钟源通过设置SCI波特率寄存器SCI0BD的波特率选择位SBR[12:0],来选择合适的分频系数2) 写控制字到SCI控制寄存器1(SCI0CR1) 设置是否允许SCI、数据长度、输出格式、选择唤醒方法、是否校验等3) 写控制字到SCI控制寄存器2(SCI0CR2)设置是否允许发送与接收、是中断接收还是查询接收等串行通信程序如下:程序一:(中断方式)/** write in “Init.h” **/#include /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void InitSci(void);/** write in “Init.c” **///初始化程序#include "Init.h"//---------------初始化SCI---------------//void InitSci(void){ SCI0BD=4545; //设波特率为110 //SCI baud rate = SCI module clock/(16*SCIBD)=Bus Clock/(16*SCIBD) // = 8MHz/(16*4545)=500kHz/4545=110bps //SCIBD : SBR12-SBR0,Value from 1 to 8191 SCI0CR1=0; SCI0CR2=0X2C; // 0010 1100 RIE=1,TE=1,RE=1 // RIE=1 RDRF and OR interrupt requests enabled // TE=1 Transmitter enabled // RE=1 Receiver enabled}/** write in “SCI.h” **///函数声明unsigned char SciRead();void SciWrite(byte);/** write in “SCI.c” **///串行通信程序#include "Init.h"#include "SCI.h"//---------------读SCI数据---------------//unsigned char SciRead(){ if(SCI0SR1_RDRF==1){//数据从移位寄存器传送到SCI数据寄存器SCIDRL //SCI0SR1_RDRF==1表明数据寄存器SCI0DRL为满,可以接收新的数据 SCI0SR1_RDRF=1; //读取SCI数据寄存器会将RDRF清除,重新置位 return SCI0DRL; //返回数据寄存器的数值 }}//---------------写SCI数据---------------//void SciWrite(byte sci_value){ while(!(SCI0SR1&0X80)); //SCI0SR1_TDRE==1表明数据寄存器SCI0DRL为空,可以发送新的数据 SCI0DRH=0; SCI0DRL=sci_value; //发送新的数据至数据寄存器SCI0DR}//---------------中断程序-----------------//#pragma CODE_SEG NON_BANKEDinterrupt 20 void Sci_Intrrupt(void){ //SCI的中断向量号为20 byte text; DisableInterrupts; //关中断 text=SciRead(); //接收数据寄存器SCI0DRL中的数据 asm nop; asm nop; SciWrite(text); //发送数据至数据寄存器SCI0DRL DDRA=0XFF; //设A口为输出,用来显示是否执行中断,可以不用 PORTA_PA6=!PORTA_PA6; EnableInterrupts; //开中断}#pragma CODE_SEG DEFAULT/** write in “main.c”” **/#include "Init.h"#include "SCI.h"void main(void) { /* put your own code here */ _DISABLE_COP(); //关看门狗 DisableInterrupts; //关中断 InitSci(); EnableInterrupts; //开中断 for(;;) { // _FEED_COP(); /* feeds the dog */ } /* loop forever */ /* please make sure that you never leave main */}程序二:(查询方式)/** write in “Init.h” **/#include /* common defines and macros */#include "derivative.h" /* derivative-specific definitions *///芯片初始化相关函数声明void InitSCI(void);/** write in “Init.c” **///头文件#include "Init.h" //芯片初始化头文件//---------------初始化SCI---------------//void InitSCI(void){ SCI0BD=4545; //SCI baud rate = SCI module clock/(16*SCIBD)=Bus Clock/(16*SCIBD) // = 8MHz/(16*4545)=500000Hz/4545=110bps //SCIBD : SBR12-SBR0,Value from 1 to 8191 SCI0CR1=0X00; SCI0CR2=0X0C; //0010 1100 RIE=1,TE=1,RE=1 //RIE=1 RDRF and OR interrupt requests enabled //TE=1 Transmitter enabled //RE=1 Receiver enabled}/** write in “SCI.h”” **///[SCI.h]串行通信头文件-------------------------------------//#include "Init.h" //串行通信相关函数声明void SCITXD(byte sci_value); //串行发送1个字节void SCISendN(byte n,byte ch[]); //串行发送n个字节byte SCIRXD(byte *p); //串行接收1个字节byte SCIReceiveN(byte n,byte ch[]); //串行接收n个字节/** write in “SCI.c”” **/#include "SCI.h"//SCITXD:串行发送1个字节---------------------------------------------------*void SCITXD(byte sci_value){while(!(SCI0SR1&0X80)); //SCI0SR1_TDRE==1表明数据寄存器SCI0DRL为空,可以发送新的数据//SCI0DRH=0; //当使用8位数据格式时,只使用SCIDRL寄存器。

当使用9位数据格式时, //先写SCIDRH寄存器,再写SCIDRL寄存器 SCI0DRL=sci_value; //发送新的数据至数据寄存器SCI0DRL }//SCISendN:串行发送N个字节-------------------------------------------------*void SCISendN(byte n,byte ch[]){ byte i; for (i=0; i

下载提示
相似文档
正为您匹配相似的精品文档