51单片机的基础知识汇总

文章目录

  • 51单片机之点灯
  • 51单片机之灯的亮灭交替
  • 51单片机之灯的流水灯
  • 51单片机之数码管数字显示
  • 51单片机之数码管数字的流水灯
  • 51单片机之数码管数字的0-7显示
  • 51单片机之蜂鸣器的鸣叫与关闭
  • 51单片机之DS1302时钟设置
  • 51单片机之读出温度传感器温度
  • 代码模块化汇总
    • 主函数
      • main.c
    • 延时函数Delay
      • Delay.c
      • Delay.h
    • 矩阵键盘MatriXKey
      • MatriXKey.c
      • MatriXKey.h
    • 数码管NiXie
      • NiXie.c
      • NiXie.h
    • 时钟DS1302
      • DS1302.c
      • DS1302.h


前言: 我在学习江科大视频后被我们学校的蓝桥杯选拔赛考试,刚好学校的选拔赛出的实现类的题目比较贴合江科大UP主讲的知识,所以这次就总结一下学习江科大视频后我写出来的51单片机基础知识代码总结,当然你也可以拿到我这一篇博客来作为练习的题目,从而迅速掌握视频的大部分精髓

51单片机之点灯

这个操作是我们学校选拔赛的第一道题目,控制矩阵键盘的第一个按键,从而实现LED_1 电灯亮。

这里给出代码:

KeyNum = MatriXie();
		if(KeyNum == 1)
		{
			LED_1=~LED_1;
		}

51单片机之灯的亮灭交替

这个操作是我们学校选拔赛的第二道题目,控制矩阵键盘的第二个按键,从而实现LED_2电灯的5毫秒的亮灭交替。

这里给出代码:

if(KeyNum == 2)
		{
			KeyNum = 0;
			while(1)
			{
				LED_1 = 0;
				Delay(100);
				LED_1 = 1;
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 2)
				{
					LED_1 = 1;
					break;
				}
			}
		}

51单片机之灯的流水灯

这个操作是我们学校选拔赛的第三道题目,控制矩阵键盘的第三个按键,从而实现LED的流水灯效果,默认是从左到右流水灯,这里没说延迟多少,所以默认就是Delay(1000) ms。

流水灯这里可以补充一些基础的知识,就是P2 控制的是LED灯,所以只需要对P2 进行赋值16进制的数字即可。

这里给出代码:

if(KeyNum == 3)
		{
			while(1)
			{
				P2 = 0xFE; // 1111 1110
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xFD; // 1111 1101
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xFB; // 1111 1011
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xF7; // 1111 0111
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xEF; // 1110 1111
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break; 
				}
				P2 = 0xDF; // 1101 1111
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xBF; // 1011 1111
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0x7F; // 0111 1111
				Delay(100);
				//flag=1;
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
			}
		}

51单片机之数码管数字显示

这个操作是我们学校选拔赛的第四道题目,控制矩阵键盘的第四个按键,从而实现数码管显示数字0。

数码管这里补充一些基础知识,就是数码管的数字显示是分为A、B、C、D、E、F、G 以及DP的,详细的可以查看下面这个图片来学习,(这个图片来自江科大的PPT),A、B、C、D对应的16进制的低四位,所以不难得出E、F、G、DP控制的是16进制的高四位。

这里给出代码:

if(KeyNum == 4)
		{
			KeyNum = 0;
			P2_4 = 1;
			P2_3 = 1;
			P2_2 = 1;
			while(1)
			{
				P0 = 0x66; // 0111 1101
				KeyNum = MatriXie();
				if(KeyNum == 4) 
				{
					P0 = 0xFF;
					break;
				}
			}
		}

51单片机之数码管数字的流水灯

这个操作是我们学校选拔赛的第五道题目,控制矩阵键盘的第五个按键,从而实现数码管显示数字0,并且进行“流水灯”的效果,这里显然很简单,可以封装一个函数NiXie来表示数码管在哪一个位置显示哪一个数字,然后去Delay多少毫秒,就可以完成流水灯的效果。

这里给出代码:

