微机原理与接口技术实验指导书_第1页
微机原理与接口技术实验指导书_第2页
微机原理与接口技术实验指导书_第3页
微机原理与接口技术实验指导书_第4页
微机原理与接口技术实验指导书_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

单片机原理与应用实验指导书嘉兴学院南湖学院PAGE1绪论该课程为电子信息类专业,尤其是电气工程及自动化、电子信息工程、自动化、机电一体化专业的重要课程。是一门计算机硬软件知识与数字信号处理知识相结合的课程。同学通过预习准备与上机操作练习,熟悉软件开发方法,理解各种单片机系统的实现,并掌握单片机系统设计和实现方法。本实验教学是高等院校电类专业为加强《单片机原理及应用》课程的理论学习而开设的综合性实践课程,它是根据有关实验题目,设计相应程序,提供实验的设备,同时也是对掌握有关实验设备的选择,操作使用的过程。因此所开设的每个实验都有明确的目的和要求。MSP-EXP430G2LaunchPad(以下简称G2)是TI公司推出的1款MSP430开发板,它提供了具有集成仿真功能的14/20引脚DIP插座目标板,可通过SpyBi-Wire(2线JTAG)协议对系统内置的MSP430超值系列器件(G系列)进行快速编程和调试。PAGE38实验一CCS使用实验一.实验目的1.了解CodeComposerStudio5.5软件的操作环境和基本功能,了解MSP430的软件开发过程。(1)学习创建工程和管理工程的方法。(2)了解基本的编译和调试功能。(3)学习使用观察窗口。(4)了解图形功能的使用二.实验原理CCS(CodeComposerStudio)是TI公司推出的“集成开发环境”IDE(IntergratedDevelopmentEnvironment)。所谓“集成开发环境”就是处理器的所有开发都在一个软件里完成,包括工程管理、程序编译、代码下载、调试等功能。CCS支持所有TI公司推出的处理器,包括MSP430、ARMCortex系列、C2000和DSP。 1.开发MSP430应用系统一般需要以下几个调试工具来完成:软件集成开发环境(CodeComposerStudio5.5):完成系统的软件开发,进行软件和硬件仿真调试。它也是硬件调试的辅助手段。开发系统:实现硬件仿真调试时与硬件系统的通信,控制和读取硬件系统的状态和数据。 2.CodeComposerStudio5.5主要完成系统的软件开发和调试。它提供一整套的程序编制、维护、编译、调试环境,能将汇编语言和C语言程序编译连接生成COFF(公共目标文件)格式的可执行文件,并能将程序下载到目标板上运行调试。 3.用户系统的软件部分可以由CodeComposerStudio建立的工程文件进行管理,工程文件一般包含以下几种文件:-源程序文件:C语言或汇编语言文件(*.ASM或*.C)-头文件(*.H)-命令文件(*.CMD)-库文件(*.LIB,*.OBJ)三.实验设备与器材1.PC机一台;操作系统为WindowsXP(或WindowsNT、Windows98、Windows2000,以下假定操作系统为WindowsXP)。安装CCS软件。 2.MSPEXP430G2553launchpad核心实验板一块。3.USB连接电缆一条。四.实验内容与记录1.实验准备(1)连接实验设备检查EXP430G2553launchpad完好。(2)开启设备①接通计算机电源,进入Windows操作系统。②提供的USB电缆的扁平端连接到计算机的USB接口上。2.启动CodeComposerStudio5双击桌面上“CodeComposerStudio5.5.03.创建工程(1)创建新的工程文件首先,新建的工程会默认出现在之前选定的workspace文件夹中。点击File?New?CCSProject,输入Projectname:CCS_example,Outputtype:Excutable(可编译执行的,另一个可选项是Library),Device选择MSP430G2553,最后选择是“EmptyProject(withmain.c)工程建立后之后,自动生成了一堆文件,其中我们需要操作的就是main.c文件,编写各种代码,点击保存后可激活“关联跳转”。关联跳转非常有用,可以按住CTRL+鼠标左键点击任意函数,就会跳转到该函数的引用位置,按可以回到原代码位置。如果需要添加外部文件,注意好文件路径和头文件包含问题。双击打开main.c,输入下列程序:(2)在工程文件中添加程序文件(可选操作):在任何一个工程中,都包含main.c文件,还可以有很多其他文件。在ProjectExplorer树形目录中,可以通过新建或者直接COPY的方法增加文件夹或c文件、h文件。(3)编译连接工程:程序编写完成后,点击即可开始编译。根据图中所示的编译错误提示窗逐条修改错误。(4)运行调试:点击行下载和仿真了,耐心等待后,得到仿真调试界面。完成后,代码被下载到G2单片机里,点击开始运行程序。(4)观察数据:在仿真运行后,点击ToolàGraphàSingleTime设置参数如下: 在断点位置点击右键,编辑断点属性。将Action改为RefreshAllWindows,这样就可以连续更新波形。分别把DisplayDataSize设为1024和128的显示效果五.实验小结与思考题总结CCS编译调试环境在使用上的特点,联系其它使用过的编译器,找出它们之间相似的功能。进一步掌握其它在实验中没有用到的功能选项和编译、调试技巧六.实验报告要求1.实验目的2.实验的基本原理3.实验程序的主要部分4.实验结果及问题分析

