您的当前位置:首页正文

基于8255的8LED显示电子码表设计

来源:帮我找美食网


基于8255的8LED显示电子码表设计

通达学院

实验报告

(2010/2011学年 第 一 学期)

题 目:基于8255的8LED显示电子码表设计

专 业 通信工程 学 生 姓 名 班 级 学 号

授 课 教 师 林建中 授 课 单 位 南京邮电大学 日 期 2011年11月

第一部分 实验目的及要求:

1.实验目的

本课程设计在理论课程的基础上,重点

培养学生的动手能力,通过理论计算、实际编程、调试、测试、分析查找故障,解决在实际设计中的问题,使设计好的电路能正常工作,为下一步结合实际的硬件系统设计准备条件

2. 实验要求 基本要求:

1 设计秒表功能,精度为0.01秒。 2 可同时记录和存储10个秒表数据(连续记录并显示已存储记录数)。

3

秒表记录数据查询和清除功能。 可根据速度误差用D/A转换器输出DC

发挥部分:

1

信号。

2

可设定速度偏差范围,当超范围时通有静音功能。

过蜂鸣器能发出提示音。

3 动态显示格式:

自定

第二部分 实验工具及实验器件

1. Proteus7.4以及Keil 2软件的使用

Proteus软件是英国Labcenter

electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年即将增加Cortex和DSP系列处理器,并持续增加其他系列处理器模型。在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。

5

在PROTEUS绘制好原理图后,调入已编译好的目标代码文件:*.HEX,可以在PROTEUS的原理图中看到模拟的实物运行状态和过程。而*.HEX文件则由Keil软件编译后生成。

Keil uVision2是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,使用接近于传统c语言的语法来开发,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用,而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编,您可以在关键的位置嵌入,使程序达到接近于汇编的工作效率。KEILC51标准C编译器为8051微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效,快速的特点。C51编译器的功能不断增强, 使你可以更加贴近CPU本身,及其它的衍生产品。C51已被完全集成到uVision2的集成开发环境中,这个集成开发环境包含:编译器,汇编器,实时操作系统,项目管理器,调试器。uVision2 IDE可为它们提供单一而灵活的开发环境。

6

Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面,使您能在很短的时间内就能学会使用keil c51来开发您的单片机应用程序 。

另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。在开发大型软件时更能体现高级语言的优势。

有了proteus和keil 我们就需要在这两个软件中建立我们所需要的工程进行实验,具体步骤如下:

第一步:在Keil2中建立一个新的工程,并命名,

第二步:选择使用的单片机芯片,我们选择80c31,

第三步:将新创建的.c文件添加到Target中。

这样我们就可以在keil2的环境下对单片机的程序进行编译和运行了。

2. 51单片机AT89c51。

7

51单片机是对目前所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。需要注意的是52系列的单片机一般不具备自编程能力。 当前常用的51系列单片机主要产品有: *Intel的:80C31、80C51、87C51,80C32、80C52、87C52等;

*ATMEL的:89C51、89C52、89C2051等; *Philips、华邦、Dallas、

Siemens(Infineon)等公司的许多产品80C31单片机,它是8位高性能单片机。属于标准的MCS-51的HCMOS产品。它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,标准MCS-51单片机的体系结构和指令系统。 80C31内置中

8

央处理单元、128字节内部数据存储器RAM、32个双向输入/输出(I/O)口、2个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。但80C31片内并无程序存储器,需外接ROM。 此外,80C31还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。80C31有PDIP(40pin)和PLCC(44pin)两种封装形式。 管脚说明:

8031芯片具有40根引脚,其引脚图如图所示:

9

40根引脚按其功能可分为四类: 1. 电源线2根

Vcc:编程和正常操作时的电源电压,接+5V。

Vss:地电平。 2. 晶振:2根

XTAL1:振荡器的反相放大器输入。使用外部震荡器是必须接地。

XTAL2:振荡器的反相放大器输出和内部时钟发生器的输入。当使用外部振荡器时用于输入外部振荡信号。

10

