基于51单片机的四位共阴数码管秒表proteus仿真

硬件设计

链接:https://pan.baidu.com/s/1CbUbMKzYM-p52ZakgRnqCw
提取码:l39p
在这里插入图片描述

代码设计

#include "reg51.h"
#include "intrins.h"

#define GPIO_DIG   P2			   //数据端

#define uchar unsigned char		   //重命名关键字
#define uint unsigned int		   //重命名关键字

sbit K1=P3^0;		//开始
sbit K2=P3^1;		//暂停
sbit K3=P3^2;		//复位

sbit L1=P1^4;		//数码管1位选
sbit L2=P1^5;		//数码管2位选
sbit L3=P1^6;		//数码管3位选
sbit L4=P1^7;		//数码管4位选

sbit beep=P1^0;

unsigned char code DIG_CODE[10] = {
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};
//0、1、2、3、4、5、6、7、8、9的显示码
unsigned char code DIG_CODE2[10] = {
0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,
0xff,0xef};
//0、1、2、3、4、5、6、7、8、9带小数点的显示码
unsigned char DisplayData[4];
//用来存放要显示的8位数的值

uchar i,m;	   //定义变量
uchar min=0;
long int k=0;
uint Second_Counts;		   //定义变量

void DigDisplay()		   //数码管显示子函数
{
	unsigned int j;		   //定义变量

	L1=0;			  //位选
	L2=1;
	L3=1;
	L4=1;
	GPIO_DIG = DisplayData[0];     //发送段码
	j = 1000;						   //扫描间隔时间设定
	while(j--);	
	L1=1;			   //消隐
	L2=1;
	L3=1;
	L4=1;               

	L1=1;
	L2=0;			  //位选
	L3=1;
	L4=1;
	GPIO_DIG = DisplayData[1];     //发送段码
	j = 1000;						   //扫描间隔时间设定
	while(j--);	
	L1=1;			   //消隐
	L2=1;
	L3=1;
	L4=1;      

	L1=1;
	L2=1;
	L3=0;			   //位选
	L4=1;
	GPIO_DIG = DisplayData[2];     //发送段码
	j = 1000;						   //扫描间隔时间设定
	while(j--);	
	L1=1;			   //消隐
	L2=1;
	L3=1;
	L4=1;      

	L1=1;
	L2=1;
	L3=1;
	L4=0;			   //位选
	GPIO_DIG = DisplayData[3];     //发送段码
	j = 1000;						   //扫描间隔时间设定
	while(j--);	
	L1=1;			   //消隐
	L2=1;
	L3=1;
	L4=1;      
	
}

void main()
{
//	Second_Counts=570;
//	min=9;
	GPIO_DIG = 0x00; 		//初始化数据口
    
	TMOD=0x01;				//定时器0方式1
	TH0=(65536-50000)/256;		//定时器0:50ms
	TL0=(65536-50000)%256;
	TH1=(65536-2000)/256;		
	TL1=(65536-2000)%256;
	EA=1;   
//	ET1=1;
//	TR1=1;         
    while (1)
    {
		if(K1==0)
		{
			ET0=1;
			TR0=1;		//开启定时器
		}
		if(K2==0)
		{
			ET0=0;
			TR0=0;		//关闭定时器
		}
		if(K3==0)						 //复位按键按下时
		{
			ET0=0;
			TR0=0;		//关闭定时器
			DisplayData[0] = DIG_CODE2[0];	  //清零显示
			DisplayData[1] = DIG_CODE[0];	  //清零显示
			DisplayData[2] = DIG_CODE2[0];	  //清零显示
			DisplayData[3] = DIG_CODE[0];	  //清零显示
			i=0;							  //清零计数
			Second_Counts=0;				  //清零秒
		}

		if((Second_Counts>0)&&(m==0))
		{
			ET1=1;
			TR1=1;   
		}

		if((min==9)&&(Second_Counts==599))
		{
			ET0=0;
			TR0=0;		//关闭定时器
			ET1=1;
			TR1=1; 
		}

		DigDisplay();		 //执行数码管显示函数
    }
}


//T0中断函数
void DSY_Refresh() interrupt 1
{
	TH0=(65536-50000)/256;		//恢复定时器0初值
	TL0=(65536-50000)%256;
	i++;
	m++;
	if(m>=20)
	{
		m=0;
	}
	if(i==2)				//50ms*2=0.1s转换状态
	{
		i=0;
		Second_Counts++;
		if(Second_Counts>=600)
		{
			Second_Counts=0;
			min++;
		}

		DisplayData[0] = DIG_CODE2[min%10];	  //显示百位
		DisplayData[1] = DIG_CODE[Second_Counts/100%10];	  //显示十位
		DisplayData[2] = DIG_CODE2[Second_Counts/10%10];	  //显示个位
		DisplayData[3] = DIG_CODE[Second_Counts%10];		  //显示小数点后一位
//		if(Second_Counts==10000) Second_Counts=0;			  //当秒计数到1000秒又变为0
	}
}
  • 25
    点赞
  • 175
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值