MSP430定时器综合试验

发布者:TP9111最新更新时间:2020-04-19 来源: eefocus关键字:MSP430  定时器  综合试验 手机看文章 扫描二维码
随时随地手机看文章

1.实验目的


学会定时器使用。


2.实验要求


掌握定时器的定时控制编程。


3.实验内容


(1)编写键盘扫描程序。


(2)编写LED显示程序。


(3)用定时器控制8个LED循环显示程序(间隔时间1秒)。


(4)编写用键控制LED灯循环方向,按键可以随时切换。。


#include

#include "Config.h"                     //开发板配置头文件,主要配置IO端口信息



uchar Flag=0;                           //标志位

uchar Time=0;                           //时间计数变量

uchar count=0;

uchar key;

int f = 0;

uint flag_run = 0;

//***********************************************************************

//               MSP430IO口初始化

//***********************************************************************

void Port_Init()

{

  P1SEL = 0x00;                   //P1普通IO功能

  P1DIR = 0xF0;                   //P10~P13输入模式,外部电路已接上拉电阻

  P6DIR  = 0xFF;                      //设置IO口方向为输出

  LED8 = 0xFF;                        //P6口初始设置为FF

}


//***********************************************************************

//             TIMERA初始化,设置为UP模式计数

//***********************************************************************

void TIMERA_Init(void)                                   //连续计数模式,计数到0XFFFF产生中断

{

  TACTL |= TASSEL1 + TACLR + ID0 + ID1 + MC0 + TAIE;     //SMCLK做时钟源,8分频,连续计数模式,计数到0XFFFF,开中断

  CCR0=9999;

}



void LED_ZhengXiang(unsigned char LED_NUM)    //LED从0-7闪烁

{

  switch(LED_NUM)

  {

    case 0: LED8=0xfe; break;

    case 1: LED8=0xfd; break;

    case 2: LED8=0xfb; break;

    case 3: LED8=0xf7; break;

    case 4: LED8=0xef; break;

    case 5: LED8=0xdf; break;

    case 6: LED8=0xbf; break;

    case 7: LED8=0x7f; break;

  }

}



void LED_FanXiang(unsigned char LED_NUM)      //LED从7-0闪烁

{

  switch(LED_NUM)

  {

    case 0: LED8=0x7f; break;

    case 1: LED8=0xbf; break;

    case 2: LED8=0xdf; break;

    case 3: LED8=0xef; break;

    case 4: LED8=0xf7; break;

    case 5: LED8=0xfb; break;

    case 6: LED8=0xfd; break;

    case 7: LED8=0xfe; break;

  }

}



uchar Key_Scan(void) 

{

  uchar key_check;

  uchar key_checkin;

  key_checkin=KeyPort;          //读取IO口状态,判断是否有键按下

  key_checkin&= 0x0F;          //读取IO口状态,判断是否有键按下

  if(key_checkin!=0x0F)            //IO口值发生变化则表示有键按下

    {

      delay_ms(20);                  //键盘消抖,延时20MS

      key_checkin=KeyPort;

      if(key_checkin!=0x1F)

        {  

          key_check=KeyPort;

          switch (key_check & 0x0F)

            {

              case 0x0E:key=1;break;

              case 0x0D:key=2;break;

              case 0x0B:key=3;break;

              case 0x07:key=4;break;

            }

          

        }

      

   }

  else

   {

     key=0xFF;        

   }

  return key;



//***********************************************************************

//             TIMERA中断服务程序,需要判断中断类型

//***********************************************************************

#pragma vector = TIMERA1_VECTOR

__interrupt void Timer_A(void)

{

  switch(TAIV)                                  //需要判断中断的类型

  {

    case 10:count++;break;                         //设置标志位Flag

  }

  if(count==100){

    Flag++;

    count =0; 

    if(f == 1)

        {

          if(flag_run == 1)

          {

            Flag = 8-(Flag%8);

            flag_run = 0;

          }

          LED_ZhengXiang(Flag%8);

        }

        else if(f == 2)

        {

          if(flag_run == 0)

          {

            Flag = 8-(Flag%8);

            flag_run = 1;

          }

          LED_FanXiang(Flag%8);

        }

  }

}









//*************************************************************************

//           主函数

//*************************************************************************

void main(void)

  WDT_Init();                                   //看门狗设置

  Clock_Init();                                 //系统时钟设置

  Port_Init();                                  //端口初始化

  TIMERA_Init();                                //设置TIMERA

  _EINT();

  delay_ms(100);

  while(1)

  {

    Key_Scan();                       //键盘扫描,看是否有按键按下

          if(key == 1 || key == 2)

          {

            f = 1;

          }

          else if(key == 3 || key == 4)

          {

            f = 2;

          }

  }

}

关键字:MSP430  定时器  综合试验 引用地址:MSP430定时器综合试验

上一篇:MSP430 LaunchPad定时器中断(连续模式)
下一篇:launchpad MSP430G2553 软件UART和硬件UART及跳帽的设置

推荐阅读最新更新时间:2024-11-21 15:46

