kaix

  • 450 主题
  • 495 帖子
  • 2760 积分
  • 身份:LV5 资深技术员
  • E币:911

一页纸讲清单片机

2019-2-27 13:51:44 显示全部楼层
        初学者的态度
        在我学习单片机的年代,只有单片机而且只有一种51单片机,没的选择。现在,有51内核的系列单片机、有MSP430单片机、有CC2530单片机、有ContexM0系列单片机、有STM8单片机、还有台湾的合泰、华邦、义隆...甚至国内的单片机......这还不包括ARM、ContexM3、STM32...这些32位的嵌入式产品。面对这么多的选择,你怎么入门?
        在我的学生中,不少人觉得8位机太简单了,稍微入门就准备要学嵌入式,搞ARM,玩Linux。在他们看来,会单片机并不等于嵌入式。实际上这是两个概念,而且你会用单片机就等于你能用单片机了吗?不,还差很远。不管是8位机还是32位机,它只是你解决问题的一个工具而已。很多人都会用C语言,但是有几个人能用C语言写出Linux和uCOS来呢?
        所以,初学者的态度很重要。哪一款单片机不重要,只要你精通擅长一款,日后再用其他公司的那都是小菜一碟,进而学习32位的处理器也是游刃有余,轻松自如,否则,每个单片机对你来说,都永远处于入门状态。
        一页纸讲清单片机
        也许有人问:有没有那么简单呀?
        当然不会那么简单啦,首先你要把书读薄,然后再把书读后,最后把书放进自己脑子里,形成自己的一套思路。
        理解任何一个事物,最好把握它的本质。对于各个各样的嵌入式微处理器产品,实际上用一页纸就可以把本质的脉络说清楚。有这么神奇,嗯...我也是自己总结的,大家可以看看,加以斧正。
       
        8位和32位机都可以看成是“内核+外设”的结构,外设多,单片机就复杂些,总线位数高,运行就快一些。本质上还逃不出这个架构。对于设计人员编程来说,操作外设实际上就是读写各种特殊功能寄存器,传输数据就是读写总线,相应外设就是处理中断。除了这三大操作,好像没有其他了。当然对于不同的外设,其特殊功能寄存器的定义不同,中断向量不同,操作流程不同,但本质上还是在操作寄存器、总线和中断。
        有人不服说,不会吧,一定还有别的。当然有了,但对于初学者来说,不要钻牛角尖,把常见的、大多数的东西把握了,慢慢再去研究小众技能吧。上面讲了这么多,实际上就想告诉初学者:嵌入式或者单片机的入门真的不难,但也不容易,需要你拿出态度来。我经常对我的学生说:“单片机或者嵌入式这东西是入门难,到经验积累到一定程度就比较容易了。”
        一些不是建议的经验
        1、从8位单片机入门比较好一点,选好一个型号,认真学习,直到精通。
        2、多练习,多写代码,多上网看看博客,当然自己要有一块学习板了。
        3、掌握简单常用的模拟电路和数字电路,比如:电阻限流、电容滤波、运放放大等等,将来你在设计电路和调试程序的时候都会用到。
        4、精通C语言,特别是指针和数组,最好把预处理和编译过程了解一下。
        5、掌握一个电路设计软件,对于单片机,其实会Protell99都可以了。
        6、会使用万用表,最好有示波器啦,而且要掌握一些常用的测试手段。
        7、在自己学习过程中,整理并形成自己的元器件库和常用程序库,这是你进阶下一阶段成为高手的关键。
        8、多看看各种单片机案例,掌握各种常用芯片的使用,嵌入式就是一个逐渐积累的过程。你的嵌入式技术有多高,就看你心里的案例与资源有多少。现在各种功能都有模块或专用芯片,还都提供UR、SPI、IIC等接口。
        表面上你用单片机在实现蓝牙,实际上你只是在使用单片机的串口读写数据。如果说元器件电路模块是硬件资源的积累,那么,常用接口模块驱动程序则是软件资源的积累。 将来在你的产品设计中,可能用到很多新的模块和元件,只要它的接口是SPI接口、IIC接口、UR串口等你熟悉的接口,那么对于你来说,它就是一个旧模块和元件。因为单片机实际上面对的不是模块和元件,而是你熟悉的常用接口。
        9、最好有做笔记的习惯,你也可以写写博客,这个到后面会有意想不到的作用。
        经典51内核资源全览浓缩图
        你不要当51单片机是高科技产品,请把它看作一款玩具。你不是在学习开发,你是在玩“极品飞车”。学习会让懒人痛苦,而玩耍会给懒人快乐,没有愉悦的心情,还谈什么学好学精?
        经典款51单片机都有什么东西?一张图就可以告诉你...
       
        <1> 四组8位并行I/O端口:
        P0端口:PC门,集电极开路输出,必须接上拉电阻才能输出高电平。
        P1端口:无特殊之处。
        P2端口:访问外部存储器时,作高8位地址用。
        P3端口:功能复用端口,详情看表。
        <2> 三大外设:外部中断、定时/计数、串行通信
        <3> 五个中断源:2个外部中断、2个定时/计数中断、1个串行通信中断        
        注意:要记住中断号与中断源的对应关系...编程时会用到!
        <4> 三大特殊功能寄存器:TCON、SCON、TMOD
        经典型51单片机的重要外设归纳
        不管简单还是复杂的微处理器,其基本架构都是“内核+外设”,而控制外设的重要途径就是特殊功能寄存器。作为一个嵌入式设计师,如果做底层的程序开发,绝大部分的工作都在跟各种特殊功能寄存器打交道。
        51单片机的外设不多,可以分成三大块:中断系统、定时/计数器和串行接口。
        要想把这些外设应用好,首先得把控制这些外设的特殊功能寄存器弄明白,其实也不多,就下面几个:
        IE寄存器:中断控制寄存器。
