proteus仿真51按键控制LED数码管

proteus软件使用

        在新建工程一直默认,点击下一步。

        在原理图界面先导入元器件:选择第二个“元件模式”,点击右面蓝色的“P”,搜索需要的元件点击确定后,元件被添加到"DEVICES"下,选中即可放置到图纸上。单片机选用AT89C52,按键选择BUTTON。

在图纸上任意空白处右击->放置->终端->选择POWER或GROUND。

proteus每个引脚都会自动显示引脚电平状态:红色为高电平,蓝色为低电平,灰色为不定态或高阻态。

51单片机

晶振

        XTAL1和XTAL2这两个引脚用于接“晶振”,电容的选择一般根据晶振频率来确定。AT89C52晶振为11.0592MHz,电容取22pF;12MHz,电容取30pF。

复位电路

        复位电路一般外接RC串联支路,少部分外接RC并联,去抖动等,根据实际情况选择不同的接法。

P0系列引脚

        P0口作为I/O输出的时候输出低电平为0,输出高电平为高阻态(不是5V,相当于悬空状态),内部没有上拉电阻,是开漏的,即P0口不能真正输出高电平。必须接上拉电阻,由电源通过上拉电阻给负载提供电流。

数码管

        在proteus中“CC”为共阳级数码管,“CA”为共阴级数码管,一般使用共阴级数码管。

        在proteus中,数码管“A-DP”共八个段选(点亮数码管内的LED,高电平有效),“1-8”共八个片选(选择要点亮的数码管,低电平有效)。

        段选信号接锁存器这里使用74HC245,CE接低电平,AB/BA接高电平,可将A端的数据传输至B端。

        片选信号接译码器这里使用74LS138,E1接高电平,E2、E3接低电平,可将八个不同三位二进制数输出。代码如下:

//数码管段码表
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
 char t=0,s=0;
//数码管显示子函数
void Nixie(unsigned char Location,Number)
{
	switch(Location)		//位码输出
	{
		case 1:P3_0=0;P3_1=0;P3_2=0;break;
		case 2:P3_0=1;P3_1=0;P3_2=0;break;
		case 3:P3_0=0;P3_1=1;P3_2=0;break;
		case 4:P3_0=1;P3_1=1;P3_2=0;break;
		case 5:P3_0=0;P3_1=0;P3_2=1;break;
		case 6:P3_0=1;P3_1=0;P3_2=1;break;
		case 7:P3_0=0;P3_1=1;P3_2=1;break;
		case 8:P3_0=1;P3_1=1;P3_2=1;break;
	}
	P2=NixieTable[Number];	//段码输出
	Delay(1);				//显示一段时间
	P2=0x00;				//段码清0,消影
}

上面封装了数码管段码表与数码管显示函数,在主程序调用即可:

Nixie(1,0);

以上为在数码管第一个位置显示“0”.

代码

按键扫描函数

unsigned char Key()
{
	unsigned char KeyNumber=0;
	
	if(P1_0==0){Delay(20);while(P1_0==0);Delay(20);KeyNumber=1;}
	if(P1_1==0){Delay(20);while(P1_1==0);Delay(20);KeyNumber=2;}
	if(P1_2==0){Delay(20);while(P1_2==0);Delay(20);KeyNumber=3;}
	if(P1_3==0){Delay(20);while(P1_3==0);Delay(20);KeyNumber=4;}
	
	return KeyNumber;
}

1

void main()
{
	Nixie(1,0);
				Nixie(2,0);
				Nixie(3,0);
				Nixie(4,0);
	Nixie(5,0);
					Nixie(6,0);
				Nixie(7,0);
	Nixie(8,0);
	while(1)
	{
		show();
		
		KeyNum=Key();		//获取独立按键键码
		if(KeyNum)			//如果按键按下
		{
			P2=0x00;				//段码清0,消影
			
			if(KeyNum==1)	//如果K1按键按下
			{
				t++;
				s++;
				P1_6=1;
				P1_7=0;
				Delay(100);
				P1_6=0;
				P1_7=0;
			}
			if(KeyNum==2)	//如果K1按键按下
			{
				t--;
				P1_6=0;
				P1_7=1;
				Delay(100);
				P1_6=0;
				P1_7=0;
			}
			if(KeyNum==3)	//如果K1按键按下
			{
				
				s=0;
				
			}
			if(KeyNum==4)	//如果K1按键按下
			{
				t=0;
				
			}
		}
	}
}

14

  • 12
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值