51实现定时器定时调整
随着学习的深入对51的认识也越来越深,尤其对中断的重要性更是深深体会!如果你是和我一样的初学者,请一定要学好中断! 今天来分享一下有关定时器定时补偿的冷知识。 不知道你是否做过这样的实验,就是当你用定时器来定时1ms来实现数码管的自动加1。随着时间的推移,会发现和真正的时间略有偏差。于是就引出了接下来所要讲的。 到底这些值差在哪里呢?主要在三个方面: 进入中断前要进行压栈,即是进行数据保护,这里要耗费几个机器周期 进出中断这个过程也要耗费一定的机器周期 进入中断后的重新赋值也要耗费一定的机器周期 所以累计误差就这么慢慢增加了。 如何补偿呢? 其实思路很简单就是进入debug,看两次中断相差的时间
[单片机]
51实现<font color='red'>定时器</font>定时调整
MSP430单片机的FLASH与存储器结构(3)
1,FLASH操作程序设计 下面我们来学习编程的内容。在学习编程前,我们要先了解一下FLASH存储模块的控制寄存器。 FLASH存储模块的所有操作都通过控制相关的控制寄存器来实现的。包括FCTL1、FCTL2、FCTL3三个控制寄存器,其中FCTL1主要包含对FLASH的编程和擦除操作的控制位;FCTL2主要定义进入时序发生器前的时钟源和分频系数;FCTL3保存FLASH存储模块的一些标志位。 2, FCTL1控制寄存器 FWKEY:FLASH存储模块的安全键值。共8位,对FLASH操作时应该向其中写入对应的安全键值,否则会引起PUC信号以及KEYV信号。0x96:读取时的安全键值;0x5A:写入时的安全键值
[单片机]
<font color='red'>MSP430</font>单片机的FLASH与存储器结构(3)
MSP430系列串口波特率计算方法
MSP430系列,usart模块的波特率值设定是通过以下三个参数决定的:UxBR0,UxBR1,UxMCTL 波特率=BRCLK/N BRCLK:时钟源,可以通过寄存器设定何为时钟源; N:波特率产生的分频因子。N=UxBR1+UxBR0+UxMCTL,其中UxBR1+UxBR0为整数部分,UxMCTL为设定小数部分 举个实例:波特率=2400,时钟源=32.768kHz N=32768/2400=13.65 很明显:UxBR1+UxBR0=13,即UxBR1=0,UxBR0=13,主要是小数部分对于初学者不是很好理解; 首先把小数部分0.65×8,即5.2,取整后为5。这个5的意思就是在UxMCTL中的8位里要有5个1,剩下
[单片机]
PIC 1508 TIM0的定时器使用
使用TIM0的频率计算公式f=FOSC/4/PS/TMR0 (TMR0是TIM0的数据寄存器) void main() { OSCCON = 0x78;//主频率为16M 即FOSC = 16M __delay_ms(50); ANSC6 = 1; TRISC6 = 0; RC6 = 1;//RC6接了一盏LED OPTION_REG = 0xc0; /*TMR0CS = 0(内部指令周期时钟 (F OSC /4)) PSA=0 (预分频器分配给 Timer0 模块) PS=0(1比2分频)如果想要1:1分频,则PSA= 1;*/ TMR0IE = 1;//允许
[单片机]
PIC 1508 TIM0的<font color='red'>定时器</font>使用
msp430在ccsv5下出现的问题总结
内存问题 问题描述,报错: program will not fit into available memory. placement with alignment fails for section .cinit size 0x132 Available memory ranges: 解决方案: 修改优化级别,在property- optimization修改优先级别,注意可能会造成一些参数编译上的优化,可能不容易发现问题。
[单片机]
用555定时器如何设计电容测试仪?
1 引言 随着电子工业的发展,电子元器件急剧增加,电子元器件的适用范围也逐渐广泛起来,在应用中我们常常要测定电容的大小。因此,一种简单、实用的电容测试工具在实际中具有一定的实用价值。一般元件参数的数字化测量是把被测参数转换成频率后再进行测量,本设计采用555为核心的振荡电路,将被测电容值转化为频率,并利用AT89S51处理器测量出频率,再通过该频率值计算出电容参数值。 2 系统的原理框图 系统主要采用了555定时器构成的RC振荡电路和单片机技术。设计思路:被测电容C通过RC振荡转换成频率信号f,送入单片机测频,对该频率进行运算处理求出被测电容的值,并送显示器显示。系统框图如图1所示,其主要由测量电路和控制电路两部分组成。当接入被测
[测试测量]
用555<font color='red'>定时器</font>如何设计电容测试仪?
浅谈STM32F10X芯片SysTick系统时钟定时器
如题,正文如下: 1、介绍 实现Cortex-M3系统定时器SysTick的配置,需要具备以下知识:Cortex-M3系统定时器默认频率是HCLK的8分频(如下图所示),因此需要会RCC时钟的配置;然后配置SysTick系统定时器;编写SysTick中断处理函数。 系统时钟及系统定时器时钟(详见手册) 2、寄存器描述 l SysTick控制及状态寄存器STK_CTRL l SysTick重装载数值寄存器STK_LOAD l SysTick当前数值寄存器STK_VAL l SysTick校准数值寄存器STK_CALIB 与SysTick相关的固件库函数有以下几个: l
[单片机]
基于MSP430行驶车辆检测器的设计
利用环形线圈、MSP430F1121A单片机与输出接口,组成低功耗行驶车辆检测系统,并能根据用户预先设定的灵敏度、工作方式、输出方式进行车辆检测与信号输出。 还应用软件动态刷新基准的方法提高了检测的可靠性和准确性。实验表明:该系统具有结构简单、功耗低、调节方便等优点。 引言 近年来,车辆检测器作为交通信息采集的重要前端部分,越来越受到业内人士的关注。鉴于公路交通现代化管理和城市交通现代化管理的发展需要, 对于行驶车辆的动态检测技术——车辆检测器的研制在国内外均已引起较大重视。车辆检测器以机动车辆为检测目标,检测车辆的通过或存在状况,其作用是为智能交通控制系统提供足够的信息以便进行最优的控制。 目前,常用的行驶车辆检测器主要有磁感应
[应用]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved