当前位置:   article > 正文

AutoLeaders控制组—51单片机学习笔记(一)

AutoLeaders控制组—51单片机学习笔记(一)

第一节:51单片机的基本介绍

一、单片机简介

  1. 单片机,英文Micro Controller Unit,简称MCU。内部集成了CPU、RAM、ROM、定时器、中断系统、通讯接口等-系列电脑的常用硬件功能
  2. 单片机的任务是信息采集 (依靠传感器) 、处理 (依靠CPU) 和硬件设备(例如电机,LED等)的控制单片机
  3. 跟计算机相比,单片机算是一个袖珍版计算机,一个芯片就能构成完整的计算机系统。但在性能上,与计算机相差甚远,但单片机成本低、体积小、结构简单,在生活和工业控制领域大有所用。同时,学习使用单片机是了解计算机原理与结构的最佳选择

二、命名规则与管脚图片

VCC代表电源正极,GND代表电源负极。

请添加图片描述

命名规则

请添加图片描述

单片机内部结构图

STC89C52系列单片机的内部结构框图如下图所示。

STC89C52单片机中包含中央处理器(CPU)、程序存储器(Flash)、数据存储器(SRAM)、定时/计数器、UART串口、VO接口、EEPROM、看门狗等模块。
请添加图片描述

开发版基本模块以及对应模块原理图

注:编号相同的地方代表它们之间有线相连请添加图片描述

第二节:LED模块

一、点亮一个LED

1.LED介绍

请添加图片描述

2.LED原理图

1.电阻大小确认方式:最后一位为10的n次方 eg.2308 230*10^8
2.电阻作用:限流电阻,防止LED因电流过大而烧毁
3.电源正负极:**++不亮,+ - 亮。**因此 控制单片机引脚输出高低电频
TTL: 高电频 5V,低电频 0V,控制单片机的P2口输出高低电频
请添加图片描述

3、CPU通过配置寄存器控制硬件电路请添加图片描述

4.二进制转换请添加图片描述

5、点亮一个LED的代码

#include <REGX52.H>

