设计分享|单片机多音阶电子琴(汇编)
具体实现功能
具体实现功能:
按下不同的按键分别发出不同的音阶,分别可以发出以下音阶:低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可选。
设计思路
文献研究法:搜集整理相关单片机智能手环系统相关研究资料,认真阅读文献,为研究做准备;
调查研究法:通过调查、分析、具体试用等方法,发现单片机智能手环系统的现状、存在问题和解决办法;
比较分析法:比较不同单片机智能手环系统的具体原理,以及同一类传感器性能的区别,分析单片机智能手环系统的研究现状与发展前景;
软硬件设计法:通过软硬件设计实现具体硬件实物,最后测试各项功能是否满足要求。
设计内容
仿真实现
本设计利用protues8.7软件实现仿真设计,具体如图。
Protues也是在单片机仿真设计中常用的设计软件之一,通过设计出硬件电路图,及写入驱动程序,就能在不实现硬件的情况进行电路调试。另外,protues还能实现PCB的设计,在仿真中也可以与KEIL实现联调,便于程序的调试,且支持多种平台,使用简单便捷。
汇编程序
本设计由汇编语言编写,主代码具体如下:
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 ;
设计分享|单片机多音阶电子琴(汇编)相关推荐
- 设计分享|单片机抢答器(汇编)
具体实现功能 具体实现功能: 主持人按下抢答按键后,进入抢答模式,8位选手开始抢答,数码管显示抢答成功的选手号码,主持人按键再次按下后复位. 设计介绍 单片机介绍 51单片是一种低功耗.高性能CMOS ...
- 设计分享|单片机交通灯仿真(汇编)
具体实现功能 具体功能: (1)东西红灯60S倒计时,南北绿灯40S倒计时,东西向人行道红灯,南北向人行道绿灯: (2)40S后,黄灯闪烁切换,东西右转绿灯20S,左转绿灯20S,南北80S倒计时,右 ...
- 设计分享|单片机8路抢答器
具体实现功能 具体功能: (1)按下"开始"按键,进入20S倒计时,八位选手可以进行抢答: (2)选手按下抢答按键后,数码管显示对应的选手编号,表示抢答成功: (3)抢答成功后,点 ...
- 设计分享|单片机数字温度计
具体实现功能 具体功能: 通过DS18B20测温,通过四位数码管实时显示温度值. 设计介绍 单片机介绍 51单片是一种低功耗.高性能CMOS8位微控制器,具有 8K 在系统可编程Flash 存储器.在 ...
- 设计分享|单片机电压表模拟
具体实现功能 具体功能: 通过滑动变阻器和ADC0832模块对电压值进行采样,反馈电压值通过数码管进行显示,电压范围为0-5V,如图所示表示电压为3.92V. 设计介绍 单片机介绍 51单片是一种低功 ...
- 设计分享|单片机直流电机转速控制(汇编)
目录 具体实现功能: 设计介绍 51单片简介 设计思路 设计内容 仿真图(protues8.7) 程序(KeilC51) 具体实现功能: 利用滑动变阻器实现对直流电机转速的控制,仿真实现,汇编语言编写 ...
- 设计分享|单片机花样流水灯
目录 具体实现功能 设计介绍 51单片机简介 设计思路 设计内容 仿真图(protues8.7) 程序(Keil5) 具体实现功能 单片机控制两列16个LED实现彩灯展示.P0口控制的8个LED彩灯实 ...
- 设计分享|单片机4*4矩阵键盘控制LED灯
目录 具体实现功能 设计介绍 51单片机简介 设计思路 设计内容 仿真图(protues8.7) 程序(Keil5) 具体实现功能 4*4矩阵键盘控制LED显示,第一个按键控制一个LED点亮,第二个按 ...
- 设计分享|单片机按键控制继电器实现灯亮灭
具体实现功能 按键按下,控制继电器实现灯点亮:按键再次按下,控制继电器实现灯熄灭. 设计介绍 51单片机简介 51单片是一种低功耗.高性能CMOS-8位微控制器,具有8K可编程Flash存储器,使得其 ...
最新文章
- java类定义的顺序_Java类及对象的初始化顺序
- flutter_web 实战之文章列表与详情
- .NET Core 服务在 ARM64 服务器中的部署
- 编译报错+解决方法:错误: 找不到符号
- git小技巧之分支、关联远程仓库、回滚、解决.gitignore不生效等
- 客户组网服务案列_山西seo关键词排名优化案列
- 转I give the orders around here.
- android切换输入法工具类
- csf格式手机播放器(安卓csf格式播放器)
- web前端开发之微信小程序
- 怎样在nature上查文献?
- fanq15/FSOD-code 的环境配置及运行
- Python实现CRAPS赌博游戏
- 输入上下文句柄相关函数 linux,一起聊聊WSL的那些事儿(上)
- 5分钟自建数据库可视化平台,在线管理数据库也太方便了~
- 在Unity2018如何使用代码一键设置Icon
- 图解http(七)-web的攻击技术
- php aes加密 ctr,使用aes+ctr的加密问题
- 计算机工作无法更改,win10系统计算机工作组名称无法更改的操作方案
- centos7在net连接下ifcfg-ens33的配置