89C205160进制计数器实验报告

  • 格式:docx
  • 大小:49.02 KB
  • 文档页数:5

开放式电路实验报告

实验二 基于89C2051的60进制计数器的实现

班级:软1215班

成员:王俊福、宋渊、徐耀阳

2014 年 10 月 15 日

实验二 基于89C2051的60进制计数器的实现

一、 实验目的

通过搭建电路并且编程实现60进制计数器,我们学习到89C2051的简单运用以及部分的电路原理,并且学会了对单片机的IO口的简单操作,同时也明白了计数器LED的发光原理。

二.实验原理

计数器通过LED显示,分为十位和各位单独显示。每一个LED计数器显示电路(如图所示)是由8个发光二极管(七个二极管拼接成数字0—9,一个二极管显示为小数点)和8个电阻构成的电路。发光二极管与电阻对应串联,然后接在与之相对应的IO口的特定位上。通过软件编程对IO口输出高低电平来实现LED的亮灭。由于发光二极管的导通电压一般为1.7V以上,另外,他的工作电流根据型号不同一般为1mA到30mA,电阻选择范围100欧姆~3千欧姆在此我们这里选用560欧姆的电阻。

三.实验电路图 时钟电路

复位电路 89C2051

单片机 LED显示数字

直流5V电源

四.实验设备及元器件汇综

同实验一的器件都一样,只不过这一次实验是把原件都集成到了电路板上,然后编程对芯片进行烧写,实现计数器程序。

五.实验过程简述

1、研究电路图,看懂60进制计数器的实现的电路原理。

2、然后把89C2051控制电路和LED显示电路按照编码要求连接。

3、测试电路,观察是否得到正确的60进制计数器显示,若出现错误则按照各部分的功能原理查找错误并纠正。

六.实验总结

1)比较C,ASM汇编语言编程的不同?

答:汇编语言是一种用文字助记符来表示机器指令的符号化语言,是最接近机器码的一种语言。其主要优点是占用资源少,程序执行效率高,但是在不同的CPU上不易移植。

2)比较一下定时器中断和软件延时实现定时的优劣异同?

答:中断的优点在于响应的及时性,而且在中断程序执行的时候,还可以有处理其他程序,进行精确的计时,比如秒表,时钟,微波炉等的定时系统。

而软件延时是通过空指令或者无用循环来消耗一定的机器周期达到延时的效果,在此期间程序不可以再做别的事情。

七.实验代码

//六十位加法计数器代码

/************************************************************/

/* include files */

/************************************************************/

#include "define.h" #include "cpu.h"

static Word T40msTimer=25; //Delay Time is ??;

static Byte byLampeFlag=0;

/************************************************************/

/* Status of P0 * Value of byLampeFlag */

/* 0xff * 0 */

/* 0x00 * 1 */

/* 0xaa * 2 */

/* 0x55 * 3 */

/* 0xf0 * 4 */

/* 0x0f * 5 */

/************************************************************/

// Description: 40ms interrupt

void Timer1ISR_40ms(void) interrupt 3 using 2

{

TL1 = CLOCK_40MS & 0xff; // timer1:40ms

TH1 = CLOCK_40MS >> 8; // CLOCK_40MS = (65536-40000)

TF1 = 0;

if (T40msTimer != 0)T40msTimer--;

}

void InitialCPUIO(void)

{ P1 = 0xff; }

void InitTimer1(void)

{

IE = 0; //disable all interrupt

IP = 0x08; // hi priority:timer1

TMOD = 0x10; //set timer1:mode1 16 bit

TR1 = 1; // start timer1

TL1 = CLOCK_40MS & 0xff; //timer1:40ms

TH1 = CLOCK_40MS >> 8;

ET1 = 1; // ebable timer1 interrupt

EA = 1; //ebable all interrupt

}

void main()

{

int p1[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

//P1口数字0—9的模

int p3[10]={0xc0,0xf9,0x64,0x70,0x59,0x52,0x42,0xf8,0x40,0x50};

//P3口数字0—9的模

InitialCPUIO(); InitTimer1();

while(1)

{

if (!T40msTimer)

{

T40msTimer = 25;

//P1=p1[byLampeFlag%10];

P1=p1[byLampeFlag-10*(byLampeFlag/10)];

P3=p3[byLampeFlag/10];

byLampeFlag++;

byLampeFlag=byLampeFlag%60;

}

}

}