【小作业】三位数码管秒表显示

题目:

        用3位数码管显示计时时间,,计时范围0.01~9.99s。没有按任何按键时显示为0.00,当第1次按一下计时功能键时,秒表开始计时并显示;第2次按一下计时功能键时,停止计时,将计时的时间值送到数码管显示,第3次按一下计时功能键,秒表清0。再次按一下计时功能键,则重复上述计时过程。

 

protues仿真图: 6ea125a498f24c51829081854a55be0a.jpeg

 keil c51代码:

 

#include<reg51.h>
unsigned char dis_1[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char dis_10[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};
unsigned char dis_float[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char timer=0;
unsigned int second;        //书上计数到99可以定义为unsigned char,但本题不能定义成unsigned char型,原因是要计数到999,char范围不够,溢出重新计时。
unsigned char key=0;
main()
{
 TMOD=0x01;
	ET0=1;
	EA=1;
	second=0;
	P0=dis_10[second/100];
	P1=dis_1[second%100/10];
	P2=dis_float[second%10];
	while(1)
	{
		if((P3&0x80)==0x00)
		{
		  key++;
			switch(key)
			{
			  case 1:TH0=0xee;TL0=0x00;TR0=1;break;
				case 2:TR0=0;break;
				case 3:key=0;second=0;P0=dis_10[second/100];P1=dis_1[second%100/10];P2=dis_float[second%10];break;
			
			}
		while((P3&0x80)==0x00);	
		}
	}

}

void int_T0() interrupt 1 using 0
{
  TR0=0;
	TH0=0xee;
	TL0=0x00;
	timer++;
	if(timer==2)
	{
	  timer=0;
		second++;
	P0=dis_10[second/100];
	P1=dis_1[second%100/10];
	P2=dis_float[second%10];
	}
	if(second==999)
	{
	 TR0=0;
		second=0;
		key=2;
	}
  else
		TR0=1;
}

希望大家能够在此基础上优化代码,不倡导Ctrl+c, Ctrl+v。

谢谢!!!

 

 

 

 

  • 9
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是基于51单片机三位数码管显示秒表程序,可以实现秒表计时和计次功能: ```c #include <reg51.h> #define uchar unsigned char #define uint unsigned int // 数码管段选选通端口 sbit dula = P2^6; sbit wela = P2^7; // 数码管段码定义 uchar code table[] = { 0x3f, // 0 0x06, // 1 0x5b, // 2 0x4f, // 3 0x66, // 4 0x6d, // 5 0x7d, // 6 0x07, // 7 0x7f, // 8 0x6f // 9 }; // 延函数 void Delay(uint i) { while(i--); } // 数码管显示函数 void Display(uchar x, uchar y, uchar z) { uchar i; dula = 1; // 打开第一数码管 P0 = table[x]; Delay(100); dula = 0; // 关闭第一数码管 dula = 1; // 打开第二数码管 P0 = table[y]; Delay(100); dula = 0; // 关闭第二数码管 dula = 1; // 打开第三位数码管 P0 = table[z]; Delay(100); dula = 0; // 关闭第三位数码管 } // 秒表计时函数 void Timer() { uchar i, j, k; for(i = 0; i < 60; i++) // 秒数 { for(j = 0; j < 60; j++) // 分钟数 { for(k = 0; k < 10; k++) // 毫秒数 { Display(j/10, j%10, i); // 显示分钟和秒钟 Delay(1000); // 延1s } } } } // 秒表计次函数 void Count(uint n) { uchar i, j, k; while(n--) { for(i = 0; i < 60; i++) // 秒数 { for(j = 0; j < 60; j++) // 分钟数 { for(k = 0; k < 10; k++) // 毫秒数 { Display(j/10, j%10, i); // 显示分钟和秒钟 Delay(1000); // 延1s } } } } } void main() { wela = 0; // 全选通 Display(0, 0, 0); // 显示0 while(1) { if(P3 == 0x01) // 按键1按下 { Timer(); // 秒表计时 } if(P3 == 0x02) // 按键2按下 { Count(5); // 秒表计次 } } } ``` 在该程序中,我们使用了一个延函数 `Delay()` 来实现程序的时间控制,可以根据实际需要进行调整。同,我们还定义了一个数码管显示函数 `Display()`,通过控制数码管的段选选通端口来实现三位数码管显示。在主函数中,我们通过读取按键输入来触发秒表计时和计次功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值