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

  • 11
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于 8051 单片机的 Proteus 独立按键控制四位数码管的程序示例: ``` #include <reg52.h> // 数码管引脚定义 sbit DIG_A = P0^0; sbit DIG_B = P0^1; sbit DIG_C = P0^2; sbit DIG_D = P0^3; // 按键引脚定义 sbit KEY1 = P1^0; sbit KEY2 = P1^1; sbit KEY3 = P1^2; sbit KEY4 = P1^3; // 数码管显示表 unsigned char code DIG_TBL[] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f }; // 全局变量 unsigned char cnt = 0; // 数码管当前显示的数字 unsigned char dig = 0; // 当前显示的数码管位数 // 延时函数 void delay(unsigned int ms) { unsigned int i, j; for (i = 0; i < ms; i++) for (j = 0; j < 120; j++); } // 数码管显示函数 void display(unsigned char num) { DIG_A = DIG_B = DIG_C = DIG_D = 1; // 关闭所有数码管 switch (dig) { // 根据当前位数选择要显示的数码管 case 0: DIG_A = 0; break; case 1: DIG_B = 0; break; case 2: DIG_C = 0; break; case 3: DIG_D = 0; break; } P2 = DIG_TBL[num]; // 显示数字 } // 中断函数 void key_isr() interrupt 0 { delay(10); // 延时去抖动 if (KEY1 == 0) { // 按键 1 cnt++; if (cnt > 9) cnt = 0; } else if (KEY2 == 0) { // 按键 2 cnt--; if (cnt > 9) cnt = 9; } else if (KEY3 == 0) { // 按键 3 dig++; // 切换显示位数 if (dig > 3) dig = 0; } else if (KEY4 == 0) { // 按键 4 dig--; if (dig < 0) dig = 3; } } // 主函数 void main() { TMOD = 0x01; // 设置定时器 0 为模式 1 TH0 = 0x3c; // 定时器初值(1ms) TL0 = 0xb0; ET0 = 1; // 开启定时器 0 中断 EA = 1; // 开启全局中断 TR0 = 1; // 启动定时器 0 while (1) { display(cnt); // 显示数码管 } } // 定时器 0 中断函数 void timer0_isr() interrupt 1 { static unsigned char cnt2 = 0; TH0 = 0x3c; // 重新设置定时器初值 TL0 = 0xb0; cnt2++; if (cnt2 > 20) { // 每 20ms 刷新一次数码管 cnt2 = 0; dig++; // 切换显示位数 if (dig > 3) dig = 0; } } ``` 该程序通过定时器中断和按键中断来实现独立按键控制四位数码管的功能,主函数中的 `while(1)` 循环不断调用 `display()` 函数来显示数码管,定时器中断每 20ms 刷新一次数码管的显示位数,按键中断则根据按键编号来增加或减少计数器的值,并切换显示位数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值