C语言||利用51单片机扩展8255实现数字秒表(数码管动态扫描显示)

实验课题

今天微机原理实验老师布置了一道课后作业,就是利用51单片机做一个秒表,本来单片机是有P0,P1,P2,P3共计32个I/O口可以用的,但是因为实验箱内单片机做了外部扩展,所以端口不够用,改成利用C51单片机外扩8255实现数字秒表。

思考

因为外部做了扩展,所以在做仿真的时候思考了很久,为了和实验箱布局一致,我在proteus上还原实验箱的布局。首先是从P0做的扩展,因此要对应8255的输入端口。

很多人对8255的使用不太了解,这里我就补充一下8255的知识。

8255引脚部分及原理

  • 和外设相连的 

PA7~PA0:A口数据信号线,双向,三态引脚; 

PB7~PB0:B口数据信号线,双向,三态引脚; 

PC7~PC0:C口数据信号线,双向,三态引脚;  

  • 面向系统总线和CPU相连的 

RESET:复位信号,高电平有效。当RESET信号来到时,所有内部寄存器都被清除,同时3个数据端口被自动置 为输入端口。 

D7~D0:它们是8255A的数据线,和系统总线相连,用来传送数据和控制字。 

片选信号,低电平有效。即当端为低电平时,8255A被选中。只有当有效时,CPU才能对8255A进行读写操作。 

  • /WR读信号,低电平有效。当有效时,CPU可以从8255A中读取数据。 
  • /RD~写信号,低电平有效。当有效时,CPU可以往8255A中写入控制字或数据。 

A1、A0:端口选择信号。8255A内部有3个数据端口(I/O端口)和1个控制端口,共4个端口。通过地址线A0A1寻 址。规定当A1、A0为00时,选中A端口;为01时,选中B端口; 为10时,选中C端口;为11时,选中控制口。(这里外扩74LS373实现)

  • 电源和地

Vcc :+5V电源 

GND:地线

控制字及工作方式

工作方式我们只讲方式0(基本的输入和输出),读者只需了解这一个即可。

方式0为基本的输入/输出方式,传送数据时不需要联络信号。A口、B口和C口(或C高4位口及C低4位口)均可独立设置成方式0输入口或方式0输出口。

实验设计要求:

  1. 按下按钮S1,秒表暂停计时;
  2. 按下按钮S2,秒表开始计时;
  3. 按下按钮S3,秒表清零;
  4. 计时精确到0.5s

实验实现代码

#include 
#define uint unsigned int	
#define uchar unsigned char
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
uchar ms = 0;//毫秒
uchar s = 0;//秒
uchar min = 0;//分  
unsigned char xdata *p=0xc000;
unsigned char xdata *pa=0xc000;//段选
unsigned char xdata *pb=0xc002;//位选
uchar code led_data[] = {0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6};
uchar code dp[] = {0xfd,0x61,0xdb,0xf3,0x67,0xb7,0xbf,0xe1,0xff,0xf7};

//延时函数
void delay(uint t)
{
	uint i,j;
	for(i=0;i59)		 
		{
			ms = 0;
		}
	}

	if(count_s==200)			 
	{
		count_s = 0;		 
		s++;			 
		if(s>59)		 
		{
			s = 0;
		}
	}
	if(count_min==12000)		  
	{
		count_min = 0;		      
		min++;				  
		if(min>59)			  
		{
			min = 0;
		}
	}
}


展示

你可能感兴趣的:(技术整合)