AL第二次作业:C51单片机

目录

1.LED灯

1.1点亮第一个LED灯

1.1.1添加工程

1.1.2点亮LED

1.1.3LED灯闪烁

1.1.4LED流水线

 2.独立按键

2.1独立按键基本知识

 2.2独立按键控制LED亮灭

2.3独立按键控制LED状态


1.LED灯

1.1点亮第一个LED灯

1.1.1添加工程

在file中点击新建项目project,选择合适的文件夹新建,选择89C52(视频中是找的Atmel,然而如果是最新的kail5,是找不到Atmel的,因为Atmel被收购了,这时选择microchip中选择即可或者进行搜索)

1.1.2点亮LED

先写主函数,p2对应的是一个LED灯。

注意:那个头文件需要右击选择open此头文件即可,而且需要用16进制。

写好后如下

#include <REGX52.H>

void main()
{
	P2=0xFE;//1111 1110
}

打开stc-isp选择hex文件打开,下载程序,然后重启单片机即可。

1.1.3LED灯闪烁

这里需要引入一个新的知识,延迟,因为如果你正常写程序的话,灯由于闪烁太快,无法被人眼捕捉,因此要引入delay。

 

 在主函数中引用该函数即可。

1.1.4LED流水线

多次循环利用1.1.3的内容,轮换亮灯的位置即可。

 2.独立按键

2.1独立按键基本知识

 

 独立按键被p3控制

 

 2.2独立按键控制LED亮灭

#include <REGX52.H>
void main ()
{
	while(1)
	{
			if(P3_1==0)
			{
					P2_0=0;
			}
			else
			{
					P2_0=1;
			}
	}
}

按下亮,松开灭。

2.3独立按键控制LED状态

#include <REGX52.H>



void Delay(unsigned int xms)		//@12.000MHz
{
	while(xms)
	{
			unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}

}




void main()
{
	while (1)
	{
		if (P3_1 == 0)
		{
			Delay(20);
			while (P3_1 == 0)
			{

			}
			Delay(20);
			P2_0 = ~P2_0;
		}
	}
}

至于这个Delay,是因为按键按下时会有抖动,大概在10-15ms,为了规避这个对按键按下的影响,所以定义了一个Delay函数,并对其进行调用。

按一次亮,再按一次灭。

2.4独立按键控制LED展示二进制

#include <REGX52.H>

void Delay(unsigned int xms)
{
	while (xms)
	{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}


}void main()
{
	while (1)
	{
		if (P3_1 == 0)
		{
			Delay(20);
			while (P3_1 == 0);
			Delay(20);

			P2--;
		}
	}
}

另一种写法是运用~

	unsigned char n=0;
		while(1)
		{
			if(P3_1==0)
			{
				Delay(20);
				while(P3_1==0);
				Delay(20);
				
				n++;
				P2=~n;
			}
		}

2.5独立按键控制LED移位

#include <REGX52.H>

void Delay(unsigned int xms)
{
	while (xms)
	{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} 
	while (--i);
	xms--;
	}



}void main()
{
	unsigned char LEDNum;
	P2=~0x01;
	while (1)
	{

		if (P3_1 == 0)
		{
			Delay(20);
			while (P3_1 == 0);
			Delay(20);

			LEDNum++;
			if (LEDNum >= 8)
			{
				LEDNum = 0;
			}
			P2 = ~(0x01 << LEDNum);
		}
			if (P3_0 == 0)
	{
		Delay(20);
		while (P3_0 == 0);
		Delay(20);

		if (LEDNum == 0)
		{
			LEDNum = 7;
		}
		else
		{
			LEDNum--;
		}
		P2 = ~(0x01 << LEDNum);
	}
	}
}

3.数码管

3.1数码管结构

数码管就是通过线路将各个LED灯连接在一起。

 如原理图所示:P2控制LED的段选, P0控制LED位选。

读取时从低位向高位读取,P2_2为高位P2_4为地位,例如P2_4 = 1; P2_3 = 0; P2_2 = 1,那么表示的就是LED6这个接口。

3.2静态数码管显示

#include <REGX52.H>

