发新帖本帖赏金 10.00元(功能说明)我要提问
返回列表
打印
[51单片机]

从业十年,教你单片机入门基础。(连载)

[复制链接]
52083|221
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jianhong_wu|  楼主 | 2015-2-24 14:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jianhong_wu 于 2016-1-17 11:28 编辑

    大家好,我是吴坚鸿,自从去年在本论坛写了《从业将近十年,手把手教你单片机程序框架》后,赢得了一部分网友的好评,同时也发现了一些网友没有C语言基础,没有单片机基础,不懂keil的安装和使用,不懂74hc595的使用原理,不懂动态扫描数码管的原理,甚至连如何烧录程序也不清楚,这样阅读我那程序框架的贴子就很吃力,所以我决定新开这个连载基础贴。我2006年毕业出来工作,到现在只工作了九年,为何标题取名“从业十年”,是因为我打算明年2016年刚满十年后就整理出书,所以提前把书名公布出来。由于本人技术水平有限,不足之处望各位网友指出来相互探讨。同时感谢21ic论坛一直以来给予的支持,给我提供这么好的分享平台。
    下一节预告:跟我学单片机到底是学什么?我的两个比喻和一个规则。

(未完待续)

第一节:跟我学单片机到底是学什么?我的两个比喻和一个规则。

第二节:我眼中学习单片机的四个阶段。

第三节:单片机一个最重要的特性。

第四节:平台软件和编译器软件的简介。

第五节:用keil软件新建,关闭,打开一个完整工程的操作流程。

第六节:把.c源代码编译成.hex机器码的操作流程。

第七节:重复利用现有工程模板进行程序开发的方法以及代码备份管理技巧。

第八节:把.hex机器码下载到单片机的操作流程。

第九节:程序从哪里开始,要到哪里去?

第十节:一个用来学习C语言的模板程序。

第十一节:变量的定义与赋值语句。

第十二节:两个变量的数据交换。

第十三节:二进制与字节单位,以及各种定义变量的取值范围。

第十四节:二进制与十六进制。

第十五节:十进制与十六进制。

第十六节:加法运算的5种常用格式。

第十七节:连加以及自加运算的简写。

第十八节:加法运算的溢出。

第十九节:加法运算中,神秘中间变量的类型以及解决“掺杂多种变量类型”的办法。

第二十节:减法运算的5种常见格式。

第二十一节:减法的连写和自减运算的简写。

第二十二节:减法运算的溢出。

第二十三节:建议把所有参与减法运算的变量都转换成unsigned long数据类型。

第二十四节:乘法运算的5种常见格式。

第二十五节:连乘以及自乘运算的简写。

第二十六节:乘法运算的溢出。

第二十七节:整除求商的运算。

第二十八节:整除求余的运算。

第二十九节:利用“整除求商求余”来拆分提取一个数的个十百千位。

第三十节:逻辑运算符的“与”运算。

第三十一节:逻辑运算符的“或”运算。

第三十二节:逻辑运算符的“异或”运算。

第三十三节:逻辑运算符的“按位取反”和“非”。

第三十四节:移位运算的左移。

第三十五节:移位运算的右移。

第三十六节:括号改变优先级。

第三十七节:if判断语句以及常量变量真假的判断。

第三十八节:等于关系符“==”和不等于关系符“!=”。

第三十九节:大于关系符“>”和大于等于关系符“>=”。

第四十节:小于关系符“<”和小于等于关系符“<=”。

第四十一节:与“&&”,或“||”的关系符。

第四十二节:小括号改变判断的优先级。

第四十三节:if,else if,else的5种组合判断语句。

第四十四节:一维数组能批量定义变量的特点。

第四十五节:二维数组。

第四十六节:while循环语句。

第四十七节:循环语句do while和for。

第四十八节:循环体内的continue和break语句。

第四十九节:for和while循环体的嵌套。

第五十节:switch语句。

第五十一节:函数的三要素和执行顺序。