IP寄存器:中断优先级寄存器。
TCON寄存器:中断状态标志寄存器。
TMOD寄存器:定时/技术模式控制寄存器。
THx和TLx寄存器:定时/计数器的技术初值寄存器。
SCON寄存器:串口控制寄存器。
SBUF寄存器:串行接口收据发送和接收缓冲器。
<1> IE寄存器与IP寄存器(IP用的不多)
   
<2> TCON寄存器
     
<3> TMOD寄存器
   
        <4> SCON寄存器
   
        程序设计要点
        <1> 引入头文件
        在单片机的程序设计中,很多时候需要操作特殊功能寄存器,而这些寄存器实际上就是芯片中的一个内存地址。我们要记住这些地址很难,而且代码编写也比较复杂。为了方便记忆和使用,我们给每一个特殊功能寄存器都起了一个名字。如果在程序设计中你想直接使用这些名字,那么你就需要引入对应当芯片头文件,例如51单片机,你需要引入“reg52.h”文件。
            
        特殊功能寄存器P0的地址为80H,引入这个头文件之后,你就可以使用P0这个名字了
        P0 = 0x02;
        <2> 中断服务函数的格式
        在51单片机中有5个中断源,每个中断源都有固定的入口地址(也就是中断向量)和中断号。我们在程序设计的过程中,不需要记住中断向量地址,但需要知道每个中断源对应的中断号(参考【经典51懒人5步速成法-01】)
        一般情况下,中断的处理函数有两个,其一为中断初始化函数,其二为中断服务函数。初始化函数就是一个普通的函数,而中断服务函数却有特殊的格式要求:
        A. 中断函数没有返回值,也不能带参数。
B. 函数名后面要跟一个关键字interrupt,说明这是一个中断服务函数。
C. 在关键字interrupt后面要跟上中断号,说明这个中断服务函数是为那个中断服务的。   
中断服务函数的格式为:
        void 函数名() interrupt  中断号
         {  ----函数体----  }
        例如,定时器0的中断服务函数,我们C语言可以这样写:
            
        三大外设的开发与可重用代码
        在51内核的单片机中,主要有外部中断、定时计数和串行通信三大外设。在其他的嵌入式芯片中,这三个外设也是必不可少的。三大外设的程序设计实际上就成了51单片机最基础核心,掌握着三个部分的设计思路是学习单片机开发的必经之路。
        编写三大外设的程序实际上有很多类似的地方。它们都需要进行初始的寄存器配置,也就是初始化,它们都和中断有关,都需要编写中断服务函数。因此,对于每一个外设,我们都需要编写一个初始化函数和中断服务函数。这些函数在不同的应用工程中实际上都差不多,也就是说代码的重用性很高。
