day03 51单片机

51单片机学习

1 模块化编程

1.1 什么是模块化编程

随着我们的代码越来越复杂,我们的main.c越来越长,阅读性也越来越差。如果将来开始做项目,我们可能要同时操作好几个模块,这种情况下我们无法再把代码写到同一个文件,而是要分模块管理代码。

具体实现方法,就是将源码按照不同功能和模块,拆成若干部分源码,再用头文件相互引用。

2命名规范

2.1 变量命名

使用有意义的名字,该名字应反映变量的用途或其代表的值

避免使用单个字符名字,除非是常见的循环变量如i, j。

使用小写字母,并在多个单词间使用下划线连接。例如:sensor_value,update_interval。

使用g_前缀来标识全局变量。例如:g_system_state。

使用s_前缀来标识静态变量。例如:s_internal_counter。

使用st_前缀来标识结构体变量。例如:st_date。

使用p_前缀来标识指针。例如:p_num。

使用p_st_前缀来标识结构体指针。例如p_st_date。

常量和宏定义使用全大写字母,并用下划线分隔单词。例如:MAX_VALUE, TIMER_INTERVAL。

结构体类型声明需要使用“_Struct”后缀,例如Da****te*****_Struct*

枚举类型名称使用大写字母开始,例如:ColorType。

枚举值使用全大写字母,并用下划线分隔单词,例如:COLOR_RED, COLOR_BLUE。

内部变量都要加static关键字。

2.2 函数命名

函数名称应描述其功能或执行的操作。

使用{分层}{模块}{功能}作为函数名称,分层详见分层定义,模块首字母大写,功能使用首字母大写的驼峰命名。特殊名词全部大写。

返回布尔值的函数,其名称应该是一个问题或断言。例如:IsButtonPressed(), HasDataArrived()。

为属性/变量获取值的函数使用Get前缀。例如:GetSpeed()。

为属性/变量设置值的函数使用Set前缀。例如:SetSpeed(int speed)。

函数应尽量短小,并执行单一功能。这样可以提高代码的可读性和可维护性。

内部函数都要加static关键字。

2.3 文件命名

使用{分层}_{模块}作为文件名称,分层详见分层定义,模块首字母大写,特殊名词全部大写。

如果项目规模较大,头文件和源文件建议分开存放。

3 代码分层规范

3.1 工具函数和常规宏定义

所有特定算法、工具函数和常规宏定义。

目录:Com/

前缀:Com_

3.2 驱动层

所有与芯片直接交互的自身硬件代码,例如GPIO开关、硬件UART或ADC的驱动、计时器等。

目录:Dri/

前缀:Dri_

3.3 接口层

位于驱动层之上,通过标准接口(GPIO、UART、IIC、SPI等)驱动的外部硬件代码。如果没有外部硬件设备,可以不用这一层。

目录:Int/

前缀:Int_

3.4 中间层

提供更高级的服务,如操作系统、文件系统、通信协议栈等。这层通常用于复杂的单片机项目,例如使用RTOS的项目。简单的项目可以不用这一层。

目录:Mid/

前缀:Mid_

3.5 应用层

包含应用程序的主要逻辑。该层应只与上面的中间件层或接口层交互,尽量不直接访问驱动层。

目录:App/

前缀:App_

4 常规定义和通用方法

4.1 延时函数

1)Util.h

(1)点击EIDE图标,在项目的Com目录下新建文件Util.h

在这里插入图片描述

在这里插入图片描述

#ifndef _UTIL_H_
#define _UTIL_H_
#include <INTRINS.H>

// 8bit无符号数
typedef unsigned char u8;
// 16bit无符号数
typedef unsigned int u16;

/**
 * @brief 延时一定时长
 *
 * @param count 延时时长,单位1ms
 */
void Delay1ms(u16 count);

#endif

2)Util.c

在项目的Com目录下新建文件Util.c,写入以下内容。

#include "Util.h"

void Delay1ms(u16 count) //@11.0592MHz
{
   
    u8 i, j;

    while (count > 0)
    {
   
        count--;
        _nop_();
        i = 2;
        j = 199;
        do
        {
   
            while (--j)
                ;
        } while (--i);
    }
}