实验二MSP430系统时钟实验一.实验目的1.了解MSP430系统时钟工作原理。2.掌握MSP430系统时钟的配置方法。二.实验原理现代单片机的制造工艺都差不多,靠电子元件本身节能的潜力非常有限。单片机的低功耗主要是依靠间歇工作实现的,而间歇工作的方法就是启停系统时钟。如果像普通51单片机那样只有一个时钟,关掉时钟意味着单片机全面停工,节能的同时也没法正常使用了。所以出于低功耗的需要,MSP430单片机工作的系统时钟被分为了MCLK、SMCLK和ACLK三个,可以根据需要关闭其中的一个几个或全部。MCU内需要时钟的单元包括CPU和部分片内外设,三种时钟的功能区别如下:1)MCLK:主时钟(MainsystemClock),专为CPU运行提供的时钟。MCLK频率配置的越高,CPU执行的速度越快。虽然CPU速度越快功耗也越高,但高频率的MCLK可以让CPU工作时间更短。所以正确的低功耗设计并不是要尽量降低MCLK,而是在不用CPU时立刻关闭MCLK。在大部分应用中,需要CPU运算的时间都非常短,所以,间歇开启MCLK(唤醒CPU)的方法节能效果非常明显。2)SMCLK:子系统时钟(Sub-mainClock),专为一些需要高速时钟的片内外设提供服务,比如定时器和ADC采样等。当CPU休眠时,只要SMCLK开启,定时器和ADC仍可工作(一般待片内外设完成工作后触发中断,唤醒CPU去做后续工作)。3)ACLK:辅助时钟(AuxillaryClock),辅助时钟的频率很低,所以即使一直开启功耗也不大,当然关掉也是可以的。辅助时钟可以供给那些只需低频时钟的片内外设,比如LCD控制器,还可用于产生节拍时基,与定时器配合间歇唤醒CPU。MCLK、SMCLK和ACLK三者关系用更形象的比喻就是主力部队(MCLK)、先头部队(SMCLK)、警戒哨兵(ACLK)的关系。1)需要用主力部队的时候不多,一般情况都处于休整状态,以节约“给养”(功耗)。2)能只用先头部队解决的问题,就别动用主力,待先头部队完成自己的任务后,再请主力出马。3)当没有实际“敌人”的时候,主力部队和先头部队都可以休整,但是要放上哨兵作为警戒,发现“敌人”可以随时唤醒主力部队。如图,MSP-EXP430G2开发板上P1.3接了一个按键,P1.0接了LED(用跳线帽连接),下面我们将编写一段代码,通过长延时控制P1.0LED亮灭,可以通过按键改变DCO频率,随着DCO改变,LED亮灭频率发生变化。原理:软件延时的时长与时钟频率成反比,改变DCO频率自然就会改变延时,从而引起LED闪烁频率的变化。三.实验设备与器材1.PC机一台;操作系统为WindowsXP(或WindowsNT、Windows98、Windows2000,以下假定操作系统为WindowsXP)。安装CCS软件。2.MSPEXP430G2553launchpad核心实验板一块。3.USB连接电缆一条。四.实验内容与记录1.实验准备(1)连接实验设备检查EXP430G2553launchpad完好。(2)开启设备①接通计算机电源,进入Windows操作系统。②提供的USB电缆的扁平端连接到计算机的USB接口上。(3)启动CodeComposerStudio5双击桌面上“CodeComposerStudio5.5.0”2.实验步骤仅使用MSP-EXP430G2开发板进行实验插上P1.0和P1.6的LED跳线启动CCS,打开4_KEY_LED_Change_DCO工程下载并运行仿真程序观测LED闪烁频率按键后,LED闪烁频率变快每4次按键后,LED闪烁频率变回初始状态。3.源代码/**Key_LED_Change_DCO.c*硬件描述:LaunchpadG2553开发板上P1.3接了一个按键,P1.0接了LED(用跳线帽连接)。*功能描述:LED依靠长延时闪烁,每次按下按键后,系统时钟按1/8/12/16MHz循环改变,LED闪烁速度变化*Createdon:2013-4-8*Author:Administrator*/#include"MSP430G2553.h"//在main()函数前提前申明子函数voidP1_IODect(); //P1口的外部中断事件检测函数voidP13_Onclick(); //P1.3按键的中断事件处理函数voidGPIO_Init(); //GPIO初始化函数voidmain(void){ WDTCTL=WDTPW+WDTHOLD; //关闭看门狗定时器 GPIO_Init(); //初始化GPIO _enable_interrupts(); //等同_EINT,使能总中断 while(1) { __delay_cycles(1000000); //与CPU时钟相关的长延时// __delay_cycles(100); //与CPU时钟相关的长延时 P1OUT^=BIT0; //LED亮灭状态改变 P1OUT^=BIT6; //LED亮灭状态改变 }}/***************************************************************************名称:GPIO_Init()*功能:设定按键和LED控制IO的方向,启用按键IO的上拉电阻*入口参数:无*出口参数:无*说明:无*范例:无*************************************************************************/voidGPIO_Init(){ //设定P1.0和P1.6的输出初始值 P1DIR|=BIT0+BIT6; //设定P1.0为输出 P1OUT|=BIT0+BIT6; //设定P1.0初值 //配合机械按键,启用内部上拉电阻 P1REN|=BIT3; //启用P1.3内部上下拉电阻 P1OUT|=BIT3; //将电阻设置为上拉 //配置P1.3中断参数 P1DIR&=~BIT3;//P1.3设为输入(可省略) P1IES|=BIT3;//P1.3设为下降沿中断 P1IE|=BIT3;//允许P1.3中断}/***************************************************************************名称:PORT1_ISR()*功能:响应P1口的外部中断服务*入口参数:无*出口参数:无*说明:P1.0~P1.8共用了PORT1中断,所以在PORT1_ISR()中必须查询标志位P1IFG才能知道* 具体是哪个IO引发了外部中断。P1IFG必须手动清除,否则将持续引发PORT1中断。*范例:无*************************************************************************/#pragmavector=PORT1_VECTOR__interruptvoidPORT1_ISR(void){ //启用Port1事件检测函数 P1_IODect(); //检测通过,则会调用事件处理函数 P1IFG=0; //退出中断前必须手动清除IO口中断标志}/***************************************************************************名称:P1_IODect()*功能:判断具体引发中断的IO,并调用相应IO的中断事件处理函数*入口参数:无*出口参数:无*说明:该函数兼容所有8个IO的检测,请根据实际输入IO激活“检测代码”。* 本例中,仅有P1.3被用作输入IO,所以其他7个IO的“检测代码”没有被“激活”。*范例:无**********************************************************************/voidP1_IODect(){ unsignedintPush_Key=0; //排除输出IO的干扰后,锁定唯一被触发的中断标志位 Push_Key=P1IFG&(~P1DIR); //延时一段时间,避开机械抖动区域 __delay_cycles(10000); //消抖延时 //判断按键状态是否与延时前一致 if((P1IN&Push_Key)==0) //如果该次按键确实有效{ //判断具体哪个IO被按下,调用该IO的事件处理函数 switch(Push_Key){// caseBIT0: P10_Onclick(); break;// caseBIT1: P11_Onclick(); break;// caseBIT2: P12_Onclick(); break; caseBIT3: P13_Onclick(); break;// caseBIT4: P14_Onclick(); break;// caseBIT5: P15_Onclick(); break;// caseBIT6: P16_Onclick(); break;// caseBIT7: P17_Onclick(); break; default: break; //任何情况下均加上default }}}/***************************************************************************名称:P13_Onclick()*功能:P1.3的中断事件处理函数,即当P1.3键被按下后,下一步干什么*入口参数:无*出口参数:无*说明:使用事件处理函数的形式,可以增强代码的移植性和可读性*范例:无**************************************************************************/voidP13_Onclick(){ //Freq仅在P13_Onclick()中使用,但是又需要退出函数时不被清除 staticunsignedintFreq=0; //静态全局变量的典型应用场合 //变量从0~3循环移位 Freq++; if(Freq>3) Freq=0; //根据Freq的值,改变DCO设定频率 switch(Freq){ case0: DCOCTL=CALDCO_1MHZ; BCSCTL1=CALBC1_1MHZ; break; case1: DCOCTL=CALDCO_8MHZ; BCSCTL1=CALBC1_8MHZ; break; case2: DCOCTL=CALDCO_12MHZ; BCSCTL1=CALBC1_12MHZ;break; case3: DCOCTL=CALDCO_16MHZ; BCSCTL1=CALBC1_16MHZ;break; default: break; }}五.实验小结与思考题总结MSP430系统时钟工作原理及配置方法。进一步掌握其它在实验中没有用到的功能选项和编译、调试技巧。六.实验报告要求1.实验目的2.实验的基本原理3.实验程序的主要部分4.实验结果及问题分析

