1、单片机竞赛论文 电子琴1一、设计任务应用单片机制作一个电子音乐琴,使其能够弹奏音乐。二、要求1、基本要求: 1、具有七个基本键。(1 2 3 4 5 6 7) 2、音调输出清晰正确。2、发挥部分: 1、扩展出高、低各7个音符键。 2、使其具有延音效果。 3、具有乐谱回放功能。 总 体 概 述本设计采用AT89S52单片机作为整个系统的控制核心,具有:音乐琴, 电子钟, LED阵列扫描显示, 液晶字符显示, 循环彩灯 五个模块。音乐琴采用4X4矩阵键盘为输入键盘,共有十六个基本音, 并与其他功能组合, 具有一定的实用性与趣味性, 较好的完成题目要求。关键词:单片机 矩阵键盘 频率 。一、音乐琴系
2、统。1. 电路原理图 2 系统板硬件连线 1 把“单片机系统”区域中的 P1.0 端口用导线连接到“音频放大模块”区域中的 SPK IN 端口上; 2 把“单片机系统“区域中的 P3.0 P3.7 端口用 8 芯排线连接到“ 4X4 行列式键盘”区域中的 C1 C4 R1 R4 端口上; 3 相关程序内容 音乐产生的方法; 一首音乐是许多不同的音阶组成的,而每个音阶对应着不同的频率,这样我们就可以利用不同的频率的组合,即可构成我们所想要的音乐了,当然对于单片机来产生不同的频率非常方便,我们可以利用单片机的定时 / 计数器 T0 来产生这样方波频率信号,因此,我们只要把一首歌曲的音阶对应频率关系
3、弄正确即可。现在以单片机 12MHZ 晶振为例,例出高中低音符与单片机计数 T0 相关的计数值如下表所示 音符 频率( HZ ) 简谱码( T 值) 音符 频率( HZ ) 简谱码( T 值) 低 1 DO 262 63628 # 4 FA# 740 64860 #1 DO# 277 63731 中 5 SO 784 64898 低 2 RE 294 63835 # 5 SO# 831 64934 #2 RE# 311 63928 中 6 LA 880 64968 低 3 M 330 64021 # 6 932 64994 低 4 FA 349 64103 中 7 SI 988 65030 #
4、 4 FA# 370 64185 高 1 DO 1046 65058 低 5 SO 392 64260 # 1 DO# 1109 65085 # 5 SO# 415 64331 高 2 RE 1175 65110 低 6 LA 440 64400 # 2 RE# 1245 65134 # 6 466 64463 高 3 M 1318 65157 低 7 SI 494 64524 高 4 FA 1397 65178 中 1 DO 523 64580 # 4 FA# 1480 65198 # 1 DO# 554 64633 高 5 SO 1568 65217 中 2 RE 587 64684 #
5、5 SO# 1661 65235 # 2 RE# 622 64732 高 6 LA 1760 65252 中 3 M 659 64777 # 6 1865 65268 中 4 FA 698 64820 高 7 SI 1967 65283 下面我们要为这个音符建立一个表格,有助于单片机通过查表的方式来获得相应的数据 低音 0 19 之间,中音在 20 39 之间,高音在 40 59 之间 TABLE: DW 0,63628,63835,64021,64103,64260,64400,64524,0,0 DW 0,63731,63928,0,64185,64331,64463,0,0,0 DW 0
6、,64580,64684,64777,64820,64898,64968,65030,0,0 DW 0,64633,64732,0,64860,64934,64994,0,0,0 DW 0,65058,65110,65157,65178,65217,65252,65283,0,0 DW 0,65085,65134,0,65198,65235,65268,0,0,0 DW 0 2 、音乐的音拍,一个节拍为单位( C 调) 曲调值 DELAY 曲调值 DELAY 调 4/4 125ms 调 4/4 62ms 调 3/4 187ms 调 3/4 94ms 调 2/4 250ms 调 2/4 125m
7、s 对于不同的曲调我们也可以用单片机的另外一个定时 / 计数器来完成。 下面就用 AT89S51 单片机产生一首“生日快乐”歌曲来说明单片机如何产生的。 在这个程序中用到了两个定时 / 计数器来完成的。其中 T0 用来产生音符频率, T1 用来产生音拍。 4 程序框图 5 汇编源程序 KEYBUF EQU 30H STH0 EQU 31H STL0 EQU 32H TEMP EQU 33H ORG 00H LJMP START ORG 0BH LJMP INT_T0 START: MOV TMOD,#01H SETB ET0 SETB EA WAIT: MOV P3,#0FFH CLR P3.
8、4 MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY1 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK1 MOV KEYBUF,#0 LJMP DK1 NK1: CJNE A,#0DH,NK2 MOV KEYBUF,#1 LJMP DK1 NK2: CJNE A,#0BH,NK3 MOV KEYBUF,#2 LJMP DK1 NK3: CJNE A,#07H,NK4 MOV KEYBUF,#3 LJMP DK1 NK4: NOP D
9、K1: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK1A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK1A CLR TR0 NOKEY1: MOV P3,#0FFH CLR P3.5 MOV
10、A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY2 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK5 MOV KEYBUF,#4 LJMP DK2 NK5: CJNE A,#0DH,NK6 MOV KEYBUF,#5 LJMP DK2 NK6: CJNE A,#0BH,NK7 MOV KEYBUF,#6 LJMP DK2 NK7: CJNE A,#07H,NK8 MOV KEYBUF,#7 LJMP DK2 NK8: NOP DK2: MO
11、V A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK2A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK2A CLR TR0 NOKEY2: MOV P3,#0FFH CLR P3.6 MOV A,P3 A
12、NL A,#0FH XRL A,#0FH JZ NOKEY3 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY3 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK9 MOV KEYBUF,#8 LJMP DK3 NK9: CJNE A,#0DH,NK10 MOV KEYBUF,#9 LJMP DK3 NK10: CJNE A,#0BH,NK11 MOV KEYBUF,#10 LJMP DK3 NK11: CJNE A,#07H,NK12 MOV KEYBUF,#11 LJMP DK3 NK12: NOP DK3:
13、MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK3A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK3A CLR TR0 NOKEY3: MOV P3,#0FFH CLR P3.7 MOV A,P3
14、 ANL A,#0FH XRL A,#0FH JZ NOKEY4 LCALL DELY10MS MOV A,P3 ANL A,#0FH XRL A,#0FH JZ NOKEY4 MOV A,P3 ANL A,#0FH CJNE A,#0EH,NK13 MOV KEYBUF,#12 LJMP DK4 NK13: CJNE A,#0DH,NK14 MOV KEYBUF,#13 LJMP DK4 NK14: CJNE A,#0BH,NK15 MOV KEYBUF,#14 LJMP DK4 NK15: CJNE A,#07H,NK16 MOV KEYBUF,#15 LJMP DK4 NK16: NOP
15、 DK4: MOV A,KEYBUF MOV DPTR,#TABLE MOVC A,A+DPTR MOV P0,A MOV A,KEYBUF MOV B,#2 MUL AB MOV TEMP,A MOV DPTR,#TABLE1 MOVC A,A+DPTR MOV STH0,A MOV TH0,A INC TEMP MOV A,TEMP MOVC A,A+DPTR MOV STL0,A MOV TL0,A SETB TR0 DK4A: MOV A,P3 ANL A,#0FH XRL A,#0FH JNZ DK4A CLR TR0 NOKEY4: LJMP WAIT DELY10MS: MOV
16、R6,#10 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET INT_T0: MOV TH0,STH0 MOV TL0,STL0 CPL P1.0 RETI TABLE: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H DB 7FH,6FH,77H,7CH,39H,5EH,79H,71H TABLE1: DW 64021,64103,64260,64400 DW 64524,64580,64684,64777 DW 64820,64898,64968,65030 DW 65058,65110,65157,65178 END 二、时钟系统1
17、 原理图2 工作原理利用单片机89S52作为本系统的中控模块。电路设有四个按键,一个为功能选择开关,能够选择调节时间、日期、第一个闹钟、第二个闹钟;第二个为“加”按钮,能够实现数字的累加;第三个为“减”按钮,能够实现数字的递减;第四个为确定选择开关。电路程序取用单片机内部其中一个定时中断系统作为基准秒频,这样能够使CPU达到最大利用。功能调节时显示电路仍然能够达到同步显示。当调节的闹钟时间与时钟显示的时间相等时,声光报警电路动作,取用LM386能够放大单片机输出的音频信号,推动扬声器发出乐耳的音乐,时钟程序的整体设计方案是用单片机驱动电路控制时钟显示,为显示提供电源,用软件程序控制时种运行和各
18、种调节功能。三、LED列阵扫描显示系统1.原理图2 系统板硬件连线 我们把行列总线接在单片机的i0口,然后把上面分析到的扫描代码送入总线,就可以得到显示的汉字了。在这个例子里,由于一共用到16行,16列,如果将其全部接入89c51单片机,一共使用32条io口,这样造成了io资源的耗尽,系统也再无扩充的余地。实际应用中我们使用4-16线译码器74ls154来完成列方向的显示。而行方向16条线则接在p0口和p2口。3 相关C程序内容 #include unsigned char code tab=0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f; unsigned c
19、har code graph38=0x12,0x14,0x3c,0x48,0x3c,0x14,0x12,0x00, 0x00,0x00,0x38,0x44,0x44,0x44,0x38,0x00, 0x30,0x48,0x44,0x22,0x44,0x48,0x30,0x00 ; unsigned char count; unsigned char cnta; void main(void) unsigned char i,j; TMOD=0x01; TH0=(65536-4000)/256; TL0=(65536-4000)%256; TR0=1; ET0=1; EA=1; while(1)
20、 if(P2_0=0) for(i=5;i0;i-) for(j=248;j0;j-); if(P2_0=0) count+; if(count=3) count=0; while(P2_0=0); void t0(void) interrupt 1 using 0 TH0=(65536-4000)/256; TL0=(65536-4000)%256; P3=tabcnta; P1=graphcountcnta; cnta+; if(cnta=8) cnta=0; 四:LCD字符显示1 C程序:#include#define uchar unsigned charsbit rs=P12;sbi
21、t rw=P11;sbit e=P10;delay(uchar time)while(time0) time-;void enrw()rs=0; rw=0; e=0; delay(250); e=1;write_data(uchar c)P2=c; rs=1; rw=0; e=0; delay(250); e=1;init_lcd(void)/初始化P2=0x01;/清屏幕enrw();P2=0x38;/数据长度为8位,双行显示,5*7字符。enrw();P2=0x0c;/打开显示开关enrw();P2=0x06;/地址计数递增,显示屏不移动enrw();write_cmd(uchar m)/
22、写命令,注意与写数据的区别 P2=m; enrw();position(uchar row,uchar colum)/写位置uchar p; if(row=1) p=0x82+colum-1; else p=0xC0+colum-1; write_cmd(p);display(uchar *s)/写字符串,简单的指针应用for(;*s!=0;s+) write_data(*s);void main()unsigned int m,n; m=1; n=2; init_lcd(); position(m,1); display( wolcome); position(n,1); display(c
23、ongratulations); while(1);2:原理图3:液晶的显示1线段的显示 点阵图形式液晶由M 行N 列个显示单元组成,假设LCD 显示屏有64行,每行有128 列,每8 列对应1 个字节的8 个位,即每行由16 字节,共168=128个点组成,屏上6416 个显示单元和显示RAM 区1024 个字节相对应,每一字节的内容和屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM 区的000H00FH 的16 个字节的内容决定,当(000)=FFH 时,则屏的左上角显示一条短亮线,长度为8 个点;当(3FFH)=FFH 时,则屏的右下角显示一短亮线;当(000H)=FFH,(001H
24、)=00H,(002H)=FFH,(003H)=00H,(00EH)=FFH,(00FH)=00H 时,则在屏的顶部显示一条由8 段亮线和8 条暗线组成的虚线。这就是LCD 显示的基本意思。2字符的显示 当用LCD 显示一个字符时就较复杂了,因为一个字符由68 或88 点阵组成,即要找到和屏上某几个位置对应的显示RAM区的8 个字节,并且要使每个字节的不同的位为1,其它的为0,为1的点亮,为0的点暗,这样一来就组成某个字符。但对于内带字符发生器的控制器(如T6963C)来说,显示字符就比较简单了,可让控制器工作在文本方式,根据在LCD 上开始显示的行列号及每行的列数找出显示RAM对应的地址,设
25、立光标,在此送上该字符对应的代码即可。3汉字的显示 汉字的显示一般采用图形方式,事先从微机中提取要显示的汉字的点阵码,每个汉字占32 字节,分左右两半部,各占16 字节,左边为1、3、5,右边为2、4、6, 根据在LCD 上开始显示的行列号及每行的列数可找出显示RAM 对应的地址,设立光标,送上要显示的汉字的第一个字节,光标位置加1,送第二字节,换行按列对齐,送第三字节直到32 字节显示完就可在LCD 上得到一个完整的汉字。内带T6963C的液晶图形显示模块和8031 单片机的连接1LCD显示控制器T6963C T6963C 是点阵式液晶图形显示控制器,能直接和8031单片机连接(见附图);可
26、以以图形、字符方式或合成显示;内部有字符发生器,共128 个字符,允许CPU随时访问显示RAM,并可进行位操作。2内带T6963C 的液晶图形显示模块(MGLS12864T)和8031 单片机的连接 内带T6963C 的液晶图形显示模块MGLS12864T 和8031 单片机的连接见附图。由图可以看出,MGLS12864T 的数据线和8031 的数据总线相接,它的C/D 接8031 的地址线A0,/CE2接8031外扩系统地址译码器74LS138的一个输出端;MGLS12864T的/WR,/RD分别和8031的/WR,/RD 相接,/RESET,VCC,/HALT 接+5V,VO 接5V15V
27、 可调,VEE 接5V15V;FG、GND接8031 的GND。T6963C 的主要指令见表1。参数1 参数2 指令代码 功 能1水平位置 垂直位置 21H 光标指针设置2地址(低5位) 00H 22H CGRAM 偏置地址设置3低字节 高字节 24H 地址指针位置4低字节 高字节 40H 文本区首址5 低字节 00H 41H 文本区宽度(字节数/行)6低字节 高字节 42H 图形区首址7低字节 00H 43H 图形区宽度(字节数/行)8无 无 8XH 显示方式设置9无 无 9XH 光标闪烁,显示,文本,图形显示10. 无 无 AXH 光标形状选择11无 无 BXH 数据自动读/写方式设置12
28、D1(仅写才有) 无 C0C5H 数据一次写/读,地址加1或不变13无 无 D0H 屏读14无 无 D8H 屏拷贝15无 无 FXH 位操作对T6963C进行操作前应先读状态字,T6963C 的状态字中的各位含意如表2。表2位 状态 1 0STA0:指令读写状态 准备好 忙STA1:数据读写状态 准备好 忙STA2:数据自动读状态 准备好 忙STA3:数据自动写状态 准备好 忙STA4:未用STA5:控制器运行检测可能性 可能 不能STA6:屏读/拷贝出错状态 出错 正确STA7:闪烁状态检测 正常显示 关显示五、参考书目1、单片机原理及应用主编:万文略 重庆大学出版社2、单片及应用技术与实例主编:沙占友 电子工业出版社3、C程序设计主编:谭浩强 清华大学出版社组号:第23组 参赛队员: 尤明 段宁 邵凌
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1