MSP430的C语言的程序设计电研151魏文震学号:2201500036目录概述编程基础c语言编程实例编程技巧概述在结构上MSP430系列单片机集成了一部计算机的各个基本组成成分,虽然其工作原理与普通微机并无差异,但MSP430系列单片机在结构上更加突出了体积小、功能强、面向控制的特点,具有很高的性能价格比。MSP430系列单片机由CPU、存储器和外围模块组成,这些部件通过内部地址总线、数据总线和控制总线相连构成单片机微机系统。MSP430的内核CPU结构是按照精简指令的宗旨来设计的。具有丰富的寄存器资源、强大的处理控制能力和灵活的操作方式。MSP430的存储器结构采用了统一的编址方式,可以使得对外围模块寄存器的操作跟普通的RAM单元一样方便、灵活。MSP430存储器的信息类型丰富,并具有很强的系统外围模块扩展能力。C语言的编程基础C语言的数据类型常使用8位、16位、32位、64位,同时分有无符号之分例如:特殊功能寄存器变量sfrb、sfrw,它直接定义在片内,要大写。无符号整数:char、unsignedint、unsignedlong有符号整数:int、long浮点型:floatC430的配置由于430各芯片的差异,430要进行特性配置。你也可以根据需要去修改这些配置文件。C语言的编程基础C语言的优点:1、对cpu的寄存器、寻址方式、指令系统不要求了解,对存储器和I/O组织有简单了解即可。2、寄存器和存储器的分配、寻址及数据类型等细节由C编辑器自动管理。3、程序由函数构成,程序结构化。4、可调用系统提供的许多标准子程序。5、编辑及调节时间缩短,效率提高。6、移植性比较好。C语言的编程基础c语言的算术运算符C语言的编程基础C语言的逻辑运算符C语言的编程基础C语言上机过程1、创建一个c语言项目(creatanewproject/c/main)2、设置项目属性(option)(MCU类型、debugger类型等)3、编写源程序并添加到项目中4、编译和连接(compile、make或rebuildall)5、下载程序到目标MCU(debug)6、调试和运行(go、stepover、view/register、memory)编程技巧c程序模板#includeio430.hintmain(void){WDTCTL=WCTTCL+WDTHOLD;//Stopwatchdog......//用户程序return0;}C语言预处理命令总结C程序的源代码中可包括各种编译指令,这些指令称为预处理命令。虽然它们实际上不是C语言的一部分,但却扩展了C程序设计的环境。本节将介绍如何应用预处理程序和注释简化程序开发过程,并提高程序的可读性。ANSI标准定义的C语言预处理程序包括下列命令:#define,#error,#include,#if,#else,#elif,#endif,#ifdef,#ifndef,#undef,#line,#pragma等。非常明显,所有预处理命令均以符号#开头,下面分别加以介绍。#define命令#define定义了一个标识符及一个串。在源程序中每次遇到该标识符时,均以定义的串代换它。ANSI标准将标识符定义为宏名,将替换过程称为宏替换。命令的一般形式为:#defineidentifierstring注意:1该语句没有分号。在标识符和串之间可以有任意个空格,串一旦开始,仅由一新行结束。2宏名定义后,即可成为其它宏名定义中的一部分。3宏替换仅仅是以文本串代替宏标识符,前提是宏标识符必须独立的识别出来,否则不进行替换。例如:#defineXYZthisisates使用宏printf(XYZ);//该段不打印thisisatest而打印XYZ。因为预编译器识别出的是XYZ4如果串长于一行,可以在该行末尾用一反斜杠'\'续行。#defineLONG_STRINGthisisaverylong\stringthatisusedasanexample5C语言程序普遍使用大写字母定义标识符。6用宏代换代替实在的函数的一大好处是宏替换增加了代码的速度,因为不存在函数调用的开销。但增加速度也有代价:由于重复编码而增加了程序长度。#error命令#error强迫编译程序停止编译,主要用于程序调试。#error指令使预处理器发出一条错误消息,该消息包含指令中的文本.这条指令的目的就是在程序崩溃之前能够给出一定的信息。#include命令#include使编译程序将另一源文件嵌入带有#include的源文件,被读入的源文件必须用双引号或尖括号括起来。例如:#includestdio.h或者#includestdio.h这两行代码均使用C编译程序读入并编译用于处理磁盘文件库的子程序。将文件嵌入#include命令中的文件内是可行的,这种方式称为嵌套的嵌入文件,嵌套层次依赖于具体实现。如果显式路径名为文件标识符的一部分,则仅在那些子目录中搜索被嵌入文件。否则,如果文件名用双引号括起来,则首先检索当前工作目录。如果未发现文件,则在命令行中说明的所有目录中搜索。如果仍未发现文件,则搜索实现时定义的标准目录。如果没有显式路径名且文件名被尖括号括起来,则首先在编译命令行中的目录内检索。如果文件没找到,则检索标准目录,不检索当前工作目录。条件编译命令有几个命令可对程序源代码的各部分有选择地进行编译,该过程称为条件编译。商业软件公司广泛应用条件编译来提供和维护某一程序的许多顾客版本。#if、#else,#elif及#endif#if的一般含义是如果#if后面的常量表达式为true,则编译它与#endif之间的代码,否则跳过这些代码。命令#endif标识一个#if块的结束。#ifconstant-expressionstatementsequence#endifEg:#defineMAX91#includeiostreamusingnamespacestd;intmain(){#ifMAX99coutMAXisbiggerthan99endl;#elifMAX90coutMAXisbiggerthan90endl;#elsecoutMAXissmallerthan90endl;#endifreturn0;}跟在#if后面的表达式在编译时求值,因此它必须仅含常量及已定义过的标识符,不可使用变量。表达式不许含有操作符sizeof(sizeof也是编译时求值)。#else命令的功能有点象C语言中的else;#else建立另一选择(在#if失败的情况下)。注意,#else属于#if块。#elif命令意义与ELSEIF相同,它形成一个ifelse-if阶梯状语句,可进行多种编译选择。#elif后跟一个常量表达式。如果表达式为true,则编译其后的代码块,不对其它#elif表达式进行测试。否则,顺序测试下一块。#pragma命令#pragma为实现时定义的命令,它允许向编译程序传送各种指令。#pragma的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。其格式一般为:#PragmaPara1message参数。Message参数能够在编译信息输出窗口中输出相应的信息,这对于源代码信息的控制是非常重要的。2code_seg参数。格式如:#pragmacode_seg([section-name[,section-class]])它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。3#pragmaonce(比较常用)只要在头文件的最开始加入这条指令就能够保证头文件被编译一次。这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。4#pragmahdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。5#pragmaresource*.dfm表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体外观的定义。6pragmacomment(...)该指令将一个注释记录放入一个对象文件或可执行文件中。常用的lib关键字,可以帮我们连入一个库文件。编程技巧在ccs中的c语言程序结构和一般的c程序基本相同//包含头文件#includeio430.h//带初始化全局变量定义(在RAM区)unsignedcharSTD[45]={Hi,thisisMSP430.}//未初始化全局变量定义(在RAM区)inta,b,c//函数声明voidmain(void)编程技巧{数据说明部分;//局部变量定义执行语句部分;subN(实际参数);//子程序调用......}voidsubN(形式参数){数据说明部分;//局部变量定义执行语句部分;......}编程技巧程序格式程序由函数构成,函数由语句构成;语句以分号作为结束符;程序由主函数main()标识程序入口,用户程序从函数main()的第一条语句开始执行,程序执行完毕的标志是main()函数中的代码执行完毕;标识符区分大小写,不能在变量名、函数名、关键字中插入空格和空行;关键字及编译预处理命令用小写字母书写;程序用多大括号{}表示程序的层次范围;程序没有行的概念,可任意书写,但为了可读性,书写一对大括号时根据层次采用缩格和列向对齐方式;注释部分用/*......*/表示或用“//”表示其后的内容为注释;编程技巧主程序含两部分初始化部分和执行部分,其中执行部分一般为一个无限循环#includeio430.hintmain(void){unsignedinti;//定义函数变量WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P2DIR=0xFF;//设置端口2为输出P2OUT=0;//端口2为输出初始值for(;;)//无限循环{P2OUT=~P20UT;//将端口2的值取反后输出for(i=0;i0xffff;i++);//延时}}编程技巧子函数的声明、定义和调用#includio430.hvoiddelay();intmain(void){WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P2DIR=0xFF;//设置端口2为输出P2OUT=0;//端口2为输出初始值while(1)//无限循环{P2OUT=~P2OUT;//将端口2的值取反后输出delay();//延时}}voiddelay(){unsignedinti;//定义函数变量for(i=0;i0xffff;i++);//延时}C语言编程实例例一连接如右图,编程控制发光二极管从L0到L7再到L0...一盏一盏点亮,每次只有一盏亮,如此不断反复。MSP430C语言编程实例#includeio430.hintmain(void){unsignedcharLED_0=0x01,LED_temp;unsignedinti,j;WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P1SEL=0;//设置P1为基本I/O口P1DIR=0xFF;//设置P1为输出端口P1OUT=0;//使8个LED全灭while(1)//无限循环{LED_temp=LED_0;//点亮L0的值for(i=0;i8;i++)//8个LED灯一次电量{P1OUT=LED_temp;for(j=0;j0xfff;j++)//延时LED_temp=LED_TEMP1;//改变点亮值}}MSP430Theend,thankyou!