第五十二节:从局部变量和全局变量中感悟“栈”为何物。

第五十三节:函数的作用和四种常见书写类型。

第五十四节:return语句在函数中的作用以及容易被忽略的四个功能。

第五十五节:static静态局部变量在函数中的重要作用。

打赏榜单

21ic小喇叭 打赏了 10.00 元 2015-07-24

评分
参与人数 1威望 +1 收起 理由
cov0xt + 1 很给力!

相关帖子

沙发
jianhong_wu|  楼主 | 2015-2-24 14:59 | 只看该作者
第一节:跟我学单片机到底是学什么?我的两个比喻和一个规则。

      开篇第一节,我问大家一个问题,跟我学单片机到底是学什么?我的回答是像驾驶汽车一样驾驭单片机。我教给大家的是驾驶汽车的技术而不是研发汽车的技术。因此每当别人问我学51单片机,PIC,AVR,stm32哪个更加有前途,应该先学哪个再学哪个时,我的回答是既然你是学驾驶技术,那么你用桑塔纳车来学还是用宝马车来学有差别吗?差别很小的,它们只是不同的厂家而已,只要会一种其它的就触类旁通了。把学单片机当作考驾*这是我所说的第一个比喻。
      学单片机最核心的是程序,程序跟单片机芯片是什么关系?我的回答是像歌曲跟MP3播放器的关系。我们写的程序就像预先录制好的歌曲,单片机芯片就是一个MP3播放器。把不同的歌曲下载到同一个MP3里就可以播放出不同的美妙音乐,当前下载的歌曲决定了MP3可以播放的音乐。所以我们当前编写的程序下载进单片机之后,就决定了单片机能干哪些工作,“下载程序”也俗称“烧录程序”。把单片机芯片当作MP3播放器是我第二个比喻。
      单片机芯片内部细节的工作原理是什么,为什么它能实现那么神奇的功能?我的回答是不用纠结这个问题,因为这不是我们学习的方向。考驾*的也只能告诉你汽车是由四个轮,发动机,制动系统,离合器,方向盘等部分构成,其它内部细节的原理恐怕也不会教你,不是不想教你,而确实是两个不同的学习方向。学单片机的也只能告诉你它内部是由运算器,寄存器,IO口,复位电路,晶振电路,程序存储器ROM,数据存储器RAM等部分组成,至于运算器的原理和构成也不是我们的学习方向。所以尽管我搞单片机有很多年,但是我并不是完全理解它最本质的原理。尽管我与人打交道有30多年,但是人为什么能通过大脑来灵活控制双手去活动对于我来说仍然是个迷,我只知道人是由脑袋,心脏,四肢等构成。每当有这样疑惑的时候该怎么办?我的回答是用“游戏规则”这个概念去应付它。因为游戏规则是不需要解释的,只要遵守就可以了。在应用的技术领域,把暂时不解的东西当作一种游戏规则来解读和遵守是我常用的思维方式,这个游戏规则的概念就是我所说的一个规则。
      下一节预告,我眼中学习单片机的四个阶段。

(未完待续)

使用特权

评论回复
板凳
LeaderHuang| | 2015-2-24 17:31 | 只看该作者
对于单片机的内部原理,要得学计算机组成原理和FPGA才有深刻理解。
还是linus那句话,你得先学会使用它。

使用特权

评论回复
地板
jianhong_wu|  楼主 | 2015-2-25 21:01 | 只看该作者
LeaderHuang 发表于 2015-2-24 17:31
对于单片机的内部原理,要得学计算机组成原理和FPGA才有深刻理解。
还是linus那句话,你得先学会使用它。 ...

非常赞同。先学会使用才能进一步研究它的原理。

使用特权

评论回复
5
ai小小声| | 2015-2-26 16:32 | 只看该作者
学习学习!

使用特权

评论回复
6
379109964| | 2015-2-27 09:35 | 只看该作者
那个帖子还在看!

使用特权

