📄 cpa.c
字号:
//design by 非常qq
#include "msp430xw42x.h"
unsigned int tone_dl; //定义全局变量
unsigned char jiepai;
const unsigned int tone_frq[] =
{ 0,
//低音
16384/262, 16384/277, 16384/294, 16384/311, 16384/330,16384/349,
16384/370, 16384/392,16384/415,16384/440, 16384/466, 16384/494,
//中音
16384/523, 16384/554, 16384/578, 16384/622, 16384/659, 16384/698,
16384/740, 16384/784, 16384/831, 16384/880, 16384/932, 16384/988,
//高音
16384/1046,16384/1109,16384/1175,16384/1245,16384/1318,16384/1397,
16384/1480,16384/1568,16384/1661,16384/1760,16384/1865,16384/1976};
//音乐简谱定义
//低音
#define L1 1 //低音DO
#define L_1 2 //半音DO,用于升调/降调
#define L2 3 //以下以此类推
#define L_2 4
#define L3 5
#define L4 6
#define L_4 7
#define L5 8
#define L_5 9
#define L6 10
#define L_6 11
#define L7 12
//中音
#define M1 13
#define M_1 14
#define M2 15
#define M_2 16
#define M3 17
#define M4 18
#define M_4 19
#define M5 20
#define M_5 21
#define M6 22
#define M_6 23
#define M7 24
//高音
#define H1 25
#define H_1 26
#define H2 27
#define H_2 28
#define H3 29
#define H4 30
#define H_4 31
#define H5 32
#define H_5 33
#define H6 34
#define H_6 35
#define H7 36
//节拍定义,以四分音符为一拍,1/4拍为187ms
#define P1 176 //4
#define P1D 254 //6
#define P2 88 //2
#define P2D 132 //3
#define P4 44 //1
#define P4D 66 //1+1/2
#define P8 22 //1/2
#define P8D 33 //3/4
#define P16 11 //1/4
#define P16D 16 //3/8
#define P32 5 //1/8
//歌曲数据库
const unsigned char music_dt1[100][2] =
{
{H1,P8},{0,P32},{H1,P8},{0,P32},{H1,P8},{0,P32},{M5,P16},{0,P32},{M6,P16},{0,P32},{M5,P16},{0,P32},{M6,P8},{0,P32},{M3,P8},{0,P16},{M3,P2},{0,P16},//波斯猫眯着她的双眼
{M6,P8},{0,P32},{M6,P8},{0,P32},{M6,P8},{0,P32},{M5,P16},{0,P32},{M3,P16},{0,P32},{M5,P16},{0,P32},{M3,P8},{0,P32},{M2,P8},{0,P16},{M2,P2},{0,P16},//波斯冒踮者她的脚尖
{H1,P8},{0,P32},{H1,P8},{0,P32},{H1,P8},{0,P32},{M5,P16},{0,P32},{M6,P16},{0,P32},{M5,P16},{0,P32},{M6,P8},{0,P32},{M3,P8},{0,P16},{M3,P2},{0,P16},//波斯猫守着她的爱恋
{M2,P8},{0,P32},{M6,P16D},{0,P32},{M3,P4},{0,P16},{M3,P16},{0,P32},{M3,P16},{0,P32},{M5,P16D},{0,P32},{M6,P8},{0,P32},{M6,P8},{0,P16},{M6,P2},{0,P16}//一转眼确又看不见
};
//看门狗中断用于控制每一节拍的时长
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
tone_dl++;
}
#pragma vector=TIMERA0_VECTOR //定时器1中断服务程序,翻转P4.3, P4.2口的状态
__interrupt void TIMEA0(void)
{
P4OUT^=BIT3;
P4OUT^=BIT2;
}
void sound(void)//将得到的数据转化为声音信号
{
unsigned int i;
for(i=0;i<80;i++)
{
CCR0=tone_frq[music_dt1[i][0]];//值到ccr0时候产生中断。
jiepai=music_dt1[i][1];
while(tone_dl<jiepai);//每一拍的时间延时控制
if(tone_dl>=jiepai)
tone_dl=0;
}
}
void main(void)
{
while(1)
{
_EINT();
P4OUT=0;
P4OUT=BIT2;//BIT2和BIT3的状态始终为相反(为产生矩形波)
P4DIR|=BIT2+BIT3;
TACTL=TASSEL0+TACLR;// ALK. Clear TAR
CCTL0=CCIE;//CCRO中断允许
CCR0=0;
TACTL|=MC0;//增记数
WDTCTL=(WDTPW+WDTTMSEL+WDTCNTCL+WDTSSEL+WDTIS1);//定义1ms中断一次。。
IE1|=WDTIE;//看门狗中断使能
sound();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -