嵌入式学习day01

每日面试题

1.预编译,编译过程最先做的工作是啥?
会首先编译#字开头的指令,比如拷贝#include包含的头文件代码,#define宏定义的替换,以及条件编译。
完成预编译后,会进入编译阶段,将源代码转换为汇编语言,编译器会进行词法和语法分析,如果语法正确会生成汇编代码。
2.何时需要预编译?
总是经常使用但是不经常改动的大型代码:程序由多个模块组成,所有模块都使用一组标准的包含文件和相同的编译选项,将所有包含文件预编译为一个“预编译头”。
提高代码执行效率
防止sql注入:在数据库操作中,预编译的SQL语句可以有效防止SQL注入攻击。预编译过程中,输入的参数会被作为参数而不是SQL的一部分进行处理,数据库会对这些参数进行参数化处理,从而降低恶意注入攻击的风险。
3.C语言中#和##的区别以及作用
#运算符用于把宏参数变为字符串。经常用于创建错误信息或调试信息。比如

#define PRINT_INT(x) printf("The value of x is: %d\n", x)  
#define ERROR_MSG(msg) printf("Error: " #msg "\n")  
  
int main() {  
    int a = 5;  
    PRINT_INT(a);  // 输出:The value of x is: 5  
    ERROR_MSG(This is an error);  // 输出:Error: This is an error  
    return 0;  
}

##运算符用于连接其前后的标记,在创建唯一的宏标识符时特别有用

#define ac(x, y) x##y

int main()
{
    int xy = 10;
    ac(x, y) = 20; // 相当于xy=20
    cout << xy;    // xy输出为20
    return 0;
}

另外##可以避免由于某些情况下由于宏展开导致的语法错误,例如

#define VAR_NAME(n) var_ ## n  
  
int main() {  
    int VAR_NAME(1);  // 等价于 int var_1;  
    int VAR_NAME(2);  // 等价于 int var_2;  
    // 如果没有 ## 运算符,VAR_NAME(1) 将会展开为 int var_ 1;,这将导致编译错误,因为标识符中不允许有空格。
    return 0;  
}

每日算法

leetcode 1.两数之和
给出一个数组nums和一个目标值target,在nums数组中找出两个和为target的整数,并输出他们的数组下标
因为不考虑算法优化问题 尽快得出答案即可因此直接暴力法

class Solution {
public:
    vector<int> twoSum(vector<int>& nums, int target) {
        int i, j;
        for (i = 0; i < nums.size(); i++) {
            for (j = i + 1; j < nums.size(); j++) {
                if (nums[i] + nums[j] == target)
                    return {i, j};
            }
        }
        return {i, j};
    }
};

51单片机 入门

基本io口控制

单片机的作用:IO口供电,串口数据传输等
单片机如何找到IO口:通过sfr指令来直接描述硬件地址 如sfr P0=0x80; 要使P0口所有的端口都输出低电平P0=0;
如果要找到IO口的一个具体引脚:sbit指令对应可寻址空间的一个位(bit) 例如sbit led1=P3^3;//P3口的第三位

在89C52中关于引脚是输入还是输出不需要配置 例如:
判断输入输出主要是看这个引脚的值是否被改变了,如果没改变那就是输入,如果改变了就会导致外接设备发生变化,就是输出

sbit IFfire = P1^0;
int main()
{
int io_data;
//什么情况叫做输入
io_data = IFfire; // 给变量赋值,就是输入 —— 或者理解为,这个针脚有数据啦,拿个变量来
保存
if(io_data == 0){
}
//什么情况叫做输出
IFfire = 1; // 被给予一个数值,引起IO口电压变化(一般1输出高电平,0输出低电平),此时为输
出,来影响外接的电路
return 0;
}

点灯

观察电路图在这里插入图片描述
D4小灯是一个简单的串联电路,当上电后小灯就会亮
观察D5 D6终端为LED1和LED2,如果想要D5 D6点亮只需让LED1和LED2都变成GND(即低电平)即可
在这里插入图片描述
找到LED1和LED2

搭建第一个keil文件 点个灯

#include "reg52.h"

sbit led1 = P3^7;
sbit led2 = P3^6;

void main()
{
	//需要灯亮,只需给P3.7和P3.6口低电平即可
	led1 = 0;
	led2 = 0;
}
 

将单片机通过数据线与电脑相连,观察端口是否增加,如果没有下载ch340驱动;
在stc-isp上选择单片机型号,并选择串口号
将keil上编译的hex文件上传,点击“下载/编程”按钮
拨动单片机开关重新上电
点灯成功!

让LED灯闪烁

#include "reg52.h"

sbit led1 = P3^7;
sbit led2 = P3^6;


void Delay500ms()		//@11.0592MHz
{
	unsigned char i, j, k;
	i = 4;
	j = 129;
	k = 119;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}

void main()
{
	//重复执行
	while(1){
		//灯亮,给低电平
		led1 = 0;
		led2 = 0;
		//数数,数的期间,维持低电平,灯亮,延迟
		Delay500ms();
		//灯灭,给高电平
		led1 = 1;
		led2 = 1;
		//数数,数的期间,维持低电平,灯亮,延迟
		Delay500ms();
	}
}

数数的Delay500ms函数通过stc-isp生成即可
在这里插入图片描述
通过使用Delay500ms函数使得led灯交替闪烁。

  • 26
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值