p020xx0824547997654704(编辑修改稿)内容摘要:
*/ uchar timer1tflg。 /*定时器定时完成标志 */ /*************************************** 函数名称: void timer0int() interrupt 1 功能描述: 定时器 0 中断用来产生方波 输入: 无 输出: 无 全局变量: TH0,TL0,P5 调用模块: 无 ****************************************/ void timer0int () interrupt 1 { TH0=FreqSandH。 TL0=FreqSandL。 P5 = P5 ^ 0x10。 // change state of } /****************************************** 函数名称: void delay(uchar time) 功能描述: 延时 输入: uchar time: 延时时间长度 输出: 无 全局变量: 无 调用模块: 无 **************************************/ void delay(uchar time) { uchar i。 uint j。 for(i=0。 itime。 i++) for(j=0。 j0x900。 j++)。 } /********************************************** 函数名称: void sound(uint freq) 功能描述: 输入: uint freq: 频率值 长沙理工大学创新实验室 13 输出: 无 全局变量: OSFFEQ,FreqSandH,FreqSandL,TR0,ET0 调用模块: 无 *****************************************/ void Sound(uint freq) { uint timreg。 timreg=65536l(OSFREQ/(24l*freq))。 FreqSandH=timreg/256。 FreqSandL=timregamp。 0x00ff。 TR0=1。 ET0=1。 } /********************************** 函数名称: void Soundoff(void) 功能描述: 停止发声 输入: 无 输出: 无 全局变量: TR0,ET0,P5 调用模块: 无 **********************************************/ void SoundOff(void) { TR0=0。 ET0=0。 //P5 = P5 amp。 0xef。 P5 = P5 | 0x10。 } /*************************************** 函数名称: void GetFreq(uchar ch, uchar flag) 功能描述: 依据音名取对应的频率 输入: uchar ch: 音名 uchar flg: 全音 /半音选择 输出: 返回频率值 全局变量: halfnotename[],notename[],halfnotefreq[],notefreq[] 调用模块: 无 **********************************************/ uint GetFreq(uchar ch,uchar flg) { uchar * pn,i=0。 uint * pf。 if(flg) {pn=halfnotename。 pf=halfnotefreq。 } else {pn=notename。 pf=notefreq。 } 长沙理工大学创新实验室 14 while(1) { if(pn[i]==0) return 0。 if(ch==pn[i]) return pf[i]。 i++。 } } /************************************************* 函 数名称: void PORT_Init(void) 功能描述: 初始化 I/O 输入: 无 输出: 无 全局变量: XBR2,P74OUT 调用模块: 无 ******************************************/ void PORT_Init (void) { XBR2 = 0x40。 /*使能交叉开关和弱上拉 */ P74OUT |= 0xff。 /*使能 P6,P7 推挽输出 */ } void Play(char * str) { uchar i=0,ch,halfflg=0。 uchar lasttime。 uint freq。 /*无效看门狗 */ WDTCN = 0xde。 WDTCN = 0xad。 PORT_Init ()。 OSCICN=0x14。 /*使用内部晶振 */ while(1) { for(。 i++) { ch=str[i]。 /*允许曲谱用空格符 39。 |39。 符,换行回车等分隔以便阅读 */ if((ch==39。 39。 )||(ch==39。 |39。 )||(ch==39。 \r39。 )||(ch==39。 \n39。 )) {i++。 continue。 } if(!ch) {SoundOff()。 return。 } /*乐曲结束则播放完毕 */ if(ch==39。 39。 ) {halfflg=1。 continue。 } /*半音标志 */ if(isdigit(ch)||isalpha(ch)) { freq=GetFreq(ch,halfflg)。 /*从音 名获取频率 */ lasttime=16。 break。 长沙理工大学创新实验室 15 } else {halfflg=0。 continue。 } } i++。 ch=str[i]。 /*从下一个符号获取额外音长符号 */ while(1) { if(!ch) break。 if(isdigit(ch)||isalpha(ch)) break。 /*非音长符号则下次处理 */ if(ch==39。 39。 ) lasttime+=8。 /*额外延时一拍 */ if(ch==39。 .39。 ) lasttime+=4。 /*额外延时半拍 */ if(ch==39。 _39。 ) lasttime/=2。 /*下划线相当于简谱中音名下面的下划线,延时减半 */ if(ch==39。 =39。 ) lasttime/=4。 /*双下划线相当于简谱中音名下面的双下划线,延时减为 1/4*/ i++。 ch=str[i]。 } if(freq!=0) Sound(freq)。 /*发声 */ else SoundOff()。 delay(lasttime)。 /*延时 */ SoundOff()。 delay(1)。 /*两个引之间的间歇 */ } } /* 编谱说明,低音 (简谱中数字下面有一个点的 )1234567 对应的为小写 cdefgab 中音 (简谱中数字上下都没有点的 )1234567 对应的也为 1234567 高音 (简谱中数字上面有一个点的 )1234567 对应的为大写 CDEFGAB 对于降音符 b 或声音符 一律用#+合适的音名例如 5 一个音符本身为一拍,加下划线后为半拍加等号为 1/4 拍 如 :65_ 4= 则音 6 为一拍,音 5 为半拍 ,音 4 为 1/4 拍 下 划线或等号连续书写则音长连续变短 音符后加 或 .表示延长。 ‘ ’延长一拍‘ .’延长半拍多加则延长连续增加 */ void main(void) { //uint i。 TMOD=0x11。 ET0=1。 EA=1。 delay(10)。 while(1) { // Play(1_1_5_5_6_6_5 4_4_3_3_2_2_1 5_5_4_4_3_3_2 5_5_4_4_3_3_21_1_5_5_6_6_5 4_4_3_3_2_2_1)。 /*满天都是小星星 */ 长沙理工大学创新实验室 16 delay(1000)。 delay(10)。 Play(1_2_3_1_ 1_2_3_1_ 3_4_5 3_4_5 5=6=5=4=3_1_ 5=6=5=4=3_1_ 2_g_12_g_1)。 /*两只老虎 */ // delay(1000)。 Play(aa1a2ab1b132aa a3312ab1b13211 555432ab1121233 11_1_1235432b32aa a6656543456543311_1_1235432b32aa)。 /*山楂树 */ delay(1000)。 Play(==2_1_a3)。 /*学习雷锋好榜样 */ delay(1000)。 Play( ==)。 /*团结就是力量 */ delay(1000)。 Play(3 2_3_4_3 3 2_3_4_3 3 4 3_4_5_4 4 32 3 2_3_4_3 3 2_3_4_3 34 3_4_5_4 4 32)。 /*许巍-星空前奏 */ //delay(1000)。 Play(543 3_2_1_2_30 g53 3_2_1_2_30 a65 4_3_2_3_4 1 b a g)。 /*许巍 时光 */ delay(1000)。 Play(g_g_ag 1b g_g_ag 21 g_g_53 1ba 004_4_ 312 11 )。 /*生日快乐 */ delay(1000)。 SoundOff()。 } while(1)。 训练 训练四 定时器 T3 训练 1 训练目的 熟悉定时器 /计数器的原理,练习定时 /计数器的操作与编程 2 训练设备 C8051F 开发平台一台, USB 电缆一条 ,在线调试 PC 机一台。 3 训练内容 学习使用 Silicon Labs 集成 开发环境 IDE 练习使用定时器寄存器的基本操作 4 训练步骤 ( 1)把发光二极管的短路帽接上 ( 2)运行参考程序 5 参考程序 include // SFR declarations // 16bit SFR Definitions for 39。 F02x sfr16 DP = 0x82。 // data pointer sfr16 TMR3RL = 0x92。 // Timer3 reload value 长沙理工大学创新实验室 17 sfr16 TMR3 = 0x94。 // Timer3 counter sfr16 ADC0 = 0xbe。p020xx0824547997654704(编辑修改稿)
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。
用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。