设计分享|单片机多音阶电子琴(汇编)

2022-07-27 18:47:54 浏览数 (1)

具体实现功能:

按下不同的按键分别发出不同的音阶,分别可以发出以下音阶:低3,低4,低5,低6 ,低7;中1,中2,中3;中4,中5,中6,中7;高1,高2,高3,高4。

设计介绍

单片机介绍

51单片是一种低功耗、高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器。在单芯片上,拥有灵巧的8 位CPU 和在系统可编程Flash,使得STC89C51为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。具有以下标准功能:8k字节Flash,512字节RAM,32 位I/O 口线,看门狗定时器,内置4KB EEPROM,MAX810复位电路,三个16 位 定时器/计数器,一个6向量2级中断结构,全双工串行口。另外 STC89X51 可降至0Hz 静态逻辑操作,支持2种软件可选择节电模式。空闲模式下,CPU 停止工作,允许RAM、定时器/计数器、串口、中断继续工作。掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。最高运作频率35Mhz,6T/12T可选。

设计思路

文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;

调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;

比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;

软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。

设计内容

01

仿真实现

本设计利用protues8.7软件实现仿真设计,具体如图。

Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。

02

汇编程序

本设计由汇编语言编写,主代码具体如下:

代码语言:javascript复制
            KEYBUF EQU 30H          ;   KEYBUF定义为30H
           STH0 EQU 31H             ;STH0 定义为,31H
           STL0 EQU 32H             ;STL0 定义为,32H
           TEMP EQU 33H             ;TEMP 定义为,33H
           ORG 00H                 
           LJMP START               
           ORG 0BH                  
           LJMP INT_T0              
START:     MOV TMOD,#01H     ;设置定时器0的工作方式
           SETB ET0                 ;设置定时器中断
           SETB EA                 ; 开总中断
WAIT:      MOV P3,#0FFH          ;设置P3口为输入模式
           CLR P3.4          ;清0 P3.4,按键的第一行扫描
           MOV A,P3          ;
           ANL A,#0FH          ;
           XRL A,#0FH          ; 
           JZ NOKEY1          ;
           LCALL DELY10MS          ;延时10ms
           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          ; K1键按下
           MOV KEYBUF,#1          ;
           LJMP DK1          ;
NK2:       CJNE A,#0BH,NK3          ;K2键按下
           MOV KEYBUF,#2          ;
           LJMP DK1          ;
NK3:       CJNE A,#07H,NK4          ;K3键按下
           MOV KEYBUF,#3          ;
           LJMP DK1          ;
NK4:       NOP                    ;K4键按下 
DK1:       MOV A,KEYBUF
           MOV B,#2
       MUL AB          ;因为查表里都是字,所以乘2的查表数据
           MOV TEMP,A          ;
           MOV DPTR,#TABLE          ;  指向表头
           MOVC A,@A DPTR          ; 查表
           MOV STH0,A          ;
           MOV TH0,A          ;  将数据高位送TH0
           INC TEMP          ;
           MOV A,TEMP          ;
           MOVC A,@A DPTR          ;
           MOV STL0,A          ;
           MOV TL0,A          ;将数据低位送TH0
           SETB TR0          ; 启动定时器T0
DK1A:      MOV A,P3          ;
           ANL A,#0FH          ;
           XRL A,#0FH          ;
           JNZ DK1A          ;
           CLR TR0          ;关闭定时器T0
NOKEY1:    MOV P3,#0FFH          ;设置P3口为输入模式
           CLR P3.5          ;清0 P3.5,按键的第二行扫描
           MOV A,P3          ;
           ANL A,#0FH          ;
           XRL A,#0FH          ;
           JZ NOKEY2          ;
           LCALL DELY10MS          ; 延时10ms
           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          ;K5键按下
           MOV KEYBUF,#5          ;
           LJMP DK2          ;
NK6:       CJNE A,#0BH,NK7          ;K6键按下
           MOV KEYBUF,#6          ;
           LJMP DK2          ;
NK7:       CJNE A,#07H,NK8          ;K7键按下
           MOV KEYBUF,#7          ;
           LJMP DK2          ;
NK8:       NOP          ;     K8键按下
DK2:       MOV A,KEYBUF          ;
           MOV B,#2        ;
       MUL AB    ;因为查表里都是字,所以乘2的查表数据
           MOV TEMP,A          ;
           MOV DPTR,#TABLE          ; 指向表头  
           MOVC A,@A DPTR          ; 查表
           MOV STH0,A          ;
           MOV TH0,A          ;将数据高位送TH0
           INC TEMP          ;
           MOV A,TEMP          ;
           MOVC A,@A DPTR          ;
           MOV STL0,A          ;
           MOV TL0,A          ;将数据低位送TH0
           SETB TR0          ;启动定时器T0