评论回复
7
jianhong_wu|  楼主 | 2015-3-3 10:54 | 只看该作者
本帖最后由 jianhong_wu 于 2015-11-1 14:43 编辑

第二节:我眼中学习单片机的四个阶段。

        第一阶段:学会C语言的常用语法,熟悉51单片机开发平台软件keil的操作,了解单片机的大概原理特性,能读懂按键,数码管,跑马灯,串口的简单程序,能熟悉几个常用的外围芯片驱动。网上这方面优秀的教程很多,我正在写的这个连载《从业十年,教你单片机入门基础》也是属于这类入门教程之一。
        第二阶段:我认为这个阶段是四个阶段中最重要的阶段。很多初学者完成了第一阶段的学习,真正去面对一个小项目的时候,还是无从下手。他们不知道按键,显示,通讯,应用程序之间是如何关联起来的,他们一旦遇到多任务项目的时候不知道如何并行处理,他们最缺的是程序的框架思路。网上有很多热心牛人分享的程序框架思想,都值得大家学习和借鉴。我平时做项目是用状态机的思路,就是用switch语句实现多任务的切换,再外加一个定时中断产生不同的时间计时,有兴趣的朋友可以看看我去年在本论坛写的连载贴子《从业将近十年,手把手教你单片机程序框架》
       第三阶段:大家在做项目时,除了写单片机的软件,还不可避免的要跟整个电路的硬件打交道,掌握一些常用的硬件电路知识就显得尤其重要。电阻,电容,电感,二极管,三极管,光藕的应用,电压差和参考地的关系,两系统通信时需不需要共地的原因,隔离与非隔离的本质,常见的变压整流电路,常见的外围驱动电路等等。这方面优秀的电子基础教程很多,大家应该主动找这方面的资料来学习学习,我过一两年后也打算写写这方面的连载贴子《从业十年,单片机常用硬件知识讲解》。
      第四阶段:有了前面三个阶段的主动学习和积累,就可以去做项目了,在项目中学习。根据工作的需要来选择学习哪个厂家的单片机,比如PIC,AVR,stm32等单片机厂家;根据工作的需要来决定是否需要学习汇编语言,有一些台湾厂家的单片机并不能用C语言开发,只能用汇编;根据工作的需要来深入研究相关行业所需的硬件电路知识;根据工作的需要来学习相关的外围芯片驱动程序。我本人也打算过两三年后写写这方面的贴子,作为大家项目开发时的参考工具书来用,叫《从业十年,单片机常用外围驱动程序集》。
      下节预告,单片机一个最重要的特性。
(未完待续)

使用特权

评论回复
8
bjfxxc| | 2015-3-5 14:51 | 只看该作者
期待鸿哥的大作。

使用特权

评论回复
9
yuanquan12345| | 2015-3-6 08:20 | 只看该作者
我先预定一本书。

使用特权

评论回复
10
ZHB356| | 2015-3-6 16:28 | 只看该作者
我现在准备学单片机,

使用特权

评论回复
11
又一个暑假| | 2015-3-6 16:33 | 只看该作者
赞一个

使用特权

