![MSPEXPLaunchpad实验指南参考代码_第1页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/938f23f5-4875-4b26-a999-1ec1024f1ef7/938f23f5-4875-4b26-a999-1ec1024f1ef71.gif)
![MSPEXPLaunchpad实验指南参考代码_第2页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/938f23f5-4875-4b26-a999-1ec1024f1ef7/938f23f5-4875-4b26-a999-1ec1024f1ef72.gif)
![MSPEXPLaunchpad实验指南参考代码_第3页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/938f23f5-4875-4b26-a999-1ec1024f1ef7/938f23f5-4875-4b26-a999-1ec1024f1ef73.gif)
![MSPEXPLaunchpad实验指南参考代码_第4页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/938f23f5-4875-4b26-a999-1ec1024f1ef7/938f23f5-4875-4b26-a999-1ec1024f1ef74.gif)
![MSPEXPLaunchpad实验指南参考代码_第5页](http://file3.renrendoc.com/fileroot_temp3/2022-2/23/938f23f5-4875-4b26-a999-1ec1024f1ef7/938f23f5-4875-4b26-a999-1ec1024f1ef75.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、MSP-EXP430Launchpad 实验指南参考代码附录本附录为MSP-EXP430Launchpad实验指南中各章节涉及示例程序的完整参考代码。目录第三章13.513.64第五章101012131617202121242628292930333741525253第六章575758616.3.3 光照度检测模块程序设计6466727476第三章3.5Flash使用的代码样例#include "msp430g2553.h"/*g2553有4个数据段,每个数据段有64bytes,共256bytesD:0x1000 - 0x003FC:0x1040 - 0x107FB:0x1
2、080 - 0x10BFA:0x10C0 - 0x10FF */#define uint unsigned int#define uchar unsigned char#define SegA 0x010C0#define SegB 0x01080#define SegC 0x01040#define SegD 0x01000 #define SegSize 64/*Flash初始化*/void FlashInit() FCTL2=FWKEY+FSSEL_2+FN1; /选择SMLCK作为时钟源,二分频/*Flash检测忙*/void FlashCheckBusy() while(BUSY=(
3、FCTL3&BUSY); /检测是否忙 /*Flash段擦除*/void FlashErase(int SegX) _DINT(); /关闭总中断 FlashCheckBusy(); /检测Flash是否处于忙状态 FCTL3=FWKEY; /lock=0开锁 FCTL1=FWKEY+ERASE; /使能段擦除 *(int *)SegX)=0x00; /段擦除-空写 FlashCheckBusy(); /检测Flash是否处于忙状态 FCTL3=FWKEY|LOCK; /上锁 return;/*Flash写字节*/void FlashWriteChar(uint addr,char w
4、data) _DINT(); /关闭总中断 FlashCheckBusy(); /检测Flash是否处于忙状态 FCTL3=FWKEY; /lock=0开锁 FCTL1=FWKEY+WRT; /写使能 *(uchar *)addr)=wdata; /将wdata存入addr变量地址中 FCTL1=FWKEY; /写关闭 FCTL3=FWKEY+LOCK; /上锁 return;/*Flash读字节*/char FlashReadChar(uint addr) char rdata; rdata=*(char*)addr; /读取addr所指地址的值 return rdata;/*Flash写字
5、*/void FlashWriteWord(uint addr,uint wdata) _DINT(); /关闭总中断 FlashCheckBusy(); /检测忙,若忙,则等待 FCTL3=FWKEY; /lock=0开锁 FCTL1=FWKEY+WRT; /写使能 *(uint *)addr)=wdata; /向地址addr处写入wdata FCTL1=FWKEY; /写关闭 FCTL3=FWKEY+LOCK; /上锁 return;/*Flash读字*/uint FlashReadWord(uint addr) uint rdata; rdata=*(uint *)addr; /读取变量
6、addr地址的值 return rdata;/*Flash修改字节*/void FlashModifyChar(uint SegX,char AddrNum,char wdata) char i,TempArrySegSize; for(i=0;i<SegSize;i+) /读入内存 TempArryi=*(uint *)(SegX+i); TempArryAddrNum= wdata; /在数组中的某一位置AddrNum写入wdata FlashErase(SegX); /段擦除 FCTL3=FWKEY; /lock=0开锁 FCTL1=FWKEY+WRT; /准备写 for(i=0;
7、i<SegSize;i+) /向段中重新写数组 *(uint *)(SegX+i)=TempArryi; FCTL1=FWKEY; /写关闭 FCTL3=FWKEY+LOCK; /上锁/*Flash批量写*/void FlashBurstWrite(int SegX,int *pStr) int i; FlashErase(SegX); /段擦除 FCTL3=FWKEY; /lock=0,开锁 FCTL1=FWKEY+WRT; /写使能 for(i=0;i<2*sizeof(pStr);i+) /将数组内容写入段中 *(uchar *)(SegX+i)=*(pStr+i); FCT
8、L1=FWKEY; /写关闭 FCTL3=FWKEY+LOCK; /上锁main() char ReadChar; uint ReadWord; int p='a','b','c','d' WDTCTL=WDTPW+WDTHOLD; /关闭看门狗 P1DIR=0xff; /P1口设为输出,闲置的I/O不悬空 P2DIR=0xff; /P2口设为输出,闲置的I/O不悬空 P1OUT=0xff; /P1口输出1 P2OUT=0xff; /P2口输出1 FlashInit(); /Flash初始化 FlashErase(SegD); F
9、lashWriteChar(0x01007,0x12); /向地址01008h写入12h ReadChar=FlashReadChar(0x01007); /读取地址01008h的值 FlashWriteWord(0x01008,0x3456); /向地址01009h和0100Ah依次写入56h和34h ReadWord=FlashReadWord(0x01008); /读取从地址01009h起的一个字 FlashWriteChar(0x01017,ReadChar); /向地址01018h写入12h FlashWriteWord(0x01018,ReadWord); /向地址01019h和0
10、101Ah依次写入56h和34h FlashBurstWrite(SegC,p); /向SegD段从地址0110h依次写入a、b、c、d FlashModifyChar(SegB,0x02,0xef); /将地址0112h和0113h内容改为e和f _BIS_SR(CPUOFF); /关闭CPU3.61. USCI模块串行异步通信例程以MSP430G2553的USCI模块串行异步通信操作为例,介绍串口寄存器配置及收发程序处理过程。(1)初始化串口void UART_init(void) UCA0CTL1 |=UCSWRST; UCA0CTL1 |= UCSSEL_2; /SMCLK UCA0B
11、R0 = 0x68; /32.768/9600= UCA0BR1 = 0x00; / 1000kHz/9600 = 104.166 =0X68 波特率9600 UCA0MCTL = UCBRS_2; / Modulation UCBRSx = 1 UCA0CTL0 &=UCPEN; UCA0CTL0 &=UCSPB; UCA0CTL0 &=UC7BIT; UCA0CTL1 &=UCSWRST; P1SEL|=BIT1+BIT2; P1SEL2|=BIT1+BIT2; /P1DIR|=BIT2;第二功能无需配置? IE2 |= UCA0RXIE+UCA0TXIE;
12、 unsigned int j; for(j=0;j<2000;j+); (2)串口发送函数/* 宏定义*/unsigned char RX_BUFFRXBUF_SIZE=0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0; /接收缓冲区unsigned int UART_InLen=16; /输入数据长度unsigned int RX_IndexR = 0; /接收FIFO的读指针unsigned int RX_IndexW = 0; /接收FIFO的写指针unsigned char TX_BUFFTXBUF_SIZE=0,0,0,0,0,0,0,0,0,0,0,0,0,0
13、,0,0; /发送缓冲区unsigned int UART_OutLen =16; /发送FIFO内待发送的字节数unsigned int TX_IndexR = 0; /发送FIFO的读指针unsigned int TX_IndexW = 0; /发送FIFO的写指针uint8 ch=0;/* 串口发送一字节函数,查询方式*/void UART_sent(uint8 Chr) IFG2&=UCA0TXIFG;UCA0TXBUF=Chr; while (IFG2&UCA0TXIFG)=0); / USCI_A0 TX buffer ready?/* 串口发送一帧数据函数,中断方
14、式*/char UART0_PutFrame(unsigned char *Ptr,unsigned int Lenth) int i; if(IE2&UCA0TXIE) return(0); if(Lenth>TXBUF_SIZE) return(0); for(i=0;i<Lenth;i+) delay_us(100); TX_BUFFi=Ptri; TX_IndexR=0; UART_OutLen=Lenth; IFG2|=UCA0TXIFG; IE2|=UCA0TXIE; return(1);/* 名 称:USCIxTX_ISR()* 功 能:串口发送中断,每发完1
15、字节会发生一次中断*/#pragma vector=USCIAB0TX_VECTOR_interrupt void USCI0TX_ISR (void) if (UART_OutLen > 0) UART_OutLen-; UCA0TXBUF = TX_BUFFTX_IndexR; while (!(IFG2&UCA0TXIFG); /查看上一字节是否发送完毕 if (+TX_IndexR >= TXBUF_SIZE) TX_IndexR = 0; else IE2 &=UCA0TXIE;(3)串口接收函数/* 串口接收一字节函数,查询方式,此处虽定义但并未使用,不
16、保证其正确性*/uint8 UART_receive(void) while (IFG2&UCA0RXIFG)=0); / 收到一字节? IFG2&=UCA0RXIFG; return(UCA0RXBUF);#pragma vector=USCIAB0RX_VECTOR_interrupt void USCI0RX_ISR(void) UART_InLen+; RX_BUFFRX_IndexW = UCA0RXBUF; /保存在缓冲区中 if (+RX_IndexW >= RXBUF_SIZE) RX_IndexW = 0; 2.USART模块异步串行通信操作例程(1)初
17、始化串口初始化串口0,允许接收和发送,允许接收中断,禁止发送中断,8bit字符发送时钟ACLK = 32.768KHz,波特率4800注意:对串口寄存器操作的时候务必保证SWRST=1,设置完成后SWRST=0。/ 串口初始化函数void InitUSART(void) U0CTL |= CHAR;/ 8bit字符 U0TCTL |= SSEL0;/ ACLK U0BR1 = 0x00/ 4800波特率 U0BR0 = 0x06 U0MCTL = 0x6f U0CTL &= SWRST;/ 设置完成 ME1 |= UTXE0 + URXE0;/ 接收发送允许 IE1 |= URXIE0
18、;/ 接收发送中断 P3SEL |= (0x80 + 0x40);/ 引脚切换到特殊功能上 _EINT(); / 不要忘了开中断(2)串口发送函数采用软件查询式发送,将1个字节写入发送寄存器,然后等待发送完成的标志。本方法适合波特率较高的场合(大于4800)/ 所涉及的全局变量unsigned char TBuff8; / 发送缓冲区unsigned char RBuff8; / 接收缓冲区unsigned char Flag_Receive = 0; / 标志: 接收到有效数据/ 串口发送函数(不需要开发送中断)发送一个数组(共8个字节)void USART_Send(unsigned ch
19、ar *pData) unsigned char i; for(i=0; i<8; i+) TXBUF0 = pDatai;/ 装入发送寄存器 while (IFG1 & UTXIFG0) = 0);/ 判断:发送是否完成 IFG1 &= (UTXIFG0); (3)串口接收函数在RAM开辟接收缓冲区,等到接收的数据组满足要求或者为一帧数据时才处理。中断中接收。/ 所涉及的全局变量unsigned char TBuff8; / 发送缓冲区unsigned char RBuff8; / 接收缓冲区unsigned char Flag_Receive = 0; / 标志: 接
20、收到有效数据/ 串口接收函数(需要开接受中断)#pragma vector=UART0RX_VECTOR_interrupt void USART0_RXIRQ (void) unsigned char Temp; / 暂存接收数据 Temp = RXBUF0; / 8字节接收缓冲队列 RBuff0 = RBuff1; RBuff1 = RBuff2; RBuff2 = RBuff3; RBuff3 = RBuff4; RBuff4 = RBuff5; RBuff5 = RBuff6; RBuff6 = RBuff7; RBuff7 = Temp; / 判断数据有效(有效则设置标志位,等待处理
21、) if (RBuff0 = 0xd0)Flag_Receive = 1; return; elseFlag_Receive = 0;(4)串口校验CRC16函数常用函数,使用的CRCKey = 0xA001输入一个数组和长度,则计算出该部分的CRC值。/ CRC-16循环冗余效验函数unsigned int Caculate_CRC16(unsigned char *DAT, unsigned char Lenth) / *DAT指向要计算CRC的数组, Lenth为数据的有效长度 unsigned int CRC = 0xffff;/ CRC的初始值为FFFF unsigned char
22、i; unsigned char j; for(i=0; i<Lenth; i+) CRC = CRC DATi; / 和当前字节异或一次 for(j=0; j<8; j+) / 循环8次 if(CRC & 0x01) / 判断最低位,如果为1 CRC = CRC >> 1; / 右移一位 CRC = CRC 0xA001; / 和多相式异或 else / 判断最低位,如果为0 CRC = CRC >> 1; / 右移一位 return(CRC);第五章程序示例#include <msp430g2553.h>typedef unsigne
23、d char uchar;typedef unsigned int uint;/*全局变量*/uchar key_Pressed; /按键是否被按下:1-是,0-否uchar key_val; /存放键值uchar key_Flag; /按键是否已放开:1-是,0-否/设置键盘逻辑键值与程序计算键值的映射uchar key_Map = 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16;/*函数名称:Init_Keypad功 能:初始化扫描键盘的IO端口参 数:无返回值 :无*/void Init_Keypad(void) P1DIR = 0xf0; /P1.0P1.
24、3设置为输入状态, P1.4P1.7设置为输出状态 P1OUT |= 0xf0; / P1.4P1.7输出高电平 key_Flag = 0; key_Pressed = 0; key_val = 0;/* Check_Key(),检查按键,确认键值*/*函数名称:Check_Key功 能:扫描键盘的IO端口,获得键值参 数:无返回值 :无*/void Check_Key(void) uchar row ,col,tmp1,tmp2; tmp1 = 0x80; for(row = 0;row < 4;row+) /行扫描 P1OUT = 0xf0; /P1.4P1.7输出全1 P1OUT
25、-= tmp1; /P1.4p1.7输出四位中有一个为0 tmp1 >>=1; if (P1IN & 0x0f) < 0x0f) /是否P1IN的P1.0P1.3中有一位为0 tmp2 = 0x01; / tmp2用于检测出那一位为0 for(col = 0;col < 4;col+) / 列检测 if(P1IN & tmp2) = 0x00) / 是否是该列,等于0为是 key_val = key_Maprow * 4 + col; / 获取键值 return; / 退出循环 tmp2 <<= 1; / tmp2左移1位 /*函数名称:de
26、lay功 能:延时约15ms,完成消抖功能参 数:无返回值 :无*/void delay() uint tmp; for(tmp = 12000;tmp > 0;tmp-);/*函数名称:Key_Event功 能:检测按键,并获取键值参 数:无返回值 :无*/void Key_Event(void) uchar tmp; P1OUT &= 0x00; / 设置P1OUT全为0,等待按键输入 tmp = P1IN; / 获取 p1IN if (key_Pressed = 0x00)&&(tmp & 0x0f) < 0x0f) /如果有键按下 key_P
27、ressed = 1; / 如果有按键按下,设置key_Pressed标识 delay(); /消除抖动 Check_Key(); / 调用check_Key(),获取键值 else if (key_Pressed = 1)&&(tmp & 0x0f) = 0x0f) /如果按键已经释放 key_Pressed = 0; / 清除key_Pressed标识 key_Flag = 1; / 设置key_Flag标识 else _NOP(); 程序示例#include <MSP430g2553.h>#define Dis00 0x3F /数码管显示字符"
28、;0"#define Dis01 0x06 /数码管显示字符"1"#define Dis02 0x5B /数码管显示字符"2"#define Dis03 0x4F /数码管显示字符"3"#define Dis04 0x66 /数码管显示字符"4"#define Dis05 0x6D /数码管显示字符"5"#define Dis06 0x7D /数码管显示字符"6"#define Dis07 0x07 /数码管显示字符"7"#define Dis0
29、8 0x7F /数码管显示字符"8"#define Dis09 0x6f /数码管显示字符"9"#define Dis0A 0X77 /数码管显示字符"A"#define Dis0B 0x7C /数码管显示字符"B"#define Dis0C 0x39 /数码管显示字符"C"#define Dis0D 0x5E /数码管显示字符"D"#define Dis0E 0x79 /数码管显示字符"E"#define Dis0F 0X71 /数码管显示字符"
30、;F"const unsigned char seg_16 = 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void delay_(int m) /延时子程序 int i; int j; for (i=m;i>0;i-) for(j=100;j>0;j-);void Display( signed char i ) /数码管显示子程序 / unsigned char result(); if(0<=i<=15) P1OUT = seg_i; /
31、 数码管显示数值 / delay_(100); / while(1);void main(void) WDTCTL = WDTPW + WDTHOLD; / 关闭看门狗 P1SEL = 0; /设置P1口全为普通IO口 P1DIR = 0xff; /将P1所有端口设为输出 P1OUT = 0X00; /p1口先全部输出低电平 unsigned char i; for(i=0;i<16;i+)/依稀显示从“0”到“F” Display(i);程序示例#include <msp430g2553.h>#include"Key&Display.h" /自定
32、义头文件void main( void ) WDTCTL = WDTPW + WDTHOLD; / 停止开门狗 Init_4lines_Mode();/初始化4线工作模式 Send_Command(CH452_RESET);/CH452芯片内部复位 Send_Command(KeyDisplay_ON);/允许显示驱动并启动键盘扫描 /开中断,P2.0接CH452的DOUT引脚,当有键按下时,DOUT上产生由高到低的脉冲 P2IE|=BIT0; P2IES|=BIT0; P2IFG&=BIT0; _EINT(); while(1) /中断处理函数#pragma vector = POR
33、T2_VECTOR/中断处理程序,接收到DOUT脉冲信号时,运行之_interrupt void Port2(void) unsigned char Keyvalue; Send_Command(CH452_GET_KEY);/单片机向CH452发送读取按键代码命令 Keyvalue=Key_Read(); switch(Keyvalue) case 0x40:/按键K0按下 Send_Command( NDis1); /第1位数码管不显示 Send_Command(Dis00);/第0位数码管显示0 break; case 0x41:/按键K1按下 Send_Command( NDis1);
34、 /第1位数码管不显示 Send_Command(Dis01);/第0位数码管显示1 break; case 0x42:/按键K2按下 Send_Command( NDis1); /第1位数码管不显示 Send_Command(Dis02);/第0位数码管显示2 break; case 0x43:/按键K3按下 Send_Command( NDis1);/第1位数码管不显示 Send_Command(Dis03);/第0位数码管显示3 break; case 0x48:/按键K4按下 Send_Command( NDis1);/第1位数码管不显示 Send_Command(Dis04);/第0
35、位数码管显示4 break; case 0x49:/按键K5按下 Send_Command( NDis1);/第1位数码管不显示 Send_Command(Dis05);/第0位数码管显示5 break; Send_Command( NDis1);/第1位数码管不显示 Send_Command(Dis06);/第0位数码管显示6 break; Send_Command( NDis1);/第1位数码管不显示 Send_Command(Dis07);/第0位数码管显示7 break; case 0x50:/按键K8按下 Send_Command( NDis1);/第1位数码管不显示 Send_Co
36、mmand(Dis08);/第0位数码管显示8 break; case 0x51:/按键K9按下 Send_Command( NDis1);/第1位数码管不显示 Send_Command(Dis09);/第0位数码管显示9 break; case 0x52:/按键K10按下 Send_Command(Dis00);/第0个数码管显示字符"0" Send_Command(Dis11);/第1个数码管显示字符"1" break; case 0x53:/按键K11按下 Send_Command(Dis01);/第0个数码管显示字符"1" S
37、end_Command(Dis11);/第1个数码管显示字符"1" break; case 0x58:/按键K12按下 Send_Command(Dis02);/第0个数码管显示字符"2" Send_Command(Dis11);/第1个数码管显示字符"1" break; case 0x59:/按键K13按下 Send_Command(Dis03);/第0个数码管显示字符"3" Send_Command(Dis11);/第1个数码管显示字符"1" break; Send_Command(Dis0
38、4);/第0个数码管显示字符"4" Send_Command(Dis11);/第1个数码管显示字符"1" break; Send_Command(Dis05);/第0个数码管显示字符"5" Send_Command(Dis11);/第1个数码管显示字符"1" break; default:break; P2IFG&=BIT0;程序示例#include "msp430g2553.h"#include "LCD12864.h"unsigned char display=
39、"=欢迎使用=" "西安电子科技大学" "实验系统标准板 " "TexasInstruments"void main() WDTCTL = WDTPW + WDTHOLD; /关闭看门狗 P2SEL &= (BIT6+BIT7); /关闭P2.6和P2.7的第二功能 P2DIR |= BIT6+BIT7; /P2.6和P2.7设置为输出 lcd_init(); /初始化LCD while(1) chn_disp1 (display);/显示数组 display 中的内容 程序示例#include "msp430g2553.h"/* 定义用户配置(根据具体的硬件平台可能要在相应修改) */#define WDT_meas_setting (DIV_SMCLK_512)/定义
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 变配电保护自动化项目风险分析和评估报告
- 2025年装配灯具项目可行性研究报告
- 2025年中国船用柴油机行业市场全景评估及发展战略规划报告
- 《公司变更登记申请书》
- xx供电局状态可靠性等智能评估可行性研究报告
- 污水管道工程评估报告
- 互连接线行业行业发展趋势及投资战略研究分析报告
- 2025年丝织准备机械项目可行性研究报告
- 玄武岩项目可行性研究报告
- 2025年机房温控节能项目可行性研究报告
- 2024-2025学年物理人教版八年级上册-6.4-密度的应用-课件
- 矿山应急管理培训
- DB41T 2486-2023 叉车维护保养与自行检查规范
- 一年级家长会课件2024-2025学年
- 1、DL-T5113.1-2019 水利水电工程单元工程质量等级评定标准第一部分:土建工程用表
- 三相四线及三相三线错误接线向量图分析及更正
- 120急救车辆管理规范与120驾驶员管理制度
- 白酒业务员考勤管理制度
- 2024年海南省海口市小升初数学试卷(含答案)
- 小班班本课程《吃饭这件小事》
- 危险化学品事故应急预案演练评估报告
评论
0/150
提交评论