ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

用定时/计数器中断 和 动态八段数码管做一个秒表

2021-09-08 01:32:50  阅读:183  来源: 互联网

标签:P2 定时器 void 数码管 八段 sbit 秒表 u16


用 定时/计数器中断 和 动态八段数码管做一个秒表

学以致用,简单把定时器中断和数码管动态显示结合一下。

1.思路

使用定时器来计数,然后把秒数变化显示到数码管上。

定时器

数码管

2.主要代码讲解

void main()
{
	u16 a;
	a = 0;
	Time0Init();//定时器0中断的初始化操作

	while(1)
	{   
	    if(i == 1000)//设定一次中断是1ms,1000次是1s
		{
			i = 0;   //把计数的i清零,方便下一秒计数1000次
			led = ~led; //起到提示作用
            a++;    //累计的秒数
		}
		else if(i%25 == 0) //每25ms刷新一次
		{
			fenbian(a); // 数码管显示函数
	    }
	}
}

3.全部代码参考(代码写的很烂,欢迎提出建议)

#include<reg51.h>

typedef unsigned char u8;
typedef unsigned int u16;

sbit led = P2^0;
static u16 i;
static u16 a;

sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;

u8 code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(u16 i) 
{
	while(i--);
}

void Time0Init()
{
	TMOD|=0x01; 
	TH0 = 0xFC; 
	TL0 = 0x66;
	TR0 = 1;    
	ET0 = 1;     
	EA = 1;		 
	
} 

void fenbian(u16 a)
{	int b;
    int c;
	if(a<10)
	{
		LSC=0;LSB=0;LSA=0;
		delay(100);
		switch(a)
			{
				case(0):P0=smgduan[0];delay(100);break;
				case(1):P0=smgduan[1];delay(100);break;
				case(2):P0=smgduan[2];delay(100);break;
				case(3):P0=smgduan[3];delay(100);break;
				case(4):P0=smgduan[4];delay(100);break;
				case(5):P0=smgduan[5];delay(100);break;
				case(6):P0=smgduan[6];delay(100);break;
				case(7):P0=smgduan[7];delay(100);break;
				case(8):P0=smgduan[8];delay(100);break;
				case(9):P0=smgduan[9];delay(100);break;
			}
        P0 = 0x00;
	}
	else if(a>=10 && a<100)
	{
			LSC=0;LSB=0;LSA=0;
			b = a/1%10;
			switch(b)
				{
					case(0):P0=smgduan[0];delay(100);break;
					case(1):P0=smgduan[1];delay(100);break;
					case(2):P0=smgduan[2];delay(100);break;
					case(3):P0=smgduan[3];delay(100);break;
					case(4):P0=smgduan[4];delay(100);break;
					case(5):P0=smgduan[5];delay(100);break;
					case(6):P0=smgduan[6];delay(100);break;
					case(7):P0=smgduan[7];delay(100);break;
					case(8):P0=smgduan[8];delay(100);break;
					case(9):P0=smgduan[9];delay(100);break;
				}
			P0 = 0x00;
			
			LSC=0;LSB=0;LSA=1;
			c = a/10%10;
			switch(c)
				{
					case(0):P0=smgduan[0];delay(100);break;
					case(1):P0=smgduan[1];delay(100);break;
					case(2):P0=smgduan[2];delay(100);break;
					case(3):P0=smgduan[3];delay(100);break;
					case(4):P0=smgduan[4];delay(100);break;
					case(5):P0=smgduan[5];delay(100);break;
					case(6):P0=smgduan[6];delay(100);break;
					case(7):P0=smgduan[7];delay(100);break;
					case(8):P0=smgduan[8];delay(100);break;
					case(9):P0=smgduan[9];delay(100);break;
				}
			P0 = 0x00; 		
		}
	
}

void main()
{
	u16 a;
	a = 0;
	Time0Init();

	while(1)
	{   
	    if(i == 1000)
		{
			i = 0;
			led = ~led;
			a++;
		}
		else if(i%25 == 0)
		{
			fenbian(a);
	    }
	}
}

//中断函数,但是我把处理放在主函数中,这样可以保证计数的准确
void Time0() interrupt 1
{
    TH0 = 0xFC;
	TL0 = 0x66;
	i++;
}

参考https://blog.csdn.net/m0_50679156/article/details/120097808

标签:P2,定时器,void,数码管,八段,sbit,秒表,u16
来源: https://www.cnblogs.com/mosu/p/15226288.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有