单片机课设-数码管倒计时显示(仿真图,代码全)

proteus单片机数码管显示

要求:
单片机AT89C51外接6个共阳LED数码管,P3.0和P3.1引脚分别外接一独立按键。开机时数码管显示123456,在按下P3.0按键时,数值减一,在按下P3.1按键时,数值加一。

Proteus仿真电路如下:

单片机课设-数码管倒计时显示(仿真图,代码全)_第1张图片

流程图如下:

单片机课设-数码管倒计时显示(仿真图,代码全)_第2张图片

顺序图:

单片机课设-数码管倒计时显示(仿真图,代码全)_第3张图片

代码分析:

首先初始化按键P3.0和P3.1两个按键,并且定义好共阳数码管0到9的字段码,,最初定义要显示的数值shu=123456,定义好延时Delay函数和动态显示dis函数。
动态显示dis函数显示过程:
先通过取余操作将shu的最低位取出,再传送当前数值数码管显示内容的七段码值,再传送位选信号使最后一位数码管显示,其他数码管全部关闭,然后延迟一段时间,随后对shu的值进行除10操作将最低位去掉。接下来,依次循环六次。
按键操作时候,先判断是否被按下,由于单片机扫描速度非常快,如果判断被按下就进行操作,那么可以会导致明明只按下一次但单片机会操作多次,于是用一个while循环来判断按键松开时才继续后面操作,这样每按一次键时只有松手的瞬间才会执行操作,增加了程序的灵敏度。

#include
sbit key1=P3^0;
sbit key2=P3^1;
unsigned char code discode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
void Delay(unsigned int x)
{
	unsigned char j;
	for(;x>0;--x)
		for(j=110;j>0;j--);
}
void dis(unsigned long temp)
{
	signed char i;
	for(i=5;i>=0;--i)
	{
		P2=(0x01<<i);
		P1=discode[temp%10];//每次显示最低位
		Delay(1);
		temp/=10;//去掉当前最低位
		P1=0xff;
	}
}
void main()
{
	unsigned long shu=123456;
	while(1)
	{
		dis(shu);//显示数值
		if(key1==0)
		{
			while(key1==0)//按下之后松手表示按键操作
			{
				dis(shu);
			}
			shu--;
		}
		if(key2==0)
		{
			while(key2==0)
			{
				dis(shu);
			}
			shu++;
		}
	}
}

你可能感兴趣的:(单片机,单片机,c语言)