3. I/O口共有p0、p1、p2、p3四个8位口,32根I/O线,其功能如下: 1) P0.0~P0.7 (AD0~AD7) 是I/O端口O的引脚,端口O是一个8位漏极开路的双向I/O端口。在存取外部存储器时,该端口分时地用作低8位的地址线和8位双向的数据端口。(在此时内部上拉电阻有效) 2) P1.0~P1.7

端口1的引脚,是一个带内部上拉电阻的8位双向I/O通道,专供用户使用。 3) P2.0~P2.7 (A8~A15)

端口2的引脚。端口2是一个带内部上拉电阻的8位双向I/O口,在访问外部存储器时,它输出高8位地址A8~A15 4) P3.0~P3.7

端口3的引脚。端口3是一个带内部上拉电阻的8位双向I/O端口,该口的每一位均可独立地定义第一I/O口功能或第二I/O口功能。作为第一功能使用时,口的结构与操作与P1口完全相同,第二功能如下示: 口引脚 第二功能

11

P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 (外部中断) P3.3 (外部中断)

P3.4 T0(定时器0外部输入) P3.5 T1(定时器1外部输入) P3.6 (外部数据存储器写选通) P3.7 (外部数据存储器读选通)

3. SRAM芯片6264

6264的容量为8KB,是28引脚双列直

插式芯片,采用CMOS工艺制造

12

A12~A0(address inputs):地址线,可寻址8KB的存储空间。

D7~D0(data bus):数据线,双向,三态。

OE(output enable):读出允许信号,输入,低电平有效。

WE(write enable):写允许信号,输入,低电平有效。

CE1(chip enable):片选信号1,输入,在读/写方式时为低电平。

CE2(chip enable):片选信号2,输入,在读/写方式时为高电平。 VCC:+5V工作电压。 GND:信号地。

4. 6264的操作方式

6264的操作方式由, CE1 , CE2的共同作用决定

① 写入:当和为低电平,且和CE2为高电平时,数据输入缓冲器打开,数据由数据线D7~D0写入被选中的存储单元。

13

② 读出:当和为低电平,且和CE2为高电平时,数据输出缓冲器选通,被选中单元的数据送到数据线D7~D0上。

③ 保持:当为高电平,CE2为任意时,芯片未被选中,处于保持状态,数据线呈现高阻状态。

微处理器通过数据总线、地址总线及控制总线与存储器连接,如下图所示:

CPU 线 线 线 存储器

地址总线为地址信号,用来指明选中的存储单

元地址。

数据总线为数据信号,它是微处理器送往存储器的信息或存储器送往微处理器的信息。它包括指令和数据。

控制总线发出存储器读写信号,以便从ROM、RAM中读出指令或数据,或者向RAM写入数据。

14

在微机系统中,常用的静态RAM有6116、6264、62256等。在本实验中使用的是6264。6264为8K╳8位的静态RAM,其逻辑图如下:

其中A0~12为13根地址线,I/O0~7为8根数据线,CS1 、CS2为两个片选端,OE为数据输出选通端,WR为写信号端。其工作方式见下表:

控制信号 S1 读 写 非选 L L H CS2 H H ╳ CE L ╳ ╳ OR H L ╳ 输出 输入 高阻态 W数据线 6264 A0VCC I/O0~7 WR OE ~12

5. 可编程并行I/O接口芯片8255 A

8255是Intel公司生产的可编程并行I/O接口芯片,有3个8位并行I/O口。具有3个通道

15

3种工作方式的可编程并行接口芯片(40引脚)。 其各口功能可由软件选择,使用灵活,通用性强。8255可作为单片机与多种外设连接时的中间接口电路。

8255作为主机与外设的连接芯片,必须提供与主机相连的3个总线接口,即数据线、地址线、控 制线接口。同时必须具有与外设连接的接口A、B、C口。由于8255可编程,所以必须具有逻辑控制部分,因而8255内部结构分为3个部分:与CPU连接 部分、与外设连接部分、控制部分。

引脚功能:

RESET:复位输入线,当该输入端处于高电平时,所有内部寄存器(包括控制寄存器)均被清除,所有I/O口均被置成输入方式。

16

