325定时器.doc_第1页
325定时器.doc_第2页
325定时器.doc_第3页
325定时器.doc_第4页
325定时器.doc_第5页
已阅读5页,还剩49页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

四川大学网络教育学院实践课程报告实践课程 8253定时器/计数器接口与数字电子琴校外学习中心 阿拉善奥鹏 专 业 电气工程及其自动化 层 次 专升本 年 级 0803 学生姓名 郭岩峰 学 号 200802036828 2011年 2 月 25 日一、 原理PC机的主机箱上装有一只小喇叭,由定时器8253和并行接口芯片8255控制其发音,其电路如下: 8253用定时器2来产生896Hz的音频信号使喇叭发声,我们可以改变定时器2的计数值来改变声音频率,通过发声的延时程序来获得持续时间长短不同的声音,于是就可以通过编程来获得声调(频率)和节奏(延时长短),使计算机演奏出乐曲来。如果再把音符与数字键1,2,3,4,5,6,7,8,9, 对应起来,就可以把计算机变成电子琴。下面给出有关资料: 音符1234567频率131147165175196220247262294330349392440494523 计数值计算公式 计数值=1.19318MHZ(时钟频率)/ 给定频率 =1234DCH / 给定频率.。 8253定时器通道2的端口地址:42H(存放计数值,先送低位字节,后送高位字节) 命令寄存器地址:43H 编程参考:1) 计算计数值程序段:MOV DI, 给定频率MOV DX, 12HMOV AX, 34DCHDIV DIAX中即为计数值。2) 打开扬声器发声,8255PB0,PB1送出高电平:IN AL,61HOR AL,3OUT 61H,AL3) 关闭扬声器,停止发声:IN AL,61HAND AL,0FCHOUT 61H,AL二、题义分析及解决方案通过STAR ES598PCI单板机的G6区的17号键,通过单板机上的8255A芯片进行音调的选择,由8253芯片控制产生不同频率的方波,并由8255A芯片控制打开单板机上D1区的蜂鸣器,使其对应于G6区的17号键由低到高发出17的音阶,从而实现简易电子琴的功能。同时,也可以通过事先设置好的“乐谱”回放一段音乐,其控制键在程序中设定(为A健),设8号键为返回程序菜单,可以重新选择 。1、解决问题方法及思路本次设计的电子琴主要用到了芯片8255和芯片8253。输入部分主要是由7个按键和一个并行接口8255组成。7个按键一端接地,另一端接到8255的A口输入,并且通过一个电阻接到+5V。如下表,当不同的按键按下时,从A口输入就对应一个8位的二进制数据(下表中是用16进制表示的)。通过软件检测输入的数据,然后给8253送相应频率的计数值。电子琴以8253的2号计数器为核心。系统初始化时,2号计数器工作在“方波发生器”方式,CPU通过对定时器的通道2进行编程,使其I/O寄存器接收一个控制声音频率的16位计数值,写入顺序为先低后高,端口61H的最低位控制通道2门控的开断,,CLK2为1MHZ,当计数初值为3E8H时,OUT2输出的方波大约为1000 HZ,经过简单的滤波之后,送至蜂鸣器。通过改变2号计数器的计数初值就可以使蜂鸣器发出不同频率的声音。在送出频率计数值之前,还要给方式寄存器送一个方式值,该数决定对哪一个通道编程,采用什么模式,送入通道的计数值是一字节还是两字节,是二进制码还是BCD码。其位组合的格式如下:芯片8255A的A口工作于基本输入方式下。G6区的17号按键(S29S36)直接连接到8255A芯片的A口中,用于控制芯片8253的2号计数器的计数初值,从而使8253芯片能够对于不同的按键产生与其相对应的发声频率。四川大学网络教育学院实践课程报告实践课程 使用DEBUG调试工具校外学习中心 阿拉善奥鹏 专 业 电气工程及其自动化 层 次 专升本 年 级 0803 学生姓名 郭岩峰 学 号 200802036828 2011年 2 月 25 日1.实验目的(1)熟悉DEBUG有关命令的使用方法。(2)利用DEBUG掌握有关指令的功能。(3)利用DEBUG运行简单的程序段。2.实验内容(1)进入和退出DEBUG程序。进入DEBUG程序,Windows中在命令提示符下进入DEBUG如图:退出DEBUG如图: (2)学会DEBUG中的D命令、E命令、R命令、T命令、A命令、G命令等的使用。对于U命令、N命令、W命令等,也应试一下。l R命令:1) 显示所有寄存器内容:格式:-R功能:以十六进制形式显示CPU内部各寄存器的值:以符号形式标志寄存器各标志位(除TF外)的值,并将CS:IP所指的内存内容反汇编成一条指令,可视为将要执行的指令。从显示可知,CS=10C1H,IP=0100H.2) 修改寄存器格式:-R 寄存器名功能:DEBUG首先显示指定寄存器的当前值,并在下一行首给出提示“:”,等待用户输入新值,若直接回车相当于不个忙寄存器的值。3) 修改标志值格式:-RF功能:先用符号显示当前各标志位的值,并在末尾给出提示符“-”,然后等待用户以符号形式输入新的标志值,对输入的次序没有要求,各标志值之间也可没有空格;若直接在“-”之后回车,则保留原标志值。l A命令格式:-A 内存地址l U命令格式:-U 内存块l N命令l W命令l T命令1) 单步执行格式:-T=内存地址 -P=内存地址(好像不好使)2) 多步执行格式:-T=内存地址 执行指令条数 -P=内存地址 执行指令条数(好像也不好使)l G命令格式:-G=内存地址 断点地址l D命令格式:-D内存块l E命令格式1:-E内存地址 字符或数值串格式2:-E内存地址(3)利用DEBUG,验证乘法、除法、加法、减法、带进位加、带借位减、堆栈操作指令、串操作指令的功能。1) 乘法2) 除法3) 加法4) 减法5) 带进位加6) 带借位减7) 堆栈操作指令8) 串操作指令3.实验准备(1)仔细设计有关DEBUG命令的内容,对有关命令,都要事先准备好使用的例子。(2)作为例子,准备用A命令,输入在显示器上显示字符“S”的系统调用程序段。(3)阅读将AX左移9位的程序段。4.实验步骤(1)在DOS提示符下,进入DEBUG程序。在DOS子目录下启动DEBUG。(2)详细记录每一步所用的命令,以及查看结果的方法和具体结果。例:显示S例:ABC实验程序如下:DATASEGMENTARRAYDB 80,250,200,100,50COUNTEQU $ - ARRAYSUMDW ?DATAENDSCODESEGMENTASSUMECS:CODE, DS:DATASTART:MOVAX,DATAMOVDS,AXMOVAX,0MOVDI,OFFSET SUMMOVBX,OFFSET ARRAY MOVCX,COUNTLOP:ADDAL,BXADCAH,0INCBXLOOPLOPMOVDI,AXMOVAH,4CHINT21HCODEENDSENDSTART内容:编辑习题3-2,3-3的程序并对其进行连接和执行还要单步查看每一语句执行后相关寄存器的内容,并且调试附录B.3的例子,熟悉DEBUG的执行程序3-2源程序:DATA SEGMENTBUF DBHOW ARE YOU $DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV DX,OFFSET BUFMOV AH,09HINT 21HMOV AH,4CHINT 21HCODE ENDSEND START结果:将所编写的程序进行连接运行后,通过DEBUG指令进行反汇编.首先,进入调试环境后用-r指令可以看到CS=1541,IP=0000,即程序是从1451:0000处开始执行的.用-u指令对原程序进行了反汇编,可以看到在实际的计算机内部的具体执行情况,通过该指令我们可以对源程序进行检查来查找错误加以修改.用-DB49:0指令可以显示出逻辑数据段的值可以看到具体数据与其所对应的字符.用-G14指令可看到本例中在1451:0014设置了断点.用-DDS:0 指令可以查看数据传递的执行情况.收获:通过这次上机实验我熟悉了汇编语言源程序的书写格式.编辑,汇编,连接,运行等过程.对汇编程序有了初步的了解.并且发现了一些比较容易出错的地方,例如,当自己编写的程序忘了在名称后加上其扩展名是,连接时就会提示:UNABLE TO OPEN THIS FILE另外当在连接时把其文件名写错时也会出现这种情况.还有就是在编辑文件时一定要在MASM文件夹下进行,否则就会出现文件路径不对的问题.再者就是我按附录进行操作时得到的结果并不完全和课本上的一样,这主要是使用的机子的类型不一样的原因.我还对反汇编指令DEBUG有了一定的认识,知道可以通过它来对源程序进行检查(当运行结果与预想的不一样时).总之,我在上机实验当中学到了一些在课本上不易掌握的知识,对汇编语言也有了更进一步的了解,学会了汇编的大致流程.四川大学网络教育学院实践课程报告实践课程 设计汇编语言程序校外学习中心 阿拉善奥鹏 专 业 电气工程及其自动化 层 次 专升本 年 级 0803 学生姓名 郭岩峰 学 号 200802036828 2011年 2 月 25 日一、实验目的及要求1掌握一维数组和二维数组的使用方法;2掌握字符数组和字符串的使用方法;3掌握常用的字符串处理函数;4 使用数组解决常见的问题。 二、实验设备(环境)及要求2. 软件需求:Visual C+ 6.03. 硬件需求: Pentium III 450以上的CPU处理器,64MB以上的内存,200MB的自由硬盘空间三、实验内容与步骤1、 设计一个字符串数组的统计工具,可以实现以下功能:(1) 统计所有大写字母的个数;(2) 统计所有小写字母的个数;(3) 将所有字母转换为大写字母;(4) 将所有字母转换为小写字母。2、 实现一个32的矩阵和23的矩阵相乘,输出计算结果。计算方式如下:3、 从键盘输入10个整数,使用选择排序法输出这10个整数升序排列的结果。4、 在一个多维数组中记录10个同学的学号和姓名,提供2种查找方式:(1)通过输入学号查找对应的姓名;(2)通过输入姓名查找对应的学号。学号和姓名的多维数组表示如下:学号姓名101Tom102John110Mary5、 根据输入的奇数,输出以下的钻石图形。如输入3,则输出图a的钻石图形;如输入5则输出图b的钻石图形。* * * * (a) * * * (b)6、 将两个已经按降序排列的整型数组合并为一个升序数组。设计你的算法,以得到较高的运行效率。7、 输入一段文本,根据输入的字符串,实现“查找”和“替换”功能。(选做)8、 打印输出2009年的日历。(选做)9、 替换是加密过程中常用的一种运算。可以设计一种简单的替换如下:将大写字母AZ按照字母顺序排列成一个圆圈,字母Z后面紧接着字母A,对于任何一个待替换的大写字母,取其后第n个字母代替它,即完成替换过程。例如,当n=2时,A被C替换,B被D替换,C被E替换,Y被Z替换,X被A替换,Z被B替换。对于小写字母、数字也可以类比处理。要求编写一个程序,由用户输入n(类似于密钥),并将用户输入的待替换的字符串(类似于明文,由大写和小写字母组成)逐个字母替换后输出(输出结果类似于密文)。思考一下,如何使这个程序既能完成替换(加密过程)又能完成反替换(解密过程)。(选做)四、实验结果与数据处理1、 设计一个字符串数组的统计工具,可以实现以下功能:(1) 统计所有大写字母的个数;(2) 统计所有小写字母的个数;(3) 将所有字母转换为大写字母;(4) 将所有字母转换为小写字母。#include stdafx.h#include iostream.hvoid main()char str140;int x,i,s=0,t=0;coutstr;coutx;witch(x)case 1:for(i=0;stri!=0;i+) if(stri=A)&(stri=Z) s+; coutThe number of the uppercase is s=a)&(stri=z) t+; coutThe number of the lowercase is t=a)&(stri=z) stri=stri-32; coutThe all uppercase is str=A)&(stri=Z) stri=stri+32; coutThe all lowercase is strendl;break;可以设置5个case 还加一个case 0 是退出的,前面用一些输出来提示用户,如cout*string tools*;cout等等还可以在整个从输出到结束用一个do while循环,使用户不断的选择,最后主观退出。Switch(x)在输出所输入的字符串时加引号更便于观看。如果需要还可以加一个case 使用户可以重新输入字符串而不需要重新运行程序。2、 实现一个32的矩阵和23的矩阵相乘,输出计算结果。计算方式如下:#include stdafx.h#include iostream.hvoid main()double a32,b23,c;int i,j;coutPlease input six numbers of the matrice a first: n;for(i=0;ia0i;for(i=0;ia1i;for(i=0;ia2i;coutthen input six numbers of the matrice b n;for(j=0;jb0j;for(j=0;jb1j; coutThe result of a*b is n; for(i=0;i3;i+)for(j=0;j3;j+) coutai0*b0j+ai1*b1j ;coutendl;输入二维数组时采用两个for循环。a*b可以换成aXb。ci,j= ai0*b0j+ai1*b1j.3、 从键盘输入10个整数,使用选择排序法输出这10个整数升序排列的结果。#include stdafx.h#include iostream.hvoid main() int a10,i,s,t; coutPlease input 10 numbers: n; for(i=0;iai; coutThe softed order of the 10 numbers from min to max is: n; for(i=0;i9;i+) for(s=i+1;sas) t=ai; ai=as; as=t; for(i=0;i10;i+) coutai ; coutendl; 输出时先输出原始的顺序,便于观看比较。4、 在一个多维数组中记录10个同学的学号和姓名,提供2种查找方式:(1)通过输入学号查找对应的姓名;(2)通过输入姓名查找对应的学号。学号和姓名的多维数组表示如下:学号姓名101Tom102John110Mary#include stdafx.h#include iostream.h#include string.hvoid main() int a10; int i,num,x; char name10; char b1010=Tom,John,Apple,David,Lucy,Red,Bush,Kobe,Nick,Mary; for (i=0;i10;i+) ai=101+i; coutx; switch(x) case 1:coutnum; coutThe name of num is: n; for (i=0;i10;i+) if (ai=num) coutbiendl;break; case 2:coutname; coutThe number of name is: n; for (i=0;i10;i+) if (!strcmp(bi,name) coutaiendl;break; 可以用一个三维数组 char c1128=“000”,“No”,“101”,“Tom”等到110cout“NumbertName”endl;输出原始数据。和第一题类似cout10) coutsorry no such numbercase 2 类似如果选择3或4等,coutillegal choice解法二 在定义三维数组加一个“number”,“name”结束时可用return if(ch=1|ch=2)docoutPlease input the c11ch-1quit with c0ch-1Coutc11!(ch-1)ofc11ch-15、 根据输入的奇数,输出以下的钻石图形。如输入3,则输出图a的钻石图形;如输入5则输出图b的钻石图形。* * * * (a) * * * (b)#include stdafx.h#includevoid main() int a,i,j; couta; int b140; coutThe image of diamond you want is below: n; for(i=0 ;i(a+1)/2;i+) bi=2*i+1; for(i=(a+1)/2;ia;i+) bi=ba-1-i; for(i=0;ia;i+) for( j=0;j(a-bi)/2;j+) cout ; for(j=0;jbi;j+) cout*; coutendl; #include “math.h”取绝对值函数头文件6、 将两个已经按降序排列的整型数组合并为一个升序数组。设计你的算法,以得到较高的运行效率。#include stdafx.h#include iostream.hvoid main() int a10,i,k,s,t; int b5=14,12,10,9,7; int c5=13,11,8,6,3; for(k=0;k5;k+) ak=bk; for(k=5;k10;k+) ak=ck-5; coutBefore compland b=14 12 10 9 7;c=13,11,8,6,3endl; coutAfter compland a= ; for(i=0;i9;i+) for(s=i+1;sas) t=ai; ai=as; as=t; for(i=0;i10;i+) coutai ; coutendl; 7、 输入一段文本,根据输入的字符串,实现“查找”和“替换”功能。(选做)#include stdafx.h#include iostream.h#include stdio.h#include string.hvoid main()char a1400;char b1400;char c1400;int i,s,t,j,k,m;gets(a);coutThe document you input is:naendl;coutb;coutThe location of b in the document is: n;for (i=0;i(strlen(a)-strlen(b)+1);i+) for (t=0,s=0;sstrlen(b);s+)if (ai+s=bs)t+;if (t=strlen(b)j=i+1; coutj ;coutendl;coutc;if (strlen(b)strlen(c)for (k=0;kstrlen(c);k+)ak+j-1=ck;for (m=j-1+strlen(c);m=j-2+strlen(c);m-)am+(strlen(c)-strlen(b)=am;for (k=0;kstrlen(c);k+)ak+j-1=ck;coutAfter replace the document is: naendl;和第一题是类似,Find&Replace8、 打印输出2009年的日历。(选做)#include stdafx.h#include iostream.h#include iomanip.hvoid main()int i,m,d,t=0;int a31;char Month1214=January,February,March,April,May,June, July,August,September,October,November,December ; for (i=0;i31;i+)ai=i+1;coutendl Calendar The Year of 2009 nendl;cout=n;coutsetw(10)Sunsetw(10)Monsetw(10)Tuesetw(10)Wensetw(10)Thusetw(10)Frisetw(10)Satendl;coutJanuaryendl;coutsetw(50)a0setw(10)a1setw(10)a2endl;for (d=3;d31;d+=7)coutsetw(10)adsetw(10)ad+1setw(10)ad+2setw(10)ad+3setw(10)ad+4setw(10)ad+5setw(10)ad+6endl;for (m=2;m=12;m+) cout -n;coutsetw(10)Sunsetw(10)Monsetw(10)Tuesetw(10)Wensetw(10)Thusetw(10)Frisetw(10)Satendl; coutMonthm-1endl;if (t%7!=0) coutsetw(t%7)*10) ;if (m=3|m=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论