4.2 数码管驱动

1)Int_DigitalTube.h

在项目的Int目录下创建Int_DigitalTube.h,写入以下内容。

#ifndef __INT_DIGITALTUBE_H__
#define __INT_DIGITALTUBE_H__
#include <STC89C5xRC.H>
#include "Util.h"

/**
 * @brief 设置数码管要显示的数字
 *
 * @param num 要显示的数字
 */
void Int_DigitalTube_DisplayNum

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

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

相关文章

原型变量、原子操作、原子性、内存序

一、原子变量、原子操作 锁竞争&#xff1a;互斥锁、条件变量、原子变量、信号量、读写锁、自旋锁。在高性能基础组件优化的时候&#xff0c;为了进一步提高并发性能&#xff0c;可以使用原子变量。性能&#xff1a;原子变量 > 自旋锁 > 互斥锁。 操作临界资源的时间较长…

【leetcode】动态规划::前缀和

标题&#xff1a;【leetcode】前缀和 水墨不写bug 正文开始&#xff1a; &#xff08;一&#xff09;简单前缀和 描述 给定一个长度为n的数组a1​,a2​,....an​. 接下来有q次查询, 每次查询有两个参数l, r. 对于每个询问, 请输出al​al1​....ar​ 输入描述&#xff1a; 第一…

删除mysql表卡死 , 打不开,一直转圈圈

最近用navicat删除某一张表时&#xff0c;直接卡死转圈圈&#xff0c;导致navicat直接无响应, 想着是不是自己navicat有问题&#xff0c;换同事电脑来删这张表&#xff0c;还是同样问题。 多次尝试才整明白&#xff0c;根本不是navicat的问题.是mysql 的表锁死了! 如果频繁的对…

如何明确的选择IT方向?

一、明确目标 作为初学者&#xff0c;先树立自己目标&#xff0c;找到自己感兴趣的IT行业&#xff0c;IT行业分很多种&#xff0c;听的最多次的无非不就是web前端工、程序员、后端、大数据、网络运维等。学习知识也是为了找到更好的工作&#xff0c;所以我建议先去boss直聘、五…

MyBatis 入门使用(二)

MyBatis的开发有两种方式&#xff1a;注解和XML&#xff0c;上一期我们学习了使用注解的方式&#xff0c;这期我们学习XML的方式。 使用注解主要是用来完成一些简单的增删改查功能&#xff0c;如果需要实现复杂的SQL功能&#xff0c;建议使用XML来配置映射语句。 1. 使用步骤…

day02 VS Code开发单片机

VS Code开发单片机 1.1 安装 MinGW-w64 1)MinGW-w64介绍 VS Code 用于编辑 C 代码,我们还需要 C 编译器来运行 C 代码,所以安装 VS Code之前我们需要先安装 C 编译器。这里我们使用 MinGW-w64(Minimalist GNU for Windows 64-bit)。 MinGW-w64 是一个用于Windows操作系…

Transformer模型-broadcast广播的简明介绍

broadcast的定义和目的&#xff1a; 广播发生在将较小的张量“拉伸”以具有与较大张量兼容的形状&#xff0c;以便执行操作时。 广播是一种有效执行张量操作而不创建重复数据的方式。 广播的处理过程&#xff1a; 1&#xff0c; 确定最右边的维度是否兼容 每…

2024/4/7 IOday6

1&#xff1a;有一个隧道&#xff0c;全长5公里&#xff0c;有2列火车&#xff0c;全长200米&#xff0c; 火车A时速 100公里每小时 火车B时速 50公里每小时 现在要求模拟火车反复通过隧道的场景(不可能2列火车都在隧道内运行) #include <stdio.h> #include <string.…

Redis 的主从复制、哨兵和cluster集群

目录 一. Redis 主从复制 1. 介绍 2. 作用 3. 流程 4. 搭建 Redis 主从复制 安装redis 修改 master 的Redis配置文件 修改 slave 的Redis配置文件 验证主从效果 二. Redis 哨兵模式 1. 介绍 2. 原理 3. 哨兵模式的作用 4. 工作流程 4.1 故障转移机制 4.2 主节…

