久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7093|回復: 3
打印 上一主題 下一主題
收起左側

用51單片機 匯編語言 做簡單的電子琴

[復制鏈接]
跳轉到指定樓層
樓主


源程序

SPEAKE BIT P3.0;接到蜂鳴器
MAINLED BIT P3.1
AUTOSING BIT P2.0
SINGLED BIT P3.2
AUTOSTOP BIT P2.1
PLAYSING BIT P2.2
PLAYLED BIT P3.3
PLAYSTOP BIT P2.3
FAST BIT P2.4
FASTLED BIT P3.4
FASTFLAG BIT 00H

ORG 0000H
LJMP MAIN

ORG 000BH
LJMP TIM0;TIMER0的中斷服務程序

ORG 1000H
MAIN:
MOV SP,#60H;初始化堆棧
MOV TMOD,#01H;計數器工作在MODE1,16位計數器
SETB ET0;開定時/計數器0允許
SETB EA;允許單片機總中斷
MOV P3,#0FCH;讓除了MAIN以外的燈滅
MOV 40H,#83;設置初始速度
MOV 30H,#00H;初始化偏移量

START0:
JB AUTOSING,PLAY1/*若按下p2.0,表示想要自動播放歌曲*/
SETB MAINLED
CLR SINGLED
JMP SONG1
PLAY1:
JB PLAYSING,START0/*若按下PLAYSING表示想要彈琴*/
SETB MAINLED
CLR PLAYLED
LJMP PLAY2

;播放歌曲的程序段
SONG1:
MOV A,30H;將偏移量傳入A
MOV DPTR,#SONG;取得歌曲表的首地址
MOVC A,@A+DPTR;取得相應音符
JZ OVER;若8位全為0表示播放歌曲結束
MOV R2,A
ANL A,#0FH;從低4位取出節拍
MOV R5,A;存入R5,用于定時器的中斷服務程序
MOV A,R2;再導入R2
SWAP A
ANL A,#0FH;取出頻率向量
JNZ SING;若為0表示無聲
CLR TR0 ;不記數
JMP D1
;取出頻率(計數值)的程序段
SING:
DEC A;減1,因為要從0位置開始
RL A;在計數值表中以字存儲,乘2才得到正確位置
MOV 22H,A;將位置暫存
MOV DPTR,#TAB1;計數值表
MOVC A,@A+DPTR
MOV TH0,A;取到的高位放入TH0
MOV 21H,A;暫存到21H,用于中斷程序
MOV A,22H
INC A;取低位地址
MOVC A,@A+DPTR
MOV TL0,A;放入TL0
MOV 20H,A;暫存到20H,用于中斷程序
SETB TR0;計數器開始計數
D1:
ACALL DELAY
INC 30H;播放完一個音符后將偏移量加1
JMP SONG1
OVER:
SETB SINGLED
CLR MAINLED
LJMP MAIN
;以下是電子琴的程序段
PLAY2:
MOV A,#0FH  ;先給p1的高4位置1,低4位置0,判斷是哪行
MOV P1,A
MOV R3,#00H
MOV R4,#00H
PLAY3:
ACALL DELAY20;加上這個就不會有串音的現象了
JB PLAYSTOP,PL0;若按下退出電子琴鍵則跳回
SETB PLAYLED
CLR MAINLED
LJMP START0
;以下是判斷矩陣鍵盤的按鍵
;判斷是哪行按下
PL0:
MOV A,P1
JB ACC.0,PL1
MOV R3,#0
SJMP LINE
PL1:
JB ACC.1,PL2
MOV R3,#1
SJMP LINE
PL2:
JB ACC.2,PL3
MOV R3,#2
SJMP LINE
PL3:
JB ACC.3,PLAY3
MOV R3,#3
;判斷是哪列
LINE:
MOV A,#0F0H;這次給低位置1,高位置0
MOV P1,A
MOV A,P1
LINE4:
JB ACC.4,LINE5
MOV R4,#0
SJMP PLAY4
LINE5:
JB ACC.5,LINE6
MOV R4,#4
SJMP PLAY4
LINE6:
JB ACC.6,LINE7
MOV R4,#8
SJMP PLAY4
LINE7:
JB ACC.7,PLAY3
MOV R4,#12
;這樣就可以用R4+R3得出是哪個鍵被按下
PLAY4:
MOV A,R3
ADD A,R4
ACALL YOUPLAY;得出按鍵后就調出頻率發聲就行了
LOOP:;將這個地方做做修改
MOV A,P1
ORL A,#0FH
CPL A
JZ OFF
JMP LOOP
OFF:CLR TR0
LJMP PLAY2