1、外部中断模块
        在51单片机中有INT0和INT1两个中断模块,外部的触发信号可以是电平,也可以是边沿,由寄存器TCON的IT0和IT1位来决定。
            
        2、定时/计数模块
        在51单片机中有T0和T1两个定时器,对内部可以定时,对外部可以计数。在初始化的时候,需要确定该模块是定时功能还是技术功能,工作模式是什么,最大计数值是多少。
            
        3、串行接口模块
        在51单片机的串行接口中,产生波特率需要占用定时器T1,发送数据时,将内容放到SBUF中,数据发送完毕,TI会置1。当完整接收到一个数据后,RI会置1,这时从SBUF中将内容读出即可。不管是TI还是RI标志位,都需要人工清0。
        一般情况下,发送数据采用查询方式,接收数据采用中断方式。
            
        结束语
        嵌入式应用开发涉及的知识点很多,初次接触往往感到无从下手。没错,与一些高级编程语言“易懂难精”的情况相比,嵌入式应用开发的入门是比较难的,但是,随着知识的积累和经验的丰富,后面的路会越走越宽,越走越顺。广大的嵌入式应用开发入门者应该充满信心。我一直都认为嵌入式应用开发就像一场马拉松,必须一步一个脚印,积蓄能量,逐步进阶,才能越走越远的。
        作者 :欧浩源
        来源:21ic论坛

最新评论

楼层直达:

thomas1119

  • 0 主题
  • 1 帖子
  • 203 积分
  • 身份:LV2 初级技术员
  • E币:201

allen_zhan_7528

  • 0 主题
  • 22 帖子
  • 366 积分
  • 身份:LV2 初级技术员
  • E币:220
一张纸不仅没讲清, 而且会吓到兴致勃勃对电子信息产业刚刚产生兴趣的童鞋.

uController 的应用范围今天已进入人类社会生活的细节, 但是返回上个世界50年代初首枚晶体管/首枚集成电路, 80年代左右首个处理器 8080 发明伊始. 核心的问题, 我个人总结, 都是怎样实现逻辑的可持续可编程的代码编译而成的机器码的控制. 这大致分成三个层次:
1. uController/cpu 能够实现对不同机器码的解码与执行(从简单的寻址/运算指令开始, 可能早期需要设计数十条指令).
2. pipeline, 在复杂的 cpu system 中, 编译后的指令需要读取到内存; 在相对简单的 uController, 或仅从 flash 起始执行地址读取. 这种读取/锁定/执行是连贯的. 在运行速度(处理器振荡器的震荡频率)动辄百兆/数G Hz 的环境下, 这种执行速度亿万倍超过人类的大脑且无需休息. 这是现代电子信息产业革命带来的新工业革命的基础. 在人类生产生活的各个行业, 由于电子工具(计算机/网络等)引入, 大部分的行业都提高了劳动生产率, 引入了现代人类社会的繁荣.
3. 适合的表达符合人类思维的逻辑设计方式, 上个世纪 80/90年代 class(面对对象)设计思路出现前, 早期的工作逻辑设计都是(简单)过程 process 式的, 或是说 functional 函数式的. 如何实现函数? 核心是 stack. 因此, uController/cpu 具有起码的 stack(一定是 ram/内存 硬件存储器件)设计. 另一个 ucontroller/cpu 符合人类思维模式(或任何智能模式)的表达是: interrupt. 这大致可分成两个形式: 一个是实时系统需要的即时外部/任务相应; 一个是 OS 设计中最基础的处理 concurrent 并发逻辑的基础.

今天所有的软件设计/编译/链接的终极基础, 都不外我这里总结的这几点.
希望在校的有兴趣投身电子信息产业的童鞋们, 有一个两个能意外浏览到我这里的回复.

这将有助于童鞋摆脱林林总总的具体电子设计的细节故意吓唬, 而厘清电子设计的基础目的.

zlstone1974

  • 0 主题
  • 1 帖子
  • 103 积分
  • 身份:LV1 技术小白
  • E币:99
zlstone1974 2019-3-4 10:14:05 显示全部楼层
你的一页纸讲清单片机说的很好总结的很有价值,能不能把其中的ppt发给我就是那几张图,有点不清楚。谢谢了。
广告

呵呵1608

  • 0 主题
  • 30 帖子
  • 429 积分
  • 身份:LV2 初级技术员
  • E币:337
呵呵1608 2019-3-5 10:26:58 显示全部楼层
学习了

科技大学

  • 0 主题
  • 2 帖子
  • 104 积分
  • 身份:LV1 技术小白
  • E币:101

gbq0727_2778584

  • 0 主题
  • 11 帖子
  • 372 积分
  • 身份:LV2 初级技术员
  • E币:332

测量无处不在

  • 6 主题
  • 37 帖子
  • 304 积分
  • 身份:实习版主
  • E币:256
时序图挺关键的,是将资源转换为执行的过程,开发离不开的工具。
广告

2331310053_6275

  • 0 主题
  • 206 帖子
  • 1084 积分
  • 身份:LV4 高级技术员
  • E币:609
简明扼要,通俗易懂,说的很好~!
我要评论
8
58
广告
关闭 热点推荐上一条 /2 下一条
快速回复 返回列表