接口课程设计任务书
学生姓名 专业班级 指导老师 工作单位 计算机科学与技术学院
题目:使用定时/计数器8253设计产生升音频率发音的应用
(C程序设计语言)
一、内容:
使用MIFID微机实验台上的定时/计数器8253设计产生升音频率,产生的升音频率从喇叭发音,点亮LED发光二极管。接口硬件电路图见附录所示。 二、要求:
1、16个升音频率数字以及每个升音频率相对应的时间延时数字,把他们用文件或
数组的形式存储。
2、依次读出每个升音频率数字,计算出定时/计数器8253发出这个升音频率的计数
初值。在CRT上显示这个升音频率和计数初值。
3、使用并行接口8255A的PC6控制定时/计数器8253的GATE信号,从OUT2输
出升音频率。PC0控制喇叭开始发音。 4、设计程序运行时的界面友好。
三、 进度安排:
序号 1 2 3 4 合计 内容 接口电路设计 编写程序 调试程序 撰写课程设计报告 所用时间 2天 1天 1天 1天 5天
指导教师签名: 年 月 日
系主任(责任教师)签名: 年 月 日
[键入文字]
目 录
接口课程设计任务书
1 采用器件功能说明
1.1 8253的外部特性和内部结构
1.1.1 8253的外部特性
1.1.2 8253的内部结构 1.2
8253的工作方式和初始化
1.2.1 8253的工作方式 1.2.2 8253的初始化
1.3 8255的简单介绍
2 程序流程图和硬件连接图说明
2.1 流程图 2.2 硬件连接图
3 程序调试过程
3.1程序实现相关说明 3.2 接线调试过程
4 心得体会
本科生课程设计成绩评定表 附录
2
[键入文字]
使用定时/计数器8253设计产生
升音频率发音的应用
--------(C程序设计语言)
1 采用器件功能说明
1.1 8253的外部特性和内部结构
可编程定时器/计数器8253是一种在微机系统中实现定时和计数功能的LSI外围接口电路。为了更好地完成本次实验,要求实验者必须对8253的工作原理,8253控制寄存器的格式及作用,8253的6种工作方式的各自特点,8253控制字的读回命令与锁存命令的区别等有清楚的认识。实验过程中,门控信号GATE的电平高低变化可通过电平开关来控制。时钟脉冲CLK的发出可通过单脉冲发生器来实现。OUT的电平变化可用逻辑笔来观察。OUT的波形可通过其电平变化与时钟脉冲CLK的个数关系画出。下面将介绍一下8253的外部特性和内部结构。
1.1.1 8253的外部特性
3
[键入文字]
面向CPU的信号线:
(1)数据总D0~D7线,为三态输入/输出线,用于将8253与系统数据总线相连。 (2)片选线 CS
(3)读信号 RD*,有效时表示对8253进行读操作。 (4)写信号 WR*,有效时表示对外253进行写操作。 (5)地址线 A1A0 ,用于选择8253片内的寄存器。
占用四个连续的端口地址,分别对应于三个计数初值寄存器端口和一个控制寄存器
端口。
A1A0 =00 A1A0 =01 A1A0 =10 A1A0 =11
计数器0 计数器1 计数器2 控制寄存器
面向I/O设备的信号线:
(6)计数器时钟信号CLK:为计数器提供时钟信号。
(7)计数器门选控制信号GATE:用来禁止、开始计数器的计数过程。 (8)计数器输出信号OUT:当计数值减为0时,计数器输出信号OUT,表示计数或定时已到。
4
[键入文字]
1.1.2 8253的内部结构
(1)数据总线缓冲器: 8位双向三态缓冲器。
通过编写程序向8253写入确定8253工作方式的命令; 向计数寄存器装入计数初值;读出当前计数值。 (2)读/写控制逻辑: 8253内部操作的控制部分。
按照CPU发来的读写信号及地址信号产生相应的控制信号,来选择读/写操作的端口、控制数据的传送方向,以及对控制寄存器的写入。 (3)控制字寄存器: 控制字寄存器是8位的,只能写不能读。
在初始化编程时,CPU写入方式控制字到控制字寄存器 中,用以选择计数
通道及其相应的工作方式。 (4)计数器0、计数器1、计数器2
内部结构相同、功能相同;有各自独立的端口地址;有6种不同的工作方式。 每个计数通道都由计数初值寄存器、减1计数器和计数值锁存器这三个组成。 计数初值提前写入到计数通道。
5
[键入文字]
时钟脉冲从 CLK端输入。每输入一个时钟脉冲,减1计数器减1;当减1计数器为0时,计数结束。
其中计数器的内部结构如下:
计数初值寄存器(16位):用于存放计数初值,其长度为16位,故最大计数值为65536。此寄存器的初值同减1计数器的初值在初始化时同时装入的。
减1计数器(16位):用于进行减1操作,每来一个时钟脉冲,就作减1运算,直至将计数初值减为0为止。
计数值锁存器(16位):锁存减1 计数器的内容,以供读出和查询。
1.2 8253的工作方式和初始化
1.2.1 8253的工作方式
8253有6种工作方式,由于实验用到方式2或方式3,下面介绍一下方式2和方式3:
方式2 周期性负脉冲输出(分频器)
6
[键入文字]
方式3 方波发生器
1.2.2 8253的初始化
8253的初始化包括设置控制字:选择计数通道,确定其工作方式;设置计数初值:写入到对应的计数通道中,确定计数定时时间。
8253的工作方式控制字如下:
7
[键入文字]
1.3 8255的简单介绍
8255A 有三个数据端口: 端口A、端口B、端口C,一个控制端口。本次课设主要
用到C口的PC0和PC6,C口具有按位置位/复位功能,为按位控制提供了强有力的
支持。但是端口C按位置1/置0控制字是对端口C的操作控制信息,因此该控制字必须写入控制端口,而不应写入端口C。控制字如下:
2 程序流程图和硬件连接图说明
2.1 流程图
8
[键入文字]
根据课设要求画出流程图如下:
9
[键入文字]
2.2 硬件连接图
主机,8253,8555等的连接如下图所示:
3 程序调试过程
3.1程序实现相关说明
因为本次课设,我要用C语言完成。于是需要用到一些与硬件有关的函数。说明如下:
outportb()
函数名: outportb
功 能: 输出字节到硬件端口中 用 法: void outportb(int port, char byte);
本实验中采用数组的方式存储16个升
音频率数字:
int sounds[] = {
10
[键入文字]
}
100, 200, 400, 800, 1200, 1600, 2000, 2400,
2800, 3200, 3600, 4000, 4800, 5600, 7200, 9000
3.2 接线调试过程
写完程序后,在实验板上调试运行,根据之前的设计,实验板连线:CLK2接到用户时钟块上的1.19318MHz;8255的PC6接到8253的GATE2;8255的PC0接到音乐发生器块上的门控GATE;8253的OUT2接到音乐发生器块的音调上。
连接好实验板上的连线后,开始在计算机上运行程序,由于实验室实验板大多都老化了有问题,试了几台之后终于在一台实验板上听到了升音,通过变换他的延时时间,可以清楚的听到16个一次升高频率的声音。
而在程序运行界面上可以看到16个频率及对应初值的依次输出如下图所示:
11
[键入文字]
4 心得体会
首先,这次微机原理与接口技术课程设计充分锻炼我们的动手能力和思考问题的能力,通过此次实验我加深了对8253定时计数器和8255C口应用的了解。应用C语言编程深入硬件,是沟通软件的逻辑可行性和实际可行性的桥梁,由此也使我体会到了软件开发的艰辛。
其次,这次课程设计让我积累了相关方面的专业知识,对以后的工作学习有着借鉴作用。
最后,虽然本次课程设计的任务已经基本完成,但是我相信这些知识还会在以后再次用到,我会继续努力学习这方面的知识,巩固旧知识和学习新的专业知识。
12
[键入文字]
本科生课程设计成绩评定表
班级: 姓名: 学号: 序号 1 2 3 4 5 6 评分项目 学习态度认真、遵守纪律 设计分析合理性 设计方案正确性、可行性、创造性 设计结果正确性 设计报告的规范性 设计验收 满分 10 10 20 40 10 10 总得分/等级 实得分 评语: 注:最终成绩以五级分制记。优(90-100分)、良(80-89分)、中(70-79分)、
及格(60-69分)、60分以下为不及格
指导教师签名:
200 年 月 日
13
[键入文字]
附录:源码
#include #define counter 0x306 //8253计数器2的端口 #define order53 0x307 //8253命令端口 #define order55 0x303 //8255命令端口 #ifdef __cplusplus #define __CPPARGS ... #else #define __CPPARGS #endif unsigned long int clk=1193181; int sounds[16]= { 100, 200, 400, 800, 1200, 1600, 2000, 2800, 3200, 3600, 4000, 4800, 5600, 7200, }; void S(int number) //8253 { printf(\"The frequency of the sound is:%d\ printf(\" ### \"); int sound,HNo,LNo; sound=clk/number; printf(\"The counter number is:%d\\n\ HNo=(sound>>8)&0x00ff; LNo=sound&0x00ff; 14 2400, 9000 [键入文字] } outportb(order53,0xB6); //10 11 011 0,2号计数器,高位,3方式,二进制 outportb(counter,LNo); outportb(counter,HNo ); void main() { int a=16; int b=0; int temp=1; outportb(order55,0x80); while(temp){ outportb(order55,0x0d); //0000 110 1,PC6=1,使GATE2信号为1 outportb(order55,0x01); //0000 000 1,PC0=1, 喇叭开始发音 b=0;