void main()
{
	P2=0x55;//1111 1110
	while(1)
	{
		
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

然后再将代码保存,用软件stc-isp对接单片机,控制单片机点亮。

二、LED闪烁

1.利用ISP中的软件延时计算器

请添加图片描述
记得设定系统频率与定时长度,然后生成C代码,复制代码到keil中使用。
加头文件#include< INTRINS.H>;

2.LED闪烁代码

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

	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0xFE;
		Delay500ms();
		P2=0xFF;
		Delay500ms();
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

三、LED流水灯

LED流水灯代码

#include <REGX52.H>
#include <INTRINS.H>
void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	_nop_();
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	while(1)
	{
		P2=0xFE;//1111 1110
		Delay500ms();
		P2=0xFD;//1111 1101
		Delay500ms();
		P2=0xFB;//1111 1011
		Delay500ms();
		P2=0xF7;//1111 0111
		Delay500ms();
		P2=0xEF;//1110 1111
		Delay500ms();
		P2=0xDF;//1101 1111
		Delay500ms();
		P2=0xBF;//1011 1111
		Delay500ms();
		P2=0x7F;//0111 1111
		Delay500ms();

	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41

第三节、独立按键

原理图

请添加图片描述

1.独立按键介绍

请添加图片描述

2.按键的抖动请添加图片描述

按键消抖方法:1.硬件消除 2.软件程序消抖 延时20ms 等抖动过去再开始执行程序。

3.一个独立按键按下LED亮,松开LED灭

#include <REGX52.H>
//长按独立按键,LED点亮
void main()
{
	while(1)
	{
		if(P3_1==0){
			P2_0=0;
		}
		else{
			P2_0=1;
		}
	}

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4.独立按键按一次亮,再按一次灭

#include <REGX52.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms)
	{
		i = 2;
		j = 199;
		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; 
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

5.独立按键控制LED二进制闪烁

#include <REGX52.H>

void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
			i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
	
}

void main()
{
	unsigned char LEDNum=0;
	while(1)
	{
		if(P3_1==0){
			Delay(20);
			while(P3_1==0);
			Delay(20);
			
			LEDNum++;
			P2=~LEDNum;
		}
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32

6.独立按键控制LED左右移位

#include <REGX52.H>
void Delay(unsigned int xms);

unsigned char LEDNum;

void main()
{
	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);
		}
	}
}


void Delay(unsigned int xms)		//@11.0592MHz
{
	unsigned char i, j;
	while(xms--)
	{
			i = 2;
		j = 199;
		do
		{
			while (--j);
		} while (--i);
	}
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

第四节、LED数码管

原理图

请添加图片描述
COM共阴极,GRN共阳极。

1.LED数码管介绍

请添加图片描述

2.数码管引脚定义

一、一位数码管
左图: 由八个LED组成(ABCDEFG DP 段),对应一个字节八位,上面一个图是共阴极连接,下面是共阳极连接。
右图:十个引脚,3,8号为共级引脚,就近引出。

控制数码管显示数字:
例:显示数字6:需要将ACDEFG点亮,其余熄灭。
共阴极:公共端 (负极)接地 位选端 0,ACDEFG高电平,其余低电平。
共阳极:公共端接VCC,ACDEFG低电平,其余高电平。
请添加图片描述
二、四位一体数码管:(开发板)

1.引脚序号12个,上面图为共阴极连接,下面图为共阳极连接。
2 .四位数码管分为四个单元,公共端单独引出,所有相同字母的LED连在同一个引脚 8+4=12。

静态一位数字显示
例:第三位显示数字1:共阴极
公共端第三个单元给0(正负极相接短路,单元永远不会亮),其余公共端给1;BC段引脚给1,其余给0。
缺点:同一时刻只能有一个数码管被点亮,即使有多个被点亮,显示的数据也是相同的。
优点:引脚数较少,操作方便。

动态数码管显示
想要点亮多个不同数字,利用人眼暂留,数码管显示余辉效应,
很块地在不同单元出现数字,循环,就可以显示。
请添加图片描述

3.138译码器介绍

作用:将8条线转化为3条线(数码管上8个公共端8条线,利用进制转化为ABC上的三条线)
CBA ----- Y
0 0 0 ---- Y0
二进制—十进制 (000 到 111 ,0~7)
请添加图片描述

静态数码管显示代码1

#include <REGX52.H>

//在LED6上输出一个数字6
void main()
{
	P2_4=1;
	P2_3=0;
	P2_2=1;
	P0=0x7D;
	while(1)
	{
		
	}
	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

静态数码管显示代码2(利用子程序简化输入)

#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

void NixieTube(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()
{
	NixieTube(7,2);
	while(1)
	{
		
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

动态数码管

1.改变主函数

循环在123位上分别显示123,利用人眼余辉效应看起来像静态123

while(1)
{
	NixieTube(1,1);
	NixieTube(2,2);
	NixieTube(3,3);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.消影:

位选 段选 位选 段选(段选与位选之间时间过短,导致数字串位,需要段选后先清零)用Delay函数。

P0=NixieTable[number];
Delay(1);
P0=0x00;
  • 1
  • 2
  • 3

3.动态数码管代码(在123位上分别显示123)

注意Delay函数的频率为11.059

#include <REGX52.H>
unsigned char NixieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};

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

	while(xms--)
	{
		i = 11;
		j = 190;
		do
		{
			while (--j);
		} while (--i);
	}
}


void NixieTube(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)
	{
		NixieTube(1,1);
		NixieTube(2,2);
		NixieTube(3,3);
	}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47

4.补充段码表与其他(LED八小段共阴极)

请添加图片描述
请添加图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/不正经/article/detail/408589
推荐阅读
相关标签
  

闽ICP备14008679号