在学习51单片机时,长长是大的方向都懂得,小的细节都理解不好,但是当应用的时候,细节又决定着成败。写帖子的目的,只是当作自己的一个学习记录,通过更多人的交流不断完善自己。
靠开始的时候,也就照样学样,跑一个流水灯啊,输出一个字符啊……但是总感觉有哪里不是很透彻的样子,所以就经常自己胡思乱想了。
单片机是怎么工作的呢???????
单片机就是小型的计算机,众所周知,二进制代码(也叫机器码,以下称机器码)能够直接被硬件直接识别和执行。那么你是否有疑问,机器码又是怎么被硬件识别的,汇编语言、c语言又是怎么变成机器码的?对于整个单片机系统,当我从上电启动开始,代码语言是如何指挥硬件工作?硬件又是从哪里开始工作的?执行指令的过程是怎么样的? 1.机器码如何被识别 微型计算机内部,数的表示形式是二进制,这是因为二进制数只有0和1,人们采用晶体管的导通和截止、脉冲的高电平和低电平等都是很容易实现的,此外,二进制数运算简单,便于电子线路实现。不同硬件组成的单片机有不同的指令集。因此机器码能够被硬件直接识别和执行。采用16进制书写只是为了方便描述冗长的二进制。 单片机能够执行的是一条一条用二进制数字写成的指令,在CPU读取这些指令时会用机器内部的译码部件把这些数字译成一定的操作,从而知道单片机该做什么。在同一架构的CPU中,机器指令是相同的,或是向下兼容的。硬件工程师们在设计CPU时,综合考虑各方面的情况,最终形成了若干条指令,然后把这些指令镌刻在CPU中,用硬件部分予以实现。 2.汇编语言如何转化成机器码 汇编语言是机器码的符号化。不同硬件组成的单片机有不同的指令集,不同的指令集用不同的助记符表示,所以汇编语言与机器语言一一对应,CPU内部有多少条机器指令,就会相应有多少条汇编指令。 不同的计算机的机器语言所对应的汇编语言也不同,因此通用性较差;其所生成的代码与机器指令直接对应,因此占用存储空间少,执行速度快,实时性强,对于一些实时性较强的场合,使用汇编语言进行程序设计往往是唯一的选择。 3.单片机c语言到机器码的过程 众所周知,由编译器编译完成C语言代码之后,产生的HEX文件里的二进制机器码。C语言产生HEX文件过程:c翻译成汇编,汇编在转化成机器码。对于编译器来讲,将c转化成汇编的时候,不是一一对应的关系,也就是说几行c代码,可能翻译成几十行。 虽然c语言有很多优点,但是汇编语言可以清楚的理解CPU内部的结构及其程序运行模式。 4.c语言和汇编的比较 当然小宋老师说的很对。你有时间的话,深入地掌握一种汇编也是有益无害的,多一种知识就能多一份解决问题的能力。学汇编能让你理解你用的片子,同样会提高你对C的理解的。对提高开发能力有益无害。
至于说,深不深入学51,则是仁者见仁的问题,要换我,我会建议你,深入掌握一种51核的MCU,将常用的片内外设的用法(包括电路连接和编程)都弄懂,就好了。
花时候学类似的片子,不如学算法、学数学、学电路、学点数字信号处理,学点操作系统知识,HIAHIA
总之就是不建议你把时间花在有量变没质变的事情上
学了51,再往前,你可以花时间弄RTOS,使用带操作系统ARM开发,或是学习DSP芯片的开发,或是学FPGA,总之,学习那些能给你带来新思维方式的技能,而不是总停留在一个层面上跑圈圈。 5.程序在单片机中是如何运行的(即指令执行过程)? 单片机执行指令是在控制器的控制下进行的。控制器(主要包括程序计数器PC、程序地址寄存器、指令寄存器、指令译码器、条件转移逻辑电路以及时序控制逻辑电路等)主要任务是产生合适的时序读取指令,然后识别指令,并根据指令的性质控制单片机各功能部件执行指令,从而保证单片机各部分能自动协调地工作。 计算机每执行一条指令都分为三个阶段:取指令—分析指令—执行指令。即首先从程序存储器中读取指令,送指令寄存器保存,然后送指令译码器进行译码,再将译码结果送定时控制逻辑电路,由时序控制逻辑电路产生各种定时信号和控制信号,送到单片机的各个部件及器件去执行相应的操作。这就是执行一条指令的全过程,而程序是指令的集合。 取指令:根据程序计数器PC中的值从程序存储器读出现行指令,发送到指令寄存器。 分析指令:将指令寄存器中的指令操作码取出后进行译码,分析其指令性质。如指令要求操作数,则寻找操作数地址。 执行指令:逐条指令重复上述操作过程,直至遇到停机指令、可循环等待指令。 一般计算机进行工作时,首先要通过外部设备把程序和数据通过接口电路和数据总线送入存储器,然后逐条执行。但是单片机中的程序一般事先已通过写入器固化在片内或片外程序存储器中。因而一开机即可执行指令。 例子详解: 开机时,程序计数器PC变为0000H。然后单片机在时序电路作用下自动进入执行程序过程。执行过程实际上就是取出指令(取出存储器中事先存放的指令阶段)和执行指令(分析和执行指令)的循环过程。 例如执行指令:MOV A,#0E0H,其机器码为“74H E0H”,该指令的功能是把操作数E0H送入累加器, 0000H单元中已存放74H,0001H单元中已存放E0H。当单片机开始运行时,首先是进入取指阶段,其次序是: 1 程序计数器的内容(这时是0000H)送到程序地址寄存器; 2 程序计数器的内容自动加1(变为0001H); 3 程序地址寄存器的内容(0000H)通过内部地址总线送到存储器,以存储器中地址译码电跟,使地址为0000H的单元被选中; 4 CPU使读控制线有效; 5 在读命令控制下被选中存储器单元的内容(此时应为74H)送到内部数据总线上,因为是取指阶段,所以该内容通过数据总线被送到指令寄存器。至此,取指阶段完成,进入译码分析和执行指令阶段。 由于本次进入指令寄存器中的内容是74H(操作码),以译码器译码后单片机就会知道该指令是要将一个数送到A累加器,而该数是在这个代码的下一个存储单元。所以,执行该指令还必须把数据(E0H)从存储器中取出送到CPU,即还要在存储器中取第二个字节。其过程与取指阶段很相似,只是此时PC已为0001H。指令译码器结合时序部件,产生74H操作码的微操作系列,使数字E0H从0001H单元取出。因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令的执行完毕。单片机中PC="0002H",PC在CPU每次向存储器取指或取数时自动加1,单片机又进入下一取指阶段。这一过程一直重复下去,直至收到暂停指令或循环等待指令暂停。CPU就是这样一条一条地执行指令,完成所有规定的功能。 单片机的存储空间分为程序存储器和数据存储器两大类。指令代码存放在程序存储器中,是程序的一部分,由CPU通过取指令的方式读取并执行;而数据存储器则用于存储指令执行过程中所需要的变量及中间结果等内容,由指令代码控制CPU进行读写。所以,程序的执行实际上就是CPU在指令代码的控制下,不断取出存放在各存储器空间的操作数,由CPU进行处理的过程。 6.接下来,我们又将产生一个问题,51单片机存储器的结构又是怎么样的?及如何访问这些存储器? 要找到存放在个存储器空间的操作数,首先要明确存放操作数的地址空间和地址,即寻址。51单片机采用的是哈佛结构,程序存储器和数据存储器在不同存储空间格子独立编址。冯诺依曼结构则是统一编址。 程序和数据分别存储在什么地方? 程序存储器和数据存储器分开,有各自的寻址系统、控制信号和特定的功能。程序存储器只存放程序和常数,数据存储器通常用来存储程序运行中所需要的临时的或可变的数据。程序存储器一般为只读存储器(ROM、EEPROM或FLASH存储器),数据存储器一般则采用静态随机存储器(RAM)。 51存储器编址方式 程序存储器: 程序存储器用于存放程序、常数及表格。分为片内和片外。 51的内部和外部ROM、EPPROM或FLASH存储器的总的编址单位是0000H~0FFFH,共64KB(65536字节),实际程序执行时到底访问的是哪个地址空间的程序存储器,由 信号控制(高电平访问内部,低电平访问外部)。 程序存储器以16位的程序计数器PC作为地址指针,可寻址64KB空间范围, 作为程序存储器的读选通信号。需要访问存放在程序存储器中的常数及表格等数据时,要用查表指令MOVC来指定CPU访问程序存储器。 时序图!! 数据存储器: 数据存储器用做缓冲和数据暂存,如存放运算中间结果、设置特征及标志位。外部的RAM编址有重叠,因此当使用MOV指令时读/写的是内部数据存储器、特殊功能寄存器和位地址空间,而使用MOVX指令则是读/写外部数据存储器。 对于外部数据存储器以16位的特殊功能寄存器DPTR作为地址指针,可寻址64KB空间,也可以用8位地址作为指针,访问外部数据存储器的低256字节。 / 作为外部数据存储器的读/写选通信号。 对于内部数据存储器:可作为数据缓冲器、堆栈、工作寄存器组和软件标志等使用。CPU对内部RAM有丰富的操作指令。 工作寄存器组的选择、位寻址空间、堆栈和数据区。(请看书本详解) 时序图!! 7.寄存器的解析 寄存器,顾名思义,借寄存储的器件。 51内除程序计数器PC和4个工作寄存器区外,所有其他寄存器如I/O端口数据锁存器、定时器/计数器、状态寄存器、串行口数据缓冲器和各种控制寄存器都是以特殊功能寄存器SFR 的形式出现的。他们离散的分布在80H~FFH的地址空间内。 特殊功能寄存器大致可分为两类:1、与I/O口有关;2、做芯片内部功能控制用。(具体详解请看书本)
|