MSP430流水灯蜂鸣器实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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; }