if(KeyNum == 5)
		{
			KeyNum = 0;
			while(1)
			{
				NiXie(1,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(2,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(3,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(4,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(5,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(6,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(7,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(8,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
			}
		}

51单片机之数码管数字的0-7显示

这个操作是我们学校选拔赛的第六道题目,控制矩阵键盘的第六个按键,这道题更是送分题了,没什么思考难度,直接不断调用NiXie函数去显示数码管即可。

这里给出代码:

if(KeyNum == 6)
		{
			KeyNum = 0;
			while(1)
			{
				NiXie(1,0);
				NiXie(2,1);
				NiXie(3,2);
				NiXie(4,3);
				NiXie(5,4);
				NiXie(6,5);
				NiXie(7,6);
				NiXie(8,7);
				KeyNum = MatriXie();
				if(KeyNum == 6) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
			}
		}

51单片机之蜂鸣器的鸣叫与关闭

这个操作是我们学校选拔赛的第七道题目,控制矩阵键盘的第七个按键,从而实现蜂鸣器的鸣叫,再次按下第七个按键,实现蜂鸣器的关闭。

蜂鸣器这里补充一些基础知识,蜂鸣器,我的理解就是不断的在一定的振幅改变下才去鸣叫,所以可以利用一个for循环来触发蜂鸣器的鸣叫

这里给出代码:

if(KeyNum == 7)
		{
			KeyNum = 0;
			while(1)
			{
				BuzzerTime();
				Delay(1);
				KeyNum = MatriXie();
				if(KeyNum == 7) 
				{
					BuzzerTime();
					break;
				}
			}
		}

51单片机之DS1302时钟设置

这个操作是我们学校选拔赛的第八道题目,控制矩阵键盘的第八个按键,从而实现DS1302时钟功能,让数码管显示时钟,并且秒是可以动的,可以进位到分钟,小时,所以这道题目是很困难的,也是江科大UP主讲了好长时间的课程,一节课1.5h总共两节课,给我学的很困哈哈哈哈不过多学的话就会了。

这里给出代码:

//main函数
if(KeyNum == 8)
		{
			DS1302_SetTime();
			KeyNum = 0;
			while(1)
			{
				DS1302_ReadTime();
				NiXie(1,DS1302_Time[0]/10);
				NiXie(2,DS1302_Time[0]%10);
				NiXie(3,10);
				NiXie(4,DS1302_Time[1]/10);
				NiXie(5,DS1302_Time[1]%10);
				NiXie(6,10);
				NiXie(7,DS1302_Time[2]/10);
				NiXie(8,DS1302_Time[2]%10);
				KeyNum = MatriXie();
				if(KeyNum == 8)
				{
					P2_2 = 1;
					P2_3 = 1;
					P2_4 = 1;
					P0 = 0xFF;
					break;
				}
			}
		}

51单片机之读出温度传感器温度

这个操作是我们学校选拔赛的第九道题目,控制矩阵键盘的第九个按键,从而实现温度传感器读取温度的功能,这道题我当时没有写出来是因为这里我学的不够扎实,当时并没有思路去写出来这个题目。。。。看看小伙伴谁会写的话可以给大家讲出来。

代码模块化汇总

主函数

main.c

#include <REGX52.H>
#include "Delay.h"
#include "MatriXie.h"
#include "NiXie.h"
#include "BuzzerTime.h"
#include "DS1302.h"

//定义LED
sbit LED_1 = P2^0;
sbit LED_2 = P2^1;
sbit LED_3 = P2^2;
sbit LED_4 = P2^3;
sbit LED_5 = P2^4;
sbit LED_6 = P2^5;
sbit LED_7 = P2^6;
sbit LED_8 = P2^7;
//定义独立按键
sbit K_3 = P3^2;
sbit K_4 = P3^3;
sbit K_2 = P3^0;
sbit K1 = P3^1;

unsigned char KeyNum,flag=0;

void main()
{
	//P2 = 0xFE; // 1111 0111
	while(1)
	{
		KeyNum = MatriXie();
		if(KeyNum == 1)
		{
			LED_1=~LED_1;
		}
		if(KeyNum == 2)
		{
			KeyNum = 0;
			while(1)
			{
				LED_1 = 0;
				Delay(100);
				LED_1 = 1;
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 2)
				{
					LED_1 = 1;
					break;
				}
			}
		}
		if(KeyNum == 3)
		{
			while(1)
			{
				P2 = 0xFE; // 1111 1110
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xFD; // 1111 1101
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xFB; // 1111 1011
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xF7; // 1111 0111
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xEF; // 1110 1111
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break; 
				}
				P2 = 0xDF; // 1101 1111
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0xBF; // 1011 1111
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
				P2 = 0x7F; // 0111 1111
				Delay(100);
				//flag=1;
				KeyNum = MatriXie();
				if(KeyNum == 3) 
				{
					P2 = 0xFF;
					break;
				}
			}
		}
		if(KeyNum == 4)
		{
			KeyNum = 0;
			P2_4 = 1;
			P2_3 = 1;
			P2_2 = 1;
			while(1)
			{
				P0 = 0x66; // 0111 1101
				KeyNum = MatriXie();
				if(KeyNum == 4) 
				{
					P0 = 0xFF;
					break;
				}
			}
		}
		if(KeyNum == 5)
		{
			KeyNum = 0;
			while(1)
			{
				NiXie(1,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(2,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(3,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(4,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(5,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(6,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(7,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
				NiXie(8,4);
				Delay(100);
				KeyNum = MatriXie();
				if(KeyNum == 5) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
			}
		}
		if(KeyNum == 6)
		{
			KeyNum = 0;
			while(1)
			{
				NiXie(1,0);
				NiXie(2,1);
				NiXie(3,2);
				NiXie(4,3);
				NiXie(5,4);
				NiXie(6,5);
				NiXie(7,6);
				NiXie(8,7);
				KeyNum = MatriXie();
				if(KeyNum == 6) 
				{
					P2_4 = 1;
					P2_3 = 1;
					P2_2 = 1;
					P0 = 0xFF;
					break;
				}
			}
		}
		if(KeyNum == 7)
		{
			KeyNum = 0;
			while(1)
			{
				BuzzerTime();
				Delay(1);
				KeyNum = MatriXie();
				if(KeyNum == 7) 
				{
					BuzzerTime();
					break;
				}
			}
		}
		
		if(KeyNum == 8)
		{
			DS1302_SetTime();
			KeyNum = 0;
			while(1)
			{
				DS1302_ReadTime();
				NiXie(1,DS1302_Time[0]/10);
				NiXie(2,DS1302_Time[0]%10);
				NiXie(3,10);
				NiXie(4,DS1302_Time[1]/10);
				NiXie(5,DS1302_Time[1]%10);
				NiXie(6,10);
				NiXie(7,DS1302_Time[2]/10);
				NiXie(8,DS1302_Time[2]%10);
				KeyNum = MatriXie();
				if(KeyNum == 8)
				{
					P2_2 = 1;
					P2_3 = 1;
					P2_4 = 1;
					P0 = 0xFF;
					break;
				}
			}
		}
	}
}

延时函数Delay

Delay.c


void Delay1ms(void)	//@12.000MHz
{
	unsigned char data i, j;

	i = 2;
	j = 239;
	do
	{
		while (--j);
	} while (--i);
}
void Delay(unsigned int x)
{
	while(x--)
	{
		Delay1ms();
	}	
}

Delay.h

void Delay1ms(void);
void Delay(unsigned int x);

矩阵键盘MatriXKey

MatriXKey.c

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

unsigned int MatriXie()
{
	unsigned char KeyNumber = 0;
	
	P1 = 0xFF;
	P1_7 = 0;
	if(P1_3 == 0) {Delay(20);while(P1_3==0);Delay(20);KeyNumber=1;}
	if(P1_2 == 0) {Delay(20);while(P1_2==0);Delay(20);KeyNumber=2;}
	if(P1_1 == 0) {Delay(20);while(P1_1==0);Delay(20);KeyNumber=3;}
	if(P1_0 == 0) {Delay(20);while(P1_0==0);Delay(20);KeyNumber=4;}
	
	P1 = 0xFF;
	P1_6 = 0;
	if(P1_3 == 0) {Delay(20);while(P1_3==0);Delay(20);KeyNumber=5;}
	if(P1_2 == 0) {Delay(20);while(P1_2==0);Delay(20);KeyNumber=6;}
	if(P1_1 == 0) {Delay(20);while(P1_1==0);Delay(20);KeyNumber=7;}
	if(P1_0 == 0) {Delay(20);while(P1_0==0);Delay(20);KeyNumber=8;}
	
	P1 = 0xFF;
	P1_5 = 0;
	if(P1_3 == 0) {Delay(20);while(P1_3==0);Delay(20);KeyNumber=9;}
	if(P1_2 == 0) {Delay(20);while(P1_2==0);Delay(20);KeyNumber=10;}
	if(P1_1 == 0) {Delay(20);while(P1_1==0);Delay(20);KeyNumber=11;}
	if(P1_0 == 0) {Delay(20);while(P1_0==0);Delay(20);KeyNumber=12;}
	
	P1 = 0xFF;
	P1_4 = 0;
	if(P1_3 == 0) {Delay(20);while(P1_3==0);Delay(20);KeyNumber=13;}
	if(P1_2 == 0) {Delay(20);while(P1_2==0);Delay(20);KeyNumber=14;}
	if(P1_1 == 0) {Delay(20);while(P1_1==0);Delay(20);KeyNumber=15;}
	if(P1_0 == 0) {Delay(20);while(P1_0==0);Delay(20);KeyNumber=16;}
	
	return KeyNumber;
}

MatriXKey.h

unsigned int MatriXie(void);

数码管NiXie

NiXie.c

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

unsigned char NiXieTable[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x40};
void NiXie(unsigned char pos,unsigned char number)
{
	switch(pos)
	{
		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;
}

NiXie.h

void NiXie(unsigned char pos,unsigned char number);

时钟DS1302

DS1302.c

#include <REGX52.H>

//引脚定义
sbit DS1302_SCLK=P3^6;
sbit DS1302_IO=P3^4;
sbit DS1302_CE=P3^5;

//寄存器写入地址/指令定义
#define DS1302_SECOND		0x80
#define DS1302_MINUTE		0x82
#define DS1302_HOUR			0x84
#define DS1302_DATE			0x86
#define DS1302_MONTH		0x88
#define DS1302_DAY			0x8A
#define DS1302_YEAR			0x8C
#define DS1302_WP			0x8E

//时间数组,索引0~6分别为年、月、日、时、分、秒、星期
unsigned char DS1302_Time[]={15,22,00};

/**
  * @brief  DS1302初始化
  * @param  无
  * @retval 无
  */
void DS1302_Init(void)
{
	DS1302_CE=0;
	DS1302_SCLK=0;
}

/**
  * @brief  DS1302写一个字节
  * @param  Command 命令字/地址
  * @param  Data 要写入的数据
  * @retval 无
  */
void DS1302_WriteByte(unsigned char Command,Data)
{
	unsigned char i;
	DS1302_CE=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	for(i=0;i<8;i++)
	{
		DS1302_IO=Data&(0x01<<i);
		DS1302_SCLK=1;
		DS1302_SCLK=0;
	}
	DS1302_CE=0;
}

/**
  * @brief  DS1302读一个字节
  * @param  Command 命令字/地址
  * @retval 读出的数据
  */
unsigned char DS1302_ReadByte(unsigned char Command)
{
	unsigned char i,Data=0x00;
	Command|=0x01;	//将指令转换为读指令
	DS1302_CE=1;
	for(i=0;i<8;i++)
	{
		DS1302_IO=Command&(0x01<<i);
		DS1302_SCLK=0;
		DS1302_SCLK=1;
	}
	for(i=0;i<8;i++)
	{
		DS1302_SCLK=1;
		DS1302_SCLK=0;
		if(DS1302_IO){Data|=(0x01<<i);}
	}
	DS1302_CE=0;
	DS1302_IO=0;	//读取后将IO设置为0,否则读出的数据会出错
	return Data;
}

/**
  * @brief  DS1302设置时间,调用之后,DS1302_Time数组的数字会被设置到DS1302中
  * @param  无
  * @retval 无
  */
void DS1302_SetTime(void)
{
	DS1302_WriteByte(DS1302_WP,0x00);
	DS1302_WriteByte(DS1302_HOUR,DS1302_Time[0]/10*16+DS1302_Time[0]%10);
	DS1302_WriteByte(DS1302_MINUTE,DS1302_Time[1]/10*16+DS1302_Time[1]%10);
	DS1302_WriteByte(DS1302_SECOND,DS1302_Time[2]/10*16+DS1302_Time[2]%10);
	DS1302_WriteByte(DS1302_WP,0x80);
}

/**
  * @brief  DS1302读取时间,调用之后,DS1302中的数据会被读取到DS1302_Time数组中
  * @param  无
  * @retval 无
  */
void DS1302_ReadTime(void)
{
	unsigned char Temp;;
	Temp=DS1302_ReadByte(DS1302_HOUR);
	DS1302_Time[0]=Temp/16*10+Temp%16;
	Temp=DS1302_ReadByte(DS1302_MINUTE);
	DS1302_Time[1]=Temp/16*10+Temp%16;
	Temp=DS1302_ReadByte(DS1302_SECOND);
	DS1302_Time[2]=Temp/16*10+Temp%16;
}

DS1302.h

#ifndef __DS1302_H__
#define __DS1302_H__

//外部可调用时间数组,索引0~6分别为年、月、日、时、分、秒、星期
extern unsigned char DS1302_Time[];

void DS1302_Init(void);
void DS1302_WriteByte(unsigned char Command,Data);
unsigned char DS1302_ReadByte(unsigned char Command);
void DS1302_SetTime(void);
void DS1302_ReadTime(void);

#endif

在这里插入图片描述

📌 [ 笔者 ]   夏目浅石.
📃 [ 更新 ]   2023.11[ 勘误 ]   /* 暂无 */
📜 [ 声明 ]   由于作者水平有限,本文有错误和不准确之处在所难免,
              本人也很想知道这些错误,恳望读者批评指正!

📜 参考文献:

B站江科大51单片机入门视频
AYIT嵌入式实验室出题
CSDN嵌入式领域博主:謓泽(学习笔记超级建议看这位大佬的博客,复习很快,学习视频的成本也会低)

在这里插入图片描述如果侵权,请联系作者夏目浅石,立刻删除

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/155826.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

利用回溯绕过正则表达式

目录 利用strpos的特性拿到flag 利用回溯绕过正则表达式 利用回溯次数绕过正则表达式并且实现文件上传 使用回溯绕过正则表达式waf拿到flag 本篇会讲解三个实验来分别绕过正则表达式&#xff0c;python的正则表达式和Javascript的正则表达式大致相同如果有正则表达式不太懂…

千梦网创:实现自动化“挂机躺盈”的三种方法

在互联网众多行业中&#xff0c;有很多人一直在寻找所谓的“挂机躺盈”的项目&#xff0c;在理财领域这种收入被称为“被动收入”。 天上不会掉馅饼这是一句讲烂掉的话了&#xff0c;躺在家里吃白食等着钱进账是一件不可能的事情。 然而如果你看到身边有“被动收入”的例子&a…

QTableWidget 设置列宽行高大小的几种方式及其他常用属性设置

目录 效果&#xff1a; 1.列宽、行高自动分配 2.固定值 3.随内容分配列宽 随内容分配行高 4.水平方向标签拓展剩下的窗口部分&#xff0c;填满表格 5.列宽是自动分配的&#xff0c;但是第一列可手动调整宽度&#xff0c;而表格整体的列宽仍是自动分配的。第二、三列办法调…

UE基础篇五:动画

导语: 视频文档在文末 一、动画 1.1 物理资产可以用来做布娃娃系统 1.2 混合空间 调整这个值会在动画切换时有一个插值时间,表现为等一下再切 1.3 启用根运动 1.4 一些导入设置只有在导入时才有效, 1.5 动画图标可以预览调节数值<

类和对象(7):初始化列表

class Date { public:Date(int year 1, int month 1, int day 1){_year year;_month month;_day day;}private:int _year;int _month;int _day; };构造函数体内的语句只能称为赋初值&#xff0c;不能称为初始化。初始化只能初始化一次&#xff0c;而构造函数体内可以多次…

【洛谷算法题】P5712-Apples【入门2分支结构】

&#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5712-Apples【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格式&…

Excel Unix时间戳和日期时间格式的相互转换

时间戳转日期时间 ((A18*3600)/86400)DATE(1970,1,1) # 或 (A18*3600)/8640070*36519# 带格式化 TEXT((C18*3600)/8640070*36519,"yyyy-mm-dd hh:mm:ss")首先加8小时进行时区转换&#xff0c;然后转换成天数&#xff0c;再加上1970年1月1日&#xff0c;最后设置日期…

在node-red 的function中使用第三方的npm 库来处理业务逻辑

首先找到node-red的安装目录,这个目录可以在启动日志里看到。 如我的 我的就是在 /Users/fizz/.node-red 进入该目录,安装所需要的库 如 npm install lodash 然后在setting.js 中配置functionGlobalContext // The following property can be used to seed Global Context …

从0开始学习JavaScript--JavaScript 函数

JavaScript中的函数是编写可维护、模块化代码的关键。本文将深入研究JavaScript函数的各个方面&#xff0c;包括基本语法、函数作用域、闭包、高阶函数、箭头函数等&#xff0c;并通过丰富的示例代码来帮助读者更好地理解和应用这些概念。 函数的基本语法 函数是一段可被重复…

UE基础篇八:平衡蓝图与C++的使用

一、蓝图转换C++ 案例结构: 1.1 蓝图和C++对比 1.2 将蓝图变量转C++ 现在C++中定义同样的类型

基于单片机设计的水平仪(STC589C52+MPU6050)

一、前言 【1】项目背景 水平仪是一种常见的测量工具&#xff0c;用于检测物体或设备的水平姿态。在许多应用中&#xff0c;如建筑、制造和航空等领域&#xff0c;保持设备的水平姿态是非常重要的。为了实现实时的水平检测和显示&#xff0c;基于单片机设计的水平仪是一个常见…

转置矩阵的性质

下面公式中的上标T表示转置的意思。 其中是数

S25FL256S介绍及FPGA实现思路

本文介绍 S25FL256S 这款 FLASH 芯片&#xff0c;并进行 FPGA 读写控制的实现&#xff08;编程思路及注意事项&#xff09;。 文章目录 S25FL-S 介绍管脚功能说明SPI 时钟模式SDRDDR 工作模式FLASH存储阵列&#xff08;地址空间映射&#xff09;常用寄存器及相关指令Status Reg…

php接口api数据签名及验签

api数据签名作用&#xff1a;通过使用签名可以验证数据在传输过程中是否被篡改或修改。接收方可以使用相同的签名算法和密钥对接收到的数据进行验证&#xff0c;如果验证失败则表明数据被篡改过 1、数据发送方进行接口签名并传输签名字段 <?php // 请求URL $url "h…

Xrdp+内网穿透实现远程访问Linux Kali桌面

XrdpCpolar实现远程访问Linux Kali桌面 文章目录 XrdpCpolar实现远程访问Linux Kali桌面前言1. Kali 安装Xrdp2. 本地远程Kali桌面3. Kali 安装Cpolar 内网穿透4. 配置公网远程地址5. 公网远程Kali桌面连接6. 固定连接公网地址7. 固定地址连接测试 前言 Kali远程桌面的好处在于…

LeetCode(19)最后一个单词的长度【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接&#xff1a; 58. 最后一个单词的长度 1.题目 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 …

Jupyter Notebook的下载安装与使用教程_Python数据分析与可视化

Jupyter Notebook的下载安装与使用 Jupyter简介下载与安装启动与创建NotebookJupyter基本操作 在计算机编程领域&#xff0c;有一个很强大的工具叫做Jupyter。它不仅是一个集成的开发环境&#xff0c;还是一个交互式文档平台。对于初学者来说&#xff0c;Jupyter提供了友好的界…

机器人制作开源方案 | 守护一体化护耆卫士

作者&#xff1a;白玲玲、张硕、孔亚轩单位&#xff1a;兰州理工大学指导老师&#xff1a;毕广利 1. 场景调研 “探索者”平台是结合机械、电子、传感器、计算机软硬件、控制、人工智能和造型技术等众多的先进技术研发推出的专业型机器人设备原型设计工具&#xff0c;包含机构…

第七篇 基于JSP 技术的网上购书系统——新品上架、推荐产品、在线留言、搜索功能实现(网上商城、仿淘宝、当当、亚马逊)

目录 1.新品上架 1.1功能说明 1.2界面设计 1.3处理流程 1.4数据来源和算法 1.4.1数据来源 1.4.2查询条件 1.4.3表间关系 1.4.4相关sql实例 2.推荐产品 2.1功能说明 2.2界面设计 2.3处理流程 2.4数据来源和算法 2.4.1数据来源 2.4.2查询条件 2.4.3表间关…

实战:给docusaurus文档网站配置Algolia 实现全站内容搜索功能-2023.11.16(已解决)

更新于&#xff1a;2023年11月16日 次文档已全部脱敏&#xff01; 实战&#xff1a;给docusaurus文档网站配置Algolia 实现全站内容搜索功能-2023.11.16(已解决) 目录 前提条件 &#x1f340; 前提条件 具备docker环境 具有自己的网站 &#x1f340; 实验软件&#xff08…