版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、基于MSP430单片机原理及应用第一章 MSP430单片机概述目录1.1 MSP430单片机的特点1.2 MSP430系列单片机的分类1.3 MSP430 x16x硬件结构概述1.4 MSP430 x16x重要特性和外部引脚1.5 MSP430 x16x的时钟模块与低功耗目录1.1 MSP430单片机的特点(1)超低功耗 (2)强大的运算处理能力(3)高性能模拟技术及丰富的片上外围模块(4)高效方便的开发环境(5)系统工作稳定MSP430单片机的特点(1)超低功耗MSP430系列单片机的电源电压采用1.83.6V低电压,具有5种低功耗模式,可实现无可匹敌的超低功耗性能。RAM数据保持方式下耗电
2、仅0.1A,活动模式耗电250A/MIPS(MIPS:每秒百万条指令数)。(2)强大的运算处理能力MSP430系列单片机是16位单片机,采用了RISC(Reduced Instruction Set Computer,精简指令集计算机)结构,一个时钟周期可以执行一条指令,使MSP430在8MHz晶振工作时,指令速度可达8MIPS。MSP430单片机的特点(3)高性能模拟技术及丰富的片上外围模块 MSP430系列单片机结合TI的高性能模拟技术,高精度的模/数转换器(ADC)有很高的转换速率,最高可达200kb/s,适用于大多数数据采集的场合。(4)高效方便的开发环境目前MSP430系列有OTP型
3、、FLASH型和ROM型三种类型的器件,国内大量使用的是FLASH型。对于FLASH型有十分方便的开发调试环境,整个开发都可以在同一个软件集成环境中进行。这种方式只需要一台PC机和一个JTAG调试器。开发语言有汇编语言和C语言。目前较好的软件开发工具是IAR Workbench V5.30和CCSV5.5。MSP430单片机的特点(5)系统工作稳定系统上电复位后,由DCOCLK启动CPU,以保证系统从正确的位置开始执行。随后软件可设置适当的寄存器的控制位来确定最后的系统时钟频率。如果晶体振荡器在用做CPU时钟MCLK时发生故障,DCO会自动启动,以保证系统正常工作。目录1.2 MSP430系列
4、单片机的分类(1)Mt :内存的类型(2)Da Db:器件配置(3)Mc:内存容量MSP430系列单片机的分类MSP430系列的单片机种类很多,使得设计人员可以根据具体的应用而选择不同的单片机,获得最佳的性价比。这些系列有着相同的命名规则,规则如下:MSP430 Mt Da Db Mc Mt:内存的类型MtC ROMF FLASHE EEPROMU USERP OTPMSP430系列单片机的分类10,11基本型12,13带硬件UART14带硬件UART,硬件乘法器31,32带液晶驱动33带液晶驱动,带硬件UART,硬件乘法器41带液晶驱动43带液晶驱动,带硬件UART44带液晶驱动,带硬件UA
5、RT,硬件乘法器表1-1 Da Db :器件配置MSP430系列单片机的分类01KB程序存储区,128字节数据存储区12KB程序存储区,128字节数据存储区24KB程序存储区,256字节数据存储区38KB程序存储区,256字节数据存储区412KB程序存储区,512字节数据存储区516KB程序存储区,512字节数据存储区624KB程序存储区,1KB字节数据存储区732KB程序存储区,1KB字节数据存储区848KB程序存储区,2KB字节数据存储区960KB程序存储区,2KB字节数据存储区表1-2 Mc:内存容量 上述命名规则中,并没有把模/数转换、定时器和封装等包括进来,如要选择单片机满足工程的需
6、要,可登陆TI官方网站超找各单片机的精确配置。目录1.3 MSP430 x16x硬件结构概述(1)MSP430 x16x硬件结构MSP430 x16x硬件结构概述MSP430采用了RISC结构,主要包含16位的RISC CPU、存储器、外围模块、灵活的时钟系统以及连接他们的数据总线和地址总线。图1-1 MSP430 x16x硬件结构目录1.4 MSP430 x16x的重要特性和外部引脚1.4.1 MSP430 x16x的重要特性1.4.2 MSP430 x16x的引脚功能MSP430 x16x的重要特性和外部引脚低电压范围1.8V3.6V超低功耗活动模式:330Aat1MHz,2.2V待机模式
7、:1.1A掉电模式:(RAM数据保持):0.2A五种省电模式从待机到唤醒模式响应时间不超过6s16位精简指令系统指令周期125-ns高速晶体(8MHz)低速晶体(32KHz)数字控制振荡器DCO12位200ksps的AD转换器内部温度传感器有3个捕获/比较寄存器的16位定时器Timer_A,Timer_B两通道串行通信接口可用于异步或同步模式6个8位并行端口,且2个8位端口有中断能力自带硬件乘法器串行在系统编程保密熔丝的程序代码保护 1.4.1 MSP430F16x的主要特性MSP430 x16x的重要特性和外部引脚 1.4.2 MSP430F16x的外部引脚MSP430F169共有64个引脚
8、,其引脚分布,如图所示。图1-2 MSP430 x16x系列单片机引脚图目录1.5 MSP430 x16x的时钟模块与低功耗1.5.1 MSP430 x16x系列单片机时钟模块1.5.2低速晶体振荡器1.5.3高速晶体振荡器1.5.4 DCO振荡器1.5.5 振荡器失效检测1.5.6 MSP430 x16x的低功耗结构MSP430 x16x的时钟模块与低功耗1.5.1 MSP430 x16x系列单片机时钟模块时钟模块对于MSP430单片机来说至关重要,它不仅给CPU提供正确的时序,还给单片机的外围模块提供工作时序。因此,一个高效稳定的时钟模块是单片机系统能够正常工作的基础。图1-3 MSP43
9、0 x16x系列单片机的基础时钟模块结构MSP430 x16x的时钟模块与低功耗ACLK辅助时钟:由LFXT1CLK信号经1、2、4、8分频后得到,可以由软件选择各个外围模块的时钟信号,一般用于低速外设。MCLK系统主时钟:MCLK可由软件选择来自LFXT1CLK、XT2CLK、DCOCLK三者之一,然后经1、2、4、8分频得到,MCLK主要用于CPU和系统。SMCLK子系统时钟:可由软件选自LFXT1CLK和DCOCLK或XT2CLK和DCOCLK,然后经1、2、4、8分频得到。SMCLK主要用于高速外围模块。MSP430F169基本时钟模块有三个时钟输入源LFXT1CLK(低速32768H
10、z,高速450Hz到8MHz)、XT2CLK(450Hz到8MHz)、DCOCLK,提供以下三种时钟信号MSP430 x16x的时钟模块与低功耗1.5.2 低速晶体振荡器MSP430系列的单片机的每种产品都会有低速晶体振荡器(LFXT1),通常外接32768Hz的手表晶振。LFXT1振荡器在发生有效的PUC后开始工作,一次有效的PUC(power-up-clear)信号将SR寄存器的OscOff位复位,即允许LFXT1工作。如果LFXT1CLK信号没有用作SMCLK或ACLK信号,则可以用软件将OscOff位置位,禁止LFXT1工作。图1-4 LFXT1的控制逻辑图MSP430 x16x的时钟
11、模块与低功耗1.5.3 高速晶体振荡器 高速振荡器(XT2),它产生时钟信号XT2CLK,它的工作特性与LFXT1振荡器工作在高频模式时类似。如果XT2CLK没有用作MCLK、SMCLK时钟信号,则可以用XT2OFF控制位关闭XT2;如果CPUOFF=0,SELM=2,则XT2CLK用作MCLK时钟;如果SCG1=0,且SELS=1,XT2CLK用作SMCLK时钟。图1-5 XT2振荡器控制逻辑图MSP430 x16x的时钟模块与低功耗1.5.4 DCO振荡器 MSP430系列的单片机外部振荡器产生的时钟信号都可以经1、2、4、8分频后用作系统的MCLK。当上电复位或者振荡器失效的时候,DCO
12、会自动被选做MCLK的时钟源,频率在800kHz左右。图1-6 DCO控制逻辑图MSP430 x16x的时钟模块与低功耗1.5.5 振荡器失效检测 MSP430内部含有晶体振荡器失效监测电路,监测LFXT1(工作在高频模式)和XT2输出的时钟信号。振荡器失效会设置振荡器失效标志位OFIFG,如果此时振荡器失效中断允许位(OFIE)置位,则产生非屏蔽中断请求。OFIFG必须由用户软件清除。XT2振荡器的失效信号和LFXT1振荡器的失效信号都能引起OFIFG中断标志。振荡器失效标志OFIFG必须在LFXT1和XT2的失效信号都为“0”时,才能被软件复位。图1-7 振荡器失效中段逻辑图MSP430
13、x16x的时钟模块与低功耗1.5.6 MSP430 x16x的低功耗结构 MSP430系列单片机在低功耗方面表现的非常优秀。五种低功耗模式分别为LPM0LPM4(LOW POWER MODE),CPU的活动状态称为AM(ACTVE MODE)模式。其中AM耗电最大,LPM4耗电最省,仅为0.1uA。另外工作电压对功耗的影响:电压越低功耗也越低。低功耗结构图,如图所示。各种模式下消耗电流的情况如图所示图1-8 低功耗结构图MSP430 x16x的时钟模块与低功耗1.5.6 MSP430 x16x的低功耗结构各种模式下消耗电流的情况如图所示图1-9 各种模式下消耗电流情况基于MSP430单片机原理
14、及应用第二章 MSP430单片机指令系统与程序设计目录2.1 寻址模式2.2 汇编指令系统2.3 C语言程序设计2.4 MSP430 C语言扩展特性2.5 MSP430开发工具简介2.6 CCSv5.5软件开发环境目录2.1 寻址模式2.1.1 寄存器寻址模式2.1.2 变址寻址模式2.1.3 符号寻址模式2.1.4 绝对寻址模式2.1.5 寄存器间接寻址模式2.1.6 间接增量寻址模式2.1.7 立即数寻址模式寻址模式MSP430支持7种源操作数寻址模式和4种目的操作数寻址模式,如表所示。本节将对每一种模式进行简单介绍。模式源操作数目的操作数描述寄存器寻址XX一个时钟周期变址寻址XX表处理符
15、号寻址XX容易阅读代码,PC相关绝对寻址XX直接访问任意存储单元寄存器间接寻址X使用指针访问内存自增间接寻址X表处理立即数寻址X不限常量值表2-1 MSP430寻址模式描述寄存器寻址模式可以直接操作通用寄存器(R4R15)或特殊功能寄存器,如程序计数器或状态寄存器。就指令速度和代码空间而言,这种模式很高效。描述:寄存器内容是操作数源模式位:As=00(操作码定义源寄存器)语法:Rn长度:一个或两个字注释:源或目的均有效例: 编源程序 ROM中的内容 MOV R10, R11 MOV R10,11操作:将R10的内容移动到R11中。执行前 执行后 R10 123H R10 123HR11 0FA
16、00H R11 123HPC PC_old PC PC_old+2寄存器寻址模式变址寻址模式适合查表类应用,其构成是X(Rn),其中X是常量,Rn是CPU寄存器。绝对地址是X+Rn。描述: (X+Rn)指出操作数地址。X存储在紧邻的字中源模式位: As=01(操作码后紧邻的字定义了存储单元地址)目的模式位: Ad=1(操作码后紧邻的字定义了存储单元地址)语法: X(Rn)长度: 两个或三个字注释: 源和目的均有效例: 汇编源程序 ROM中的内容MOV 2(R5), 3(R6) MOV X(R5),Y(R6) X=2 Y=3操作:将地址为(R5)+2的存储单元内容移动到地址为(R6)+3的存储单
17、元中。 执行前 执行后R5 01080H R5 01080HR6 0108CH R6 0108CH内存单元01082H 1234H 内存单元01082H 1234H内存单元01090H 5678H 内存单元01090H 1234H变址寻址模式符号寻址模式可以给固定的存储单元添加标签,适用于嵌入式程序的开发。描述(PC+X)指出操作数, X存储在下一个字中。使用变址寻址表示是X(PC)源模式位: As=01(操作码后紧邻的字定义了存储单元地址)目的模式位: Ad=1(操作码后紧邻的字定义了存储单元地址)语法: ADDR长度: 两个或三个字注释: 源和目的均有效例: 汇编源程序 ROM中的内容MO
18、V EDE, TON1 MOV X(PC),Y(PC) X=EDE-PC Y=TON1-PC 操作:将地址为EDE的单元内容移动到地址为TON1的单元中。其中EDE=PC+X,TON1=PC+Y。 执行前 执行后内存单元01234H 67H 内存单元01234H 67H内存单元02345H 8BC0H 内存单元02345H 67H符号寻址模式绝对寻址模式与符号寻址相似,区别是其标签前有“&”。描述: 指令后字中包含绝对地址,X存储在下一个字中,使用变址寻址表示是X(SR)源模式位: As=01(操作码后紧邻的字定义了存储单元地址)目的模式位: Ad=1(操作码后紧邻的字定义了存储单元地址)语法
19、: &ADDR长度: 两个或三个字注释: 源和目的均有效例: 汇编源程序 ROM中的内容MOV &EDE, &TON1 MOV X(0), Y(0) X=EDE Y=TON1操作:将地址为EDE的内容移动到地址为TON1中。如果EDE=1234H,TON1=2345H,则:执行前 执行后内存单元01234H 67H 内存单元01234H 67H内存单元02345H 8BC0H 内存单元02345H 67H绝对寻址模式数据字存储单元地址由Rn指出,寄存器间接寻址模式不适用于目的操作数,但可通过变址寻址格式0(Rn)模拟。描述: Rn用来指出操作数源模式位: As=10语法: &Rn长度: 一个或
20、两个字注释: 仅适用于源操作数,目的操作数替代是0(Rn)例: 汇编源程序 ROM中的内容 MOV R10, 0(R11) MOV (R10), 0(R11)操作:将地址为R10的单元中内容移动到地址为R11的单元中。R10和R11本身的值在执行前后不变。执行前 执行后R10 0123H R10 0123HR11 0FA00H R11 0FA00H内存单元0123H 1234H 内存单元0123H 1234H内存单元0FA00H 5678H 内存单元0FA00H 1234H寄存器间接寻址模式数据字存储单元地址由Rn指出,寄存器间接寻址模式不适用于目的操作数,但可通过变址寻址格式0(Rn)模拟。
21、描述: Rn用来指出操作数源模式位: As=10语法: &Rn长度: 一个或两个字注释: 仅适用于源操作数,目的操作数替代是0(Rn)例: 汇编源程序 ROM中的内容 MOV R10, 0(R11) MOV (R10), 0(R11)操作:将地址为R10的单元中内容移动到地址为R11的单元中。R10和R11本身的值在执行前后不变。执行前 执行后R10 0123H R10 0123HR11 0FA00H R11 0FA00H内存单元0123H 1234H 内存单元0123H 1234H内存单元0FA00H 5678H 内存单元0FA00H 1234H寄存器间接寻址模式间接增量寻址模式同寄存器间接
22、寻址相似,但间接增量寻址模式中操作数是指令中数字的自增值。操作数格式是Rn+, 这种模式适用于数据块处理。间接增量寻址模式与寄存器间接寻址相似,但指令执行完成后,源操作数自动增加一个字节或一个字。描述: Rn用来指出操作数,字节指令中Rn自增1而字指令中Rn自增2源模式位: As=11语法: Rn+长度: 一个或两个字注释: 仅适用于源操作数,目的操作数替代是0(Rn)加上第二条指令INCD Rn例: 汇编源程序 ROM中的内容 MOV R10+, 0(R11) MOV (R10)+, 0(R11)操作:将地址为R10的单元中内容移动到地址为R11的单元中。执行后R10内容变为R10+2,R1
23、1本身的值在执行前后不变。执行前 执行后 R10 0123H R10 0125HR11 0FA00H R11 0FA00H内存单元0123H 1234H 内存单元0123H 1234H内存单元0FA00H 5678H 内存单元0FA00H 1234H间接增量寻址模式立即数寻址模式用来将常量值赋给寄存器或内存单元。描述: 指令后的字中包含立即数常量N, 使用自增间接寻址表示是PC+ 源模式位: As=11语法: #N长度: 两个或三个字,如果常量CG1或CG2可用就少一个字注释: 仅适用于源操作数例:MOV #23H, TON1 ;将常数23移动到目的地址TON1中。立即数寻址模式目录2.2 汇
24、编指令系统2.2.1双操作数指令2.2.2单操作数指令2.2.3 程序流控制-跳转2.2.4 仿真指令MS430指令集包括27种内核指令,还支持24种仿真指令。CPU将内核指令解码成唯一的操作码,汇编器和编译器用来生成仿真指令的助记符。有3种内核指令格式:双操作数,单操作数和程序流控制跳转。可使用“B”,“W”和“.A”扩展来访问字节,字和地址指令。如果没有扩展,就把指令解释为字指令。汇编指令系统双操作数指令双操作数指令格式如下:1514131211109876543210opcodeS-RegAdB/WAsD-Reg位简介1512opcode操作码118S-Reg工作寄存器用于存储操作数(s
25、rc)7Ad负责寻址模式的寻址位,用于表示目标操作数(dst)6B/WByte或Word操作:B/W=0,Word操作;B/W=1,Byte操作54As负责寻址模式的寻址位,用于表示源操作数(src)30D-Reg工作寄存器用于存储目的操作数(dst)双操作数指令助记符操作简介算术指令ADD( .B or .w)src,dstsrc+dstdst源操作数加到目的操作数ADDC( .B or .w)src,dstsrc+dst+Cdst源操作数和进位加到目的操作数DADD ( .B or .w)src,dstsrc+dst+Cdst(dec)源操作数和进位用十进制加到目的操作数SUB ( .B
26、or .w)src,dstdst+ .not.src+1dst从目的操作数减去源操作数SUBC ( .B or .w)src,dstdst+ .not.src+Cdst从目的操作数减去源操作数和进位逻辑和寄存器控制指令AND( .B or .w)src,dstsrc. and. dstdst源操作数与目的操作数进行与运算BIC( .B or .w)src,dst.not.src. and. dstdst清除目的操作数对应的比特位BIS( .B or .w)src,dstsrc. or. dstdst设置目的操作数位BIT( .B or .w)src,dstsrc. and. dst测试目的操作
27、数位XOR( .B or .w)src,dstsrc. xor. dstdst源操作数与目的操作数进行异或运算数据指令CMP( .B or .w)src,dstdst-src源操作数与目的操作数进行比较MOV( .B or .w)src,dstsrcdst源操作数移动到目的操作数表2-2 双操作数内核指令单操作数指令单操作数指令格式如下:1514131211109876543210opcodeB/WAdD/S-Reg位简介157opcode操作码6B/WByte或Word操作:B/W=0,Word操作;B/W=1,Byte操作54Ad负责寻址模式的寻址位,用于表示源操作数(src)30D/S-
28、Reg工作寄存器用于存储目的操作数(dst)或源操作数(src)单操作数指令助记符操作简介逻辑和寄存器控制指令RRA(.B or .w) dstMSB-MSB-LSB-C目的操作数右移RRC(.B or .w) dstc-MSB-LSB-C目的操作数带进位右移SWPB(.B or .w) dstSwap bytes目的操作数进行字节交换SXT dstbit7-bit8bit15目的操作数符号扩展PUSH(.B or .w) src SP-2-SP,src-sp源操作数压入栈程序流控制指令CALL(.B or .w) dstSP-2-SP,PC+2-SPdst-PC子程序调用目的地址RETITO
29、S-SR,SP+2-SPTOS-PC,SP+2-SP中断返回表2-4单操作数内核指令程序流控制-跳转跳转指令格式如下:位简介1513opcode操作码1210C90PC offsetPCnew=PCold+2+PCoffset 21514131211109876543210opcodeC10 bit PC offset程序流控制-跳转助记符简介程序流控制指令JEQ/JZ label零标志置位就跳转到标签处JNE/JNZ label零标志不置位就跳转到标签处JC label进位标志置位就跳转到标签处JNC label进位标志不置位就跳转到标签处JN label求反标志置位就跳转到标签处JGE l
30、abel大于或等于就跳转到标签处JL label小于就跳转到便签处JMP label无条件跳转表2-6 程序流控制指令(跳转)目录2.3 C语言程序设计2.3.1 标示符与关键字2.3.2 数据类型2.3.3 运算符2.3.4 函数2.3.5 数组2.3.6 指针2.3.7 位运算2.3.8 存储寄存器2.3.9预处理2.3.10 程序的基本结构C语言程序设计MSP430程序设计除了可以使用汇编语言外,还可以采用C语言编程。使用C语言进行程序设计是当今单片机系统开发和应用的主流,这主要有两个方面的因素:一方面是随着芯片工业的快速发展,单片机能够以较低的成本提供较快的预算速度和更多的存储空间;另
31、外一方面,现在的单片机系统处理的任务越来越复杂,产品更新的周期也越来越短,这也对开发的进度提出了较高的要求。在这种情况下,使用汇编程序设计已经不能满足要求,C语言由于其可移植性好、硬件控制能力强、表达和运算能力强的特点,能够充分地发挥单片机的丰富功能,提高软件的开发效率,增强其可读性和可移植性。MSP430单片机使用的一套应用C语言的集成开发环境和调试器是由IAR公司提供的。MSP430 C语言与标准C语言的不同之处,主要表现在以下几个方面:C语言程序设计 外围模块变量外围模块变量也被称作特殊功能寄存器变量,其直接位于内部的RAM中。sfrb:用于定义地址范围为0 x000 xFF的片内外围模
32、块的功能寄存器以及特殊功能寄存器。例如,P1端口的输入寄存器地址为0 x0020,则可定义为:sfrb P1IN=0 x20sfrw:用于定义地址范围为0 x1000 x1FF的片内外模块的功能寄存器。例如,ADC12模块的控制寄存器的地址为0 x01A2,则sfrw ADC12CTL1=0 x1A2指针变量MSP430 C语言的指针变量包括代码指针和数据指针,都可以指向0000H0FFFFH范围的存储空间。枚举类型用enum关键字,可以使声明的每一个变量具有适合它的值所需的最短整数类型,包括char、short、int或long。浮点类型在标准IEEE格式中,浮点使用4字节数来表示。低于最小
33、极限的浮点数被看作零而溢出。标示符与关键字(1)标示符标示符用来定义变量、函数、标号以及用户定义对象的名称。标示符由字母和数字组成,但第一个字符必须是字母或下划线。C语言中大、小写字母被认为是不同的字符。如:at、AT、At就是3种不同的标示符。标示符与保留的关键字都不能与库函数名和自定义的函数名相同。(2)关键字 关键字是一种已经被编译器定义过的标示符,具有特定的定义,因此也称作保留字,意思是不可以再被用户定义了。 另外,针对不同的微处理器,还有一些扩展的关键字,扩展关键字将在后续章节中介绍。数据类型数据类型有基本型、构造型、指针型。(1)基本型基本型数据类型如表2-10所示。数据类型位数范
34、围char8bit0255signed char8bit-128127unsigned char8bit0255short16bit-3276832767unsigned short16bit065535int16bit-3276832767unsigned int16bit065535long32bit-231231-1unsigned long 16bit0232-1long long64bit-263263-1unsigned long long64bit0264-1float32bit1.18E-383.39E+38Double*32bit1.18E-383.39E+38Double*
35、64bit2.23E-3081.79E+308表2-10 基本型数据类型*依赖编译器数据类型(2)构造型 构造型是由基本数据类型组成的集合体。有数组、结构、联合、枚举4种形式。在对单片机的编程中,使用的最多的是数组。枚举用于定义一组常量,增加程序的可读性。由于包含结构的程序运行效率低,因此结构很少使用。联合的应用范围有限,所以也很少用到。数组 数组是同一种数据类型的集合体,如unsigned char Da5,表示5个unsigned char类型的数据组成了Moon数组。 使用时通过下标来存取数组中的数据,如Da2=100的含义为为数组Da中的第三个元素赋值100。数组的第一个元素的下标为0
36、,Da0为第一个元素。按照数组Da的定义,数组Da只有5个元素,所以,其后一个元素为Da4。数据类型结构 结构是可以有多种数据类型组成的混合数据集合体。使用时首先定义结构类型,如:struct Moonunsigned char Data,/无符号8位字符类型unsigned int Year /无符号16位整数类型;以上代码定义了结构类型Moon,其中Data和Year的数据类型。struct为定义结构的关键字。使用结构类型时首先定义结构变量。如:Struct Moon Mo;/定义结构体变量Mo为Moon类型存取结构变量时,通过结构类型中的变量名来进行,结构变量的名称和结构中的变量名中间用
37、“.”隔开,如:Mo.Data=15;/Mo中的Data元素被赋值为15Mo.Year=3; /Mo中的Year元素被赋值为3数据类型联合联合是可以有多种数据类型组成的混合数据集合体。联合与结构的区别在于放置在内存中的数据的存放方式不同。结构中的每个成员是顺序存放的,都拥有自己的内存单元,结构所占用的内存长度为所有成员占用内存长度的和。联合的内存长度为占用内存最多的成员的长度,所有的成员都放在同一内存地址,每次只能存放成员中的一种,而且有效的只能是最后一次放置的成员。使用时首先定义联合类型,如:Union Yearunsigned char da0;/无符号8位字符类型unsigned int
38、 da1;/无符号16位整数类型;代码中定义了联合类型Year,其中da0和da1的数据类型不同。Union为定义联合的关键字。使用联合类型是首先定义联合变量。如:Union Year Ye;/定义联合变量Ye为Year类型存取联合变量时,通过联合类型中的变量名来进行,联合变量的名称和联合中的变量名中间用“.”隔开,如:Ye.da0=15;/Ye中的da0元素被赋值为15Ye.da1=3;/Ye中的da1元素被赋值为3数据类型枚举枚举就是列举一个变量所有的取值。这样做的好处是增加程序的可读性。举例:menu week Mon,Tues,Wed,Thurs,Fri,Sta,Sun编译器按照顺序为
39、它们取值,Mon=0,Tues=1Sun=6。也可以强制定义枚举的取值。举例:menu week Mon,Tues=5,Wed,Thurs,Fri,Sta,Sun程序运行的结果为:Mon=0,Tues=5,Wed=6,Thurs=7数据类型(3) 指针型指针型用来存储地址,也可以是变量的地址,也可以是函数的地址。指针的应用非常灵活,能够提高程序的效率。举例:unsigned char Sun;unsigned char *Moon=Sun;Moon中存放了变量Sun的地址。运算符运算符是进行基本运算的符号。(1)赋值运算符赋值运算符为“=”,作用是把等号右边的值赋给等号左边的变量举例:Moon
40、=100;变量Moon的值为100。除了“=”,还有复合赋值运算符:+=、=、*=、/=、%=、=、&=、|=、=。举例:q0 +=5; /q0=q0+5 q0 =5; /q0=q0-5q0 *=5; /q0=q0*5q0 /=5; /q0=q0/5q0 %=5; /q0=q0%5q05; /q0=q0=5; /q0=q05q0 &=5; /q0=q0&5q0 |=5; /q0=q0|5q0 =5; /q0=q05运算符(2)算术运算符算术运算符有+、*、%、+、,下面分别加以解释:+ 加法运算 减法运算* 乘法运算/ 除法运算,结果只保留整数,小数部分被舍去。% 取余运算,要求两个运算对象都
41、为整数,如9%8,结果为1。+ 增量运算,自加1。例如Moon+等价于Moon=Moon+1。减量运算,自减1。例如Moon等于Moon=Moon1。(3)关系运算符关系运算符用于判别两个值之间的关系,判别的结果只有真和假两种结果。判别结果如果为真,则表示为1,判别结果为假则表示为0。关系运算符有以下几种: 大于= 大于等于 小于 位右移 ka =100; /为结构体sst 中的变量ka 赋值 100 (*psst ).ka =100与psst-ka =100 的含义完全相同。“-”的含义为通过指针获取结构中的变量。数组和结构、联合的成员也可以是指针。位运算位运算通过位运算符进行。举例:uns
42、igned char q0=0 x35,q1=0 x47;q0=q05; /q1的值右移5位执行结果为:q0=0 x1A8 q1=0 x2有些处理器寄存器中的每一位也有其位地址,所以可以对寄存器中的位单独操作,如MCS51系列微处理器。MSP430没有位地址,所以,只能采取位屏蔽的方法对寄存器中某一位进行操作,而避免改变同一寄存器中其他位的内容。如:P1DIR =P1DIR | 0 x1;P1OUT=P1OUT & 0XFE;P1DIR 为MSP430的P1口的方向寄存器,P1OUT为P1口的输出寄存器。以上代码中第一行语句将P1口的最低位(一共8位)输入输出方向改为输出,其他位方向不变。第二
43、行语句是将最低位输出0,其他位不变。存储寄存器变量和函数都有其有效区域,称为作用域。程序如果使用范围之外的变量和函数,则编译会出错。(1)变量 变量包括局部变量、全局变量、外部变量、静态变量。 局部变量 在函数内部定义的变量称为局部变量,它只在函数内有效,退出函数时所分分配的内存将被释放。全局变量 在程序开始执行的时候就被分配了内存,一直保持到程序结束,可以被任何模块调用。在函数之外定义的变量为全局变量。外部变量 在其他文件中定义但在本文件中使用的变量,称为外部变量,用extern 标识。静态变量 寿命相当于全局变量,但只允许在定义的函数内使用的变量称为静态变量,静态变量在退出定义的函数时,其
44、值仍然存在,直至下一次进入定义它的函数中,执行程序对它进行修改。变量的声明形式为:作用域类型 数据类型 变量名;举例:extern int Moon;存储寄存器(2)函数函数的存储类型有static 和extern两种。声明形式为:作用域类型 返回数据类型 函数名 (参数名)声明为static 的函数称为内部函数或者静态函数。静态函数只能在定义此函数的文件中被调用,而不能被其他文件的函数调用。extern称为外部函数。除非被声明为静态函数,函数都可以在其他文件中被调用。编译器函数默认为外部函数,因此,extern通常可以忽略。类 型作用域和寿命说 明auto 局部变量变量默认类型为autore
45、gister局部变量、只是提示编译器将此变量分配在CPU的寄存器中寄存器中变量的使用速度比较快,但寄存器个数有限,最终还是由编译器决定是否为变量分配寄存器extern 全局变量外部变量static全局变量静态变量表2-12 变量作用域预处理编译器在编译过程之前先进行预处理。预处理包括宏文件、条件编译和文件包含。(1)宏定义 宏定义的命令为 #define 。如: #define CAR 100 以上代码的含义是定义CAR为100,执行预处理时编译器将有效范围内所有的CAR替换成100 。这样做的好处是增加程序的可读性和可维护性。 也可以使用带参数的宏,例如: #define SUM(x,y)
46、(x+y) Moon=SUM(1,2)*2; 以上宏定义在预处理时会将SUM(1,2) 替换成(1+2),成为: Moon=(1+2)*2; 注意括号的重要性,如果宏写为: #define SUM(x,y) x+y 则替换的结果为: Moon=1+2*2; 即使运算的顺序发生了变化,结果也会不同。预处理(1)条件编译 由于某些原因,编译时会想要得到不同的结果。比如某一系列的产品所使用的程序,绝大部分都是相同的,只是由于型号不同需要在某处根据不同的型号做不同的处理,因此就需要条件编译,由编译器根据所选的型号(条件编译的条件)自动选择所需要的程序段。 条件编译器的命令有 #if、#ifdef、#i
47、fndef、#endif。 格式1: #ifdef 标识符 程序段 1 #else 程序段 2 #endif 判断是否定义了标识符,如果定义了标识符,则选择程序段1编译,忽略程序段2;否则选择程序段2,忽略程序段1。预处理格式2:#ifndef 标识符 程序段 1;#else 程序段 2;#endif判断是否定义了标识符,如果定义了标识符,则选择程序段1编译,忽略程序段2;否则选择程序段2,忽略程序段1。格式3:#if 常量表达式1 程序段 1#elif 常量表达式 2 程序段 2。#else 程序段 n#endif以上格式的代码顺序判断哪一个常量表达式为真,并编译相应的程序段,忽略其他的程序
48、段。预处理(2)文件包含由于各种原因,不会将一个程序的所有部分都放置在一个文件中。另外,C语言和编译也定义了很多常量、数据结构以及函数。编译器在编译时必须要知道一个文件中的程序使用到的这些内容在什么文件中作出了定义,一般编写每一个c文件(程序文件以.c为后缀)都会编写一个头文件(.h为后缀),c文件中用到的常量、数据结构、函数都在头文件中声明。需要调用此c文件的内容的文件只需要用#include *.h或者#include “*.h”语句调用就可以了。与“”的作用一样,不过习惯上在包含编译器定义的库时用,包含用户自己定义的文件时用“”。在头文件中,往往还会看到一种宏指令,如在msp430 x1
49、4x.h中有:#ifndef_msp430 x14x#define_msp430 x14x#endif其中msp430 x14x是这个头文件的文件名,含义是如果未定义_msp430 x14x,则定义_msp430 x14x,并编译随后的内容。以后编译器遇到其他的文件也包含此头文件时,由于_msp430 x14x已经被定义过了,不符合#ifndef_msp430 x14x条件,所以不会再次编译头文件的内容。它的作用是防止同一个头文件被重复包含,从而避免头文件中的内容重复定义。编译器会对重复定义提出警告或者报错。程序的基本结构 程序有4种基本的结构:顺序结构、选择结构、循环结构和跳转结构。(1)顺
50、序结构在顺序结构中语句依次顺序执行。顺序结构是程序的基本结构。(2)选择结构选择结构由判断和分支两部分组成,选择结构有两种:if结构和switch结构。if有3种形式,如果表达式为真则执行程序段,否则跳过程序段执行本选择结构之后的程序,形式为:if (表达式) 程序段如果表达式为真则执行程序段1,否则执行程序段2,形式为:if (表达式) 程序段1else 程序段2程序的基本结构如果表达式1为真则执行程序段1,然后执行本选择结构之后的程序;如果表达式2为真,则执行程序段2,然后执行本结构之后的程序。如此依次判断表达式是否为真,如果为真则执行相应的程序段,然后执行本结构后的程序,形式为:if (
51、表达式1) 程序段1else if (表达式2) 程序段2else 程序段n程序的基本结构计算表达式的值,判断与哪一个常量相等,则执行哪一段程序,然后执行本结构后的程序。如果没有一个值与表达式相等,则执行程序段default 。break指令的含义为跳出选择体,如果省去,则在执行完某程序段后就不会跳出来,而是继续进行下面的判断。在多个不同的常量都使表达式执行同一段程序时可以写为:case 常量1:case 常量2; 程序段break;形式为:switch (表达式)case 常量1: 程序段1break;case 常量2: 程序段2break;default: 程序段 default 程序的基
52、本结构(3)循环结构for形式为:for (初值设定表达式;循环条件表达式;更新表达式) 程序段执行过程如图2-1所示图2-1 for 循环程序的基本结构while形式为:while (条件表达式) 程序段执行过程如图2-2所示。Do while形式为:do 程序段while(条件表达式);执行过程如图2-3 所示。图2-2 while 循环图2-3 do while 循环 程序的基本结构(4)跳转goto形式为:goto 语句标号;语句标号是一个带冒号“:”的标识符。执行goto语句要将使程序无条件跳转到语句标号标示的那一句程序。goto语句可以从循环结构中跳出来,但不能跳入循环结构。结构化
53、编程不推荐此语句,但在某些情况下,使用它可以使程序表现得更为简洁。举例:tt: x=1;goto :tt;continue形式为:continue;一般用在循环结构中,功能是忽略循环结构中本语句之后尚未执行的程序,直接进入下一个循环周期。是否退出循环仍需由循环条件来确定。举例:for (q0=0;q0100;q0+) if (q1q0=50) continue ; else q1q0=0 结果:依次判断数组q1中下标从099的元素的值,如果值等于50,则忽略(continue),否则这些元素被赋值为0。程序的基本结构break形式为:break;在前面遇到过此语句。break语句一般用在循环结
54、构中,其作用就是无条件跳出循环结构。在switch结构中的break即是此含义。return形式为return (表达式);或:return;return 语句的作用为中止函数的执行,程序返回到调用函数的位置的下一句执行。对于需要返回值的函数返回一个值,所以return 后要跟表达式。不需要返回值的函数使用return即可。目录2.4 MSP430 C语言扩展特性2.4.1 MSP430 C语言的扩展特性2.4.2 MSP430 C语言扩展关键字2.4.3 MSP430 #pragma编译命令2.4.4 MSP430的预定义符号2.4.5 MSP430的本征函数 2.4.6 MSP430的段定
55、义 MSP430 C语言的扩展特性MSP430的C语言在标准C语言的基础上主要在关键字、#pragma编译命令、预定义符号、本征函数及其他扩展特性等方面进行了扩展。下面就各个部分加以简要说明。(1)扩展关键字在默认情况下,MSP430的C语言编译器遵守C语言规范,MSP430的C语言扩展关键字都不能使用。但是编译器选项“-e”能使扩展关键字可以使用。同时,它们也就不能用作变量名了。扩展关键字有以下几类:与I/O访问有关的关键字:sfrb、sfrw。非易失RAM关键字:no_init。函数类型关键字:interrupt、monitor。 MSP430 C语言的扩展特性(2)#pragma编译命令
56、#pragma编译命令控制编译器的存储器分配,控制是否允许用扩展关键字,以及是否输出警告消息。它提供符合标准语法的扩展特性。#pragma编译命令是否可用与“-e”选项无关。#pragma编译命令主要分为以下几类:位域取向#pragma bitfields =default#pragma bitfields =reversed代码段#pragma codeseg(段名)扩展控制#pragma language =default#pragma language =extended函数属性#pragma function=default#pragma function= interrupt#pra
57、gma function= monitor存储器用法#pragma memory=default#pragma memory=constseg#pragma memory=dataseg#pragma memory=no_init警告消息控制#pragma warnings=default#pragma warnings=off#pragma warnings=on MSP430 C语言的扩展特性(3)预定义符号的预定义符号允许检查编译时的环境,注意它们都用双下划线字符表示。_DATE_ 格式为MM dd yyyy格式的当前日期_FILE_ 当前源文件名_IAR_SYSTEMS_ICC IAR
58、 C编译器的标志符_LINE_ 当前源程序行号_STDC_ ANSI-C编译器的标识符_TID_ 目前标志符_TIME_ 格式为 hh:mm:ss的当前时间_VER_ 返回整型版本号(4)本征函数本征函数允许对MSP430作底层的控制。为了使它们能在C语言程序中使用,程序文件应该包含头文件(In430.h)。经编译,本征函数成为内嵌代码,可能是单个指令,也可能是一段指令序列。关于本征函数的功能细节,可以参看具体的芯片技术文档。下面给出一些本征函数。_args$ 返回参数数组给函数_argt$ 返回参数类型_NOP 空操作指令_EINT 允许中断_DINT 禁止中断_BIS_SR 对状态寄存器中
59、某一位置位_BIC_SR 对状态寄存器中某一位置位_OPC 插入DW常数说明伪指令 MSP430 C语言的扩展特性(5)其他扩展特性$字符,为了与DEC公司的VMS-C兼容,将$加入到有效字符集中,编译时用SIZEOF 取消限制,SIZEOF运算符不能用在#if和#elif表达式内。 MSP430 C语言扩展关键字通过前面的概述部分知道MSP430的C语言的扩展关键字,下面具体对各个关键字进行介绍(1)interrupt该关键字用于中断函数。中断函数的定义如下。语法: interrupt void 函数名()或者interrupt中断向量void 函数名()参数: 中断函数没有参数。 中断函数
60、可能需要指定中断向量。返回: 中断函数一般是void,没有返回。说明: interrupt关键字声明了在处理器发生中断时调用。函数的参数必须为空,如果说明了中断向量,函数地址将插入该向量;如果未说明中断向量,用户必须在向量表中为中断函数提供适当的入口,最好在 cstartup模块中提供。下面举例说明:#include /初始化定时器模块void Init_TimerB(void)TBCTL=TBSSEL0+TBCLR;TBCCTL0=CCIE;TBCCR0=32768;TBCTL |=MC0;/初始化端口P1DIR=0;P1SEL=0;P1DIR |=BIT0;return;/定时器中断int
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《癌症疼痛诊疗规范》课件
- 《孔子的简介》课件
- 人物访谈报告培训课件
- 单位管理制度集合大合集员工管理十篇
- 单位管理制度集粹汇编人事管理篇十篇
- 单位管理制度汇编大合集人力资源管理篇十篇
- 《神经收集电子教案》课件
- 单位管理制度分享汇编【人力资源管理】
- 单位管理制度范例选集职员管理篇
- 单位管理制度呈现合集职员管理篇
- 湖南2025年湖南省生态环境厅直属事业单位招聘44人笔试历年参考题库附带答案详解
- 福建省部分地市2023-2024学年高三上学期第一次质量检测(期末)生物 含解析
- (新版):中国卒中学会急性缺血性卒中再灌注治疗指南
- 人工智能在体育训练中的应用
- 2024-2030年中国液态金属行业市场分析报告
- 高二上学期数学北师大版(2019)期末模拟测试卷A卷(含解析)
- 2024-2025学年上学期深圳初中语文七年级期末模拟卷3
- 2024-2025学年上学期广州初中地理八年级期末模拟卷2
- 中考语文真题专题复习 小说阅读(第01期)(解析版)
- 2025版国家开放大学法律事务专科《法律咨询与调解》期末纸质考试单项选择题题库
- GB 45067-2024特种设备重大事故隐患判定准则
评论
0/150
提交评论