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 <msp430x14x.h>
#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; }
}
void Timer (void)
{
P6OUT ^= BIT7; // Toggle P6.7
delay(1);
}
void delay(int z)
{int x;
for(x=z;x>0;x--);
//for(y=10;y>0;y--);
}
六、总结
通过这次msp430单片机的实验,是我进一步的了解了单片机的远离,虽然在实验过程中遇到了一些问题,但我及时与同学讨论与老师沟通,解决了以上问题。在此次试验中,我充分的了解到了实践的重要性。
第二篇:MSP430流水灯蜂鸣器实验报告
MSP430实验报告
水位报警器
姓名: 丁宇昊
学号: 021210508
一、实验目的:
掌握msp430单片机的程序编写和运行过程。
掌握IAR Embedded Workbench程序的编译和运行。
二、实验内容:
用继电器代替传感器输入模拟电压,用IED灯显示水位高度,当超过预定值时,蜂鸣器响,实现报警。
三、使用串口:
P1口,P2口
四、电路实现:
把继电器作为的AD的输入,通过AD转换,把电压分成16小分,每一份信号控制1个led,通过改变led两端电平高低,控制led亮灭。当到达预定值时,把蜂鸣器的接口设置为高电平。
五、实验代码:
#include <msp430.h>
void delay(int j)
{
do j--;
while (j != 0);
}
int main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC10CTL0 = ADC10SHT_2 + ADC10ON + ADC10IE; // ADC10ON, interrupt enabled ADC10CTL1 = INCH_1+SREF0; // input A1
ADC10AE0 |= BIT7; // PA.1 ADC option select
P1DIR |= BIT0; // Set P1.0 to output direction P1DIR|=BIT4;
P1DIR|=BIT5;
P2DIR|= 0xff;
P2OUT|=0xff;
P2SEL&=0x00;
for (;;)
{
ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start __bis_SR_register(CPUOFF + GIE); // LPM0, ADC10_ISR will force exit if (ADC10MEM > 960)
{
P1OUT |=BIT4;
P1OUT &= ~BIT5;
P2OUT =0xFE;
}
else if(ADC10MEM >900)
{ P1OUT |=BIT4;
P1OUT &= ~BIT5;
P2OUT = 0xfc;
}
else if(ADC10MEM >840)
{ P1OUT |=BIT4;
P1OUT &= ~BIT5;
P2OUT=0xf8;
}
else if(ADC10MEM >780)
{ P1OUT |=BIT4;
P1OUT &= ~BIT5;
P2OUT= 0xf0;
}
else if(ADC10MEM >660)
{ P1OUT |=BIT4;
P1OUT &= ~BIT5;
P2OUT= 0xe0;
}
else if(ADC10MEM >600)
{ P1OUT |=BIT4;
P1OUT &= ~BIT5;
P2OUT= 0xc0; }
else if(ADC10MEM >540) { P1OUT |=BIT4; P1OUT &= ~BIT5; P2OUT= 0x80; }
else if(ADC10MEM >480) { P1OUT |=BIT4; P1OUT &= ~BIT5; P2OUT= 0x00; }
else if(ADC10MEM >420) { P1OUT&=~BIT5; P2OUT=0x00; P1OUT|=BIT4; P2OUT=0x00; delay(20); P1OUT&=~BIT4; P2OUT=0xfe; P1OUT|=BIT5; P2OUT=0xfe; }
else if(ADC10MEM >360) { P1OUT&=~BIT5; P2OUT=0x00; P1OUT|=BIT4; P2OUT=0x00; delay(20); P1OUT&=~BIT4; P2OUT=0xfc; P1OUT|=BIT5; P2OUT=0xfc; }
else if(ADC10MEM >300) {P1OUT&=~BIT5; P2OUT=0x00; P1OUT|=BIT4; P2OUT=0x00; delay(20); P1OUT&=~BIT4; P2OUT=0xf8; P1OUT|=BIT5; P2OUT=0xf8;
}
else if(ADC10MEM >240) { P1OUT&=~BIT5; P2OUT=0x00;
P1OUT|=BIT4;
P2OUT=0x00;
delay(20);
P1OUT&=~BIT4; P2OUT=0xf0;
P1OUT|=BIT5;
P2OUT=0xf0;
}
else if(ADC10MEM >180) { P1OUT&=~BIT5; P2OUT=0x00;
P1OUT|=BIT4;
P2OUT=0x00;
delay(20);
P1OUT&=~BIT4; P2OUT=0xe0;
P1OUT|=BIT5;
P2OUT=0xe0;
}
else if(ADC10MEM >120) { P1OUT&=~BIT5; P2OUT=0x00;
P1OUT|=BIT4;
P2OUT=0x00;
delay(20);
P1OUT&=~BIT4; P2OUT=0xc0;
P1OUT|=BIT5;
P2OUT=0xc0;
P1DIR |=BIT6; P1OUT ^=BIT6;
delay(100);
}
else if(ADC10MEM >60) { P1OUT&=~BIT5; P2OUT=0x00;
P1OUT|=BIT4;
P2OUT=0x00;
delay(20);
P1OUT&=~BIT4;
P2OUT=0x80;
P1OUT|=BIT5;
P2OUT=0x80;
P1DIR |=BIT6;
P1OUT ^=BIT6;
delay(100);
}
else
{ P1OUT&=~BIT5;
P2OUT=0x00;
P1OUT|=BIT4;
P2OUT=0x00;
delay(20);
P1OUT&=~BIT4;
P2OUT=0x00;
P1OUT|=BIT5;
P2OUT=0x00;
P1DIR |=BIT6;
P1OUT ^=BIT6;
delay(100);
}
}
}
// ADC10 interrupt service routine
#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__bic_SR_register_on_exit(CPUOFF); // Clear CPUOFF bit from 0(SR) }
六、总结
通过这次msp430单片机的实验,是我进一步的了解了单片机的远离,虽然在实验过程中遇到了一些问题,但我及时与同学讨论与老师沟通,解决了以上问题。在此次试验中,我充分的了解到了实践的重要性。