unsigned char NixieTable[] = {0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
void Nixie(unsigned char Location, Number)
{
	switch (Location)
	{
	case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
	case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
	case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
	case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
	case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
	case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
	case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
	case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}
	P0 = NixieTable[Number];
}


void main()
{
	Nixie(2, 3);
	while (1)
	{

	}
}

3.3动态数码管显示

#include <REGX52.H>


void Delay(unsigned int xms)
{
	while (xms)
	{
	unsigned char i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
	xms--;
	}
}



unsigned char NixieTable[] = {0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
void Nixie(unsigned char Location, Number)
{
	switch (Location)
	{
	case 1:P2_4 = 1; P2_3 = 1; P2_2 = 1; break;
	case 2:P2_4 = 1; P2_3 = 1; P2_2 = 0; break;
	case 3:P2_4 = 1; P2_3 = 0; P2_2 = 1; break;
	case 4:P2_4 = 1; P2_3 = 0; P2_2 = 0; break;
	case 5:P2_4 = 0; P2_3 = 1; P2_2 = 1; break;
	case 6:P2_4 = 0; P2_3 = 1; P2_2 = 0; break;
	case 7:P2_4 = 0; P2_3 = 0; P2_2 = 1; break;
	case 8:P2_4 = 0; P2_3 = 0; P2_2 = 0; break;
	}
	P0 = NixieTable[Number];
	Delay(1);
	P0=0x00;
}


void main()
{
	
	while (1)
	{
		Nixie(1, 1);
//		Delay(2);
		Nixie(2, 3);
	//	Delay(2);
		Nixie(4, 6);
	//	Delay(2);
	}
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ORG 0000H LJMP START ORG 0030H START: MOV TMOD,#1 ;设置定时器工作方式 ORL P3,#0CH ;将P3.0(列0,KB0)~P3.3(列3,KB3)设置为输入状态 MOV R3,#0FEH ;8个LED初始状态(亮灯编码),FEH=11111110B,最低位为0,对应的右数第一个LED亮 LOP: LCALL KEY_SND ;调用按键发声子程序 SJMP LOP ;重新开始下一轮按键扫描与发声 KEY_SND: ;按键发声子程序 CLR P3.7 ;将行4送0 MOV A,P3 ;读列状态 ORL A,#0F0H ;屏蔽无效的高4位,保留低4位列值 CPL A ;取反,以判断按键状态 JZ EXIT ;判断是否有键按下:A=00H,无键按下,则转EXIT(子程序返回) LCALL Delays ;否则A≠0,有键按下,则调用延时子程序去抖 CLR P3.7 ;再将行4送0 MOV A,P3 ;读列状态 ORL A,#0F0H ;屏蔽无效的高4位,保留低4位列值 CPL A ;取反,以判断按键状态 JZ EXIT ;确认是否 有键按下:A=00H,无键按下,则转EXIT(子程序返回) JNB P3.2,dd1 ;是KB2,则转dd1: JNB P3.3,dd2 ;是KB3,则转dd2: JMP EXIT dd1: MOV P0,R3 ;将亮灯编码从P0口输出到LED LCALL DelaysD ;调用延时子程序 MOV A,R3 RL A ;循环左移1位,亮灯编码=0FDH,下一个LED亮 MOV R3,A JMP dd1 ;重新开始,循环输出显示 JMP EXIT dd2: MOV p0,#0FFH next1: MOV p0,#000H Lcall DelaysD MOV p0,#0FFH Lcall DelaysD jmp next1 EXIT: RET ;按键发声子程序返回 Delays:MOV R6,#20 ;延时子程序 D1: MOV R7,#248 DJNZ R7,$ DJNZ R6,D1 RET DelaysD: ;延时子程序(三重循环) MOV R7,#255 ;为R7设置延时值 DL1: MOV R6,#32 ;为R6设置延时值 DL2: MOV R5,#16 ;为R5设置延时值 DL3: DJNZ R5,DL3 ;若R5-1不为0,则转DL3 DJNZ R6,DL2 ;若R6-1不为0,则转DL2 DJNZ R7,DL1 ;若R7-1不为0,则转DL1 RET ;子程序返回 END

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值