CS:芯片选择信号线,当这个输入引脚为低电平时,即/CS=0时,表示芯片被选中,允许8255与CPU进行通讯;/CS=1时,8255无法与CPU做数据传输.

RD:读信号线,当这个输入引脚为低电平时,即/RD=0且/CS=0时,允许8255通过数据总线向CPU发送数据或状态信息,即CPU从8255读取信息或数据。

WR:写入信号,当这个输入引脚为低电平时,

即/WR=0且/CS=0时,允许CPU将数据或控制字写入8255。

D0~D7:三态双向数据总线,8255与CPU数据传送的通道,当CPU 执行输入输出指令时,通过它实现8位数据的读/写操作,控制字和状态信息也通过数据总线传送。

8255具有3个相互独立的输入/输出通道端口,用+5V单电源供电,能在一下三种方式下工作。

方式0————基本输入输出方式;方式1————选通输入/出方式;方式三————双向选通输入/输出方式;

17

PA0~PA7:端口A输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入锁存器。 工作于三种方式中的任何一种; PB0~PB7:端口B输入输出线,一个8位的I/O锁存器, 一个8位的输入输出缓冲器。 不能工作于方式二;

PC0~PC7:端口C输入输出线,一个8位的数据输出锁存器/缓冲器, 一个8位的数据输入缓冲器。端口C可以通过工作方式设定而分成2个4位的端口, 每个4位的端口包含一个4位的锁存器,分别与端口A和端口B配合使用,可作为控制信号输出或状态信号输入端口。'不能工作于方式一或二。

A1,A0:地址选择线,用来选择8255的PA口,PB口,PC口和控制寄存器. 当A1=0,A0=0时,PA口被选择; 当A1=0,A0=1时,PB口被选择; 当A1=1,A0=0时,PC口被选择; 当A1=1.A0=1时,控制寄存器被选择.

6. 74HC373 锁存器

18

当三态允许控制端 OE 为低电平时,O0~O7 为正常逻辑状态,可用来驱动负载或总线。当 OE 为高电平时,O0~O7 呈高阻态,即不驱动总线,也不为总线的负载,但锁存器内部的逻辑操作不受影响。

当锁存允许端 LE 为高电平时,O 随数据 D 而变。当 LE 为低电平时,O 被锁存在已建立的数据电平。当 LE 端施密特触发器的输入滞后作用,使交流和直流噪声抗扰度被改善 400mV。

引出端符号: D0~D7 数据输入端

OE 三态允许控制端(低电平有效) LE 锁存允许端

19

O0~O7 输出端

真值表:

Dn H L X X LE H H L X OE L L L H On H L Q0 高阻态

7. 8LED液晶显示器件7SEG-MPX8-CC-BLUE

第三部分 实验原理及程序代码:

1. 硬件部分电路设计图 电路图如图:

20

2. 软件部分设计

/*电子码表

用proteus仿真时注意在烧写对话框中将晶振值改为6MHZ 按键1 开始、暂停

按键2 秒表运行时记录数据,查看存储记录时删除存储数据

按键3 秒表暂停时清除显示清零

按键4 查看存储的数据,第一次按下为第一组数据,以此类推最多十组数据 */

#include

21

#include #define PA XBYTE[0x0000] #define PB XBYTE[0x0001] #define PC XBYTE[0x0002] #define control XBYTE[0x0003] #define uchar unsigned char #define uint unsigned int uint code

duanma[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9码值 //uint code

weima[10]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uint code

weima[10]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; uint

displaybuff[]={0x3f,0x3f,0x40,0x3f,0x3f,0x40,0x3f,0x3f}; bit flag=0; bit flag1=0;

22

bit flag2=0; bit flag3=0; bit flag4=0;

uchar num,second,minute; uchar count=0,count1=0; uchar

num_date[10],second_date[10],minute_date[10];

uchar number; uchar n0;

void DelayUs2x(uchar t); void DelayMs(uchar t); void display(); void start(); void trans_date(); void keyscan(); //主函数 main() {

start(); PC=0xff;

23

while(1) {

keyscan(); trans_date(); display(); } }

