MSP430单片机C语言的基本结构
MSP430单片机C语言和汇编语言混合编程刍议
信 息都 是按照堆栈结构方式进行传递实现 ,并且堆栈结构形
成过程 中, 也是按照从右到左 的顺序形成的 。并且, 在堆栈传 递的过程 中,如果传递函数中最左 边的两个 函数是结构或者
关键 词: MS P 4 3 0 单片机 ; C语 言; 汇编语 言; 编程设计; 软件开发 ; 分析 中图分类号 : T G 8 4 文献标识码 : A 文章编号 ; 1 6 7 3 — 1 1 3 1 ( 2 0 1 3 ) 0 1 — 0 0 7 2 — 0 2
根据上文所 述的 C语言与汇编语 言混合编程方法 ,以及
1 C语言 和汇 编语 言 的特点 以及 混合编 程 方法
1 . 1 C语 言和 汇编 语言 编程 设计 的特 点
在进行计算机应用程序 以及软件系统程序的编写设计应
目前进行 MS P 4 3 0 单片机 芯片软件开发设计的常用 L A R E m 。
b e d d e d Wo r k b e n c h软件系统 , 该系统在进行 MS P 4 3 0单片机
该 寄存器功能在进行 C语 言编译程序 的传递调用时不需要进 行保护 。此外 , L A R系统 中普通寄存器则主要是对 C语 言编 译器 的程序编译变量 以及编译过程进行 寄存保护实现 ,这组 寄存器 中的C语言编译信 息, 在进行混合编程 调用 时, 需要进
行保护 , 保护 功能由 C语言编译器 自动实现进行 。 在L AR系统 中, C语 言编译器 中的 C语言编译程序数据 参数在被调用过程 中, 没进行一次函数的调用, 就会建立一个
MSP430单片机的原理与应用
MSP430单片机的原理与应用1. 简介MSP430单片机是德州仪器公司(Texas Instruments)推出的一款低功耗、高性能的16位单片机,广泛应用于各种嵌入式系统和物联网设备中。
本文将介绍MSP430单片机的基本原理和常见应用场景。
2. 基本原理MSP430单片机采用哈佛结构的架构,拥有16位的CPU,8到256KB的闪存和0.5到16KB的RAM。
其低功耗特点使得它在电池供电的嵌入式设备中得到广泛应用。
MSP430单片机的工作原理可以简单概括为以下几个步骤: - 程序存储器中的指令被取出并送入指令译码器。
- 指令译码器将指令解码,并执行相应的操作。
- 执行的结果被存储器读写单元读取或写入。
- 控制单元协调整个系统的操作,包括时钟、中断、输入输出等。
3. 应用场景3.1 智能家居MSP430单片机在智能家居领域中具有广泛的应用。
通过连接传感器、执行器和通信模块,MSP430单片机可以实现对温度、湿度、光照等环境参数的监控与控制。
并且,MSP430单片机能够通过无线通信和云平台实现智能家居设备的远程控制和监测。
3.2 工业自动化在工业自动化领域,MSP430单片机能够通过连接传感器和执行器实现对生产过程的监测和控制。
它能够实时采集温度、压力、流量等参数,并根据设定的逻辑进行自动控制。
同时,MSP430单片机的低功耗特性使得它适合在工业现场长时间运行。
3.3 物联网设备随着物联网的快速发展,MSP430单片机在物联网设备中的应用越来越广泛。
它可以用于连接各种传感器、执行器和通信模块,实现对环境、设备等的监测和控制。
而且,MSP430单片机的低功耗特性使得它非常适合在物联网设备中使用,能够延长电池寿命。
3.4 医疗设备在医疗设备领域,MSP430单片机能够实现对患者的生理参数的监测和控制。
它可以连接各种传感器,如心电传感器、体温传感器等,实时采集患者的生理数据,并可以根据需要进行报警和控制操作。
第一章MSP430单片机概述
第一章MSP430单片机概述MSP430是一种低功耗、高性能的单片机,由德州仪器(Texas Instruments,TI)公司开发。
它采用了超低功耗的电源管理技术,使其在电池供电下能够持续运行数年之久。
MSP430单片机适用于许多应用领域,包括消费电子、医疗设备、工业自动化、智能家居和传感器网络等。
MSP430单片机的核心是RISC架构的16位处理器,具有较小的指令集,运行速度快,并且能够以较低的能耗完成各种任务。
它采用了哈佛结构,具有16位的定长指令格式,有着高效的编码能力。
此外,它还具有多种中断机制,可以快速响应外部事件或实现多任务操作。
MSP430单片机提供了多个不同的系列,以适应不同应用场景的需求。
不同系列的MSP430单片机在处理器速度、内存容量和外设接口等方面有所差异。
其中,MSP430F系列适用于通用应用,而MSP430G系列适用于低成本和功耗敏感的应用。
此外,MSP430FR系列还具有非易失性存储器,可以在掉电情况下保留数据。
MSP430单片机具有丰富的外设接口,包括通用IO口、模拟输入输出、时钟控制器、串口通信、定时器和比较器等。
这些外设接口使得MSP430单片机能够灵活地与其他设备进行通信,并实现多种功能。
MSP430单片机在低功耗方面具有很大优势。
它采用了多种省电技术,包括多级电源管理、动态电压调节和片上电源管理单元等。
这些技术使得MSP430单片机在待机和运行模式下的功耗都非常低,能够更好地满足移动设备和电池供电设备的需求。
总的来说,MSP430单片机是一种低功耗、高性能的单片机,具有丰富的外设接口和完善的开发工具链。
它适用于多种应用领域,可以满足不同需求的设计要求。
随着物联网的快速发展,MSP430单片机的市场前景十分广阔,并且将继续发挥重要作用。
MSP单片机(精品)
单片机的发展趋势
» 单片机发展为嵌入式处理器 单片机位数从4位、8位提高到16位、32位,从单CPU向多CPU发展。32位单片机由 于处理能力和开发方法已经和传统的单片机大相径庭,一般被称为嵌入式处理器, 成为数字系统设计的另外一个分支。
» 集成度进一步提高 单片机内部集成的设备越来越多,包括SRAM、FLASH ROM、E2ROM、AD、DA、PWM、 UART控制器、I2C控制器、 USB控制器、看门狗、上电复位电路、RC振荡器、FPGA 等,真正做到了SOC。
Z80 、MC6800系列等
Z80系列是8051系列流行之前非常流行的单片机,目前几乎没有人使用; 6800系列是Motorola公司80年代末推出的产品,采用RISC结构,成本低廉; 在低端大批量中占有优势。
目前热门的单片机(1)
51增强系列
8051为Intel公司80年代初推出,是目前普及度最广、兼容品种 最多的单片机。标准8051速度较慢,需要12个时钟周期运行一 条指令;目前出现了各大公司都推出了高速的8051兼容内核, 典型的是Dallas公司设计的4指令周期8051内核和Cignal公司研 发的单指令周期8051内核,Cignal公司的增强8051内核运行大 部分指令仅需要一个时钟周期,最快的型号已经达到100Mips 的计算速度。
智能化的仪器仪表:单片机用于包括温度、湿度、流量、流速、电压、 频率、功率、厚度、角度、长度、硬度、元素测定等和各类仪器仪表 中,使仪器仪表数字化、智能化、微型化,功能大大提高。
日常生活中的电器产品:单片机可用于电子秤、录像机、录音机、彩 电、洗衣机、高级电子玩具、冰箱、照相机、家用多功能报警器等。
MSP430系列单片机 原理与应用
2015.03
MSP430简介(超详细·)
msp430简介MSP430是德州公司新开发的一类具有16位总线的带FLASH 的单片机,由于其性价比和集成度高,受到广大技术开发人员的青睐.它采用16位的总线,外设和内存统一编址,寻址范围可达64K,还可以外扩展存储器.具有统一的中断管理,具有丰富的片上外围模块,片内有精密硬件乘法器、两个16位定时器、一个14路的12位的模数转换器、一个看门狗、6路P口、两路USART通信端口、一个比较器、一个DCO内部振荡器和两个外部时钟,支持8M 的时钟.由于为FLASH型,则可以在线对单片机进行调试和下载,且JTAG口直接和FET(FLASH EMULATION TOOL)的相连,不须另外的仿真工具,方便实用,而且,可以在超低功耗模式下工作对环境和人体的辐射小,测量结果为100mw左右的功耗(电流为14mA左右),可靠性能好,加强电干扰运行不受影响,适应工业级的运行环境,适合与做手柄之类的自动控制的设备.我们相信MSP430单片机将会在工程技术应用中得以广泛应用,而且,它是通向DSP系列的桥梁,随着自动控制的高速化和低功耗化, MSP430系列将会得到越来越多人的喜爱.一、IO口(一)、P口端口寄存器:1、PxDIR 输入/输出方向寄存器(0:输入模式 1:输出模式)2、PxIN 输入寄存器输入寄存器是只读寄存器,用户不能对其写入,只能通过读取该寄存器的内容知道I/O口的输入信号。
3、PxOUT 输出寄存器寄存器内的内容不会受引脚方向改变的影响。
4、PxIFG 中断标志寄存器(0:没有中断请求 1:有中断请求)该寄存器有8个标志位,对应相应的引脚是否有待处理的中断请求;这8个中断标志共用一个中断向量,中断标志不会自动复位,必须软件复位;外部中断事件的时间必须>=1.5倍的MCLK的时间,以保证中断请求被接受;5、PxIES 中断触发沿选择寄存器(0:上升沿中断 1:下降沿中断)6、PxSEL 功能选择寄存器(0:选择引脚为I/O端口 1:选择引脚为外围模块功能)7、PxREN 上拉/下拉电阻使能寄存器(0:禁止 1:使能)(二)、常用特殊P口:1、P1和P2口可作为外部中断口。
MSP430单片机C语言的基本结构
MSP430单片机C语言的基本结构王晓宁2013/1/28随着单片机处理速度的加快和存储容量的加大以及相应的开发软件中增强的代码优化功能,用C语言编写的程序其代码效率和运行速度已堪与汇编程序相媲美,而且C语言程序因其平易性、结构化、易维护性和可移植性而日益广泛地应用于单片机的开发中。
用C语言编程时必须结合单片机的特点,不同品牌、不同系列或不同型号的单片机其内部资源、寄存器名称等都会不同,因此其软件的开发必须结合实际的硬件来进行。
但C语言的程序结构还是有许多共性的,下面结合MSP430单片机大致说一下C程序的基本结构。
C语言的程序结构还是比较规范的,一般包括头文件、宏定义、变量定义、函数定义、一个主函数main( )、以及中断处理函数等。
在多文件的管理中,还包括自定义的头文件等。
根据不同的情形,一个完整的C程序可以有不同的具体结构,但其框架基本上还是固定的。
下面通过几个简单的小例子来看一下C 程序的几种结构。
在此之前,先说一下C中的赋值方式。
很多情况下,C程序就是在那儿完成一些赋值操作。
|= 是“或”运算,&=是“与”运算,^= 是“异或”运算。
比如BIT0已经在430的头文件里定义为:BIT0=0x0001,0x0001是16进制计数,转成2进制就是(低八位),那么P1OUT|=BIT0,是一个什么结果?这是一个“或”运算(英文称or)。
首先P1OUT是一个在头文件中定义好的寄存器,是8位的,因此,我们可以把P1OUT就当成一个变量名好了,只不过这个变量是在头文件中定义的,我们直接拿来用即可。
P1OUT 的取值就是在~之间(二进制)。
因此不管P1OUT原先的值是多少,P1OUT|=BIT0就是(设P1OUT原先的值为xxxxxxxx)xxxxxxxx跟进行或运算,最低位(即BIT0)的值肯定是1的,而对其它位没有影响。
因此这样赋值后P1OUT=xxxxxxx1,达到了让BIT0位等于1(称为“置1”)的目的。
MSP430系列单片机系统工程设计与实践1_第2章 MSP430单片机的内部资源
2.3.1 时钟系统结构与原理
MCLK:主时钟(Master Clock)。MCLK是专为CPU运行提供的时钟。 SMCLK:子系统时钟(Subsystem Master Clock),也称辅助时钟。 ACLK:活动时钟(Active Clock)。ACLK一般是由32.768kHz晶体直接产生的 低频时钟,在单片机运行过程中一般不关闭,用于产生节拍时基,或和定 时器配合间歇唤醒CPU。
PxSEL寄存器用于设置每一位I/O的功能:0=普通I/O口 1=第二功能
2.2.1 I/O口寄存器
• 在MSP430单片机中,很多内部功能模块也需要和外界进 行数据交流,为了不增加芯片管脚数量,大部分都和I/O 口复用管脚。导致MSP430单片机大多数I/O管脚都具有第 二功能。通过寄存器PxSEL可以指定某些I/O管脚作为第二 功能使用。例如从DataSheet的管脚排布图中查到 MSP430x42x系列单片机的P2.4、P2.5口和串口的TXD、RXD 公用管脚。若需要将这两个管脚配置为串口收发脚,则须 将P2SEL的4、5位置高:
图2.2.3 逻辑电平转换电路
2.2.6 电容感应式触控
图2.2.4 电容感应式触控按键的结构与原理
2.2.6 电容感应式触控
图2.2.5 两个触控键公用电阻
2.2.6 电容感应式触控
图2.2.6 常见触控键排列方式
2.3 时钟系统与低功耗模式
2.3.1 时钟系统结构与原理 2.3.2 低功耗模式 2.3.3 低功耗模式的应用
■ PxIES寄存器用于选择每一位I/O的中断触 发沿:0=上升沿1=下降沿
例2.2.3 将P1.5、P1.6、P1.7口设为中断源,下降沿 触发:
PxIFG寄存器是I/O中断标志寄存器:0=中断条件不成立 1=中断条 件曾经成立过
MSP430系列单片机介绍
MSP430系列单片机介绍MSP430系列单片机是德州仪器(TI)公司推出的一种低功耗、高集成度、高性能的16位超低功耗单片机。
它采用精确的调度技术和先进的低功耗架构设计,拥有出色的性能、高功耗效率、广泛的外设集成以及丰富的工具和软件支持。
MSP430系列单片机的内核基于RISC架构,拥有16位数据总线和16位地址总线。
它可以工作在多种工作频率下,从几kHz到几十MHz不等,以满足不同的应用需求。
此外,MSP430系列单片机还具有多种睡眠模式,可以进一步降低功耗。
MSP430系列单片机内置了丰富的外设,包括模拟接口、数字接口和通信接口。
模拟接口包括模数转换器(ADC)、数字模拟转换器(DAC)和比较器等,可以实现各种传感器接口和模拟信号处理。
数字接口包括通用输入输出(GPIO)、定时器/计数器、串行通信接口等,可以实现数字信号处理和通信功能。
通信接口包括UART、SPI和I2C等,可以实现与外部设备的数据交换。
MSP430系列单片机广泛应用于各种电子设备中,如便携式设备、智能家居、医疗器械、工业自动化等。
由于其低功耗和高性能的特点,它可以满足不同应用场景下对功耗和性能的需求。
例如,在便携式设备中,MSP430系列单片机可以实现长时间的电池寿命;在智能家居中,它可以实现低功耗的远程控制和数据传输;在医疗器械中,它可以实现高精度的信号处理和通信。
总之,MSP430系列单片机是一种低功耗、高集成度、高性能的16位超低功耗单片机。
通过其先进的架构设计和丰富的外设集成,它可以满足各种应用的需求。
同时,它还提供了丰富的工具和软件支持,方便开发者进行开发和调试。
MSP430经典例程讲解
这只是我在学习TI公司生产的16位超的功耗单片机MSP430的随笔,希望能对其他朋友有所借鉴,不对之处还请多指教。
下面,开始430之旅。
讲解430的书现在也有很多了,不过大多数都是详细说明底层硬件结构的,看了不免有些空洞和枯燥,我认为了解一个MCU的操作首先要对其基础特性有所了解,然后再仔细研究各模块的功能。
1、首先你要知道msp430的存储器结构。
典型微处理器的结构有两种:冯 ? 诺依曼结构----程序存储器和数据存储器统一编码;哈佛结构----程序存储器和数据存储器。
MSP430系列单片机属于前者,而常用的mcs51系列属于后者。
0-0xf特殊功能寄存器;0x10-0x1ff外围模块寄存器;0x200-?根据不同型号地址从低向高扩展;0x1000-0x107f seg_b0x1080_0x10ff seg_a 供flash信息存储,剩下的从0xffff 开始向下扩展,根据不同容量,例如149为60KB,0xffff-0x11002、复位信号是MCU工作的起点,430的复位型号有两种:上电复位信号POR和上电清楚信号PUC。
POR信号只在上电和RST/NMI复位管脚被设置为复位功能,且低电平时系统复位。
而PUC信号是POR信号产生,以及其他如看门狗定时溢出、安全键值出现错误是产生。
但是,无论那种信号触发的复位,都会使MSP430在地址0xffff处读取复位中断向量,然后程序从中断向量所指的地址开始执行。
复位后的状态不写了,详见参考书,嘿嘿。
3、系统时钟是一个程序运行的指挥官,时序和中断也是整个程序的核心和中轴线。
430最多有三个振荡器:DCO内部振荡器;LFXT1外接低频振荡器,常见的32768HZ,不用外接负载电容;也可接高频450KHZ-8M,需接负载电容;XT2接高频450KHZ-8M,加外接电容。
430有三种时钟信号:MCLK系统主时钟,可分频1/2/4/8,供CPU使用,其他外围模块在有选择情况下也可使用;SMCLK系统子时钟,供外围模块使用,可选则不同振荡器产生的时钟信号;ACLK辅助时钟,只能由LFXT1产生,供外围模块。
MSP430汇编语言介绍
存储器地址编号 1101-1100 1103-1102 1105-1104 1107-1106 1109-1108 110B-110A
存储器内容 40 34 00 06 50 34 00 07 44 82 02 00
操作量 操作码 操作数 操作码 操作数 操作码 操作数
指令 MOV #n,R4 n=6H ADD #n,R4 n=7H MOV R4,&n n=200H
上一条是把立即数送至R4的指令,需要继续取操作数
① PC的内容1102H传至地址寄存器AR; ② PC的内容可靠送入AR后,PC的内容+2变 为1102H; ③ AR通过地址总线AB把地址信号1102H送 至存储器,经地址译码器选中存储器 1102H-1103H单元; ④ CPU通过控制总线CB向存储器发出读操作 控制指令; ⑤ 选中1102H-1103H存储单元的内容(00 06)读至数据总线DB上; ⑥ 读出的内容(00 06)经DB送至数据寄存 器DR; ⑦ 因为CPU处于取操作数阶段,取出为操作 数,执行该指令,则DR通过CPU内部总线 把数据(00 06)送入寄存器R4。
执行后 R10 0A125H R11 0FA00H 内存单元0A123H 1234H 内存单元0FA00H 1234H
汇编指令集中常用符号和缩写
八、MSP430指令系统
精简指令集(RISC)设计;
共有51条指令,包含27条硬件执行的内核 指令和24条基于现有硬件结构的高效率的 仿真指令;
数据传送类指令
1. 2. 3. 4. 5. 6. MOV CLR PUSH POP MOV SWPB MOV SXT ;将立即数234H传送到R5寄存器 ;将R5寄存器清零 ;保存状态寄存器,堆栈指针-2 ;从堆栈中恢复状态寄存器,堆栈指针+2 ;寄存器中的值为2345H ;执行后R5的内容为4523H ;寄存器中的值为2345H ;执行后R5的内容为0045H,因为低字节 符号位为0 MOV #2388H,R5 ;寄存器中的值为2388H SXT R5 ;执行后R5的内容为FF88H,因为低字节 符号位为1 (SXT:扩展符号位,低位字节符号扩展到高位字节) #234H,R5 R5 SR SR #2345H,R5 R5 #2345H,R5 R5
msp430单片机教程
msp430单片机教程MSP430单片机是一种经典的低功耗、高性能的微控制器,被广泛应用于嵌入式系统中。
它具有很多特点,比如低功耗、宽工作电压范围、快速启动速度等。
本文将介绍MSP430单片机的基本知识和使用方法。
首先,我们需要了解MSP430单片机的结构。
MSP430包括CPU、内存、I/O接口等多个部分。
CPU是控制单元,负责处理指令和数据。
内存是存储器,用于存储程序和数据。
I/O接口用于与外部设备进行通信。
MSP430单片机使用C语言进行编程。
编程的基本步骤包括初始化、读取输入、处理数据、输出结果等。
编程时,需要了解寄存器的使用方法和I/O接口的配置。
MSP430提供了丰富的库函数和工具,方便开发人员进行程序开发和调试。
MSP430单片机的应用范围广泛。
它可以用于物联网设备、传感器、控制器、无线通信等多个领域。
由于其低功耗的特点,MSP430单片机在电池供电设备中得到了广泛应用。
其性能优越和易用性也使得它成为嵌入式系统中的首选单片机。
MSP430单片机教程包括了一系列基础和高级的内容。
基础教程首先介绍了MSP430单片机的基本知识,包括硬件结构、编程环境和工具的使用等。
然后,通过一系列实践案例,教授学生如何编写简单的程序。
高级教程则深入讲解了MSP430单片机的一些高级特性和应用,如中断、定时器、串口通信等。
在学习MSP430单片机时,还需要学习如何使用开发板和调试工具。
开发板是连接MSP430单片机和计算机的桥梁,提供了丰富的外设接口。
通过合理配置开发板,可以实现多种外设的功能。
调试工具可以帮助开发人员进行程序的调试和性能优化,提高开发效率和质量。
总之,MSP430单片机是一种功能强大、易用且低功耗的微控制器。
学习MSP430单片机的教程可以帮助我们掌握嵌入式系统的开发和应用。
通过学习,我们可以深入了解MSP430单片机的原理和使用方法,为实际应用提供有力的支持。
msp430f149的24c02标准C语言程序
机,msp430,avr单片机,单片机开发板单片机教程网()是专业提供各种单片机教程、资料、程序,为初学者打造一个良好的学习交流的平台!msp430f149的24c02标准C语言程序#include <msp430x14x.h>typedef unsigned char uchar;typedef unsigned int uint;#define SCL_H P3OUT |= BIT3#define SCL_L P3OUT &= ~BIT3#define SDA_H P3OUT |= BIT1#define SDA_L P3OUT &= ~BIT1#define SDA_in P3DIR &= ~BIT1 //SDA改成输入模式#define SDA_out P3DIR |= BIT1 //SDA变回输出模式#define SDA_val P3IN&BIT1 //SDA的位值#define TRUE 1#define FALSE 0#define deviceaddress 0xa0 //AT24C02的设备地址/********************************************//*******************************************函数名称:delay功能:延时约15us的时间参数:无返回值:无********************************************/void delay(void){uchar i;for(i = 0;i 15;i++)_NOP();}/******************************************* 函数名称:start功能:完成IIC的起始条件操作参数:无返回值:无********************************************/ void start(void){SCL_H;SDA_H;delay();SDA_L;delay();SCL_L;delay();}/******************************************* 函数名称:stop功能:完成IIC的终止条件操作参数:无返回值:无********************************************/ void stop(void) {SDA_L;delay();SCL_H;delay();SDA_H;delay();}/*******************************************函数名称:mack功能:完成IIC的主机应答操作参数:无返回值:无********************************************/void mack(void){SDA_L;SCL_H;delay();SCL_L;_NOP();_NOP();SDA_H;delay();}/******************************************* 函数名称:mnack功能:完成IIC的主机无应答操作参数:无返回值:无********************************************/ void mnack(void){SDA_H;_NOP(); _NOP();SCL_H;delay();SCL_L;_NOP(); _NOP();SDA_L;delay();}/**********检查应答信号函数******************/ /*如果返回值为1则证明有应答信号,反之没有*/ /******************************************* 函数名称:check功能:检查从机的应答操作参数:无返回值:从机是否有应答:1--有,0--无********************************************/ uchar check(void){uchar slaveack;SDA_H;_NOP(); _NOP();SCL_H;SDA_in;_NOP(); _NOP();slaveack = SDA_val; //读入SDA数值SCL_L;delay();SDA_out;if(slaveack) return FALSE;else return TRUE;}/******************************************* 函数名称:write1功能:向IIC总线发送一个1参数:无返回值:无********************************************/ void write1(void){SDA_H;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write0功能:向IIC总线发送一个0参数:无返回值:无********************************************/ void write0(void){SDA_L;delay();SCL_H;delay();SCL_L;delay();}/******************************************* 函数名称:write1byte功能:向IIC总线发送一个字节的数据参数:wdata--发送的数据返回值:无********************************************/ void write1byte(uchar wdata){uchar i;for(i = 8;i > 0;i--){if(wdata & 0x80) write1();else write0();wdata <= 1;}SDA_H;_NOP();}/******************************************* 函数名称:writeNbyte功能:向IIC总线发送N个字节的数据参数:outbuffer--指向发送数据存放首地址的指针n--数据的个数返回值:发送是否成功的标志:1--成功,0--失败********************************************/ uchar writeNbyte(uchar * outbuffer,uchar n) {uchar i;for(i = 0;i n;i++){write1byte(* outbuffer);if(check()){outbuffer++;}else{stop();return FALSE;}}stop();return TRUE;}/******************************************* 函数名称:read1byte功能:从IIC总线读取一个字节参数:无返回值:读取的数据********************************************/ uchar read1byte(void){uchar rdata = 0x00,i;uchar flag;for(i = 0;i 8;i++){SDA_H;delay();SCL_H;SDA_in;delay();flag = SDA_val;rdata <= 1;if(flag) rdata |= 0x01;SDA_out;SCL_L;delay();}return rdata;}/******************************************* 函数名称:readNbyte功能:从IIC总线读取N个字节的数据参数:inbuffer--读取后数据存放的首地址n--数据的个数返回值:无********************************************/ void readNbyte(uchar * inbuffer,uchar n){uchar i;for(i = 0;i n;i++){inbuffer[i] = read1byte();if(i (n-1)) mack();else mnack();}stop();}/*******************************************函数名称:delay_10ms功能:延时约6ms,等待EEPROM完成内部写入参数:无返回值:无********************************************/ void delay_10ms(void){uint i = 1000;while(i--);}/*******************************************函数名称:Write_1Byte功能:向EEPROM中写入1个字节的数据参数:Wdata--写入的数据dataaddress--数据的写入地址返回值:写入结果:1--成功,0--失败********************************************/ uchar Write_1Byte(uchar wdata,uchar dataaddress) {start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check())write1byte(wdata);elsereturn 0;if(check()) stop();else return 0;delay_10ms(); //等待EEPROM完成内部写入return 1;}/*******************************************函数名称:Write_NByte功能:向EEPROM中写入N个字节的数据参数:outbuf--指向写入数据存放首地址的指针n--数据个数,最大不能超过8,由页地址决定其最大长度dataaddress--数据写入的首地址返回值:写入结果:1--成功,0--失败********************************************/uchar Write_NByte(uchar * outbuf,uchar n,uchar dataaddress) {uchar flag;start();write1byte(deviceaddress); //写入器件地址if(check() == 1)write1byte(dataaddress); //写入数据字地址elsereturn 0;if(check())flag=writeNbyte(outbuf,n);elsereturn 0;delay_10ms(); //等待EEPROM完成内部写入if(flag) return 1;else return 0;}/*******************************************函数名称:Read_1Byte_currentaddress功能:从EEPROM的当前地址读取1个字节的数据参数:无返回值:读取的数据********************************************/uchar Read_1Byte_currentaddress(void){uchar temp;start();write1byte((deviceaddress|0x01));if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_currentaddress功能:从EEPROM的当前地址读取N个字节的数据参数:readbuf--指向保存数据地址的指针n--读取数据的个数返回值:读取结果:1--成功,0--失败********************************************/uchar Read_NByte_currentaddress(uchar * readbuf,uchar n) {start();write1byte((deviceaddress|0x01));if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}/*******************************************函数名称:Read_1Byte_Randomaddress功能:从EEPROM的指定地址读取1个字节的数据参数:dataaddress--数据读取的地址返回值:读取的数据********************************************/uchar Read_1Byte_Randomaddress(uchar dataaddress){uchar temp;start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte((deviceaddress|0x01));}elsereturn 0;if(check())temp = read1byte();elsereturn 0;mnack();stop();return temp;}/*******************************************函数名称:Read_NByte_Randomaddress功能:从EEPROM的指定地址读取N个字节的数据参数:readbuf--指向保存数据地址的指针n--读取数据的个数dataaddress--数据读取的首地址返回值:读取结果:1--成功,0--失败********************************************/uchar Read_NByte_Randomaddress(uchar * readbuf,uchar n,uchar dataaddress){start();write1byte(deviceaddress);if(check())write1byte(dataaddress);elsereturn 0;if(check()){start();write1byte(deviceaddress|0x01);}elsereturn 0;if(check())readNbyte(readbuf,n);elsereturn 0;return 1;}本例程是基于msp430f149单片机的24C02的程序,主要让我们熟悉的掌握IIC 协议的操作,虽然没有写主函数进行读写操作,但是这模块化非常实用,无论是扩展成24C16还是其它I2C对新手朋友有非常好的参考价值。
msp430单片机入门知识
PORT2_VECTOR (1 * 2u) /* 0xFFE2 P2 */ PORT1_VECTOR (4 * 2u) /* 0xFFE8 P1 */ TIMERA1_VECTOR (5 * 2u) /* 0xFFEA Timer A CCR1/2*/ TIMERA0_VECTOR (6 * 2u) /* 0xFFEC Timer A CCR0 */ USART0TX_VECTOR (8 * 2u) /* 0xFFF0 串口发送 */ USART0RX_VECTOR (9 * 2u) /* 0xFFF2 串口接收*/ WDT_VECTOR (10 * 2u) /* 0xFFF4 Watchdog Timer */ SD16_VECTOR (12 * 2u) /* 0xFFF8 16位ADC */ NMI_VECTOR (14 * 2u) /* 0xFFFC Non-maskable */ RESET_VECTOR (15 * 2u) /* 0xFFFE Reset */
20
中断的具体过程
1. 事先将中断服务程序入口地址装入中断 向量表。
2. 中断发生后,如果中断被允许(可屏蔽 中断),CPU将当前程序地址和CPU状 态寄存器SR压入堆栈。
3. 跳转到中断服务程序入口,备份寄存器 入堆栈。
4. 开始执行中断服务程序。 5. 退出中断前,恢复寄存器。CPU取回SR
寄存器,跳转回中断前主程序地址。
6
MSP430FE425A资源 1. 8M/s处理速度 2. 512RAM(数据)+16KB Flash(程序代码) 3. 内置Flash控制器,剩余Flash可存数据。 4. 内置时钟管理单元,可内部倍频 5. 3路同步采样、差分输入、32倍程控增益放大器的16位ADC 6. 温度传感器 7. 1.2V基准源和输出缓冲器 8. 128段LCD驱动器 9. 增强UART串口 10. 看门狗 11. BasicTimer定时器 12. 16位TimeA定时器,3路捕获和2路PWM 13. 内置BOR复位电路 14. 16个双向可中断IO口 15. 内置电能计量模块 16. 后缀带A的,比如FE425A带硬件乘法器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第 7页/共 13 页
以下各图示例了 430 的头文件中的宏定义,包括各寄存器的定义,寄存器中各位的定义等等。这些头 文件中的内容千万不要动,不要改变,否则会很麻烦的。除非你很清楚你在干什么。 (后面还有一些文字, 请耐心看到最后一页)
第 8页/共 13 页
第 9页/共 13 页
第 10页/共 13 页
第 1页/共 页
例 1:C 程序的基本结构。图 1 的例子基本说明了 C 程序的基本结构,不论你的程序是大还是小,头文件、 主函数总是需要的。注意图中红色的标注,可以帮助我们理解在程序中每条语句是怎样被执行的。
图 1. C 程序的基本结构 如果要打一个比较形象的比喻,上面这个小例子的基本结构就是通过 while(1)语句让 CPU 在那儿不停 地跑圈,一直不停地依次执行相同的任务:间隔地点亮红色和绿色 LED。如果画一张图的话,应该像图 2 所示。
图 5. 多文档的管理
图 6. 文档 1
第 5页/共 13 页
图 7. 文档 2
图 8. 文档 3
第 6页/共 13 页
例 5.中断及其处理。图 9 示例了中断及其中断服务程序的编写方法。
图 9. 中断及其处理,本例中运用了低功耗模式 0 中断是控制器或处理器为了快速响应及处理外部事件(如按键、触摸屏、AD 转换结束、定时器计时 到、以及与外部模块接口等等)而采取的一种应对机制。中断就是一种临时打断,如图 2 中所示,CPU 本 来在那儿跑圈,如果我们的程序中允许了某些中断并开启了总中断,则当这些中断事件发生时,CPU 就会 响应这些中断,也就是 CPU 先去处理这些中断事件(或称突发事件) ,处理完后,CPU 再返回到原来的被 中断点,继续处理它原来的事情。这个过程会涉及到 PC(程序计数器)值的变化及 SP(堆栈指针)的改 变等等,不过 PC 和 SP 的变化在我们的 C 程序中是不可见的,或者说是我们不需要关心的,我们只要写 好我们的 C 语言就一切 OK 了。
第 13页/共 13 页
图 4. 函数的定义和调用
第 4页/共 13 页
例 4:多文件管理和头文件。如果程序很大,则可以进行功能划分,把它模块化。如图 5 的工程中,有 Blink_and_Delay.c, Blink_and_Delay.h, Lighting Two LEDs with Multi C files.c 三个文档。
图 2. CPU 在跑圈,周围有一些可以产生中断的事件,但 CPU 不一定理会
第 2页/共 13 页
例 2:C 程序的宏定义。图 3 示例了宏定义的方法,通过宏定义可以把许多操作和语句定义为有字面含义 的名称, 如图 3 程序中的 Red_On_Green_Off, 一读就知道是让红色 LED 点亮, 绿色 LED 熄灭。 有人说过: 用 C 语言编程,无论变量、语句还是函数都是可以念出来并像让人听起来就懂的。因此给变量命名、函数 命名、宏定义等,都要起一些一看就知其意的名字,读起来可以朗朗上口的,有助于程序的可读性和相互 交流,也有助于你自己事后的修改和维护。
第 11页/共 13 页
下列各图示例了.cmd 文件中各寄存器地址的定义。
第 12页/共 13 页
实际上在 CCS 的编译环境下还包括了许多的头文件,包括数学运算,输入输入出等等,等等。
这些就是 MSP430 单片机 C 程序的大致框架。 如此说来我们的 C 程序在那儿干什么?它就是在那里赋值和运算还有中断处理, 当然这一切需要结合 着单片机内的硬件(其内部资源)以及单片机外的硬件电路安排来进行,这就是软件+硬件。至于汇编, 你先不要碰它好了,什么时候需要了,再去处理它也不迟。我们的任务已经很明确和简单了,我们手头上 有许多寄存器和控制寄存器,寄存器内有很多位(0 或者 1) ,这些就是我们的操作对象(而不是那十二把 舀子) ,当我们把一切都设置好了以后,单片机里的千军万马就听我们的调遣了,停!单片机的外面呢? 同样的有千军万马!外面的电阻、电容、电感,二极管、三极管、场效应管、稳压器、模拟集成电路、数 字集成电路、千奇百怪的传感器、通信模块、控制模块、LCD、按键、触摸键,上位机、下位机、USB、 以太网、物联网… …, 何止是千军万马啊,数不胜数啊。 因此,我们才刚刚上路哎。 希望这些能对大家能有所帮助,不妥之处敬请批评指正。 又及,写东西、码字是很累人的活,不知不觉半下午和一晚上又过去了。
MSP430 单片机 C 语言的基本结构
王晓宁 2013/1/28
随着单片机处理速度的加快和存储容量的加大以及相应的开发软件中增强的代码优化功能, 用 C 语言 编写的程序其代码效率和运行速度已堪与汇编程序相媲美,而且 C 语言程序因其平易性、结构化、易维护 性和可移植性而日益广泛地应用于单片机的开发中。用 C 语言编程时必须结合单片机的特点,不同品牌、 不同系列或不同型号的单片机其内部资源、寄存器名称等都会不同,因此其软件的开发必须结合实际的硬 件来进行。 但 C 语言的程序结构还是有许多共性的, 下面结合 MSP430 单片机大致说一下 C 程序的基本结 构。 C 语言的程序结构还是比较规范的,一般包括头文件、宏定义、变量定义、函数定义、一个主函数 main( )、以及中断处理函数等。在多文件的管理中,还包括自定义的头文件等。根据不同的情形,一个完 整的 C 程序可以有不同的具体结构,但其框架基本上还是固定的。下面通过几个简单的小例子来看一下 C 程序的几种结构。 在此之前,先说一下 C 中的赋值方式。很多情况下,C 程序就是在那儿完成一些赋值操作。|= 是“或” 运算,&=是“与”运算,^= 是“异或”运算。比如 BIT0 已经在 430 的头文件里定义为:BIT0=0x0001, 0x0001 是 16 进制计数,转成 2 进制就是 00000001(低八位),那么 P1OUT|=BIT0,是一个什么结 果?这是一个“或”运算(英文称 or)。首先 P1OUT 是一个在头文件中定义好的寄存器,是 8 位的,因 此,我们可以把 P1OUT 就当成一个变量名好了,只不过这个变量是在头文件中定义的,我们直接拿来用 即可。P1OUT 的取值就是在 00000000~11111111 之间(二进制)。因此不管 P1OUT 原先的值时多少, P1OUT|=BIT0 就是(设 P1OUT 原先的值为 xxxxxxxx)xxxxxxxx 跟 00000001 进行或运算,最低位 (即 BIT0)的值肯定是 1 的,而对其它位没有影响。,因此这样赋值后 P1OUT=xxxxxxx1 ,达到了让 BIT0 位等于 1(称为“置 1”)的目的。P1OUT&=~BIT0 的结果呢?首先,这是一个“与”运算(英文 称 and),而“~”在 C 中是一个求反的符号(即 1 变 0,0 变 1),则~BIT0=11111110,也即把 BIT0 原来各位的值全求反了。那么不论 P1OUT 原来的值是多少,就假设为 xxxxxxxx ,则 xxxxxxxx 跟 , 11111110 相“与”的结果就是 xxxxxxx0,也就是 BIT0 这一位肯定是 0 的(称为“清 0”或“置 0”) 而 对 其 它 位 没 有 影 响 。 P1OUT^=BIT0 呢 ? 这 称 为 “ 异 或 ” 运 算 ( 英 文 称 为 xor ) ( 1^0=1,0^1=1,0^0=0,1^1=0 ) , BIT0=00000001 , 设 P1OUT=xxxxxxx1 , 则 ( xxxxxxx1 ) ^(00000001)=xxxxxxx0;若 P1OUT=xxxxxxx0,则(xxxxxxx0)^(00000001)=xxxxxxx1,因此 不管 P1OUT 的值原先是多少, 经过 P1OUT^=BIT0 的运算后, (原先是 1 变为 0, BIT0 这一位总是取反的 原先是 0 变为 1)。综上,P1OUT|=BIT0 是赋 1 运算,P1OUT&=~BIT0 是赋 0 运算,P1OUT^=BIT0 是 求反运算,而且都是只对 BIT0 位产生影响,对其它位是没有影响的(其它位还保留它们原先的值)。这 是一种很好的处理方法,因为单片机的寄存器,其每一位都是有控制作用的,我们只改变我们想赋值的那 一位,而对其它位不造成影响。当然其它一些赋值方法也是可以的,如:WDTCTL=WDTPW+WDTHOLD 等。 另 外 BIT6+BIT0 是 互 不 影 响 的 , 因 为 BIT6=01000000 , BIT0=00000001 , 因 此 BIT6+BIT0=01000001 , 各 位 之 间 互 不 干 扰 ( 或 称 为 互 不 打 架 ) 。 很 多 位 相 加 也 是 同 理 : BIT7+BIT6+BIT3+BIT1=10000000+01000000+00001000+00000010=11001010,各位互不影响。 因此,可以有这样的赋值运算:P1DIR|=BIT6+BIT0,P1OUT&=~(BIT7+BIT5+BIT1)等等。其它的 运算就是加减乘除了。这些事情在许多单片机的书及资料中都有叙述,可能没有讲得这么细。
图 3. C 程序中的宏定义和引用
第 3页/共 13 页
例 3:C 程序中函数的定义和调用。定义函数和调用函数是 C 语言最突出的特点之一,也最有挑战性,函 数的英文名称是 Function,字面意义上就是一个功能,数学里的函数不就是一个功能吗? y f ( x ) 6 x 2 , 就是完成了一个功能,一个抛物线的功能。 C 语言中,通过定义函数完成相应的功能,并通过在主函数 main( )中调用函数来实现其功能。在函数定义中还可以给函数传递参数(形参) ,函数中还可以有复杂的 数学运算及逻辑处理。函数可以有返回值,也可以没有返回值(只完成某些操作) 。在图 4 的示例中只定 义了几个简单的函数,没有传递参数,没有复杂的数学或逻辑运算,也没有返回值。很多情况下,有些函 数定义了,但在主函数中没有调用它,则这个函数是不起作用的。