PIC16F877A-C语言-音乐

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
unsigned char k, i;
TMR1CS=0;//内部时钟输入,Fosc/4
T1CKPS1=0; T1CKPS0=0;//预分频方式
//TMR1H=timer0h; //TMR1L=timer0l+13; TMR1ON=1;//定时器1使能
TRISB3=0;
//RB3=!RB3;
TMR1IF=0;///定时器1中断标志位 第3页
const unsigned int sszymmh[] = { 6, 2, 3, 5, 2, 1, 3, 2, 2, 5, 2, 2, 1, 3, 2, 6, 2, 1, 5, 2, 1, //一个音符有三个数字。前为第几个音、中为第几个八度、后为时长(以半拍为单位)。 //6, 2, 3 分别代表:6, 中音, 3个半拍; //5, 2, 1 分别代表:5, 中音, 1个半拍; //3, 2, 2 分别代表:3, 中音, 2个半拍; //5, 2, 2 分别代表:5, 中音, 2个半拍; //1, 3, 2 分别代表:1, 高音, 2个半拍; // 6, 2, 4, 3, 2, 2, 5, 2, 1, 6, 2, 1, 5, 2, 2, 3, 2, 2, 1, 2, 1, 6, 1, 1, 5, 2, 1, 3, 2, 1, 2, 2, 4, 2, 2, 3, 3, 2, 1, 5, 2, 2, 5, 2, 1, 6, 2, 1, 3, 2, 2, 2, 2, 2, 1, 2, 4, 5, 2, 3, 3, 2, 1, 2, 2, 1, 1, 2, 1, 6, 1, 1, 1, 2, 1, 5, 1, 6, 0, 0, 0};
//高音 234567
0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF //超高音 1234567
};
const unsigned char FREQL[] =
{
0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6, //低音1234567
0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i
0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,
//高音 234567
0x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16}; //超高音 1234567
//////////////////////////////////////////////////////////////////////////////// ////// void delay(unsigned char t) //延时程序,控制发音的时间长度120ms(1/4拍) {
unsigned char a,b,c; while(t--) //四重循环, 共延时t个1/4拍
/////////////////T1中断程序,控制发音的音调 ///////////////////////////////////////////////
void interrupt ISR(void) {
if(TMR1IF==1) { TMR1IF=0; TMR1ON=0;
RB3=!RB3;//输出方波, 发音
/////PIC16F877A///////////////// /////RB3输出///////////////////
#include <pic.h>
__CONFIG(HS&WDTDIS&LVPDIS);
unsigned char timer0h, timer0l, time;
const unsigned char FREQH[] =
TMR1H=timer0h; TMR1L=timer0l+5; //下次的中断时间, 这个时间, 控制音调高低
TMR1ON=1;//启动T0
} } //////////////////////////////////////////////////////////////////////////////// /////////
{
0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8, //低音1234567
0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i
0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,
PIC16F877A-C语言-音乐
TMR1IE=1;//定时器1中断允许
PEIE=1;//开外设中断
GIE=1;//开总中断
while(1) { i = 0; time = 1;
while(time) { k = sszymmh[i] + 7 * sszymmh[i + 1] - 1;//第i个是音符, 第i+1个 是第几个八度
TMR1ON=0;//关闭T0, 停止发音
}
*/
//////////////////////////////////////////////////////////////////////////////// ///////////
/////// void song() {
//演奏一个音符
TMR1H=timer0h; TMR1L=timer0l+5; //控制音调
{ for(c=193;c>0;c--)//for(c=193;c>0;c--) for(b=114;b>0;b--)//for(b=114;b>0;b--) for(a=1;a>0;a--); } TMR1ON=0; //延时期间, 可进入T0中断去发音
//TR0 = 0; //关闭T0, 停止发音 } ////////////////////////////////////////////////////////////////////////////////
PIC16F877A-C语言-音乐
///////////////////////////////////// ////PIC16F877A////////////////////// //////////////////////////////////////////// ////测试通过////////////////////////////// ////////////////////////////////////////////// //在网上找的都是51的音乐程序, //自己小小的修改了一下, ////在PIC16F877A测试通过, ///需要改成其他歌曲请修改const unsigned int sszymmh[]函数
timer0h = FREQH[k];
//从数据表中读出频率数值
timer0l = FREQL[k];
//实际上, 是定时的时间长度
time = sszymmh[i + 2]; //读出时间长度数值
i += 3;
song();
//发出一个音符
}
}
}
第4页
/* void delay(unsigned char t)
//延时程序,控制发音的时间长度 第2页
PIC16F877A-C语言-音乐 {
unsigned char t1; unsigned long t2; for(t1 = 0; t1 < t; t1++) //双重循环, 共延时t个半拍
for(t2 = 0; t2 < 8000; t2++); //延时期间, 可进入T0中断去发音
///const unsigned char Birthday[]= 第1页
PIC16F877A-C语言-音乐
/* const unsigned char sszymmh[] = { 5,1,2, 5,1,2, 6,1,4, 5,1,4, 1,2,4, 7,1,8, 5,1,2, 5,1,2, 6,1,4, 5,1,4, 2,2,4, 1,2,8, 5,1,2, 5,1,2, 5,2,4, 3,2,4, 1,2,4, 7,1,4, 6,1,4, 4,2,2, 4,2,2, 3,2,4, 1,2,4, 2,2,4, 1,2,4, 0,0,0}; */
TMR1ON=1;
//启动T0, 由T0输出方波去发音
delay(time);
//控制时间长度
Baidu Nhomakorabea
}
////////////////////////////////////////////////////////////////////////////////
///////////
////////
void main(void) {
相关文档
最新文档