飞思卡尔单片机SCI通信程序_第1页
飞思卡尔单片机SCI通信程序_第2页
飞思卡尔单片机SCI通信程序_第3页
飞思卡尔单片机SCI通信程序_第4页
飞思卡尔单片机SCI通信程序_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、SCI通信一、飞思卡尔单片机DZ60 SCI通信(一) 查询发送#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#define LED_D1 PTDD_PTDD0#define LED_D1_DIR PTDDD_PTDDD0#define LED_ON 0#define LED_OFF 1unsigned char SCANF_SEND_STRINGS = "HELLO MCU

2、WORLD"unsigned char *pSendString = SCANF_SEND_STRINGS;/*/* 初始化总线时钟PEE模式 */* 外部晶振频率为4MHz,总线频率16MHz */*/void INIT_MCG(void) MCGC2=0x36; while(!MCGSC_OSCINIT); MCGC1=0xb8; while(MCGSC_IREFST); while(MCGSC_CLKST!=0b10); MCGC2_LP = 1; MCGC1 = 0x90; MCGC3 = 0x48; MCGC2_LP = 0; while(!MCGSC_PLLST); wh

3、ile(!MCGSC_LOCK); MCGC1 = 0x10; while(MCGSC_CLKST!=0b11); void delay(void) unsigned int i; unsigned int j; for(i = 0; i < 100; i+) for(j = 0; j < 4000; j+); void main(void) DisableInterrupts; SOPT1 = 0; INIT_MCG(); EnableInterrupts; /* enable interrupts */ /* include your code here */ LED_D1_D

4、IR = 1; LED_D1 = LED_OFF;/以下为设置波特率,以及初始化SCI1控制寄存器 SCI1BDH = 0X00; SCI1BDL = 0X68;/波特率设置为9600 SCI1C1 = 0x00; /设置SCI1为正常模式,八位数据位,无奇偶校验 SCI1C2 = 0x08; /允许发送数据,禁止中断功能 while(1) while(*pSendString) != '0') while(!SCI1S1_TDRE);/SCI1S1_TDRE 为1表示发送数据缓冲器为空 SCI1D = *pSendString; pSendString+; LED_D1 =

5、LED_D1;/每发送一个字节,闪烁一次LED灯 delay(); for(;) _RESET_WATCHDOG(); /* feeds the dog */ /* loop forever */ /* please make sure that you never leave main */(二)中断发送#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */#define LED_D1 PTD

6、D_PTDD0#define LED_D1_DIR PTDDD_PTDDD0#define LED_ON 0#define LED_OFF 1unsigned char SCANF_SEND_STRINGS = "HELLO MCU WORLD"unsigned char *pSendString = SCANF_SEND_STRINGS;/*/* 初始化总线时钟PEE模式 */* 外部晶振频率为4MHz,总线频率16MHz */*/void INIT_MCG(void) MCGC2=0x36; while(!MCGSC_OSCINIT); MCGC1=0xb8; whil

7、e(MCGSC_IREFST); while(MCGSC_CLKST!=0b10); MCGC2_LP = 1; MCGC1 = 0x90; MCGC3 = 0x48; MCGC2_LP = 0; while(!MCGSC_PLLST); while(!MCGSC_LOCK); MCGC1 = 0x10; while(MCGSC_CLKST!=0b11); void delay(void) unsigned int i; unsigned int j; for(i = 0; i < 100; i+) for(j = 0; j < 4000; j+); void main(void)

8、 DisableInterrupts; SOPT1 = 0; INIT_MCG(); EnableInterrupts; /* enable interrupts */ /* include your code here */ LED_D1_DIR = 1; LED_D1 = LED_OFF; /以下为设置波特率,以及初始化SCI1控制寄存器 SCI1BDH = 0X00; SCI1BDL = 0X68;/波特率设置为9600 SCI1C1 = 0x00; /设置SCI1为正常模式,八位数据位,无奇偶校验 SCI1C2 = 0x88; /TIE = 1(bit7) 启动TDRE中断,发送中断使

9、能 /手册指出,如果设置了发送中断使能TIE位,每当TDRE = 1时都请求硬件中断 /TE = 1(bit3) 发送器打开 while(1); for(;) _RESET_WATCHDOG(); /* feeds the dog */ /* loop forever */ /* please make sure that you never leave main */*/* SCI1中断向量函数 */* 向量编号为18,中断来源TDRE,TC */*/interrupt 18 void SCI1_SEND(void) while(*pSendString != '0') wh

10、ile(!SCI1S1_TDRE); SCI1D = *pSendString; pSendString+; LED_D1 = LED_D1;/ delay(); (三)查询接收#include <hidef.h> /* for EnableInterrupts macro */#include "derivative.h" /* include peripheral declarations */整个功能:PC-单片机-PC,PC串口发数据-单片机串口接收数据-单片机将接收到的数据发送回给PC#define LED_D1 PTDD_PTDD0#define L

11、ED_D1_DIR PTDDD_PTDDD0#define LED_ON 0#define LED_OFF 1unsigned char SCANF_SEND_STRINGS = "HELLO MCU WORLD"unsigned char *pSendString = SCANF_SEND_STRINGS;unsigned char ReceiveString;/*/* 初始化总线时钟PEE模式 */* 外部晶振频率为4MHz,总线频率16MHz */*/void INIT_MCG(void) MCGC2=0x36; while(!MCGSC_OSCINIT); MCGC

12、1=0xb8; while(MCGSC_IREFST); while(MCGSC_CLKST!=0b10); MCGC2_LP = 1; MCGC1 = 0x90; MCGC3 = 0x48; MCGC2_LP = 0; while(!MCGSC_PLLST); while(!MCGSC_LOCK); MCGC1 = 0x10; while(MCGSC_CLKST!=0b11); /延时函数void delay(void) unsigned int i; unsigned int j; for(i = 0; i < 100; i+) for(j = 0; j < 4000; j+)

13、; void main(void) DisableInterrupts; SOPT1 = 0; INIT_MCG(); EnableInterrupts; /* enable interrupts */ /* include your code here */ LED_D1_DIR = 1; LED_D1 = LED_OFF; /以下为设置波特率,以及初始化SCI1控制寄存器 SCI1BDH = 0X00; SCI1BDL = 0X68;/波特率设置为9600 SCI1C1 = 0x00; /设置SCI1为正常模式,八位数据位,无奇偶校验 SCI1C2 = 0x0C; /RE = 1(bit2

14、)接收器打开 /TE = 1(bit3)发送器打开 while(1) while(!SCI1S1_RDRF);/ SCI1S1_RDRF = 1时,表示接收数据寄存器满,可以取出数据 SCI1S1_RDRF = 0; /清除SCI1S1_RDRF ReceiveString = SCI1D; /将接收寄存器中的数据保存至ReceiveString / LED_D1 = LED_D1; / delay(); while(!SCI1S1_TDRE);/SCI1S1_TDRE = 1时,发送数据寄存器(缓存区)空,可以发送数据 SCI1D = ReceiveString;/将接收到的数据,放至发送数

15、据寄存器(缓存区),发送 / LED_D1 = LED_D1; / delay(); for(;) _RESET_WATCHDOG(); /* feeds the dog */ /* loop forever */ /* please make sure that you never leave main */ 程序改成下面语句,上位机串口发大数据不死机,但可能丢数据。while(1) /* while(!SCI1S1_RDRF);/ SCI1S1_RDRF = 1时,表示接收数据寄存器满,可以取出数据 SCI1S1_RDRF = 0; /清除SCI1S1_RDRF ReceiveS

16、tring = SCI1D; /将接收寄存器中的数据保存至ReceiveString while(!SCI1S1_TDRE);/SCI1S1_TDRE = 1时,发送数据寄存器(缓存区)空,可以发送数据 SCI1D = ReceiveString;/将接收到的数据,放至发送数据寄存器(缓存区),发送*/ if(SCI1S1_RDRF = 1) ReceiveString = SCI1D; if(SCI1S1_TDRE = 1) SCI1D = ReceiveString; (四)中断接收#include <hidef.h> /* for EnableInterrupts macro

17、 */#include "derivative.h" /* include peripheral declarations */#define LED_D1 PTDD_PTDD0#define LED_D1_DIR PTDDD_PTDDD0#define LED_ON 0#define LED_OFF 1unsigned char SCANF_SEND_STRINGS = "HELLO MCU WORLD"unsigned char *pSendString = SCANF_SEND_STRINGS;unsigned char ReceiveString

18、;/*/* 初始化总线时钟PEE模式 */* 外部晶振频率为4MHz,总线频率16MHz */*/void INIT_MCG(void) MCGC2=0x36; while(!MCGSC_OSCINIT); MCGC1=0xb8; while(MCGSC_IREFST); while(MCGSC_CLKST!=0b10); MCGC2_LP = 1; MCGC1 = 0x90; MCGC3 = 0x48; MCGC2_LP = 0; while(!MCGSC_PLLST); while(!MCGSC_LOCK); MCGC1 = 0x10; while(MCGSC_CLKST!=0b11);

19、/延时函数void delay(void) unsigned int i; unsigned int j; for(i = 0; i < 100; i+) for(j = 0; j < 4000; j+); void main(void) DisableInterrupts; SOPT1 = 0; INIT_MCG(); EnableInterrupts; /* enable interrupts */ /* include your code here */ LED_D1_DIR = 1; LED_D1 = LED_OFF; /以下为设置波特率,以及初始化SCI1控制寄存器 SC

