单片机课程设计报告————按键控制定时器选播多段音乐 【摘要】 本课程设计是按键控制定时器选择多段音乐,以AT89S52 统的操作核心,以一个数码管显示播放音乐的序号,通过按键来选择音乐(本课程设计中含3 首音乐)。 硬件设计方案 单片机及晶振模块该设计选用的是Atmel 公司生产的AT89S52 型单片机,由石英晶体振 荡器产生单片机工作时所需的时钟信号,振荡器采用的是12M的晶振,使 其机器周期为1us,方便发音程序的计算和编译。 AT89S52 是一种低功耗、高性能CMOS8 位微控制器,具有 8K 在系统可编程Flash 存储器。使用Atmel 公司高密度非易失性存储器技 术制造,与工业 80C51 产品指令和引脚完全兼容。片上 Flash 允许程序存 储器在系统可编程,亦适于常规编程器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得AT89S52 为众多嵌入式控制应用系统提供高灵 活、超有效的解决方案。 AT89S52 具有以下标准功能: 8k 字节Flash,256 字节RAM, 32 口线,看门狗定时器,2个数据指针,三个16 位定时器/计数器, 一个 级中断结构,全双工串行口,片内晶振及时钟电路。另外,AT89S52 可降至0Hz 静态逻辑操作,支持2 种软件可选择节电模式。空闲 模式下,CPU 停止工作,允许 RAM、定时器/计数器、串口、中断继续工 作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作 停止,直到下一个中断或硬件复位为止。 AT89S52 的引脚分布: 2.数码管显示模块 该部分只用了一个数码管,用来显示播放的音乐序列,数码管的 管脚都接了1K的上拉电阻。数码管显示的歌曲序列为0,1,2。 3.按键控制模块 此模块只用了两个按键,按键K1 用来控制歌曲的开始和停止,接P1.0 口,按键K2 用于选择歌曲,接P3.2 口。按下K1,开始播放音乐,随着改 变数码管的显示值(0、1、2),将出现对应的音乐。 4.扬声器模块 扬声器上接了一个三极管,用于放大声音。 程序如下: #include #include #define uchar unsigned char #define uint unsigned int sbit K1=P1^0; //播放和停止键 sbit SPK=P3^7; //蜂鸣器 uchar Song_Index=0,Tone_Index=0; //当前音乐段索引,音符索引 //数码管段码表 uchar code DSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //标准音符频率对应的延时表 uchar code HI_LIST[]={0,226,229,232,233,236,238,240,241,242,244,245,246,247,248}; uchar code LO_LIST[]={0,4,13,10,20,3,8,6,2,23,5,26,1,4,3}; //三段音乐的音符 uchar code Song[][50]= //三段音乐的节拍uchar code Len[][50]= //外部中断0void EX0_INT() interrupt TR0=0;//播放结束或者播放中途切换歌曲时停止播放 Song_Index=(Song_Index+1)%3; //跳到下一首的开头 Tone_Index=0; P2=DSY_CODE[Song_Index]; //数码管显示当前音乐段号 //定时器0中断函数void T0_INT() interrupt TL0=LO_LIST[Song[Song_Index][Tone_Index]];TH0=HI_LIST[Song[Song_Index][Tone_Index]]; SPK=~SPK; //延时void DelayMS(uint ms) while(ms--)for(t=0;t