MSP430流水灯蜂鸣器实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MSP430实验报告

姓名:

学号:

一、实验目的:

掌握msp430单片机的程序编写和运行过程。

掌握IAR Embedded Workbench程序的编译和运行。

二、实验内容:

实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动",同时每改变一次流水方式,蜂鸣器响一次。

三、使用串口:

P2口,P6口

四、蜂鸣器实现:

通过定义Timer()函数,并在每次改变流水方式时调用Timer()函数,通过对p6接口的设置,来达到蜂鸣器声音的实现。

五、实验代码:

//BoardConfig.h//

typedef unsigned char uchar;

typedef unsigned int uint;

//控制位的宏定义

#define Ctrl_Out P3DIR |= BIT3 + BIT6 + BIT7;

#define Ctrl_0 P3OUT &= ~(BIT3 + BIT6 + BIT7)

#define SRCLK_1 P3OUT |= BIT7

#define SRCLK_0 P3OUT &= ~BIT7

#define SER_1 P3OUT |= BIT6

#define SER_0 P3OUT &= ~BIT6

#define RCLK_1 P3OUT |= BIT3

#define RCLK_0 P3OUT &= ~BIT3

//板上资源配置函数

void BoardConfig(uchar cmd)

{

uchar i;

Ctrl_Out;

Ctrl_0;

for(i = 0; i < 8; i++)

{

SRCLK_0;

if(cmd & 0x80) SER_1;

else SER_0;

SRCLK_1;

cmd <<= 1;

}

RCLK_1;

_NOP();

RCLK_0;

}

主函数:

#include

#include "BoardConfig.h"

void Timer (void);

void delay(int z);

uint i = 0,j = 0,dir = 0;uchar step = 0xff;

uint flag = 0,speed = 0; //flag--灯光流动方式,speed--灯光流动速度

void main(void)

{

WDTCTL = WDTPW + WDTHOLD; //关闭看门狗

BoardConfig(0xf0);

CCTL0 = CCIE; //使能CCR0中断

CCR0 = 50000;

TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式

P2DIR = 0xff; //设置P2口方向为输出

P2OUT = 0xff;

P6DIR |= BIT7; //蜂鸣器对应IO设置为输出

_EINT(); //使能全局中断

LPM0; //CPU进入LPM0模式

}

函数名称:Timer_A

功能:定时器A的中断服务函数,在这里通过标志

控制流水灯的流动方向和流动速度

参数:无

返回值:无

#pragma vector = TIMERA0_VECTOR

__interrupt void Timer_A (void)

{

if(flag == 0)

{

P2OUT = ~(0x80>>(i++)); //灯的点亮顺序D8 -> D1

}

else if(flag == 1)

{

P2OUT = ~(0x01<<(i++)); //灯的点亮顺序D1 -> D8

}

else

{

if(dir) //灯的点亮顺序 D8 -> D1,D1 -> D8,循环绕圈

{

P2OUT = ~(0x80>>(i++));

}

else

{

P2OUT = ~(0x01<<(i++));

}

}

if(i == 8)

{

i = 0;

dir = ~dir;

}

j++;

if(j == 8)

{ Timer();

i = 0;

j = 0;

flag++;

if(flag == 4) flag = 0;

switch(speed)

{

case 0:

TACTL &=~ (ID0 + ID1); TACTL |= ID_3;

break;

case 1:

TACTL &=~ (ID0 + ID1); TACTL |= ID_2;

break;

case 2:

TACTL &=~ (ID0 + ID1); TACTL |= ID_1;

break;

case 3:

TACTL &=~ (ID0 + ID1); TACTL |= ID_0;

break;

default:

break;

}

if(flag != 3) speed++; if(speed == 4) speed = 0; }

相关文档
最新文档