为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

外围电路

2017-10-25 10页 doc 62KB 18阅读

用户头像

is_977556

暂无简介

举报
外围电路外围电路 #include #include #include #ifndef __SOUNDPLAY_H_REVISION_FIRST__ //音乐相关 #define __SOUNDPLAY_H_REVISION_FIRST__ //音乐相关 #define uint unsigned int #define uchar unsigned char void nl(); //农历 /*定义全局变量---------------------------------------------------...
外围电路
外围电路 #include #include #include #ifndef __SOUNDPLAY_H_REVISION_FIRST__ //音乐相关 #define __SOUNDPLAY_H_REVISION_FIRST__ //音乐相关 #define uint unsigned int #define uchar unsigned char void nl(); //农历 /*定义全局变量---------------------------------------------------------------*/ uchar sec,min,hour, day, date, month,year,cen,r1_h,r1_m,r1_of,r2_h,r2_m,r2_of; data uchar year_moon,month_moon,date_moon,cen_m,week; uint bt,rt,rr,rtt,rrt; bit c_moon; //农历 世纪 bit c; //公历 世纪 bit w = 0; //调时标志位 bit r = 0; //调整闹铃 /*定义12864液晶屏数据线------------------------------------------------------*/ sbit LCM_RS = P1^6; //模式位,为0输入指令,为1输入数据 sbit LCM_RW = P1^7; //读写位,为0读,为1写 sbit LCM_EN = P3^3; //使能位 sbit LCM_BLA = P1^5; #define Lcd_Bus P0 //LCM12864数据总线 /*定义DS12CR887数据线--------------------------------------------------------*/ sbit DS_CS = P3^5; sbit DS_AS = P3^4; sbit DS_RW = P3^6; sbit DS_DS = P3^7; #define Ds_Bus P2 //DS12CR887数据总线 /*定义按键-------------------------------------------------------------------*/ sbit K1 = P1^3; //K1-设置 sbit K2 = P1^0; //K2-确认 sbit K3 = P1^2; //K3-加 sbit K4 = P1^1; //K4-减 /*定义DS18B20数据线----------------------------------------------------------*/ sbit DQ = P3^0; /*定义蜂鸣器-----------------------------------------------------------------*/ sbit beep = P3^1; /*定义累加器A中的各位--------------------------------------------------------*/ sbit a0 = ACC ^ 0; sbit a1 = ACC ^ 1; sbit a2 = ACC ^ 2; sbit a3 = ACC ^ 3; sbit a4 = ACC ^ 4; sbit a5 = ACC ^ 5; sbit a6 = ACC ^ 6; sbit a7 = ACC ^ 7; /* */ #define SYSTEM_OSC 12000000 //定义晶振频率12000000HZ #define SOUND_SPACE 4/5 //定义普通音符演奏的长度分率,// 每4分音符间隔 unsigned int code FreTab[12] = { 262,277,294,311,330,349,369,392,415,440,466,494 }; //原始频率表 unsigned char code SignTab[7] = { 0,2,4,5,7,9,11 }; //1~7在频率表中的位置 unsigned char code LengthTab[7]= { 1,2,4,8,16,32,64 }; unsigned char Sound_Temp_TH0,Sound_Temp_TL0; //音符定时器初值暂存 unsigned char Sound_Temp_TH1,Sound_Temp_TL1; //音长定时器初值暂存 /*延时程序-------------------------------------------------------------------*/ //延时函数 1MS/次 void DelayM(uint a) { uchar i; while( --a != 0) { for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。 } //i 从0加到125,CPU大概就耗时1毫秒 } //延时函数 void Delay(int num) { while(num--); } void InitialSound(void) //音乐相关 { beep = 0; Sound_Temp_TH1 = (65535-(1/1200)*SYSTEM_OSC)/256; // 计算TL1应装入的初值 (10ms的初装值) Sound_Temp_TL1 = (65535-(1/1200)*SYSTEM_OSC)%256; // 计算TH1应装入的初值 TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TMOD |= 0x11; ET0 = 1; ET1 = 0; TR0 = 0; TR1 = 0; EA = 1; } void BeepTimer0(void) interrupt 1 //音符发生中断 { beep = !beep; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0; } //************************************************************************** void Play(unsigned char *Sound,unsigned char Signature,unsigned Octachord,unsigned int Speed) { unsigned int NewFreTab[12]; //新的频率表 unsigned char i,j; unsigned int Point,LDiv,LDiv0,LDiv1,LDiv2,LDiv4,CurrentFre,Temp_T,SoundLength; //Point 指针索引值 //LDiv 音音符演奏的长度(多少个10ms) //LDiv0 1分音符的长度(几个10ms)即一个节拍 //LDiv4 4分音符的长度 //CurrentFre 查出对应音符的频率 //SoundLength歌曲长度 //Temp_T计算计数器初值 unsigned char Tone,Length,SL,SH,SM,SLen,XG,FD; //Tone音调 //Length音长 //SL音符 //SM高低音 //SH是否升半 //XG音符类型(0普通1连音2顿音) for(i=0;i<12;i++) // 根据调号及升降八度来生成新的频率表 { j = i + Signature; if(j > 11) { j = j-12; NewFreTab[i] = FreTab[j]*2; } else NewFreTab[i] = FreTab[j]; if(Octachord == 1) NewFreTab[i]>>=2; else if(Octachord == 3) NewFreTab[i]<<=2; } SoundLength = 0; while(Sound[SoundLength] != 0x00) //计算歌曲长度 { SoundLength+=2; } Point = 0; Tone = Sound[Point]; Length = Sound[Point+1]; // 读出第一个音符和它时时值 LDiv0 = 12000/Speed; // 算出1分音符的长度(几个10ms) LDiv4 = LDiv0/4; // 算出4分音符的长度 LDiv4 = LDiv4-LDiv4*SOUND_SPACE; // 普通音最长间隔标准 TR0 = 0; TR1 = 1; while(Point < SoundLength) { SL=Tone%10; //计算出音符 SM=Tone/10%10; //计算出高低音 SH=Tone/100; //计算出是否升半 CurrentFre = NewFreTab[SignTab[SL-1]+SH]; //查出对应音符的频率 if(SL!=0) { if (SM==1) CurrentFre >>= 2; //低音 if (SM==3) CurrentFre <<= 2; //高音 Temp_T = 65536-(50000/CurrentFre)*10/(12000000/SYSTEM_OSC);//计算计数器初值 Sound_Temp_TH0 = Temp_T/256; Sound_Temp_TL0 = Temp_T%256; TH0 = Sound_Temp_TH0; TL0 = Sound_Temp_TL0 + 12; //加12是对中断延时的补偿 } SLen=LengthTab[Length%10]; //算出是几分音符 XG=Length/10%10; //算出音符类型(0普通1连音2顿音) FD=Length/100; LDiv=LDiv0/SLen; //算出连音音符演奏的长度(多少个10ms) if (FD==1) LDiv=LDiv+LDiv/2; if(XG!=1) if(XG==0) //算出普通音符的演奏长度 if (SLen<=4) LDiv1=LDiv-LDiv4; else LDiv1=LDiv*SOUND_SPACE; else LDiv1=LDiv/2; //算出顿音的演奏长度 else LDiv1=LDiv; if(SL==0) LDiv1=0; LDiv2=LDiv-LDiv1; //算出不发音的长度 if (SL!=0) { TR0=1; for(i=LDiv1;i>0;i--) //发规定长度的音 { while(TF1==0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; } } if(LDiv2!=0) { TR0=0; beep=0; for(i=LDiv2;i>0;i--) //音符间的间隔 { while(TF1==0); TH1 = Sound_Temp_TH1; TL1 = Sound_Temp_TL1; TF1=0; } } Point+=2; Tone=Sound[Point]; Length=Sound[Point+1];
/
本文档为【外围电路】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索