评论回复
12
jianhong_wu|  楼主 | 2015-3-8 09:33 | 只看该作者
第三节:单片机一个最重要的特性。
      “道生一,一生二,二生三,三生万物。”《道德经》认为,世间万物,缤纷多彩,它们都起源自一个东西,这个“一”的东西就是“道”。电子世界也存在“一”这个东西,这个“一”繁衍出手机,电脑,电视机,机器人等丰富多彩的电子世界。这个“一”就是单片机一个最重要的特性:程序下载进单片机的内存后,可以识别管脚上的高低电平信号,管脚也可以输出不同时间长度的高低电平。下面我把这句话的5个重要关健词提取出来,详细解读它的含义。
       程序。有3种,C程序,汇编程序,机器程序。能下载进单片机的只有机器程序,C程序和汇编程序都不能直接下载进单片机,所以C程序和汇编程序最终要经过专用编译软件翻译成机器程序后,才能下载进单片机执行。程序就是语言,语言就是用来交流的,交流就必须存在两个对象,这两个对象分别是程序员和单片机。程序员用C语言或者汇编语言,单片机只用机器语言,他们两者交流就必需一个翻译家,这个翻译家就是编译软件,俗称编译器,它专门把C语言或者汇编语言翻译成单片机能识别的机器语言。现在单片机开发的主流是用C语言,我本人出来工作后就从来没有用过汇编语言,所以我的观点是,C语言是必修课,汇编语言是选修课;C语言是白话文简单易懂,汇编语言是文言文繁琐难读。当然汇编也有它的优点和不可替代的场合,汇编的翻译效率高,往往是一句汇编语言对应一句机器语言,而一句C语言有可能对应几句机器语言,所以很多嵌入式系统某段要求简洁高效的源代码都是用汇编来写的,也有少数一些很便宜的单片机不提供C编译器,只能用汇编语言开发。所以要不要学汇编,我的建议是最好根据个人的工作需求来决定。
       内存。既然程序可下载进单片机,那么单片机必然有一个存储程序的内存。单片机内存包括ROM和RAM两部分。ROM的优点是掉电后存储的内容不会丢失,缺点是除非在烧录(下载)过程中,否则上电后它存储的内容也不能更改。并且,虽然ROM在烧录(下载)过程中可以更改内容,但是更改的次数有限制,也就是烧录(下载)的次数有限制,一般最大次数是10万次,当然这里所说ROM是指FLASH的单片机,如果是OTP的单片机,那么最大次数是1次。而RAM恰好反过来,RAM的优点是上电后存储的内容可以被程序指令随时更改,而且还没有更改次数限制,缺点是掉电后内容会丢失。正因为ROM和RAM各有特点,所以它们的分工有所不同。程序包括指令和数据两部分。指令是指程序中的判断,跳转,赋值等指令,这些内容是程序烧录进单片机时就固定下来的,不可更改的,所以存储在ROM中。数据也分两种,程序指令可更改的数据和程序指令不可更改的数据。程序指令可更改的数据存储在RAM中,程序指令不可更改的数据存储在ROM中。那么谁在幕后进行这些分类存储?是编译器软件和下载器(烧录器)。编译器除了把C语言翻译成机器语言之外,还帮我们分好了类,分配好了存储的地址和位置,下载器(烧录器)再根据这些信息把程序存储到内存中。
       管脚。它是单片机与外部电路进行能量和信息交互的桥梁。有电源,复位,晶振和IO口这4种类型管脚。第一种电源管脚。是给单片机内部电路供电的接口。单片机有两种常用的供电电压,一般不是3.3V就是5V,有的单片机两种电压都兼容。第二种复位管脚。单片机上电后需要外部电路给它一个瞬间高电平或者低电平的复位信号,才能启动工作。这类外部的复位电路通常是用电容和电阻组成的充电电路来实现,也有一些系统是用专门的复位芯片来实现。第三种晶振管脚。任何单片机想要工作必须要有晶振。单片机执行程序指令是按一个节拍一个节拍来执行的。而晶振产生固定频率的脉冲就是这个节拍的基础源泉。所以把晶振比喻成单片机的心脏是非常恰当的。当然,现在很多单片机都把晶振集成到内部了,不用再外接晶振。第四种IO口管脚。这是跟我们编写程序关联最密切的管脚。前面提到的电源,复位,晶振这3种管脚是为了让单片机能工作,俗称单片机工作的三要素。而单片机工作的具体内容就是通过IO口管脚来体现的。比如,IO口能识别按健的输入,也能驱动继电器的开关,也能跟外围器件进行通信。
       电平。单片机IO口管脚检测到的电压低于或等于0.8V时是低电平,程序里读取到的是0数字。检测到的电压高于或等于2.4V时是高电平,程序里读取到的是1数字,当然IO口输入的最大电压不能超过单片机的供电电压。单片机输出的低电平是0V,单片机输出的高电平等于它的供电电压值。
       时间。时间是单片机程序必不可少的一个元素。跟外围芯片通信的时序节拍需要时间,驱动发光二极管闪烁需要时间,工控自动化的某些延时需要时间。单片机的时间来源自两方面。第一方面源自指令的周期时间。单片机是根据节拍来执行程序指令的,所以每执行一条指令都要消耗一点时间,只要让程序执行一些无实际意义的指令,并且通过调整所执行指令的条数就可以得到所需要的时间长度。第二方面源自单片机内部自带的定时器。假如设置定时器每20毫秒产生一次中断,现在要获取10秒钟的时间,只需程序统记500次定时中断就可以了,因为1秒等于1000毫秒。
       下节预告,平台软件和编译器软件的简介。