20、I1BDH = 0X00; SCI1BDL = 0X68;/波特率设置为9600 SCI1C1 = 0x00; /设置SCI1为正常模式,八位数据位,无奇偶校验 SCI1C2 = 0x2C; /RE = 1(bit2)接收器打开 /TE = 1(bit3)发送器打开 while(1) for(;) _RESET_WATCHDOG(); /* feeds the dog */ /* loop forever */ /* please make sure that you never leave main */*/* SCI1中断向量接收函数 */* 向量编号为17,中断来源RDRF等 */*/i

21、nterrupt 17 void SCI1_RECEIVE(void) while(!SCI1S1_RDRF);/ SCI1S1_RDRF = 1时,表示接收数据寄存器满,可以取出数据 ReceiveString = SCI1D; /将接收寄存器中的数据保存至ReceiveString LED_D1 = LED_D1; while(!SCI1S1_TDRE);/SCI1S1_TDRE = 1时,发送数据寄存器(缓存区)空,可以发送数据 SCI1D = ReceiveString;/将接收到的数据,放至发送数据寄存器(缓存区),发送 二、飞思卡尔单片机应用实验指导实验二 串口通信(SCI)实验(

22、一)实验目的:1进一步熟悉嵌入式开发系统环境、汇编、C语言、调试方式。2加强串口通信(SCI)基本原理及编程原理的理解。3理解C语言工程结构,掌握运用08C建立工程的方法。4分别运用查询方式、中断方式实现通信。(二)实验要求:1仔细阅读本实验指导书。2复习有关的串行通信(SCI)的章节3熟悉AW60串行通信(SCI)的工作方法及编程。4根据实验内容要求编写好程序,为实验做充分地准备。412356789232电平OUT INMAX232CPE16 15 14 13 12 11 10 91 2 3 4 5 6 7 8+5V GND+5VTTL电平OUT INTTL电平转为232电平1×4

23、412356789PC412356789412356789RxDTxD实验原理图如下:(三)实验设备及其连接1PC机一台2飞思卡尔嵌入式实验开发系统一台3串行通信线一根4万用表一只(四)实验内容1理解串行通信(SCI)原理。2运行与理解各子程序。3主程序运行课本的样例程序。4编制一个查询方式通信程序。将字符通过SCI一个一个地发送,发送完一个字符后,控制接在PTB0PTB7的8个LED灯显示被发送字符的ASCII码。5编制一个中断方式通信程序。编程要求同上一条。(五)编程提示1按照结构要求写好编程代码和注释。2计算波特率,SCInInit(SCI初始化子程序)设置SCI比特率寄存器(SCInB

24、DH,SCInBDL),设置允许SCI、正常码输出、8位数据、无校验,即设置SCI控制寄存器1(SCIxC1)相应位,设置是否允许发送与接收、是中断接收还是查询接收,即设置SCI控制寄存器2(SCIxC2)相应位。3查询方式通信程序的主程序主体是一个死循环,循环体中是不断检测SCI是否发送完毕,即检测SCI状态寄存器1(SCIxS1)第七位是否为1,为1则将字符的ASCII码输出到接在PTB口的LED上,并延时一会。4中断方式通信程序的主程序也主体是一个死循环,但该循环体是一个空循环体,所有接收和发送数据程序代码放在中断程序中,这里没有检测代码,数据开始发送和接收的条件就是中断的条件。(六)实

25、验报告要求1小结AW60串行通信(SCI)的原理及编程,并画出其流程图和程序代码与硬件接线图。2小结中断方式和查询方式的编程方法,并画出其流程图和程序代码与硬件接线图。3回答下列问题(1)串行SCI通信有哪些中断?各在什么情况下发生,作用是什么?(2)如何知道串行口TX发送了信号?提示:方法一,利用万用表在TX端发送0或者255持续0.5秒钟时的电压值。方法二,在TX端发送0或255持续0.5秒钟的波形时的小灯变化。(七)参考例程:void main(void) unsigned char SerialBuff="Hello! World!" /初始化存放接收数据的数组 /

26、1 关总中断 DisableInterrupts; /禁止总中断 /2 芯片初始化 MCUInit(); /3 模块初始化 SCIInit(); /串行口初始化 /4 开放中断 EnableInterrupts; /开放总中断 SCISendN(13,SerialBuff); /串口发送“Hello World!” /5 主循环 while (1) if (SCI1S1&SCI1S1_RDRF_MASK)!=0) PTBD=SCI1D ; if(SCI1S1&SCI1S1_TDRE_MASK)!=0) SCI1D=PTBD; else PTBD=0x00; void MCUIn

27、it(void) SOPT = 0b01100000; /$70 System Options Register(write once) ICGC2 = 0b00110000; /$30 internal clock generation 2 ICGC1 = 0b01111000; /$78 internal clock generation 1 /等待FLL稳定 while(!ICGS1_LOCK); PTBDD=0xff ; PTBD=0xff ;void SCIInit() unsigned int ubgs,baud=9600; unsigned char sysclk=20; /1.计算波特率并设置:ubgs = fsys/(波特率*16)(其中fsys=sysclk

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论