//初始化程序 void start() {

TMOD=0x01;

TH0=(65536-5000)/256; TL0=(65536-5000)%256; ET0=1; EA=1; TR0=0; minute=0; second=0; num=0; control=0x89; }

24

//定时器中断程序

void T0_time() interrupt 1 {

TH0=(65536-5000)/256; TL0=(65536-5000)%256; num++; if(num==100) { num=0; second++; if(second==60) {

second=0; minute++; }

if(minute==99&&second==99) {

minute=0; second=0; } }

25

}

void trans_date() {

if(flag==0) {

displaybuff[7]=duanma[minute/10]; displaybuff[6]=duanma[minute%10]; displaybuff[4]=duanma[second/10]; displaybuff[3]=duanma[second%10]; displaybuff[1]=duanma[num/10]; displaybuff[0]=duanma[num%10]; } else {

displaybuff[7]=duanma[minute_date[count-1]/10];

displaybuff[6]=duanma[minute_date[count-1]%10];

26

displaybuff[4]=duanma[second_date[count-1]/10];

displaybuff[3]=duanma[second_date[count-1]%10];

displaybuff[1]=duanma[num_date[count-1]/10];

displaybuff[0]=duanma[num_date[count-1]%10]; } }

//显示程序 void display() { uchar n=0; for(n=0;n<8;n++) {

PB=weima[n]; PA=displaybuff[n];

27

DelayMs(2); } }

//延时函数

void DelayUs2x(uchar t) {

while(--t); }

void DelayMs(uchar t) { while(t--) {

DelayUs2x(245); DelayUs2x(245); } }

//键盘扫描程序 void keyscan() {

28

uchar m; m=PC; m=m&0x0f; if(m!=0x0f) {

DelayMs(30); m=PC; m&=0x0f; if(m!=0x0f) {

if(PC==0xfe) flag1=1; if(PC==0xfd) flag2=1; if(PC==0xfb) flag3=1; if(PC==0xf7) flag4=1; }

while(PC!=0xff); }

29

if(flag1==1) {

TR0=~TR0; flag=0; flag1=0; }

if(flag2==1) {

if(TR0==1) {

if(number<10) {

minute_date[number]=minute; second_date[number]=second; num_date[number]=num; number++; } } else {

30

if(flag==1) {

minute_date[count-1]=0; second_date[count-1]=0; num_date[count-1]=0; } } flag2=0; }

if(flag3==1) {

if(TR0==0) { num=0; second=0; minute=0; flag=0; } flag3=0; }

if(flag4==1)

31

{

if(TR0==0) {

flag=1; count++;

if(count>number) count=1; } flag4=0; } }

第四部分 实验测试结果

按键1 开始、暂停

按键2 秒表运行时记录数据,查看存储记录时删除存储数据

32

按键3 秒表暂停时清除显示清零

按键4 查看存储的数据,第一次按下为第一组数据,以此类推最多十组数据

第五部分 实验小结和体会

本次课程设计的题目是基于8255的8LED显示电子码表设计。我通过在图书馆的书籍查阅和网上资料的阅读,初步了解了单片机的基础知识以及单片机通信功能的使用,并且对本次实验时所需要的软件进行了熟悉,对一些经典的例子进行了模拟仿真,学到了许多平时课程上没有学到的知识。在本次的课程设计中我遇到了不少难题,这源于我们对题目的主观认识,经过老师的耐心讲解,我认识到了在设计上存在的问题,并且在同学和老师的帮助下我知道该如何解决问题。这个过程对我的学习非常有帮助,知道如何发现问题,分析解决问题。实验过程中,也对团队精神的进行了考察,让我们在合作起来更加默契。团结就是力量,只有互相之间默契融洽的配合才能换来最终完美的结果。此次设计也让我明白了思路即出

33

路,有什么不懂不明白的地方要及时请教或上网查询,只要认真钻研,动脑思考,动手实践,就没有弄不懂的知识。最后衷心感谢本次课程设计所有同学、老师的指点和帮助。

34

因篇幅问题不能全部显示,请点此查看更多更全内容

Top