微机实验之电子琴制作
来源:互联网 发布:医院诊断书生成器软件 编辑:程序博客网 时间:2024/04/30 04:35
微机实验之电子琴制作
http://blog.csdn.net/u012062327
一、实验目的
(1)学习、掌握部分DOS功能调用使用方法;
(2)学习用8254使蜂鸣器发声的编程方法;
(3)学习LED点阵扫描显示程序的设计方法。
二、实验设备
PC机一台,TD-PIT++实验装置一套
三、实验内容及原理
1)内容:用户在键盘输入1--7,蜂鸣器则发出do--si音符;在键盘上输入A--G则可选择A--G调;在LED点阵显示音符(do--si)。
2) 原理:
a) DOS功能调用(INT 21H)
显示字符串 入口:AH=09H; 调用参数:DS:DX=串地址,‘$’为结束字符
键盘输入并回显 入口:AH=01H; 返回参数:AL=输出字符
b) 8254中的计数器工作在方式3(方波发生器),计数器的初值不同,就可产生不同频率的方波,用这些方 波信号来驱动蜂鸣器就可得到do--si音
c) LED点阵为16X16共阴极
四、实验步骤
(1)实验板接线
(2)利用取模软件,获得do--si的字库文件
(3)画流程图、编写程序
实验程序:
INCLUDE yinyue.inc .386P IOY1 EQU 3040H IOY0 EQU 3000H ;片选IOY0对应的端口始地址MY8254_COUNT0 EQU IOY0+00H*4 ;8254计数器0端口地址MY8254_COUNT1 EQU IOY0+01H*4 ;8254计数器1端口地址MY8254_COUNT2 EQU IOY0+02H*4 ;8254计数器2端口地址MY8254_MODE EQU IOY0+03H*4 ;8254控制寄存器端口地址 STACK1 SEGMENT STACK DW 256 DUP(?)STACK1 ENDS DATA SEGMENT USE16 A DW 0,441,495,556,589,661,742,833 B DW 0,495,556,624,661,742,833,935 C DW 0,262,294,330,350,393,441,495 D DW 0,294,330,371,393,441,495,556 E DW 0,371,416,441,467,525,589,661 F DW 0,350,393,441,467,525,589,661 G DW 0,393,441,495,525,589,661,742 MES1 DB '--usage:',0AH,0DH,' first, you should input A,B...or G to chose the tone' ,0AH,0DH,' second,click 1(do) ..7(si)to play music',0AH,0DH,' third,if you want to quit playing,please click ESC or click ENTER to chose the tone again',0AH,0DH,, '$' STR1 DB 'please input A,B,C,D,E,F, 0R G',0AH,0DH, '$' STR2 DB 0AH,0DH,'you can play music',0AH,0DH, '$' B1 DW 0 ADDR DW 0 YIN DW 0 LB DB ?DATA ENDSCODE SEGMENT USE16 ASSUME CS:CODE,DS:DATASTART: MOV AX,DATA MOVDS,AX MOV DX,OFFSET MES1 ;show message MOVAH,09H INT 21H MOV ADDR,OFFSET HZDOT BEGIN:MOV DX,OFFSET STR1 MOV AH,09H INT 21H ;输出字符串1 MOV SI,OFFSET A ;装入频率表A起始地址 MOV AH,01H INT 21H AND AL,0FH SUB AL,1 MOV BL,16 MUL BL ADD SI,AX ;A..G起始地址 MOV B1,SI MOV DX,OFFSET STR2 MOV AH,09H INT 21H ;输出字符串2PLAY: MOV DX,MY8254_MODE ;初始化8254工作方式 MOV AL,36H ;定时器0、方式3 OUT DX,AL MOV AH,01H INT 21H ;读取键盘上输入的数字 CMP AL,27 JZ QUIT ;ESC的时候退出 CMP AL,13 ;点击ENTER ,选调 JZ BEGIN AND AL,0FH MOV BL,AL SUB BL,1 MOV LB,BL XOR AH,AH ;获得哪个音1-7 MOV BL,2 MUL BL ADD SI,AX ;把偏移量给SI MOV DX,0FH ;输入时钟为1.0416667MHz,1.0416667M = 0FE502H MOV AX,0E502H DIV WORD PTR [SI] ;取出频率值计算计数初值,0F4240H / 输出频率 MOV DX,MY8254_COUNT0 OUT DX,AL ;装入计数初值 MOV AL,AH OUT DX,AL XOR AH,AH MOV AL,LB MOV BL,32 MUL BL MOV YIN,AX CALL DALLY MOV AX,ADDR ADD AX,YIN MOV SI,AX MOV CX,29H ;控制一屏显示时间LOOP2:CALL DSPLMSC SUB SI,32 LOOP LOOP2 MOV DX,MY8254_MODE MOV AL,01H OUT DX,AL MOV SI,B1 JMP PLAY QUIT: MOV DX,MY8254_MODE ;设置8254为方式0,out0置0 MOV AL,10H OUT DX,AL MOV AX,4C00H ;结束程序退出 INT 21HDALLY PROC ;延时子程序D0: MOV CX,0F00HD1: MOV AX,0FFFFHD2: DEC AX JNZ D2 LOOP D1 JNZ D0 RETDALLY ENDPDALLY1 PROC MOV AX,0FFFFH D3: DEC AX JNZ D3 RETDALLY1 ENDPDSPLMSC PROC;显示 1 屏汉字子程序 PUSHCX MOV CX,16 MOVBX,0FFFEHLOOP1: MOV AL,BYTE PTR[SI] MOV AH,BYTE PTR[SI+1] ROL EAX,16 MOV AX,BX ADD SI,2 ROL BX,1 NOT EAX MOV DX,IOY1 OUT DX,EAX CALL DALLY1L1: LOOP LOOP1 POP CX RETDSPLMSC ENDP CODE ENDS END START
yinyue.inc
DATA SEGMENTC444F EQU 00000H;DO C5245 EQU C444F+1;RE C4D49 EQU C5245+1;MI C4641 EQU C4D49+1;FA C534F EQU C4641+1;SO C4C41 EQU C534F+1;LA C5349 EQU C4C41+1;SI HZDOT:;DO C444FDB 000H,000H,000H,000H,01FH,01CH,036H,036H,066H,063H,066H,063H,066H,063H,066H,063HDB 066H,063H,066H,063H,036H,036H,01FH,01CH,000H,000H,000H,000H,000H,000H,000H,000H;RE C5245DB 000H,000H,000H,000H,03FH,07FH,066H,066H,066H,046H,066H,016H,03EH,01EH,036H,016HDB 066H,006H,066H,046H,066H,066H,067H,07FH,000H,000H,000H,000H,000H,000H,000H,000H;MI C4D49DB 000H,000H,000H,000H,063H,03CH,077H,018H,07FH,018H,07FH,018H,06BH,018H,063H,018HDB 063H,018H,063H,018H,063H,018H,063H,03CH,000H,000H,000H,000H,000H,000H,000H,000H;FA C4641DB 000H,000H,000H,000H,07FH,008H,066H,01CH,046H,036H,016H,063H,01EH,063H,016H,07FHDB 006H,063H,006H,063H,006H,063H,00FH,063H,000H,000H,000H,000H,000H,000H,000H,000H;SO C534FDB 000H,000H,000H,000H,03EH,01CH,063H,036H,063H,063H,006H,063H,01CH,063H,030H,063HDB 060H,063H,063H,063H,063H,036H,03EH,01CH,000H,000H,000H,000H,000H,000H,000H,000H;LA C4C41DB 000H,000H,000H,000H,00FH,008H,006H,01CH,006H,036H,006H,063H,006H,063H,006H,07FHDB 006H,063H,046H,063H,066H,063H,07FH,063H,000H,000H,000H,000H,000H,000H,000H,000H;SI C5349DB 000H,000H,000H,000H,03EH,03CH,063H,018H,063H,018H,006H,018H,01CH,018H,030H,018HDB 060H,018H,063H,018H,063H,018H,03EH,03CH,000H,000H,000H,000H,000H,000H,000H,000HDATA ENDS
0 0
- 微机实验之电子琴制作
- 微机原理实验一之存贮器内部数据传输
- 微机原理实验二之8259A中断控制器
- 微机原理实验 系列
- 微机原理实验 系列
- 电子琴
- 电子琴
- 电子琴
- 电子琴
- 电子琴
- 51单片机之电子琴设计
- 微机实验 数字钟 代码
- 微机原理上机实验 - 汇编
- 微机实验8255方式1
- 微机接口实验二:存储器扩展实验
- 微机原理之汇编语言程序部分的入门实验——DEBUG的使用
- 微机接口技术实验三测试微机系统串行口
- 【微机实验系列】基于微机的串行通信口扩展
- 用结构计算N个有理数的平均值
- 10年第六届湖南省acm程序设计大赛 第三题 C 数字整除
- Java短信发送平台代码
- js 获取 URL 参数
- 第16周项目1--数组的排序(指针)
- 微机实验之电子琴制作
- cocos2d-x(2.0.2)的win32工程移植到Android
- word2vec 中的数学原理详解(六)若干源码细节
- ztree没有样式
- 黑马程序员之ios学习总结——08 ObjectiveC语言的类和对象、类的三大特性
- Apache编译和配置
- 《老罗的Android之旅》阅读笔记——Log系统
- 使用JS截取字符串函数详解
- [笔经/面经]面试热问——你的职业规划是什么?