实验三MSP430中断实验一.实验目的1.了解MSP430中断工作原理。2.掌握MSP430中断时钟的配置方法。二.实验原理如图,MSP-EXP430G2开发板上P1.3接了一个按键,P1.0和P1.6接了LED(用跳线帽连接),下面我们将编写一段代码,两个LED保持1亮1灭,每次按下P1.3后,LED交换亮灭状态,要求不阻塞CPU。三.实验设备与器材1.PC机一台;操作系统为WindowsXP(或WindowsNT、Windows98、Windows2000,以下假定操作系统为WindowsXP)。安装CCS软件。2.MSPEXP430G2553launchpad核心实验板一块。3.USB连接电缆一条。四.实验内容与记录1.实验准备(1)连接实验设备检查EXP430G2553launchpad完好。(2)开启设备①接通计算机电源,进入Windows操作系统。②提供的USB电缆的扁平端连接到计算机的USB接口上。(3)启动CodeComposerStudio5双击桌面上“CodeComposerStudio5.5.02.实验步骤仅使用MSP-EXP430G2开发板进行实验插上P1.0和P1.6的LED跳线启动CCS,打开5_Interrupt_Key_LED工程下载并运行仿真程序观测初始时两个LED的亮灭状态每次按键后,两个LED切换亮灭3.源代码/**Interrupt_Key_LED.c*硬件描述:LaunchpadG2553开发板上P1.3接了一个按键,P1.0和P1.6各接了1个LED(用跳线帽连接)。*功能描述:按键按下的瞬间,两个LED切换亮灭状态*Createdon:2013-4-8*Author:Administrator*/#include"MSP430G2553.h"//在main函数前提前申明函数voidP1_IODect() ;voidP13_Onclick();voidGPIO_init();voidmain(void){ WDTCTL=WDTPW+WDTHOLD; //关狗 GPIO_init(); //IO初始化 _enable_interrupts(); //使能总中断 _bis_SR_register(LPM3_bits); //休眠}/*******************************************************************************************************名称:GPIO_Init()*功能:设定按键和LED控制IO的方向,启用按键IO的上拉电阻*入口参数:无*出口参数:无*说明:无*范例:无******************************************************************************************************/voidGPIO_init(){ //设定P1.0和P1.6的输出初始值 P1DIR|=BIT0+BIT6; //设定P1.0和P1.6为输出 P1OUT|=BIT0; //设定P1.0初值 P1OUT&=~BIT6; //设定P1.6初值 //配合机械按键,启用内部上拉电阻 P1REN|=BIT3; //启用P1.3内部上下拉电阻 P1OUT|=BIT3; //将电阻设置为上拉 //配置P1.3中断参数 P1DIR&=~BIT3;//P1.3设为输入(可省略) P1IES|=BIT3;//P1.3设为下降沿中断 P1IE|=BIT3;//允许P1.3中断}/*******************************************************************************************************名称:PORT1_ISR()*功能:响应P1口的外部中断服务*入口参数:无*出口参数:无*说明:P1.0~P1.8共用了PORT1中断,所以在PORT1_ISR()中必须查询标志位P1IFG才能知道* 具体是哪个IO引发了外部中断。P1IFG必须手动清除,否则将持续引发PORT1中断。*范例:无******************************************************************************************************/#pragmavector=PORT1_VECTOR__interruptvoidPORT1_ISR(void){ //启用Port1事件检测函数 P1_IODect(); //检测通过,则会调用事件处理函数 P1IFG=0; //退出中断前必须手动清除IO口中断标志}/*******************************************************************************************************名称:P1_IODect()*功能:判断具体引发中断的IO,并调用相应IO的中断事件处理函数*入口参数:无*出口参数:无*说明:该函数兼容所有8个IO的检测,请根据实际输入IO激活“检测代码”。* 本例中,仅有P1.3被用作输入IO,所以其他7个IO的“检测代码”没有被“激活”。*范例:无******************************************************************************************************/voidP1_IODect(){ unsignedintPush_Key=0; //排除输出IO的干扰后,锁定唯一被触发的中断标志位 Push_Key=P1IFG&(~P1DIR); //延时一段时间,避开机械抖动区域 __delay_cycles(10000); //消抖延时 //判断按键状态是否与延时前一致 if((P1IN&Push_Key)==0) //如果该次按键确实有效{ //判断具体哪个IO被按下,调用该IO的事件处理函数 switch(Push_Key){// caseBIT0: P10_Onclick(); break;// caseBIT1: P11_Onclick(); break;// caseBIT2: P12_Onclick(); break; caseBIT3: P13_Onclick(); break;// caseBIT4: P14_Onclick(); break;// caseBIT5: P15_Onclick(); break;// caseBIT6: P16_Onclick(); break;// caseBIT7: P17_Onclick(); break; default: break; //任何情况下均加上default }}}/*******************************************************************************************************名称:P13_Onclick()*功能:P1.3的中断事件处理函数,即当P1.3键被按下后,下一步干什么*入口参数:无*出口参数:无*说明:使用事件处理函数的形式,可以增强代码的移植性和可读性*范例:无******************************************************************************************************/voidP13_Onclick(){ //翻转IO电平 P1OUT^=BIT0; P1OUT^=BIT6; }五.实验小结与思考题总结MSP430中断工作原理及配置方法。进一步掌握其它在实验中没有用到的功能选项和编译、调试技巧。六.实验报告要求1.实验目的2.实验的基本原理3.实验程序的主要部分4.实验结果及问题分析