(未完待续)

使用特权

评论回复
13
yuanquan12345| | 2015-3-9 14:42 | 只看该作者
学习。

使用特权

评论回复
14
皓月星光| | 2015-3-9 21:34 | 只看该作者
学习了。。

使用特权

评论回复
15
justinlin2015| | 2015-3-11 17:03 | 只看该作者

赞一个

使用特权

评论回复
16
心痛哲明| | 2015-3-12 11:49 | 只看该作者
太棒了

使用特权

评论回复
17
jianhong_wu|  楼主 | 2015-3-14 09:35 | 只看该作者
第四节:平台软件和编译器软件的简介。
      C语言代码写在哪里,谁负责把它翻译成Hex格式机器码?这就涉及到编辑和编译,从而诞生了平台和编译这两种软件。平台软件负责编辑源代码,编译软件负责把源代码翻译成Hex格式的机器码。
      不同厂家的单片机,它所用的平台和编译器软件都不一样。即使是同样一个厂家的单片机,它也有可能存在多种不同的第三方平台软件和编译器软件,下面列举的一些例子只是主流的平台和编译软件,并不是说它们是唯一的。
      PIC单片机的平台软件是MPLAB,8位单片机是PICC编译器,12位单片机是PIC18编译器,16位单片机是C30编译器。这个例子从侧面也说明了一个平台软件可以嵌入多种不同的编译器软件,平台软件和编译器软件存在一对多的关系。
      51单片机的平台软件是keil,编译器是C51。
      以上所述,单片机程序开发需要用到两种软件,但是实际项目开发的时候,我们只是跟平台软件打交道就可以了,因为编译器软件是当做一种独立配件嵌入到平台软件里,统一受平台软件控制。我在用PIC的8位单片机时,需要安装一次MPLAB平台软件,也需要独立再安装一次PICC编译器软件,然后运行MPLAB平台软件,在里面操作某个菜单设置选项,把PICC编译器跟MPLAB平台软件关联起来,也就是我所说的把PICC编译器嵌入到MPLAB平台软件里,统一接受平台软件的控制,但我写代码只需要跟MPLAB平台软件打交道就可以了。我早期在做51单片机开发时,也是需要把keil平台软件和C51软件分开安装,然后再把它们关联起来,但是现在从keil2版本开始,在安装keil平台软件时就已经默认把C51安装好了,并且自动把C51嵌入到了keil平台软件。我现在用keil4这个版本的平台软件,只需要安装一次keil平台软件就可以了,不需要像早期那样再单独安装C51编译器。
      下节预告:用keil软件新建,关闭,打开一个完整工程的操作流程。
(未完待续)

使用特权

评论回复
18
yuanquan12345| | 2015-3-14 20:29 | 只看该作者
谢谢。学习了。

使用特权

评论回复
19
yefengling| | 2015-3-15 12:46 | 只看该作者
学习了

使用特权

评论回复
20
yuchi0902| | 2015-3-16 14:45 | 只看该作者
学习

使用特权

评论回复
发新帖 本帖赏金 10.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

465

帖子

524

粉丝