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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 7108|回復(fù): 3
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:326814 發(fā)表于 2018-5-10 14:21 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式


源程序

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的中斷服務(wù)程序

ORG 1000H
MAIN:
MOV SP,#60H;初始化堆棧
MOV TMOD,#01H;計數(shù)器工作在MODE1,16位計數(shù)器
SETB ET0;開定時/計數(shù)器0允許
SETB EA;允許單片機總中斷
MOV P3,#0FCH;讓除了MAIN以外的燈滅
MOV 40H,#83;設(shè)置初始速度
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;取得相應(yīng)音符
JZ OVER;若8位全為0表示播放歌曲結(jié)束
MOV R2,A
ANL A,#0FH;從低4位取出節(jié)拍
MOV R5,A;存入R5,用于定時器的中斷服務(wù)程序
MOV A,R2;再導(dǎo)入R2
SWAP A
ANL A,#0FH;取出頻率向量
JNZ SING;若為0表示無聲
CLR TR0 ;不記數(shù)
JMP D1
;取出頻率(計數(shù)值)的程序段
SING:
DEC A;減1,因為要從0位置開始
RL A;在計數(shù)值表中以字存儲,乘2才得到正確位置
MOV 22H,A;將位置暫存
MOV DPTR,#TAB1;計數(shù)值表
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;計數(shù)器開始計數(shù)
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;加上這個就不會有串音的現(xiàn)象了
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;得出按鍵后就調(diào)出頻率發(fā)聲就行了
LOOP:;將這個地方做做修改
MOV A,P1
ORL A,#0FH
CPL A
JZ OFF
JMP LOOP
OFF:CLR TR0
LJMP PLAY2

;定時計數(shù)器0中斷服務(wù)程序
TIM0:
PUSH ACC
PUSH PSW
MOV TL0,20H;將暫存的計數(shù)值再放進去
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

;節(jié)拍延時函數(shù),用于產(chǎn)生每個音符的節(jié)拍,延時187ms
DELAY:
MOV R7,#02
D2:MOV R4,#187
D3:MOV R3,40H
TEST:
JB FAST,TEST1;若沒有按下快進鍵直接去檢測是否按下暫停鍵
JB FASTFLAG,FASTSTOP;FAST為0表示可以快進,F(xiàn)AST為1表示已經(jīng)在快進狀態(tài)
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
;計數(shù)表
TAB1:
DW 64580,64684,64777,64820
DW 64898,64968,65030,65058
DW 64260,64400,64524,65217
DW 65252,65283,65300,65330
;歌曲表,高位是頻率,低位是節(jié)拍
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
*/
/*
;東風(fēng)破
;一個小節(jié)是一行;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
;反復(fù)記號后面
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
*/
;括號后面的反復(fù)記號
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
;重復(fù)
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 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 嫩草黄色影院 | 国产亚洲精品精品国产亚洲综合 | 中文字幕免费视频 | 亚洲欧美日韩精品久久亚洲区 | 亚洲 91| 亚洲精品视频观看 | 国产精品久久久久久久久免费桃花 | 亚洲国产视频一区二区 | 久久久激情视频 | 人人干人人干人人 | 日本免费黄色 | 日韩三级 | 亚洲国产aⅴ成人精品无吗 综合国产在线 | 欧美在线一区二区三区四区 | 中文字幕一区二区三区乱码在线 | 亚洲一区二区在线视频 | 国产1区2区3区 | 在线免费观看日本 | 中文字幕日韩一区 | 亚洲视频一区二区三区 | 精品久久伊人 | 本道综合精品 | 午夜精品久久久久久久星辰影院 | 午夜免费福利片 | 成人在线观看免费爱爱 | 99热激情| 欧美视频1| 欧美成人免费在线视频 | 免费看爱爱视频 | 色在线看 | 中文字幕在线不卡 | 国产露脸对白88av | 国产午夜精品久久 | 一区二区片 | 日韩三区在线观看 | 91色网站| 视频在线一区二区 | 精品久久久久久18免费网站 | www国产亚洲精品久久网站 | 午夜视频网站 | 中文字幕第100页 |