实验四MSP430定时器实验—基于PWM的LED调光一.实验目的1.了解MSP430定时器工作原理。2.掌握MSP430定时器的使用方法。二.实验原理1.定时器原理定时器在任何单片机中都具有极其重要的作用。我们都知道单片机是顺序执行指令,我们把CPU看成是人,一个每次只能干一件事的人。没有定时器的帮助,人就会像在监狱服刑一样,早上起床,吃早饭,干苦力、放风、吃晚饭、睡觉、早上起床...偶尔有的变数就是有人探监(外部中断)。可怕的是,如果吃饭时“耳背”,狱警喊停没听见,那作为犯人就必须一直吃下去,干苦力时出了岔子就更悲催了。定时器是什么呢?实际就是能够对时钟进行计数的计数器,类似我们的闹钟。定时器的出现才使单片机成为几乎无所不能的完整的自由人。一个自由主人的一天是这样的:1)起床:相当于main循环的起始。2)刷牙:相当于执行各种inital操作,此task主人(CPU)必须亲力亲为,并且不能被其他事打扰。3)烧水:代表不需要人(CPU)一直干的task,主人灌好烧水壶后,只需打开灶台火焰即可。不巧的是烧水壶并没有水烧好的鸣响器(外设中断),怎么办?最傻的办法是主人得一直盯着看烧水的全过程。但是有定时器,主人就不必要这么做了。因为烧好一壶水的时间基本是知道的,主人设定好闹钟就可以去看报纸(其他任务)或者打瞌睡了(休眠)。待闹钟响起,人去关火,泡咖啡...4)敲门:有访客敲门相当于突发事件event。假设主人住在大庄园里,又恰巧没有门铃(外部中断)怎么办?难道要主人成天蹲在大门口吗?不用,有定时器呢。假定访客敲门都最少会敲5分钟,主人将定时器设定为5分钟响一次,每5分钟去门口看一次,这样就不会错过客人来访了。其他时间,主人可以打dota或者发呆。5)吃药:假如主人每隔1小时需要吃药一次,这相当于对时间要求严格的task,按理说这不就是用个闹钟就完了吗。憋屈的是,主人只有1个闹钟,已经用在“接客”上了,怎么办?没关系,主人可以数定时5分钟的闹钟响了多少次,数够12次就吃药。类似的方法,主人可以数着闹钟的“节拍”处理其他对时间要求严格的task。6)有人来访:好了,5分钟去大门口看一次,真有访客了。访客分两种情况,送快递的(只需标记下,可以后续处理的event)或是上门拜访的(需要立刻接待处理的event)。因为对于快递包裹,主人验货收下即可(写全局变量标志位),以后有时间再研究包裹内的物品。而上门拜访的客人,主人立刻亲自接待(中断子函数,占用CPU)。7)客人赖着不走:客人脑子进水了说个没完没了(程序跑飞或外设错误),影响主人正常生活了,怎么办?没事,幸好有看门狗定时器在,每隔设定时间,必须喂狗(重置看门狗定时器),否则设定时间一到,看门狗该咬人了(重启单片机)。主人的一天要重新开始了。总结一下主人的一天,一个住着大庄园的主人,却没有仆人(有的话成双CPU了)。还非常憋屈的没有自动报警的烧水壶,庄园大门没有门铃,吃药都没有专人伺候。但是依靠闹钟(定时器),主人还是可以惬意的生活,有时间打dota,有时间打盹。甚至当“天下大乱”的时候,还有看门狗可以让一天重来。定时器作为单片机中最有用的片内外设,就是为弥补CPU顺序执行程序这个“死脑经”缺陷而量身定做的。学会使用定时器的思想,才算真正是单片机入了门。2.硬件原理如图,MSP-EXP430G2开发板上P1.3接了一个按键,P1.6为TA输出口并接了LED(用跳线帽连接),下面我们将编写一段代码,通过按键改变PWM占空比,从而改变LED亮度。三.实验设备与器材1.PC机一台;操作系统为WindowsXP(或WindowsNT、Windows98、Windows2000,以下假定操作系统为WindowsXP)。安装CCS软件。2.MSPEXP430G2553launchpad核心实验板一块。3.USB连接电缆一条。四.实验内容与记录1.实验准备(1)连接实验设备检查EXP430G2553launchpad完好。(2)开启设备①接通计算机电源,进入Windows操作系统。②提供的USB电缆的扁平端连接到计算机的USB接口上。(3)启动CodeComposerStudio5双击桌面上“CodeComposerStudio5.5.02.实验步骤仅使用MSP-EXP430G2开发板进行实验插上P1.0的LED跳线启动CCS,打开6_PWM_LED工程下载并运行仿真程序观测初始时LED的亮度(灭)每次按键后,LED变亮每10次按键以后,LED恢复初始亮度3.源代码/**PWM_LED.c*硬件描述:LaunchpadG2553开发板上P1.3接了一个按键,P1.6各接了1个绿光LED(用跳线帽连接)。*功能描述:按键按下的瞬间,LED亮度变化。需调用TA_PWM库函数。*Createdon:2013-4-8*Author:Administrator*/#include"MSP430G2553.h"#include"TA_PWM.h"voidP1_IODect();voidP13_Onclick();voidGPIO_init();voidmain(void){ WDTCTL=WDTPW+WDTHOLD; //关狗 //初始化TA0为ACLK输入,不分频,通道1超前PWM,通道2关闭 TA0_PWM_Init('A',1,'F',0); TA0_PWM_SetPeriod(500); //设定PWM周期 GPIO_init(); //初始化GPIO _enable_interrupts(); //使能总中断_bis_SR_register(LPM3_bits); //LPM3方式休眠}/*******************************************************************************************************名称:GPIO_Init()*功能:设定按键和LED控制IO的方向,启用按键IO的上拉电阻*入口参数:无*出口参数:无*说明:无*范例:无******************************************************************************************************/voidGPIO_init(){ //TA0_PWM_Init()自动设置TA口(P1.6) //配合机械按键,启用内部上拉电阻 P1REN|=BIT3; //启用P1.3内部上下拉电阻 P1OUT|=BIT3; //将电阻设置为上拉 //配置P1.3中断参数 P1DIR&=~BIT3;//P1.3设为输入(可省略) P1IES|=BIT3;//P1.3设为下降沿中断 P1IE|=BIT3;//允许P1.3中断}/*******************************************************************************************************名称:PORT1_ISR()*功能:响应P1口的外部中断服务*入口参数:无*出口参数:无*说明:P1.0~P1.8共用了PORT1中断,所以在PORT1_ISR()中必须查询标志位P1IFG才能知道* 具体是哪个IO引发了外部中断。P1IFG必须手动清除,否则将持续引发PORT1中断。*范例:无******************************************************************************************************/#pragmavector=PORT1_VECTOR__interruptvoidPORT1_ISR(void){ //启用Port1事件检测函数 P1_IODect(); //检测通过,则会调用事件处理函数 P1IFG=0; //退出中断前必须手动清除IO口中断标志}/*******************************************************************************************************名称:P1_IODect()*功能:判断具体引发中断的IO,并调用相应IO的中断事件处理函数*入口参数:无*出口参数:无*说明:该函数兼容所有8个IO的检测,请根据实际输入IO激活“检测代码”。* 本例中,仅有P1.3被用作输入IO,所以其他7个IO的“检测代码”没有被“激活”。*范例:无******************************************************************************************************/voidP1_IODect(){ unsignedintPush_Key=0; //排除输出IO的干扰后,锁定唯一被触发的中断标志位 Push_Key=P1IFG&(~P1DIR); //延时一段时间,避开机械抖动区域 __delay_cycles(10000); //消抖延时 //判断按键状态是否与延时前一致 if((P1IN&Push_Key)==0) //如果该次按键确实有效{ //判断具体哪个IO被按下,调用该IO的事件处理函数 switch(Push_Key){// caseBIT0: P10_Onclick(); break;// caseBIT1: P11_Onclick(); break;// caseBIT2: P12_Onclick(); break; caseBIT3: P13_Onclick(); break;// caseBIT4: P14_Onclick(); break;// caseBIT5: P15_Onclick(); break;// caseBIT6: P16_Onclick(); break;// caseBIT7: P17_Onclick(); break; default: break; //任何情况下均加上default }}}/*******************************************************************************************************名称:P13_Onclick()*功能:P1.3的中断事件处理函数,即当P1.3键被按下后,下一步干什么*入口参数:无*出口参数:无*说明:使用事件处理函数的形式,可以增强代码的移植性和可读性*范例:无******************************************************************************************************/voidP13_Onclick() //P1.3的事件处理函数{ //Bright在函数执行完后不能被清空,所以得设为静态局部变量 staticunsignedintBright=0; //循环改变PWM占空比 Bright=Bright+40; if(Bright>=400) //占空比最大40%,更亮的区间视觉变化不明显 Bright=0; TA0_PWM_SetPermill(1,Bright); //调用库函数,更新PWM占空比 _nop(); }五.实验小结与思考题总结MSP430定时器工作原理及配置方法。进一步掌握其它在实验中没有用到的功能选项和编译、调试技巧。六.实验报告要求1.实验目的2.实验的基本原理3.实验程序的主要部分4.实验结果及问题分析

