单片机AT89C51六位数码管秒表

详细代码讨论加我QQ:1271370903

1.1设计目的

  本设计的数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现LED显示,显示时间为0~9999.99秒,计时精度为0.01秒,能正确地进行计时。其中软件系统采用C语言编写程序,包括显示程序,定时中断服务,外部中断服务程序,延时程序等,并在WAVE中调试运行,硬件系统利用PROTEUS强大的功能来实现,简单且易于观察,在仿真中就可以观察到实际的工作状态。

1.2设计方案

  本文主要研究基于单片机的秒表设计,主要是控制电路设计,数码管显示的设计,和软件程序的编写。该计时采用单片机定时器精确延时,秒表计时精度0.01秒。有启动,暂停,复位,提醒等功能。

1.3设计任务

  采用四位数码管显示,AT89C51单片机控制,按键启动,暂停,复位,提醒功能等,计时精度00.00-9999.99秒。

1.4 设计要求

  课题需要以MCS-51系列单片机为核心,结合外围电路,制作一款时间参数测量系统。
具体要求如下:
(1)提出基于单片机的时间测量系统实现方案。
(2)制作完整的硬件电路图并编写完整的源程序,实现时间参数的测量。
(3)误差要求小于1%。

2.总体方案设计

  按模块划分可分为单片机最小系统电路、按键控制、数码管显示、三个子模块。电路结构划分可以划分为:晶振电路、复位电路、按键电路、显示电路。本次设计的核心是单片机控制模块,所以此设计是单片机应用系统的一种应用。系统采用AT89C51单片机作为核心控制单元,开始按键按下,数码管开始从0.00计时,直到按下暂停按钮,数码管时间显示,如继续计时,继续按下开始按钮,如果此次计时结束重新计时,按下清零按钮从0.00开始。
在这里插入图片描述

3.系统软件流程图

在这里插入图片描述

4. 电路总体仿真图

在这里插入图片描述

5.仿真开始

时间显示从0.00开始
在这里插入图片描述

按下开始键开始计时,暂停键看当前时间18.52秒
在这里插入图片描述

结束,按清零键,回到原始
在这里插入图片描述

6.相关代码

uchar tt,i,flag,mm;
uint num,num1,num2;
 uchar code table[]={					 //数码管段选
 0x3f,0x06,0x5b,0x4f,
 0x66,0x6d,0x7d,0x07,
 0x7f,0x6f,0x77,0x7c,
 0x39,0x5e,0x79,0x71};
 uchar code table1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};	   //数码管位选


void delay(uint xms)  //延时
{
	uint xx,yy;
	for (xx=xms;xx>0;xx--)
		for(yy=110;yy>0;yy--);
}


void display() //显示函数,数码管动态扫描
{
 uchar qian,bai,shi,ge;	

	qian=num/1000;
	bai=num%1000/100;
	shi=num%100/10;
	ge=num%10;


	
 	P0=0x00;
	P0=table[num2/10];
	P2=table1[0];
	delay(5); 

	 P0=0x00;
	P0=table[num2%10]|0x80;
	P2=table1[1];
	delay(5); 

	P0=0x00;
	P0=table[qian];
	P2=table1[2];
	delay(5); 

	P0=0x00;
	P0=table[bai]|0x80;
	P2=table1[3];
	delay(5); 

	P0=0x00;
	P0=table[shi];
	P2=table1[4];
	delay(5); 

	P0=0x00;
	P0=table[ge];
	P2=table1[5];
	delay(5); 
}

  

void keyscan()			  //按键扫描函数
{
  if(s1==0)			   //s1按键被按下	   暂停
  {
    delay(10);
	if(s1==0)
	{
	  while(!s1);				  //等待按键释放
	  TR0=0;	  				   //定时器开
	}
  }

  if(s2==0)					//s2按键被按下 ,开始
  {
    delay(10);
	if(s2==0)
	{
	  while(!s2);
	  TR0=1;						  //
	}
	 
  }
   if(s4==0)					   //s4按键被按下
  {
    delay(10);
	if(s4==0)
	{
	  while(!s4);
	  TR0=0;
	  num=0;
	  num2=0;
	  }

	}

  }
  • 8
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
制作一个基于AT89C51单片机的LED数码管秒表,可以通过按键实现计时和复功能。以下是制作步骤: 1. 硬件准备:AT89C51单片机、LED数码管、按键、电阻、电容、晶振、电源等。 2. 连接硬件:将LED数码管的七个数码管引脚分别连接到单片机的7个输出口,将按键引脚连接到单片机的2个输入口,并连接合适的电阻和电容以及晶振和电源。 3. 编写程序:使用汇编语言编写程序,实现计时和复功能。具体实现过程可以参考以下代码: ``` ORG 0H MOV TMOD, 01H ; 定时器0工作方式1,计时器 MOV TH0, 0 ; 定时器0高计数器清零 MOV TL0, 0 ; 定时器0低计数器清零 MOV P0, #0FFH ; 数码管全部关闭 MOV P2, #0FFH ; 按键全部上拉 MOV IE, #81H ; 开启定时器0中断和外部中断0 SETB TR0 ; 启动定时器0 SETB EA ; 开启总中断 SJMP $ TIMER0_ISR: CLR TR0 ; 关闭定时器0 MOV TH0, 0 ; 定时器0高计数器清零 MOV TL0, 0 ; 定时器0低计数器清零 INC COUNT ; 计数器加1 CPL P0.7 ; 数码管最高取反 JB COUNT.6, SKIP ; 判断计数器是否为偶数,是则跳过 MOV A, COUNT ; 将计数器值存入累加器A DIV AB, #10 ; 累加器A除以10,商在A,余数在B MOV P0, #0FFH ; 数码管全部关闭 MOV P0, DIGIT_TBL+B ; 根据余数显示数码管 MOV A, C ; 将商存入累加器A MOV P0, #0FEH ; 打开数码管第二 MOV P0, DIGIT_TBL+A ; 根据商显示数码管 SKIP: SETB TR0 ; 启动定时器0 RETI EXTERNAL0_ISR: MOV COUNT, #0 ; 计数器清零 MOV P0, #0FFH ; 数码管全部关闭 SETB TR0 ; 启动定时器0 RETI COUNT EQU 30H ; 计数器变量地址 DIGIT_TBL DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H, 7FH, 6FH ; 数码管显示表 END ``` 4. 烧录程序:将编写好的程序通过编程器烧录到单片机中。 5. 测试:连接电源后,按下启动按键即可开始计时,再次按下可复计时器。 通过这样的步骤,就可以制作一个简单的LED数码管秒表,实现1到99秒的计时功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值