随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机的内容比较抽象,相对电子爱好者已熟悉的模拟电路、数字电路,单片机中有一些新的概念,这些概念非常基本以至于一般作者不屑去谈,教材自然也不会很深入地讲解这些概念,但这些内容又是学习中必须要理解的,下面就结合本人的学习、教学经验,对这些最基本概念作一说明,希望对自学者有所帮助。
一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来,但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。
二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的──数字,或者说都是一串‘0’和‘1’
组成的序列。换言之,地址、指令也都是数据。指令:由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的一一对应关系,不可以由单片机的开发者更改。地址:是寻找单片机内部、外部的存储单元、输入输出口的依据,内部单元的地址值已由芯片设计者规定好,不可更改,外部的单元可以由单片机开发者自行决定,但有一些地址单元是一定要有的(详见程序的执行过程)。数据:这是由微处理机处理的对象,在各种不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:
1·地址(如MOV DPTR,#1000H),即地址1000H送入DPTR。
2·方式字或控制字(如MOV TMOD,#3),3即是控制字。
3·常数(如MOV TH0,#10H)10H即定时常数。
4·实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOV P1,#0FFH,要灯全暗,则执行指令:MOV
P1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实际输出的值。
什么是单片机?怎样学习单片机?这是单片机初学者的灵魂拷问。
一、去背寄存器
千万不要去记寄存器,我做开发这么多年了,一个寄存器都记不住。
寄存器一般是我们要使用单片机外设的时候会去配置。
一流的方法是直接参考别人的配置程序。
二流的方法是看数据手册,最傻雕的做法就是去背寄存器。
二、去背汇编指令
除了一些在校大学生应付学校考试要背以外,我到现在为止,做过几十个项目都是用c语言,没用汇编做过一个项目。
很多人说还是有必要学,学了对单片机理解地透彻一点。
我想说的是你又不制造单片机,理解这么透彻干嘛。
单片机只是工具,90%的人都是用这个工具做应用,你理解透彻和我只会用这个工具,没任何区别。
三、以为C语言学习门槛很高
C语言小学生都能学会。
我没有跟你在吹牛逼啊,前端时间有一个大姐让我带他的儿子学习单片机。
他儿子才11岁,然后我拒绝了,因为在我的认知范围里,这么小很难学的会。
然后她说她儿子之前学了c++,有点基础,我当时都惊呆了,现在的学生真的是一个比一个厉害。
不过最后我还是让她慎重考虑下,毕竟我们培训的定位是那些学习完之后想找到工作的,我们课程也是以项目驱动去学习。
新手在学习c语言前期的时候,只要学习基本语法就可以了,来来去去就5条最常用的语句。
比如说if..else,switch, for,while, 赋值语句(=).
7个运算符:加减乘除,或运算、与运算、非运算。
4个逻辑关系符:||、&&、!=、==
3个最常用的数据类型unsigned char、unsigned char short、unsigned char long。
3个进制转换:二进制、十进制、十六进制
还有就是函数的定义和调用。
基本上掌握这些,你就能编写很多程序了。
学c语言是一个循环渐进的过程,不要一上来就像写很复杂的程序,再牛逼的大佬也是从点灯开始。
等你写多了,熟悉了,到时候再学习指针、结构体之类的。
因为你没有一定的基础时候,去学一些高级应用肯定是学不懂得。
只有等你碰到了只能用指针、结构体去实现的功能的时候,你才会深刻理解它们的作用。
四、总是因为记不住各种协议而烦恼
做单片机开发会经常接触各种协议,但是总体来说也就是:IIC、SPI、USART、单口通讯。
前期的话也先不要去学习USB,CAN之类的协议,这些一般只会用在细分的领域。
大家如果工作中碰到了,再针对性去学习。
大家真正只需要掌握IIC、SPI、串口、单片通讯就行了。
学习这个也很简单,直接搜别人的例程来用,先用起来,再根据程序的去理解这些时序图就简单多了。
这里没有说错啊,是通过程序去理解时序图,这个逻辑跟大多数人的思维可能是反的。
但是我个人就是这样看懂时序图的,也是我的经验,大家可以去尝试,并不一定适合大家。
五、纠结代码写得好不好
新手前期做项目写代码以实现功能为主,特别是51单片机,你代码写好了内存也未必够你用。
在你没接触过大项目程序开发的时候,你根本不知道代码的好坏,在功能上有什么区别。
反正都能实现功能对吧?
等你真正碰到一些大项目的时候,如果你代码水平不行,肯定是做不出来的。
代码量大了你Hold不住,不知道怎么去整合,整合完以后功能之间也有冲突。
最后好不容易整合好了,又发现移植性太差,可扩展性太差,万一项目经理让你增加或者改个功能,你就挂逼了。
这个时候就是你该去思考怎么样把代码写得更好的时候了。
因为你知道痛点在哪里了,在针对这个痛点去找解决的办法。
最好的方法依然是去参考,写程序比你厉害的人。
你再针对性去学习,比如说看我录制的那个程序架构教程。
我那个教程就是我这么多年产品开发当中碰到问题,再学习解决,最终总结出来的精华。
六、什么都想学成专家
很多新手在学习过程中碰到不懂的就想把那个知识点系统学一下,不学精学透不回头。
举个例子,比如说一个电路看不懂,就以为是自己模拟电路、数字电路基础太差。
然后去把模电数电系统学一遍,学着学着就学不下去了,然后就以为做单片机开发太难了,最后也就放弃了。
就像上面这种图,你去分析呗,等你真正吃透,人都老了。
关键实际产品开发直接用一个功放芯片就行了,又节约尺寸又便宜还稳定。
所以,除非你到时候去做芯片,做开发学这些还为时过早,也很少用到。
即便你系统学完模电数电,你再回过头去看当初看不懂的电路,我保证你90%几率还是看不懂。
因为你没抓住解决问题的核心。
这就是典型的走了弯路了。
正确做法是针对性学习,比如说这个电路你看不懂,那你首先要分析这个电路你是哪里看不懂。