蓝桥杯单片机第2阶段-1

2024零基础入门(一)

1.1开发软件

  1. keilC51
  2. ISP
  3. protues

1.2新建工程

图 1 新建工程步骤

1.3认识LED原理图

图 2-1 原理图参考1

图 2-2 原理图参考2

点灯原理:

  • 结合原理图知,P1_0-P1_7输出低电平时,灯亮

74HC573 原理说明

74HC573是一款常用的八路三态输出透明D型锁存器集成电路芯片。它的核心功能是在特定时刻锁存并保持数据信号,简单来说,它像一个可以控制开合的数据闸门或一个临时数据仓库。

图 3 74HC573

下表详细说明了其各个引脚的功能:

引脚名称 功能描述
D0-D7 8位数据输入线。
Q0-Q7 8位数据输出线。
LE 锁存使能端。当此引脚为高电平时,芯片处于“透明”模式,输出Q端直接跟随输入D端的变化;当从高电平跳变为低电平时,将输入数据锁存并保持。
OE 输出使能端,低电平有效。当为低电平时,允许数据从锁存器输出;当为高电平时,输出端为高阻态,相当于与外部电路断开连接。
VCC 电源正极(典型工作电压范围为2.0V~6.0V)。
GND 电源负极(地)。

74HC573 真值表

真值表清晰地展示了在不同控制信号组合下,芯片的输出行为。

OE (输出使能) LE (锁存使能) D (数据输入) Q (数据输出)
L (低电平) H (高电平) L (低电平) L (低电平)
L (低电平) H (高电平) H (高电平) H (高电平)
L (低电平) L (低电平) X (任意) Q0 (保持锁存的数据)
H (高电平) X (任意) X (任意) Z (高阻态)

工作模式解读:

  • 透明模式 (OE=L, LE=H):输出Q实时反映输入D的状态,数据直接通过。
  • 锁存模式 (OE=L, LE=L):输出Q锁存并保持在LE引脚从高电平变为低电平前一瞬间所对应的输入D的值,之后无论D如何变化,Q都保持不变。
  • 高阻态 (OE=H):输出端无效,呈高阻态,相当于与总线断开,不影响其他设备。

*** 注意:不同型号的单片机,由于其原理图不同,实现相同功能时,需要结合具体电路连接方式修改程序,而非直接复制。***

1.4编写程序

步骤:

1、右键点击User栏添加用户主程序(main.c)

2、右键引用51头文件

3、编写程序主体框架

4、按照原理图编写程序

图 4 程序结构图1

点灯

注:本部分展示代码都在while(1)里

  • 方法1:直接对P1整体配置电平

说明:可以直接在计算器中,打开程序员模式

图 5 计算器参考图1

图 6 计算器参考图2
	P1=0x5A;	//0101 1010 (高位)亮灭亮灭 灭亮灭亮
  • 方法2:对P1的每个引脚单独配置电平
	P1_0=0;
	P1_6=0;

流水灯

首先我们需要使用ISP生成延时函数,如图

图 7 使用ISP生成延时函数
  • 延时函数生成:
  1. 打开STC-ISP烧录工具

  2. 打开软件延时计算器

  3. 系统频率选择12MHz 定时长度选择500毫秒 指令集选择STC-Y1

  4. 生成C代码,粘贴至工程文件中,并删除nop语句

修改代码,使得能通过参数调整延时的时间:

/*延时函数 ms*/
void Delayms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;

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

接下来开始写while(1):

  • 方法1:每次对需要电量的灯配置低电平,给需要熄灭的灯配置高电平,再添加延时函数
    Delayms(1000);
    P1_3=0;
    Delayms(1000);
    P1_3=1;
  • 方法2:每次对P1的8个引脚整体配置电平
	P1=0x5A;
	Delayms(1000);
	P1=0xFF;
	Delayms(1000);
  • 方法3:使用内置库函数,达到移位操作

    • 循环左移 (_crol_) 将数据的二进制位整体向左移动指定的位数。

      • 关键特点:从最高位移出的位会循环补充到最低位。

      • 示例:若变量 a的二进制为 10100101,执行 _crol_(a, 1)后,结果变为 01001011。最左边的 1移到了最右边。

    • 循环右移 (_cror_) 将数据的二进制位整体向右移动指定的位数。

      • 关键特点:从最低位移出的位会循环补充到最高位。
    • 这与普通的移位运算符(<<>>)有本质区别:普通移位时,移出的位会丢失,空出的位补0,可能改变数据中1和0的数量。

  • 核心库:intrins.h

    • intrins.h是C51单片机编程中一个非常重要的头文件,它提供了一系列与底层硬件操作密切相关的函数,这些函数能直接生成高效的汇编指令。
    • 作用:让C语言编写者能够像使用汇编语言一样,方便地进行位操作、短延时等。
    • 包含函数:除了循环移位函数,还包括 _nop_()(空操作,用于精确短延时)和 _testbit_()(测试并清零位)等。

注意:使用这些函数前,必须在程序开头包含该头文件:#include <intrins.h>

	ucLed = _crol_(ucLed,1); // 循环左移一位
	P1 = ucLed;              // 将新的LED状态输出到P1口
	Delayms(500);            // 延时500毫秒

1.5完整程序示例

  • 示例1:
/* 头文件声明区域*/
#include <REGX52.H>
#include <intrins.h>

/*延时函数 ms*/
void Delayms(unsigned int xms)	//@12.000MHz
{
	unsigned char data i, j;

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

/*变量声明区域*/
unsigned char ucLed = 0xfe;


/* main*/
void main()
{ 
	while(1)
	{		
		ucLed = _crol_(ucLed,1);
		P1=ucLed;
		Delayms(500);
		
	}
}//左括号,2个回车,右括号


  • 示例2:
/*预处理区*/
#include <REGX52.H>

/*延时函数区*/
void Delayms(unsigned int xms)//@12.000MHz
{	
	while(xms--)
	{
		unsigned char data i, j;

		i = 12;
		j = 169;
		do
		{
			while (--j);
		} while (--i);
	}	
}

/*变量声明*/

/*main*/
void main()
{
	while(1)
	{
		P1=0xFE;
		Delayms(500);
		P1=0xFD;
		Delayms(500);
		P1=0xFB;
		Delayms(500);
		P1=0xF7;
		Delayms(500);
		P1=0xEF;
		Delayms(500);
		P1=0xDF;
		Delayms(500);
		P1=0xBF;
		Delayms(500);
		P1=0x7F;
		Delayms(500);
	}
}

666666,我设置了图床,所有图片都上床到图床上了,上传到wiki后居然有的图片能显示,有的图片不能显示。

所有图片链接如下:
\https://gitee.com/GXDSDLQB/kxdsdlqb/raw/master/image-20260127113316091.png
\https://gitee.com/GXDSDLQB/kxdsdlqb/raw/master/image-20260127113809226.png
\https://gitee.com/GXDSDLQB/kxdsdlqb/raw/master/image-20260127144803842.png
\https://gitee.com/GXDSDLQB/kxdsdlqb/raw/master/image-20260127144944835.png
\https://gitee.com/GXDSDLQB/kxdsdlqb/raw/master/image-20260127145731286.png
\https://gitee.com/GXDSDLQB/kxdsdlqb/raw/master/image-20260127150229768.png
\https://gitee.com/GXDSDLQB/kxdsdlqb/raw/master/image-20260127150508273.png
\https://gitee.com/GXDSDLQB/kxdsdlqb/raw/master/image-20260127152804605.png