;定時計數器0中斷服務程序
TIM0:
PUSH ACC
PUSH PSW
MOV TL0,20H;將暫存的計數值再放進去
MOV TH0,21H
CPL SPEAKE;取反
POP PSW
POP ACC
RETI

;彈琴的子程序
YOUPLAY:
RL A
MOV 22H,A;將位置暫存
MOV DPTR,#TAB1
MOVC A,@A+DPTR
MOV 21H,A
INC 22H
MOV A,22H
MOVC A,@A+DPTR
MOV 20H,A
MOV TH0,21H
MOV TL0,20H
SETB TR0
RET

;延時20ms,用于防抖
DELAY20:
mov r1,#50h
del0:mov r2,#7dh
del1:djnz r2,del1
djnz r1,del0
RET

;節拍延時函數,用于產生每個音符的節拍,延時187ms
DELAY:
MOV R7,#02
D2:MOV R4,#187
D3:MOV R3,40H
TEST:
JB FAST,TEST1;若沒有按下快進鍵直接去檢測是否按下暫停鍵
JB FASTFLAG,FASTSTOP;FAST為0表示可以快進,FAST為1表示已經在快進狀態
SETB FASTFLAG
CLR FASTLED
MOV 40H,#30;用30使播放速度變快
LJMP DELAY
FASTSTOP:
CLR FASTFLAG
SETB FASTLED
MOV 40H,#83
LJMP DELAY
TEST1:
JB AUTOSTOP,GO_ON
CLR TR0
SETB SINGLED
CLR MAINLED
LJMP START0
GO_ON:
DJNZ R3,TEST
DJNZ R4,D3
DJNZ R7,D2
DJNZ R5,DELAY
RET
;計數表
TAB1:
DW 64580,64684,64777,64820
DW 64898,64968,65030,65058
DW 64260,64400,64524,65217
DW 65252,65283,65300,65330
;歌曲表,高位是頻率,低位是節拍
SONG:
;洋娃娃和小熊跳舞
/*
DB 12H,22H,32H,42H,52H,52H,51H,41H,32H
DB 42H,42H,41H,31H,22H,12H,32H,54H
DB 12H,22H,32H,42H,52H,52H,51H,41H,32H
DB 42H,42H,41H,31H,22H,12H,32H,14H
DB 62H,62H,61H,51H,42H,52H,52H,51H,41H,32H
DB 42H,42H,41H,31H,22H,12H,32H,54H
DB 62H,62H,61H,51H,42H,52H,52H,51H,41H,32H
DB 42H,42H,41H,31H,22H,12H,32H,14H,00H
*/
/*
;東風破
;一個小節是一行;9,A,B
DB 22H,12H,22H,33H,21H,22H,12H
DB 22H,12H,12H,0A2H,28H
DB 02H,22H,12H,22H,33H,21H,21H,11H,12H
DB 22H,12H,11H,0A1H,0A1H,91H,98H
DB 02H,52H,52H,52H,32H,32H,32H,42H
DB 53H,41H,42H,4AH
DB 02H,22H,22H,32H,21H,11H,12H,0A2H,12H
DB 62H,62H,62H,52H,58H
;反復記號后面
DB 02H,32H,32H,32H,33H,21H,22H,12H
DB 22H,32H,22H,12H,26H,32H
DB 02H,22H,0A2H,12H,23H,11H,12H,22H
DB 32H,52H,52H,32H,58H
DB 02H,52H,52H,52H,63H,51H,32H,42H
DB 54H,62H,4AH
DB 02H,22H,22H,12H,32H,22H,12H,0A2H
DB 22H,12H,22H,1AH
;括號里面的
DB 61H,31H,51H,21H,31H,21H,11H,0A1H,91H,0A1H,11H,21H,31H,51H,61H,81H
*/
;括號后面的反復記號
DB 02H,52H,52H,52H,63H,71H,62H,52H
DB 32H,32H,32H,22H,24H
DB 02H,52H,52H,52H,32H,22H,22H,12H
DB 22H,12H,22H,32H,34H
DB 02H,0B2H,12H,22H,32H,22H,32H,52H
DB 32H,22H,12H,22H,0A4H,04H
DB 02H,12H,12H,22H,32H,22H,32H,52H
DB 62H,52H,52H,32H,32H,32H,32H,22H
;重復
DB 02H,52H,52H,52H,63H,71H,62H,52H
DB 32H,32H,32H,22H,24H
DB 02H,52H,52H,52H,32H,22H,22H,12H
DB 22H,12H,22H,32H,34H
DB 02H,0B2H,12H,22H,32H,22H,32H,52H
DB 62H,52H,52H,32H,54H
DB 02H,62H,62H,52H,33H,51H,32H,22H
DB 02H,22H,22H,12H,32H,22H,12H,0A2H
DB 22H,1EH
;第二個括號里面
DB 3AH,22H,32H,0A2H
DB 16H,21H,31H,54H
DB 02H,32H,32H,32H,32H,61H,51H,33H,21H
DB 32H,51H,3DH
DB 6AH,32H,23H,31H
DB 21H,11H,0A6H,0A6H,21H,31H
DB 24H,22H,11H,0A1H,92H,0A1H,11H,14H,14H
DB 00H
END



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏2 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:362684 發表于 2018-7-2 09:54 | 只看該作者
有文件嗎
回復