实验五MSP430看门狗实验—呼吸灯一.实验目的1.了解MSP430看门狗工作原理。2.掌握MSP430看门狗的使用方法。二.实验原理1.WDT原理WDT(WatchDogTimer)俗称看门狗,是单片机非常重要的一个片内外设。早期,普通51单片机内部没有它,则有使用专门的外扩看门狗芯片。在电子产品中,被称为“狗”的就是忠诚可靠的代名词,比如电子狗(雷达测速狗)。什么是看门狗呢?看门狗实际就是一个定时器,只不过在定时到达时,可以复位单片机。这个功能对于实际工程应用中的产品非常有用。在很多应用中,单片机要经年累月的连续工作,如果期间单片机由于各种意外死机(俗称跑飞),则单片机就经年累月的不工作了,有了看门狗,就可以避免这种意外的发生。看门狗的原理就8个字“定时喂狗,狗饿复位”:1)单片机都是循环工作的,比如完成整个循环所需时间最长不超过0.5秒,则可以把看门狗定时器的定时值设为1秒,在主循环中加入看门狗定时值清零的代码(俗称喂狗)。2)这样一来,假如程序运行正常,则总会在看门狗定时器到点前“喂狗”,从而避免单片机复位。3)如果程序死机,则不会及时“喂狗”,单片机复位。复位后看门狗依然默认开启,继续守护着程序的正常运行。2.硬件原理呼吸灯就是亮度渐变的LED灯,普通LED可以用TA输出PWM来控制亮度,通过WDT定时中断来改变亮度,从而实现呼吸灯效果。如图7.4所示,G2板可以利用P1.6(PWM输出口)控制LED来实现呼吸灯。三.实验设备与器材1.PC机一台;操作系统为WindowsXP(或WindowsNT、Windows98、Windows2000,以下假定操作系统为WindowsXP)。安装CCS软件。2.MSPEXP430G2553launchpad核心实验板一块。3.USB连接电缆一条。四.实验内容与记录1.实验准备(1)连接实验设备检查EXP430G2553launchpad完好。(2)开启设备①接通计算机电源,进入Windows操作系统。②提供的USB电缆的扁平端连接到计算机的USB接口上。(3)启动CodeComposerStudio5双击桌面上“CodeComposerStudio5.5.02.实验步骤仅使用MSP-EXP430G2开发板进行实验插上P1.6的LED跳线启动CCS,打开7_1_Breath_Lamp工程下载并运行仿真程序观测LED的亮度随时间的变化3.源代码/**Breath_Lamp.c*硬件描述:P1.6(PWM输出口)接了1个绿光LED(用跳线帽连接)。*功能描述:LED亮度随时间渐渐变量又渐渐变暗,人称“呼吸灯”。需调用TA_PWM库函数。*Createdon:2013-4-8*Author:Administrator*/#include"MSP430G2553.h"#include"TA_PWM.h"#include"Breath_Lamp_Event.h"#include"Breath_Lamp_Global.h"#definePWM_PERIOD100voidmain(void){ WDTCTL=WDTPW+WDTHOLD; //初始化TA定时器 TA0_PWM_Init('A',1,'F',0); //ACLK,不分频,TA0.1输出超前PWM TA0_PWM_SetPeriod(PWM_PERIOD); //设定PWM的周期 //初始化看门狗定时器 WDTCTL=WDT_ADLY_16; //WDT设为16ms定时器模式 IE1|=WDTIE; //使能寄存器IE1中相应的WDT中断位 _enable_interrupts(); //使能总中断 _bis_SR_register(LPM3_bits);}/***************************************************************************名称:WDT_ISR()*功能:响应WDT定时中断服务*入口参数:无*出口参数:无*说明:WDT定时中断独占中断向量,所以无需进一步判断中断事件,也无需人工清除标志位。*所以,在WDT定时中断服务子函数中,直接调用WDT事件处理函数就可以了。*范例:无*************************************************************************/#pragmavector=WDT_VECTOR //WatchdogTimerinterruptserviceroutine__interruptvoidWDT_ISR(void){ WDT_Ontime();}五.实验小结与思考题总结MSP430看门狗工作原理及配置方法。进一步掌握其它在实验中没有用到的功能选项和编译、调试技巧。六.实验报告要求1.实验目的2.实验的基本原理3.实验程序的主要部分4.实验结果及问题分析

