AutoLeaders控制组-51单片机笔记(前期)

目录

一.LED灯

1.点亮LED灯

2.使LED闪烁

3.LED流水线

二.独立按键

1.原理图

2.C51数据运算

3.上代码,代码内有解释

三.数码管

1.数码管本质上是各个LED组合在一起

2.上原理图

3.上代码

四.模块化编程


一.LED灯

1.点亮LED灯

步骤如下:

1.用Keil5创建一个project

2.在search中寻找Atmel的AT89C52

3.在target下的group  添加一个item

4.在项目中输入所需代码 并且在options中的output创建一个hex file

5.在STC中找到STC89C52的芯片类型

6.打开程序--在Keil5中写入的程序(hex file)

7.点击下载并重启单片机即可

代码段:

#include <REGX52.H>
int main ()
{
	P2=0x55;//P2是控制LED的I/O口
	while (1)//该循环是为了卡住该程序,避免瞬间结束
	{
	}
}

2.使LED闪烁

需要用到Delay函数,在Stc中获取

#include <REGX52.H>
void Delay500ms()		//@12.000MHz
{
	
	unsigned char i, j, k;

	i = 4;
	j = 205;
	k = 187;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
int main ()
{
	while (1)
	{
			P2=0xfe;
		Delay500ms();
			P2=0xff;
		Delay500ms();
	}	
}

3.LED流水线

是点亮LED和LED闪烁的结合体,直接上代码

#include <REGX52.H>
#include "Delay.h"

int main ()
{
	while(1)
	{
		P2=0x7F;
		Delay500ms()	;//每过0.5秒让下一个LED亮
		P2=0xBF;
		Delay500ms()	;
		P2=0xDF;
		Delay500ms()	;
		P2=0xEF;
		Delay500ms()	;
		P2=0xF7;
		Delay500ms()	;
		P2=0xFB;
		Delay500ms()	;
		P2=0xFD;
		Delay500ms()	;
		P2=0xFE;
		Delay500ms()	;
	}
}

二.独立按键

1.原理图

_

 独立按键被P3控制

如按下K1则P3_1=0

注意:此过程会“抖”,需要消抖处理

2.C51数据运算

 这些运算会用到,先拿出来看看。

3.上代码,代码内有解释

1.控制LED亮灭

#include <REGX52.H>
void main ()
{
	while(1)
	{
			if(P3_1==0)//检测到K1按下,则P2亮起
			{
					P2_0=0;
			}
			else//K1没按下,则P2熄灭
			{
					P2_0=1;
			}
	}
}

2.控制LED状态(从这往后,只展示在main里面的代码)

	while (1)
	{
		if(P3_1==0)
		{
			//Delay(20);   视频中讲述此为消抖处理,但经仔细推敲,只要存在while,就不需要消抖
			while(P3_1==0);//若K1还在按下没松开,则卡在此循环
			//Delay(20);   而且若此处有消抖处理会出现一些问题,后续会讲
			P2_0=~P2_0;//~为取反运算
		}
	}

3.LED显示二进制

	unsigned char n=0;//定义n这个二进制的数是实现二进制的关键
		while(1)
		{
			if(P3_1==0)
			{
				//Delay(20);
				while(P3_1==0);
				//Delay(20);
				
				n++;
				P2=~n;
			}
		}

4.实现LED的移位

	signed char lednum=0;
  P2=~0x80;//此代码为了一开始第一位LED能亮
		while (1)
		{
				if(P3_1==0)
				{
					//	Delay(20);
					while(P3_1==0);
					//  Delay(20);
					
					lednum++;
					if(lednum>=8)//若if里面不用加{},则第一个; 前的内容就是if里面的内容
						lednum=0;
					P2=~(0x80>>lednum);//让0x80右移lednum个长度,再取反
		      }
			    if(P3_0==0)
				{
				//  Delay(20);
					while(P3_0==0);
				//	Delay(20);
					
					if(lednum==0)//用K2时需要先判断一步
						lednum=7;
					else
						lednum--;
					P2=~(0x80>>lednum);
				}
    }

三.数码管

1.数码管本质上是各个LED组合在一起

2.上原理图

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

P2是从高位开始,且1是选0是不选。如若P2_4=1;P2_3=0;P2_1=0;则接Y4,即段选是LED5

3.上代码

1.静态数码管显示

#include <REGX52.h>

//Location是段选,Number是位选
void Nixie(unsigned char Location,Number)
{
	//这是数码管上显示0~9的数
	unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
									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(8,8);
	while (1)
	{
	}
}

2.动态数码管显示(本质上是通过极快的速度扫描)

void Nixie(unsigned char Location,Number)
{
	unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
	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);
		Nixie(2,2);
		Nixie(3,3);
	}
}

四.模块化编程

1.在main文件中,Keil5软件自带文件的头文件用<>,自己写的头文件用"  "  如下所示

2.如图所示,所创建的.c  .h文件需要在目录下 

3.所创建的头文件需要包含一下三个#,并且在#define和#endif中间写出能调用的函数

注意:最后必须要加;  否则编译时会报错

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值