盘点!各路大神的C语言编程建议和技巧
我们鼓励在编程时应有清晰的哲学思维 , 而不是给予硬性规则 。 我并不希望你们能认可所有的东西 , 因为它们只是观点 , 观点会随着时间的变化而变化 。 可是 , 如果不是直到现在把它们写在纸上 , 长久以来这些基于许多经验的观点一直积累在我的头脑中 。 因此希望这些观点能帮助你们 , 了解如何规划一个程序的细节 。 (我还没有看到过一篇讲关于如何规划整个事情的好文章 , 不过这部分可以是课程的一部分)要是能发现它们的特质 , 那很好;要是不认同的话 , 那也很好 。 但如果能启发你们思考为什么不认同 , 那样就更好了 。 在任何情况下 , 都不应该照搬我所说的方式进行编程;要用你认为最好的编程方式来尝试完成程序 。 请一以贯之而且毫不留情的这么做 。
01
排版问题
程序是一种出版物 。 意味着程序员们会先阅读(也许是几天、几周或几年后的你自己阅读) , 最后才轮到机器 。 机器的快乐就是程序能编译 , 机器才不在乎程序写的有多么漂亮 , 可是人们应该保持程序的美观 。 有时人们会过度关心:用漂亮的打印机呆板地打印出漂亮的输出 , 而这些输出只是将所有介词用英文文本以粗体字体凸显出来 , 都是些与程序无关的细节 。 虽然有很多人认为程序就应该像Algol.68所描述的一样(有些系统甚至要求照搬该风格编写程序) , 可清晰的程序不会因为这样的呈现而变得更清晰 , 只会使糟糕的程序变得更可笑 。
对于清晰的程序来说 , 排版规范一向都是至关重要的 。 当然 , 众所周知最有用的是缩进 , 但是当墨水遮盖了意图时 , 就会控制住排版 。 因此即便坚持使用简单的旧打字机输出 , 也该意识到愚蠢的排版 。 避免过度修饰 , 比如保持注释的简洁和灵活 。 通过程序整齐一致地说出想表达的 。 接着往下看 。
02
变量命名
对于变量名称 , 长度并不是名称的价值所在 , 清晰的表达才是 。 不常用的全局变量可能会有一个很长的名称 , 像maxphysaddr 。 在循环中每一行所使用的数组索引 , 并不需要取一个比i更详尽的名字 。 取index或者elementnumber会输入更多的字母(或调用文本编辑器) , 并且会遮盖住计算的细节 。 当变量名称很长时 , 很难明白发生了什么 。 在一定程度上 , 这是排版问题 , 看看下面
vs.
现实例子中的问题会变得更糟 。 所以仅需把索引当成符号来对待 。
指针也需要合理的符号 。 np仅仅只是作为指针nodepointer的助记符 。 如果一贯都遵从命名规范 , 那么很容易就能推断出np表示“节点指针” 。 在下一篇文章中会提到更多 。
同时在编程可读性的其它方面 , 一致性也是极其重要的 。 假使变量名为maxphysaddr , 则不要给同级关系的变量取名lowestaddress 。
最后 , 我倾向于「最小长度」但「最大信息量」的命名 , 并让上下文补齐其余部分 。 例如:全局变量在使用时很少有上下文帮助理解 , 那么它们的命名相对而言更需要令人易懂 。 因此我称maxphyaddr作为一个全局变量名 , 对于在本地定义和使用的指针来说np并不一定是NodePoint 。 这是品味的问题 , 但品味又与清晰度相关 。
我避免在命名时嵌入大写字母;它们的阅读舒适性太别扭了 , 像糟糕的排版一样令人心烦 。
03
指针的使用
C语言不同寻常 , 因为它允许指针指向任何事物 。 指针是锋利的工具 , 像任何这样的工具一样 , 使用得当可以产生令人愉悦的生产力 , 但使用不当也可以造成极大的破坏 。 指针在学术界的名声不太好 , 因为它太危险了 , 莫名其妙地就变得糟糕的不行 。 但我认为它是强大的符号 , 它可以帮助我们清楚地自我表达 。
思考:当有指针指向对象时 , 对于那个对象 , 确切地说它只是名称 , 其它什么也不是 。 听起来很琐碎 , 但看看下面的两个表达式:
第一个指向一个node(节点) , 第二个计算为(可以说)同一个node 。 但第二种形式是不太容易理解的表达式 。 这里解释一下 , 因为我们必须要知道node是什么 , i是什么 , 还要知道i和node与周围程序之间相关的规则是什么 。 孤立的表达式并不能说明i是node的有效索引 , 更不用提是我们想要元素的索引 。
如果i、j和k都是node数组中的索引将很容易出差错 , 而且连编译器都不能帮助找出错误 。 当给子程序传参数时 , 尤其容易出错:指针只是一个单独的参数;但在接收的子程序中必须认为数组和索引是一体的 。
计算为对象表达式本身 , 比该对象的地址更不易察觉 , 而且容易出错 。 正确使用指针可以简化代码:
vs.
如果想取下一个元素的type可以是
或
i前移 , 但其余的表达式必须保持不变;用指针的话 , 只需要做一件事 , 就是指针前移 。
把排版因素也考虑进来 。 对于处理连续的结构体来说 , 使用指针比用表达式可读性更好:只需要较少的笔墨 , 而且编译器和计算机的性能消耗也很小 。 与此相关的问题是 , 指针类型会影响指针正确使用 , 这也就允许在编译阶段使用一些有用的错误检测 , 来检查数组序列不能分开 。 而且如果是结构体 , 那么它们的标签字段就是其类型的提示 。 因此
是足以让人明白的 。 如果是索引数组 , 数组将取一些精心挑选的名字 , 而且表达式也会变得更长:
此外 , 由于例子变得越来越大 , 额外的字符更加让人恼火 。
一般来说 , 如果发现代码中包含许多相似并复杂的表达式 , 而且表达式计算为数据结构中的元素 , 那么明智地使用指针可以消除这些问题 。 考虑一下
看起来像利用复合表达式表示p 。 有时这值得用一个临时变量(这里的p)或者把运算提取成一个宏 。
04
过程名称
过程名称应该表明它们是做什么的 , 函数名称应该表明它们返回什么 。 函数通常在像if这样的表达式使用 , 因此可读性要好 。
是没有太大帮助的 , 因为不能推断出checksize错误时返回true , 还是非错误时返回 。 相反
使这点能清晰表达 , 并且在常规使用中将来也不大可能出错 。
05
注释
这一个微妙的问题 , 需要自己体会和判断 。 由于一些原因 , 我倾向于宁可清除注释 。 第一 , 假如代码清晰 , 并且使用了规范的类型名称和变量名称 , 应该从代码本身就可以理解 。 第二 , 编译器不能检查注释 , 因此不能保证准确 , 特别是代码修改过以后 。 误导性的注释会非常令人困惑 。 第三 , 排版问题:注释会使代码变得杂乱 。
但有时我会写注释 , 像下文一样仅仅只是把它们用于介绍 。 例如:解释全局变量的使用和类型(我总是在庞大的程序中写注释);作为一个不寻常或者关键过程的介绍;或标记出大规模计算的一节 。
有一个糟糕注释风格的例子:
还有更糟糕的做法:
文章图片
先不要嘲笑 , 等到在现实中看到再去吧 。
或许除了诸如重要数据结构的声明(对数据的注释通常比对算法的更有帮助) , 这样至关重要部分之外 , 需要避免对注释的“可爱”排版和大段的注释;基本上最好就不要写注释 。 如果代码需要靠注释来说明 , 那最好的方法是重写代码 , 以便能更容易地理解 。 这就把我们带到了复杂度 。
06
复杂度
许多程序过于复杂 , 比需要有效解决的问题更加复杂 。 这是为什么呢?大部分是由于设计不好 , 但我会跳过这个问题 , 因为这个问题太大了 。 然而程序往往在微观层面就很复杂 , 有关这些可以在这里解决 。
规则1:不要断定程序会在什么地方耗费运行时间 。 瓶颈总是出现在令人意想不到的地方 , 直到证实瓶颈在哪 , 不要试图再次猜测并加快运行速度 。
规则2:估量(measure)在没有对代码做出估量之前不要优化速度 , 除非发现最耗时的那部分代码 , 要不也不要去做 。
规则3:当n很小时(通常也很小) , 花哨的算法运行很慢 。 花哨算法有很大的常数级别复杂度 。 在你确定n总是很大之前 , 不要使用花哨算法 。 (即使假如n变大 , 也优先使用规则2).例如 , 对于常见问题 , 二叉树总比伸展树高效 。
规则4:花哨的算法比简单的算法更容易有bug , 而且实现起来也更困难尽量使用简单的算法与简单的数据结构 。
以下几乎是所有实际程序中用到的数据结构:
数组
链表
哈希表
二叉树
当然也必须要有把这些数据结构灵活结合的准备 , 比如用哈希表实现的符号表 , 其中哈希表是由字符型数组组成的链表 。
规则5:以数据为核心如果选择了适当的数据结构并把一切都组织得很有条理性 , 算法总是不言而喻的 。 编程的核心是数据结构 , 而不是算法 。 (参考Brooksp.102)
规则6:就是没有规则6 。
07
数据编程
不像许多if语句 , 算法或算法的细节通常以紧凑、高效和明确的数据进行编码 。 眼前的工作可以编码 , 归根到底是由于其复杂性都是由不相干的细节组合而成 。 分析表是典型例子 , 它通过一种解析固定、简单代码段的形式 , 对编程语言的语法进行编码 。 有限状态机特别适合这种处理形式 , 但是几乎任何涉及到对构建数据驱动算法有益的程序 , 都是将某些抽象数据类型的输入“解析”成序列 , 序列会由一些独立“动作”构成 。
也许这种设计最有趣的地方是表结构有时可以由另一个程序生成(经典案例是解析生成器) 。 有个更接地气的例子 , 假如操作系统是由一组表驱动 , 这组表包含连接I/O请求到相应设备驱动的操作 , 那么可以通过程序“配置“系统 , 该程序可以读取到某些特殊设备与可疑机器连接的描述 , 并打印相应的表 。
数据驱动程序在初学者中不常见的原因之一是由于Pascal的专制 。 Pascal像它的创始人一样 , 坚信代码要和数据分开 。 因而(至少在原始形式上)无法创建初始化的数据 。 与图灵和冯诺依曼的理论背道而驰 , 这些理论可都是定义存储计算机的基本原理 。 代码和数据是一样的 , 或至少可以算是 。 还能怎样解释编译器的工作原理呢?(函数式语言对I/O也有类似的问题)
08
函数指针
Pascal专制的另一个结果是初学者不使用函数指针 。 (在Pascal中没有把函数作为变量)用函数指针来处理编码复杂度会有一些令人感兴趣的地方 。
指针指向的程序有一定的复杂度 。 这些程序必须遵守一些标准协议 , 像要求一组都是相同调用的程序就是其中之一 。 除此之外 , 所要实现的只是完成业务 , 复杂度是分散的 。
有个协议的主张是既然所有使用的功能相似 , 那么它们的行为也必须相似 。 这对简单的文档、测试、程序扩展和甚至使程序通过网络分布都有帮助——远程过程调用可以通过该协议进行编码 。
我认为面向对象编程的核心是清晰使用函数指针 。 规定好要对数据执行的一系列操作 , 以及对这些操作响应的整套数据类型 。 将程序合拢到一起最简单的方法是为每种类型使用一组函数指针 。 简而言之 , 就是定义类和方法 。 当然 , 面向对象语言提供了更多更漂亮的语法、派生类型等等 , 但在概念上几乎没有提出额外的东西 。
数据驱动程序与函数指针的结合 , 变成了一种表现令人惊讶的工作方法 。 根据我的经验 , 这种方法经常会产生惊喜的结果 。 即使没有面向对象语言 , 无需额外的工作也可以获得90%的好处 , 并且能更好地管理结果 。 我无法再推荐出更高标准的实现方式 。 我所有的程序都是由这种方式组织管理 , 而且经过多次开发后都相安无事——远远优于缺少约束的方法 。 也许正如所说:从长远来看 , 约束会带来丰厚的回报 。
09
包含文件
简单规则:包含(include)文件时应该永远不要嵌套包含 。 如果声明(在注释或隐式声明里)需要的文件没有优先包含进来 , 那么使用者(程序员)要决定包含哪些文件 , 但要以简单的方式处理 , 并采用避免多重包含的结构 。 多重包含是系统编程的祸根 。 将文件包含五次或更多次来编译一个单独的C源文件的事情屡见不鲜 。 Unix系统中/usr/include/sys就用了这么可怕的方式 。
说到#ifdef , 有一个小插曲 , 虽然它能防止读取两次文件 , 但实际上经常用错 。 #ifdef是定义在文件本身中 , 而不是文件包含它 。 结果是常常导致让成千上万不必要的代码通过词汇分析器 , 这是(优秀编译器中)耗费最大的阶段 。
只需遵从以上简单规则 , 就能让你的代码变得优雅而美观 , 至少也是赏心悦目 , 从技术变成艺术~~
延伸阅读
有人认为 , 现在是java和.net的时代 , 有谁还需要C以及汇编呢?孰不知 , java和.net是建立在软件之上的 , 是为了垄断市场而建立起来的体系 , 犹如挖好一个金碧辉煌的坑 , 请你往下跳 , 还自以为站在巨人的肩膀上 , 事实上成了坑底之蛙 。 要成为一个真正的程序员 , 并期望成为一个程序员高手 , 必须从机器出发 , 从cpu到操作系统 , 再到软件体系 , 高手的境界就是悟道后的明镜灵台 , 软件设计出神入化 , 我就是程序 , 程序就是我 。
旁观者李四说:此人大笨也!我用鼠标随便拖几个控件 , 就是一个xxx管理系统了 , 你用C语言怕是一年也写不出来吧!好吧 , 我要承认 , 讲这话的都已经是mS的奴才了 , 别的我不了解 , MFC本身就是一个封闭的架构 , 从MFC入手学习 , 你只会形成一种封闭的思维模式 , 因为MS希望很多人只学会表面的东西 , 不致成为高手 , 所以它大力推荐所谓的可视化的程序开发工具 , 也真有很多人愿意上他的当 , 最后真正迷失方向 。 说他做不了程序吧 , 他也可以做 , 但是如果程序复杂一点 , 出现问题时 , 问题出在哪里就搞不清楚了 , 反正是不清楚!
梁肇新 , 大牛啊 , 他说:"我就搞不懂了 , 用鼠标怎么写程序呢?在我的公司里 , 高手的键盘响个不停 , 鼠标偶尔响一下 , 新手是鼠标响个不停 , 键盘偶尔响一下 , 他们的薪水相差的就不是一倍那么多了!"
C语言是各大操作系统的基础 , Unix、Linux、Windows其内核都清一色是C语言开发的 , (某些地方是和汇编语言混合开发的) , 君不见WindowsAPI都是C语言函数的接口?Unix/Linux绝大多数应用都是C语言开发的;Windows应用程序用纯API开发已然不多 , 大多都是依靠某种ApplicationFramework , 比如所谓的VC++ , 其实就是指VCIDE+C++语言+MFC(现在重点已转向ATL、WTL) , 但是Windows服务、网络、驱动程序等底层软件 , 还是C语言开发的 。 各种语言的编译器 , 包括java虚拟机 , 都是用C语言开发的 。 各种嵌入式设备 , 如手机、PDA也都是C语言开发的 。
下面是一些个人建议:
多看课本、代码
由于C语言灵活、强大 , 初学者要全面地掌握它非常吃力 , 因此在学习C语言的过程中 , 要多看课本、代码 , 课本上没有的可以上网搜索 。 首先一定要熟练掌握变量、常量、基本数据类型、库函数及特点和运用、运算符、表达式及语句、C语言编写的基本格式 。 再次要掌握C语言的流程控制语句、数组、函数、指针等基础知识 , 上述知识熟练后就可以学习链表、队列、树、图等知识 。 最后要熟练各个知识点的运用 , 可以把学习的重点放在函数的设计框架、参数设计、返回值设计等关键问题上 。
学好数学、英语
在C语言的学习过程中 , 一般有大量的算法和数据结构需要去了解(大一同学在大二会接触这些知识 , 如果有想提前了解的同学 , 可以点击下面链接查看:) , 许多算数运算和逻辑运算、关系运算、循环结构都可以利用数学知识来完成的 , 同样许多算法都是为了完成数学领域的计算 。 编写程序是为了让计算机可以代替人操作运算过程 , 从而减少人力 。 可见数学在计算机学习中的重要地位 , 有了数学知识 , 你会发现数据结构与算法原来也是很简单的 。 同理 , 在C语言的学习过程中 , 我们会用到大量的英语知识 。 对于编程来说 , 英语的作用体现在阅读英文文档 , 适应国际化的编程环境 , 我们要记住常用的一些C语言中用到的词汇 , 也就是诸多的关键字 。
理论联系实践 , 重视上机试验
计算机专业的大部分课程都是通过实践来检验学习成果的 , 更重要的是要将所学的理论知识都要在实践中更好的发挥 。 编程序是个实干的活 , 光说不练不行 。 刚开始学的时候可以多练习书上的习题 。 对于自己不明白的地方 , 自己编个小程序实验一下是最好的方法 , 能给自己留下深刻的印象 。 自己动手的过程中要不断纠正自己不好的编程习惯和认识错误C语言也是一门实践性很强的课程 , 既要掌握概念 , 又要动手编程、上机调试运行 。 养成上机前分析题目 , 并编出程序源代码的好习惯 , 编程时要注意程序的格式、标点符号等 , 同时调试程序时要有耐心 , 有时一个程序可能要修改多次 , 甚至于费了不少劲还是没结果 。 要不断向老师或者同学请教 , 不断地查阅资料 , 所以编程千万不可遇难而退 , 这个时候是决定你水平提高的关键 , 一定要坚持到底 。 大家对自己要有自信 , 对学好C语言课程要有信心 , 这样我们才会有一个好的学习状态并改正BUG 。 程序调试成功后 , 要总结分析出自己在编写程序时都出现了哪些不足 , 在以后的解题过程中自己应该注意的问题 。 上级调试程序成功后要完成实验报告 , 逐步积累调试程序的经验 。 培养自己良好的编程习惯 。
养成良好的编程习惯
(1)在比较复杂的代码后面要有注释 。 如果光溜溜一堆代码 , 别人就不可能看懂你的代码 , 而且也不利于查找错误 。 除非你一直编东西给自己看 。 能在代码里说明白的就一定要在代码里体现 。 比如变量名、函数名 , 在命名的时候尽量说明是干什么用的 。
(2)注意语句的嵌套不要太长 , 把主函数尽量写简短 。 经常看到别人的代码是主函数只有几行 , 几个函数调用 , 而定义全在主函数外部 。 这样一是减少了主函数内部的嵌套 , 二是比较精简 , 容易读懂 。
(3)注意语句的选择 。 并不是分支语句就用if循环就用while、for 。 在适当的情况下switch和dowhile语句也是要用的 。 在某些时候 , switch语句比if语句更加精练明了 , 而dowhile比while少一个循环 。
文章图片
那么如何学好单片机C语言?
很多想学单片机的人问我的第一句话就是怎样才能学好单片机?对于这个问题我今天就我自己是如何开始学单片机 , 如何开始上手 , 如何开始熟练这个过程给大家讲讲 。
先说说单片机 , 一般我们现在用的比较多的的MCS-51的单片机 , 它的资料比较多 , 用的人也很多 , 市场也很大 。 就我个人的体会怎么样才能更快的学会单片机这门课 。 单片机这门课是一项非常重视动手实践的科目 , 不能总是看书 , 但是学习它首先必须得看书 , 因为从书中你需要大概了解一下 , 单片机的各个功能寄存器 , 而说明白点 , 我们使用单片机就是用软件去控制单片机的各个功能寄存器 , 再说明白点 , 就是控制单片机那些管脚的电平什么时候输出高 , 什么时候输出低 。 由这些高低电平的变化来控制你的系统板 , 实现我们需要的各个功能 。 至于看书 , 只需大概了解单片机各管脚都是干什么的?能实现什么样的功能?第一次 , 第二次你可能看不明白 , 但这不要紧 , 因为还缺少实际的感观认识 。 所以我总是说 , 学单片机看书看两三天的就够了 , 看小说你一天能看五六本 , 看单片机你两三天看两三遍就够了 , 可以不用仔细的看 。 推荐一本书 , 就这一本就足够 , 书名是《新编MCS-51单片机应用设计》 , 是哈尔滨工业大学出版社出的的 , 作者是张毅刚 。 大概了解一下书上的内容 , 然后实践 , 这是非常关键的 , 如果说学单片机你不实践那是不可能学会的 , 关于实践有两种方法你可以选择 , 一种方法:你自己花钱买一块单片机的学习板 , 不要求功能太全的 , 对于初学者来说你买功能非常多的那种板子 , 上面有很多东西你这辈子都用不着 , 我建议有流水灯、数码管、独立键盘、矩阵键盘、AD或DA(原理一样)、液晶、蜂鸣器 , 这就差不多了 。 如果上面我提到的这些 , 你能熟练应用 , 那可以说对于单片机方面的硬件你已经入门了 , 剩下的就是自己练习设计电路 , 不断的积累经验 。 只要过了第一关 , 后面的路就好走多了 , 万事开头难 , 大家可能都听过 。 方法二:你身边如果有单片机方面的高手 , 向他求助 , 让他帮你搭个简单的最小系统板 。 对于高手来说 , 做个单片机的最小系统板只需要一分钟的时间 , 而对于初学者可就难多了 , 因为只有对硬件了解了 , 才能熟练运用 。 而如果你身边没有这样的高手 , 又找不到可以帮助你的人 , 那我劝你最好是自己买上一块 , 毕竟自己有一块要方便的多 , 以后做单片机类的小实验时都能用得上 , 还省事 。
有了单片机学习板之后你就要多练习 , 最好是自己有台电脑 , 一天少看电影 , 少打游戏 , 把学习板和电脑连好 , 打开调试软件坐在电脑前 , 先学会怎么用调试软件 , 然后从最简单的流水灯实验做起 , 等你能让那八个流水灯按照你的意愿随意流动时你已经入门了 , 你会发现单片机是多么迷人的东西啊 , 太好玩了 , 这不是在学习知识 , 而是在玩 , 当你编写的程序按你的意愿实现时你比做什么事都开心 , 你会上瘾的 , 真的 。 做电子类的人真的会上瘾 。 然后让数码管亮起来 , 这两项会了后 , 你已经不能自拔了 , 你已经开始考虑你这辈子要走哪一行了 。 就是要这样练习 , 在写程序的时候你肯定会遇到很多问题 , 而这时你再去翻书找 , 或是问别人 , 当得到解答后你会记住一辈子的 , 知识必须用于现实生活中 , 解决实际问题 , 这样才能发挥它的作用 , 你自己好好想想 , 上了这么多年大学 , 天天上课 , 你在课堂上学到了什么?是不是为了期末考试而忙碌呢?考完得了90分 , 哈哈哈好高兴啊 , 下学期开学回来忘的一干二净 , 是不是?你学到什么了?但是我告诉你单片机一旦学会 , 永远不会忘了 。 另外我再说说用汇编和C语言编程的问题 。 很多同学大一二就开设了C语言的课 , 我也上过 , 我知道那时天天就是几乘几 , 几加几啊 , 求个阶乘啊 。 学完了有什么用?让你用C语言编单片机的程序你是不是就傻了?书上的东西我们必须要会运用 。 单片机编程用C语言或汇编语言都可以 , 但是我建议用C语言比较好 , 如果原来有C语言的基础那学起来会更好 , 如果没有 , 也可以边学单片机边学C语言 , C语言也挺简单 , 只是一门工具而已 , 我劝你最好学会 , 将来肯定用得着 , 要不你以后也得学 , 你一点汇编都不会根本无所谓 , 但你一点C语言都不会那你将来会吃苦头 。 汇编写程序代码效率高 , 但相对难度较大 , 而且很罗嗦 , 尤其是遇到算法方面的问题时 , 根本是麻烦的不得了 , 现在单片机的主频在不断的提高 , 我们完全不需要那么高效率的代码 , 因为在高频率的时钟 , 单片机的ROM也在不断的提高 , 足够装得下你用C语言写的任何代码 , C语言的资料又多又好找 , 将来可移植性非常好 , 只需要变一个IO口写个温度传感器的程序在哪里都能用 , 所以我劝大家用C语言 。
总结上面 , 只要你有信心 , 做事能坚持到底 , 有不成功不放弃的强烈意志 , 那学个单片机来说就是件非常容易的事 。
步骤:
1.找本书大概了解一下单片机结构 , 大概了解就行 。 不用都看懂 , 又不让你出书的 。 (三天)
2.找学习板练习编写程序 , 学单片机就是练编程序 , 遇到不会的再问人或查书 。 (二十天)
3.自己网上找些小电路类的资料练习设计外围电路 。 焊好后自己调试 , 熟悉过程 。 (十天)
4.自己完全设计具有个人风格的电路 , 产品 ,。。。 你已经是高手了 。。。。。
看到了吗?下功夫一个多月你就能成为高手 , 我就讲这么多了 , 学不学得会 , 下不下得了功夫就看你的了 。
我的单片机学习心得
很多人说 , 学单片机最好先学汇编语言 , 以我的经验告诉大家 , 绝对没有这个必要 , 初学者一开始就直接用C语言为单片机编程 , 既省时间 , 学起来又容易 , 进步速度会很快 。 在刚开始学单片机的时候 , 千万不要为了解单片机内部结构而浪费时间 , 这样只能打击你的信心 , 当你学会编程后 , 自然一步步就掌握其内部结构了 。
单片机的学习实践 。
单片机提高重在实践 , 想要学好单片机 , 软件编程必不可少 。 但是熟悉硬件对于学好单片机的也是非常重要的 。 如何学习好硬件 , 动手实践是必不可少的 。 我们可以通过自己动手做一个自己的电子制作 , 通过完成它 , 以提高我的对一些芯片的了解和熟练运用它 。 这样我们就可以多一些了解芯片的结构 。 我相信 , 你完成了一个属于自己的电子制作 , 你的单片机水平就会有一个质的提高 。
这就是我学习单片机的心得体会 , 希望给单片机的爱好者学好单片机有所帮助 。
使用单片机就是理解单片机硬件结构 , 以及内部资源的应用,在汇编或C语言中学会各种功能的初始化设置 , 以及实现各种功能的程序编制 。
第一步:数字I/O的使用
使用按钮输入信号 , 发光二极管显示输出电平 , 就可以学习引脚的数字I/O功能 , 在按下某个按钮后 , 某发光二极管发亮 , 这就是数字电路中组合逻辑的功能 , 虽然很简单 , 但是可以学习一般的单片机编程思想 , 例如 , 必须设置很多寄存器对引脚进行初始化处理 , 才能使引脚具备有数字输入和输出输出功能 。 每使用单片机的一个功能 , 就要对控制该功能的寄存器进行设置 , 这就是单片机编程的特点 , 千万不要怕麻烦 , 所有的单片机都是这样 。
第二步:定时器的使用
学会定时器的使用 , 就可以用单片机实现时序电路 , 时序电路的功能是强大的 , 在工业、家用电气设备的控制中有很多应用 , 例如 , 可以用单片机实现一个具有一个按钮的楼道灯开关 , 该开关在按钮按下一次后 , 灯亮3分钟后自动灭 , 当按钮连续按下两次后 , 灯常亮不灭 , 当按钮按下时间超过2s , 则灯灭 。 数字集成电路可以实现时序电路 , 可编程逻辑器件(PLD)可以实现时序电路 , 可编程控制器(PLC)也可以实现时序电路 , 但是只有单片机实现起来最简单 , 成本最低 。 定时器的使用是非常重要的 , 逻辑加时间控制是单片机使用的基础 。
第三步:中断
单片机的特点是一段程序反复执行 , 程序中的每个指令的执行都需要一定的执行时间 , 如果程序没有执行到某指令 , 则该指令的动作就不会发生 , 这样就会耽误很多快速发生的事情 , 例如 , 按钮按下时的下降沿 。 要使单片机在程序正常运行过程中 , 对快速动作做出反应 , 就必须使用单片机的中断功能 , 该功能就是在快速动作发生后 , 单片机中断正常运行的程序 , 处理快速发生的动作 , 处理完成后 , 在返回执行正常的程序 。 中断功能使用中的困难是需要精确地知道什么时候不允许中断发生(屏蔽中断)、什么时候允许中断发生(开中断) , 需要设置哪些寄存器才能使某种中断起作用 , 中断开始时 , 程序应该干什么 , 中断完成后 , 程序应该干什么等等 。 中断学会后 , 就可以编制更复杂结构的程序 , 这样的程序可以干着一件事 , 监视着一件事 , 一旦监视的事情发生 , 就中断正在干的事情 , 处理监视的事情 , 当然也可以监视多个事情 , 形象的比喻 , 中断功能使单片机具有吃着碗里的 , 看着锅里的功能 。
以上三步学会 , 就相当于降龙十八掌武功 , 会了三掌了 , 可以勉强护身 。
第四步:与PC机进行RS232通信
单片机都有USART接口 , 特别是MSP430系列中很多型号 , 都具有两个USART接口 。 USART接口不能直接与PC机的RS232接口连接 , 它们之间的逻辑电平不同 , 需要使用一个MAX3232芯片进行电平转换 。
USART接口的使用是非常重要的 , 通过该接口 , 可以使单片机与PC机之间交换信息 , 虽然RS232通信并不先进 , 但是对于接口的学习是非常重要的 。 正确使用USART接口 , 需要学习通信协议 , PC机的RS232接口编程等等知识 。 试想 , 单片机实验板上的数据显示在PC机监视器上 , 而PC机的键盘信号可以在单片机实验板上得到显示 , 将是多么有意思的事情啊!
第五步:学会A/D转换
MAP430单片机带有多通道12位A/D转换器 , 通过这些A/D转换器可以使单片机操作模拟量 , 显示和检测电压、电流等信号 。 学习时注意模拟地与数字地、参考电压、采样时间 , 转换速率 , 转换误差等概念 。 使用A/D转换功能的简单的例子是设计一个电压表 。
第六步:学会PCI、I2C接口和液晶显示器接口
这些接口的使用可以使单片机更容易连接外部设备 , 在扩展单片机功能方面非常重要 。
第七步:学会比较、捕捉、PWM功能
这些功能可以使单片机能够控制电机 , 检测转速信号 , 实现电机调速器等控制器功能 。 如果以上七步都学会 , 就可以设计一般的应用系统 , 相当于学会十招降龙十八掌 , 可以出手攻击了 。
第八步:学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计
学习USB接口、TCP/IP接口、各种工业总线的硬件与软件设计是非常重要的 , 因为这是当前产品开发的发展方向 。
到此为止 , 相当于学会15招降龙十八掌 , 但还不到打遍天下无敌手的境界 。 即使如此 , 也算是单片机大虾了!
网络转载!
【盘点!各路大神的C语言编程建议和技巧】更多干货内容请关注微信“电子芯吧客”或者搜索小程序“电子芯吧客”!
推荐阅读
- 《炉石传说》:上分必选卡组盘点,这份黄金合集不能错过
- 冰萨还是纯职业骑?炉石奇葩官推体系盘点 来看玩家们的投票
- 盘点一下在中国“烂大街”的几款街车,你有没有躺枪?
- 皇室战争总决赛冠军卡组盘点 皇家巨人实力依旧强悍?
- “吃鸡”大神推荐萌新使用的4把武器,上手简单,刷新率还很高!
- 英雄联盟:盘点仅有的几位成长机制英雄,越拖我越强!
- 盘点NBA球星口碑排行,从没有过花边新闻的他,外表恶汉内心善良
- 周度盘点:拍卖政策落地超预期 期现两市双双回落
- 盘点最近两年五部穿越剧,你特别喜欢哪部呢?
- 和平精英:倒地后直接退出,小白选手来不及劝,大神玩家却这样做!