DK2A:      MOV A,P3          ;
           ANL A,#0FH          ;
           XRL A,#0FH          ;
           JNZ DK2A          ;
           CLR TR0          ;  关闭定时器T0
NOKEY2:    MOV P3,#0FFH          ;设置P3口为输入模式 
           CLR P3.6          ; 清0 P3.6,按键的第三行扫描
           MOV A,P3          ;
           ANL A,#0FH          ;
           XRL A,#0FH          ;
           JZ NOKEY3          ;
           LCALL DELY10MS          ; 延时10ms
           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          ;K9键按下
           MOV KEYBUF,#9          ;
           LJMP DK3          ;
NK10:      CJNE A,#0BH,NK11          ;K10键按下
           MOV KEYBUF,#10          ;
           LJMP DK3          ;
NK11:      CJNE A,#07H,NK12          ;K11键按下
           MOV KEYBUF,#11          ;
           LJMP DK3          ;
NK12:      NOP          ; K12键按下
DK3:       MOV A,KEYBUF          ;
           MOV B,#2  ;
       MUL AB  ;因为查表里都是字,所以乘2的查表数据
           MOV TEMP,A          ;
           MOV DPTR,#TABLE          ;指向表头
           MOVC A,@A DPTR          ;查表
           MOV STH0,A          ;
           MOV TH0,A          ;将数据高位送TH0
           INC TEMP          ;
           MOV A,TEMP          ;
           MOVC A,@A DPTR          ;
           MOV STL0,A          ;
           MOV TL0,A          ;将数据低位送TH0
           SETB TR0          ;启动定时器T0 
DK3A:      MOV A,P3          ;
           ANL A,#0FH          ;
           XRL A,#0FH          ;
           JNZ DK3A          ;
           CLR TR0          ;关闭定时器T0
NOKEY3:    MOV P3,#0FFH          ;设置P3口为输入模式 
           CLR P3.7          ;清0 P3.7,按键的第四行扫描 
           MOV A,P3          ;
           ANL A,#0FH          ;
           XRL A,#0FH          ;
           JZ NOKEY4          ;
           LCALL DELY10MS          ;延时10ms
           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          ; K13键按下
           MOV KEYBUF,#13          ;
           LJMP DK4          ;
NK14:      CJNE A,#0BH,NK15          ;K14键按下
           MOV KEYBUF,#14          ;
           LJMP DK4          ;
NK15:      CJNE A,#07H,NK16          ;K15键按下
           MOV KEYBUF,#15          ;
           LJMP DK4          ;
NK16:      NOP          ; K16键按下
DK4:       MOV A,KEYBUF          ;
           MOV  B,#2   ;
       MUL  AB ; 因为查表里都是字,所以乘2的查表数据
           MOV TEMP,A          ;
           MOV DPTR,#TABLE          ; 指向表头
           MOVC A,@A DPTR          ; 查表
           MOV STH0,A          ;
           MOV TH0,A          ;将数据高位送TH0
           INC TEMP          ;
           MOV A,TEMP          ;
           MOVC A,@A DPTR          ;
           MOV STL0,A          ;
           MOV TL0,A          ;将数据低位送TH0
           SETB TR0          ;启动定时器T0
DK4A:      MOV A,P3          ;
           ANL A,#0FH          ;
           XRL A,#0FH          ;
           JNZ DK4A          ;
           CLR TR0          ; 关闭定时器T0
NOKEY4:    LJMP WAIT          ;
DELY10MS:  MOV R6,#10          ; 10ms延时子程序
D1:        MOV R7,#248          ;
           DJNZ R7,$          ;
           DJNZ R6,D1          ;
           RET          ; 
INT_T0:    MOV TH0,STH0          ; T0中断服务程序
           MOV TL0,STL0          ;
           CPL P1.0          ; 输出方波
           RETI          ;
TABLE:     DW 64021,64103,64260,64400          ;低3,低4,低5,低6
           DW 64524,64580,64684,64777          ;低7,中1,中2,中3
           DW 64820,64898,64968,65030          ;中4,中5,中6,中7
           DW 65058,65110,65157,65178          ; 高1,高2,高3,高4
           END          ; 

0 人点赞