tabby 创建ssh远程配置提示:Timed out while waiting for handshake

不知道是不是网络延迟还是虚拟机克隆链接的问题&#xff0c;使用tabby无法正常的ssh远程过去&#xff0c;链接提示信息如下&#xff1a; SSH Connecting to 192.168.36.10SSH ! Agent auth selected, but no running agent is detectedSSH Host key fingerprint:SSH ecd…

Android匿名共享内存(Ashmem)

在Android中我们熟知的IPC方式有Socket、文件、ContentProvider、Binder、共享内存。其中共享内存的效率最高&#xff0c;可以做到0拷贝&#xff0c;在跨进程进行大数据传输&#xff0c;日志收集等场景下非常有用。共享内存是Linux自带的一种IPC机制&#xff0c;Android直接使用…

深入解析War包和Jar包机制

一、概述 代码编写完成后&#xff0c;需要部署到服务器&#xff0c;但部署到服务器对文件格式是有要求&#xff0c;原生的源代码目前是无法支持直接部署到服务器上的。目前有两种主要的文件格式War包和Jar包&#xff0c;通过一定的机制将源代码变成War包或Jar包&#xff0c;就…

42. 接雨水(Java)

目录 题目描述:输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 输入&#xff1a; height [0,1,0,2,1,0,1,3,2,1,2,1]输出&#xff1…

WebKit是什么?

WebKit是一个开源的浏览器引擎&#xff0c;它用于呈现网页内容在许多现代浏览器中&#xff0c;包括Safari浏览器、iOS内置浏览器、以及一些其他浏览器如Google Chrome的早期版本。以下是一些关于WebKit的重要信息&#xff1a; 起源和发展&#xff1a;WebKit最初是由苹果公司为其…

上传文件报错e20004 阿里云盘:空间不足 送的空间突然全到期了。免费无法长久 百度网盘扛住了压力,没有跟风。

https://blog.csdn.net/chenhao0568/article/details/137332783?spm1001.2014.3001.5501 免费撑不住了&#xff0c;这样下去干不过老大呀。百度网盘扛住了压力&#xff0c;没有跟风。

计算机网络——34LANs

LANs MAC地址和ARP 32bit IP地址 网络层地址用于使数据到达目标IP子网&#xff1a;前n - 1跳从而到达子网中的目标节点&#xff1a;最后一跳 LAN&#xff08;MAC/物理/以太网&#xff09;地址&#xff1a; 用于使帧从一个网卡传递到与其物理连接的另一个网卡&#xff08;在同…

计算机网络练习-计算机网络概述与性能指标

计算机网络概述 ----------------------------------------------------------------------------------------------------------------------------- 1. 计算机网络最据本的功能的是( )。 1,差错控制 Ⅱ.路由选择 Ⅲ,分布式处理 IV.传输控制 …

人眼对亮度的感知

对比两本书的说法 计算机图形学的算法基础 david f.rogers 如图所示: 然后看数字图像处理_第三版_中_冈萨雷斯的说法&#xff1a; 视觉错觉对于做图像处理没有什么大用。前面两点有用。 第一点。马赫带效应&#xff0c;明暗变化太强的时候&#xff0c;出现马赫带。较明区域是…

蓝桥杯刷题-14-更小的数-区间DP⭐

蓝桥杯2023年第十四届省赛真题-更小的数 //区间DP #include <iostream> #include<bits/stdc.h> #define int long long using namespace std; const int N5e310; int f[N][N]; void solve(){string s;cin>>s;int ans0;for(int len2;len<s.size();len){for…

Sora是什么?Sora怎么使用?Sora最新案例视频以及常见问题答疑

Sora 是什么&#xff1f; 2024年2月16日&#xff0c;OpenAI 在其官网上面正式宣布推出文本生成视频的大模型Sora 这样说吧给你一段话&#xff0c; 让你写一篇800字的论文&#xff0c;你的理解很可能都有偏差&#xff0c;那么作为OpenAi要做文生视频到底有多难&#xff0c;下面…