实验六MSP430键盘实验—长短键识别一.实验目的1.了解MSP430看门狗工作原理。2.掌握MSP430看门狗的使用方法。3.掌握状态机建模编程思想。二.实验原理1.状态机原理有非常普遍的一类程序,事件的判断不仅与当前输入有关,还与之前的“积累效应”有关。比如,大家都知道计算机的键盘是能识别“长短键的”:1)当你短时间按下“a”时,屏幕上只显示1个a。2)当你按住“a”一定时间后,屏幕上就开始以“疯狂速度”显示aaaaaaa...了。3)如果只考察任何瞬态,都是“A”键被按下,应该事件处理都是一样的。但是,结果却不是这样。4)这说明,光判断“A”键被按下是不够的,还要看“A”键被按下多久,才能决定调用哪种事件处理函数。上面的这段描述,和数字电路中的时序逻辑电路非常像,电路的输出不仅取决于当前输入(A键按下),还与当前所处的状态有关(A键被“短按”状态和A键被“长按”状态),要对这类应用进行高效编程,流程图是不行的,需要用到传说中的状态机。状态机(StateMachine),也叫有限状态机(FiniteStateMachine),简称状态机。状态机的概念来源于时序逻辑电路,又细分为Mealy状态机和Moore状态机,两者的区别在于是否只根据状态就能得出输出结果。单片机中借用了这两种状态机的思想,引申出“状态中判断事件”和“事件中查询状态”两种单片机状态机的编程方法。下图是一个通用的状态转换图框架,所有状态机都可以基于该框架进行扩展,Event相当于事件检测函数检测出的事件,Action相当于事件处理函数。1)状态中判断事件对上图中的状态机进行编程,可以采用State状态中判断Event事件的方法。这种方法类似于Mealy型状态机(不完全等同),即在switch语句中,还需判断Event才能决定输出的结果。2)事件中查询状态对上图中的状态机进行编程,也可以采用Event事件中查询State状态的方法。这种方法类似于Moore型状态机(不完全等同),在Switch语句中,即无需再判断Event,由当前状态就知道结果。其中if(Event)表达的含义是无论用什么方法,只要能判断Event发生了,并不仅限于字面理解用if查询Event,还包括直接在中断中判断Event的情况。2.两种状态机的区别在时序逻辑电路中,Moore状态机和Mealy状态机都可以用来描述任何状态机,并且两种状态机也可以互相转换。在单片机的编程中,我们刚刚举例,也证明了事件中查询状态和状态中查询事件都可以用来描述状态机。那么这两种方法有什么优缺点呢?1)如果Event直接由中断引发,不需要if语句轮询就能判断,则用Moore型状态机(事件中查询状态)执行速度快。这是因为,只需执行对应Event的switch(State)语句,而且switch中只需对State进行判断就可以输出结果了。2)如果Event本身就需要轮询才能得出,则使用Mealy型状态机(状态中查询事件)的代码要简单。因为状态中查询事件只有一个switch(State)语句。3.硬件设置MSP-EXP430G2开发板上P1.3接了一个按键,P1.0和P1.6接了LED(用跳线帽连接),要求短按P1.3控制LED1的亮灭,长按P1.3控制LED2的亮灭。三.实验设备与器材1.PC机一台;操作系统为WindowsXP(或WindowsNT、Windows98、Windows2000,以下假定操作系统为WindowsXP)。安装CCS软件。2.MSPEXP430G2553launchpad核心实验板一块。3.USB连接电缆一条。四.实验内容与记录1.实验准备(1)连接实验设备检查EXP430G2553launchpad完好。(2)开启设备①接通计算机电源,进入Windows操作系统。②提供的USB电缆的扁平端连接到计算机的USB接口上。(3)启动CodeComposerStudio5双击桌面上“CodeComposerStudio5.5.02.实验步骤仅使用MSP-EXP430G2开发板进行实验插上P1.0和P1.6的LED跳线启动CCS,打开7_3_Key_Long_Short_Mealy工程下载并运行仿真程序短按键,切换LED1亮灭长按键,切换LED2亮灭打开7_4_Key_Long_Short_Moore工程重复以上实验3.源代码Mealy状态机/**Key_Long_Short_Mealy*硬件描述:LaunchpadG2553开发板上P1.3接了一个按键,P1.0和P1.6各接了1个LED(用跳线帽连接)*功能描述:使用状态机判别长短按键,短按键切换LED1状态,长按键切换LED2状态*Createdon:2013-4-8*Author:Administrator*/#include"MSP430G2553.h"//对状态进行宏定义#defineIDLE 0#defineSHORT 1#defineLONG 2#defineCOUNTER_THRESHOLD30 /*长键判别门限*///全局变量unsignedcharWDT_Counter=0; /*用于对按键按下时间进行计数*///在main函数前提前申明函数voidGPIO_init();voidWDT_init();voidKey_SM();unsignedcharLongClick_Dect();voidP13_OnShortRelease();voidP13_OnLongClick();/******为符合阅读习惯,将main函数放最前面,但其他函数就必须提前声明***/voidmain(void){ WDTCTL=WDTPW+WDTHOLD; //关狗 GPIO_init(); WDT_init(); _enable_interrupts(); //开总中断 _bis_SR_register(LPM3_bits); //LPM3休眠}/*******************************************************************************************************名称:GPIO_Init()*功能:设定按键和LED控制IO的方向,启用按键IO的上拉电阻*入口参数:无*出口参数:无*说明:无*范例:无******************************************************************************************************/voidGPIO_init(){ //设定P1.0和P1.6的输出初始值 P1DIR|=BIT0+BIT6; //设定P1.0和P1.6为输出 P1OUT|=BIT0; //设定P1.0初值 P1OUT&=~BIT6; //设定P1.6初值 //配合机械按键,启用内部上拉电阻 P1REN|=BIT3; //启用P1.3内部上下拉电阻 P1OUT|=BIT3; //将电阻设置为上拉}/*******************************************************************************************************名称:WDT_init()*功能:设定WDT定时中断为16ms,开启WDT定时中断使能*入口参数:无*出口参数:无*说明:WDT定时中断的时钟源选择ACLK,可以用LPM3休眠。*范例:无******************************************************************************************************/voidWDT_init(){ //设定WDT为 WDTCTL=WDT_ADLY_16; //WDT中断使能IE1|=WDTIE;}/*******************************************************************************************************名称:WDT_ISR()*功能:响应WDT定时中断服务*入口参数:无*出口参数:无*说明:不能直接判断事件,需启用状态机*范例:无******************************************************************************************************/#pragmavector=WDT_VECTOR__interruptvoidWDT_ISR(void){ //启用按键状态机 Key_SM();}/*******************************************************************************************************名称:Key_SM()*功能:判断出长短键*入口参数:无*出口参数:无*说明:本状态机为Mealy型状态机,在Switch(State)中需要判断事件*范例:无******************************************************************************************************/voidKey_SM(){ staticunsignedcharState; //状态机的状态变量 staticunsignedcharKey_Now; //记录按键的当前电平 unsignedcharKey_Past=0; //记录按键的前一次电平 unsignedcharKey_Dect=0; //按键状态值 Key_Past=Key_Now; //查询IO的输入寄存器 if(P1IN&BIT3) Key_Now=1; else Key_Now=0; //电平前高后低,表明按下 if((Key_Past==1)&&(Key_Now==0)) Key_Dect=1; //电平前低后高,表明按下 if((Key_Past==0)&&(Key_Now==1)) Key_Dect=2; switch(State) //该状态机靠扫描的按键值Key_Dect跳转状态 { caseIDLE: WDT_Counter=0; //空闲状态对计数清零 if(Key_Dect==1) State=SHORT; break; //路径1 caseSHORT: if(Key_Dect==2) //路径2 { State=IDLE; P13_OnShortRelease(); //短按事件处理函数 } if(LongClick_Dect()) //路径3 { State=LONG; P13_OnLongClick(); //长按事件处理函数 } break; caseLONG: WDT_Counter=0; //长按状态对计数清零 if(Key_Dect==2) State=IDLE; break; //路径4 defaul

温馨提示

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

评论

0/150

提交评论