使用道具 舉報

板凳
ID:561414 發表于 2019-6-14 00:46 | 只看該作者
啊啊啊啊,太感謝了謝謝大佬,熱淚盈眶QAQ
回復

使用道具 舉報

地板
ID:566264 發表于 2019-6-28 22:25 來自手機 | 只看該作者
大佬,做成電路板蜂鳴器為啥不出歌
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲五码在线 | 成人性生交大片免费看中文带字幕 | 成人免费视频网 | 国产ts人妖系列高潮 | 日韩欧美不卡 | 一级毛片视频 | 欧美日韩网站 | 亚洲色图综合网 | 一区二区福利视频 | 久久久国产一区 | 爱综合| 精品伦精品一区二区三区视频 | 欧美日韩在线一区二区 | 综合国产第二页 | 一级全黄少妇性色生活免费看 | 国产一级在线视频 | 国产日韩欧美一区 | 久久久久亚洲国产| a级性视频 | 国产综合久久 | 天天操欧美 | 在线欧美亚洲 | 国产原创在线观看 | 成人欧美一区二区三区在线观看 | 国产精品视频网址 | 国产精品国产a | 国产精品嫩草影院精东 | 中文字幕一区在线观看视频 | 日韩不卡视频在线 | 国产日韩一区二区三免费高清 | 亚洲导航深夜福利涩涩屋 | 国产精品xxxx| 国产精品www| 久久在线视频 | 成人午夜免费在线视频 | 久久成人一区二区三区 | 久久久久国产 | 国产精品国产三级国产播12软件 | 91美女在线观看 | 99色在线视频 | 日韩伦理一区二区三区 |