您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 平凡老师的单片机教程
单片机原理与应用作者:平凡第一节初学单片机几个不易掌握的概念第二节新8051教程---前言第三节单片机概述第四节单片机内、外部结构分析一第五节半导体储存器第六节单片机内、外结构分析二第七节单片机内、外结构分析三第八节单片机内、外结构分析四第九节单片机内、外结构分析五第十节寻址方式与指令系统第十一节单片机指令二数据传递类指令第十二节单片机指令三累加器A与片外RAM之间的数据传递类指令第十三节单片机指令四算述运算类指令第十四节单片机指令五逻辑运算类指令第十五节单片机指令六条件转移指令第十六节单片机指令七位及位操作指令第十七节计数器与定时器第十八节计时/计数器的方式控制字第十九节中断系统第二十节定时、中断练习一第二十一节定时、计时练习二第二十二节串行接口第二十三节串行接口应用编程实例第二十四节常用接口电路及基编程第二十五节动太扫描显示接口第二十六节键盘接口与编程第二十七节矩阵式键盘接口技术及编程单片机扩展一单片机扩展二单片机扩展三单片机扩展四单片机扩展五第一节初学单片机几个不易掌握的概念随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机的内容比较抽象,相对电子爱好者已熟悉的模拟电路、数字电路,单片机中有一些新的概念,这些概念非常基本以至于一般作者不屑去谈,教材自然也不会很深入地讲解这些概念,但这些内容又是学习中必须要理解的,下面就结合本人的学习、教学经验,对这些最基本概念作一说明,希望对自学者有所帮助。一、总线:我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的8根数据线全部接到8根公用的线上,即相当于各个器件并联起来,但仅这样还不行,如果有两个器件同时送出数据,一个为0,一个为1,那么,接收方接收到的究竟是什么呢?这种情况是不允许的,所以要通过控制线进行控制,使器件分时工作,任何时候只能有一个器件发送数据(可以有多个器件同时接收)。器件的数据线也就被称为数据总线,器件所有的控制线被称为控制总线。在单片机内部或者外部存储器及其它器件中有存储单元,这些存储单元要被分配地址,才能使用,分配地址当然也是以电信号的形式给出的,由于存储单元比较多,所以,用于地址分配的线也较多,这些线被称为地址总线。二、数据、地址、指令:之所以将这三者放在一起,是因为这三者的本质都是一样的──数字,或者说都是一串‘0'和‘1'组成的序列。换言之,地址、指令也都是数据。指令:由单片机芯片的设计者规定的一种数字,它与我们常用的指令助记符有着严格的一一对应关系,不可以由单片机的开发者更改。地址:是寻找单片机内部、外部的存储单元、输入输出口的依据,内部单元的地址值已由芯片设计者规定好,不可更改,外部的单元可以由单片机开发者自行决定,但有一些地址单元是一定要有的(详见程序的执行过程)。数据:这是由微处理机处理的对象,在各种不同的应用电路中各不相同,一般而言,被处理的数据可能有这么几种情况:1·地址(如MOVDPTR,#1000H),即地址1000H送入DPTR。2·方式字或控制字(如MOVTMOD,#3),3即是控制字。3·常数(如MOVTH0,#10H)10H即定时常数。4·实际输出值(如P1口接彩灯,要灯全亮,则执行指令:MOVP1,#0FFH,要灯全暗,则执行指令:MOVP1,#00H)这里0FFH和00H都是实际输出值。又如用于LED的字形码,也是实际输出的值。理解了地址、指令的本质,就不难理解程序运行过程中为什么会跑飞,会把数据当成指令来执行了。三、P0口、P2口和P3的第二功能用法初学时往往对P0口、P2口和P3口的第二功能用法迷惑不解,认为第二功能和原功能之间要有一个切换的过程,或者说要有一条指令,事实上,各端口的第二功能完全是自动的,不需要用指令来转换。如P3.6、P3.7分别是WR、RD信号,当微片理机外接RAM或有外部I/O口时,它们被用作第二功能,不能作为通用I/O口使用,只要一微处理机一执行到MOVX指令,就会有相应的信号从P3.6或P3.7送出,不需要事先用指令说明。事实上‘不能作为通用I/O口使用'也并不是‘不能'而是(使用者)‘不会'将其作为通用I/O口使用。你完全可以在指令中按排一条SETBP3.7的指令,并且当单片机执行到这条指令时,也会使P3.7变为高电平,但使用者不会这么去做,因为这通常这会导致系统的崩溃(即死机)。四、程序的执行过程单片机在通电复位后8051内的程序计数器(PC)中的值为‘0000',所以程序总是从‘0000'单元开始执行,也就是说:在系统的ROM中一定要存在‘0000'这个单元,并且在‘0000'单元中存放的一定是一条指令。五、堆栈堆栈是一个区域,是用来存放数据的,这个区域本身没有任何特殊之处,就是内部RAM的一部份,特殊的是它存放和取用数据的方式,即所谓的‘先进后出,后进先出',并且堆栈有特殊的数据传输指令,即‘PUSH'和‘POP',有一个特殊的专为其服务的单元,即堆栈指针SP,每当执一次PUSH指令时,SP就(在原来值的基础上)自动加1,每当执行一次POP指令,SP就(在原来值的基础上)自动减1。由于SP中的值可以用指令加以改变,所以只要在程序开始阶段更改了SP的值,就可以把堆栈设置在规定的内存单元中,如在程序开始时,用一条MOVSP,#5FH指令,就时把堆栈设置在从内存单元60H开始的单元中。一般程序的开头总有这么一条设置堆栈指针的指令,因为开机时,SP的初始值为07H,这样就使堆栈从08H单元开始往后,而08H到1FH这个区域正是8031的第二、三、四工作寄存器区,经常要被使用,这会造成数据的浑乱。不同作者编写程序时,初始化堆栈指令也不完全相同,这是作者的习惯问题。当设置好堆栈区后,并不意味着该区域成为一种专用内存,它还是可以象普通内存区域一样使用,只是一般情况下编程者不会把它当成普通内存用了。六、单片机的开发过程这里所说的开发过程并不是一般书中所说的从任务分析开始,我们假设已设计并制作好硬件,下面就是编写软件的工作。在编写软件之前,首先要确定一些常数、地址,事实上这些常数、地址在设计阶段已被直接或间接地确定下来了。如当某器件的连线设计好后,其地址也就被确定了,当器件的功能被确定下来后,其控制字也就被确定了。然后用文本编缉器(如EDIT、CCED等)编写软件,编写好后,用编译器对源程序文件编译,查错,直到没有语法错误,除了极简单的程序外,一般应用仿真机对软件进行调试,直到程序运行正确为止。运行正确后,就可以写片(将程序固化在EPROM中)。在源程序被编译后,生成了扩展名为HEX的目标文件,一般编程器能够识别这种格式的文件,只要将此文件调入即可写片。在此,为使大家对整个过程有个认识,举一例说明:ORG0000HLJMPSTARTORG040HSTART:MOVSP,#5FH;设堆栈LOOP:NOPLJMPLOOP;循环END;结束表1:03000000020040BB:0700400075815F000200431F表2020040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75815F00020043表3表1为源程序,表2是汇编后得到的HEX文件,表3是由HEX文件转换成的目标文件,也就是最终写入EPROM的文件,它由编程器转换得到,也可以由HEXBIN一类的程序转换得到。学过手工汇编者应当不难找出表3与表1的一一对应关系,值得注意的是从020040后开始的一长串‘FF',直到7581,这是由于伪指令:ORG040H造成的结果。七、仿真、仿真机仿真是单片机开发过程中非常重要的一个环节,除了一些极简单的任务,一般产品开发过程中都要进行仿真,仿真的主要目的是进行软件调试,当然借助仿真机,也能进行一些硬件排错。一块单片机应用电路板包括单片机部份及为达到使用目的而设计的应用电路,仿真就是利用仿真机来代替应用电路板(称目标机)的单片机部份,对应用电路部份进行测试、调试。仿真有CPU仿真和ROM仿真两种,所谓CPU仿真是指用仿真机代替目标机的CPU,由仿真机向目标机的应用电路部份提供各种信号、数据,进行调试的方法。这种仿真可以通过单步运行、连续运行等多种方法来运行程序,并能观察到单片机内部的变化,便于改正程序中的错误。所谓ROM仿真,就是用仿真机代替目标机的ROM,目标机的CPU工作时,从仿真机中读取程序,并执行。这种仿真其实就是将仿真机当成一片EPROM,只是省去了擦片、写片的麻烦,并没有多少调试手段可言。通常这是二种不同类型的仿真机,也就是说,一台仿真机不能既做CPU仿真,又做ROM仿真。可能的情况下,当然以CPU仿真好。第二节新8051教程---前言新8051教程——前言传统的单片机教学,均是以单片机的结构为主线,先讲单片机的硬件结构,然后是指令,然后是软件编程,然后是单片机系统的扩展和各种外围器件的应用,最后再讲一些实例。按照此种教学结构,按照这种结构,学生普遍感到难学。试想,一个从未接触过计算机结构的人,甚至数字电路也是刚刚接触的人,要他去理解单片机内部结构,这实在不是个容易的事,至于很多书一开始就提出的总线、地址等概念,更是初学者难以理解的——不管用什么巧妙的比方都不容易理解。于是糊里糊涂地学完了第一部份,第二部份一开始就是寻址方式,更抽象,好多人直到学完单片机还不能理解寻址方式究竟是什么意思,为什么需要这么多寻址方式,刚开始学当然更不懂了。然后是指令,111条指令,又不分个重点,反正全是要记住的,等到指令全部学完,大部份人已对单片机望尔生畏,开始打退堂鼓了。第三部份是编程,如果说前面的东西不能理解,还能靠记忆来获得知识的话,这部份就纯是理解和掌握了,如果以前没学过编程,短时间内很难掌握编程的有关知识,更不必说编程技巧了。可是教材上明明规定,要编出这样、那样的程序,学的人编不出来,当然只会认为,教材的要求当然是合理的,应该做到的,我做不到就是我没学好,于是很多人长叹一声:单片机太难学了!放弃吧。可是到这里还根本不知道一个单片机开发的完整过程是什么,什么是编程器还不知道。后面的就不说了,总之,现在教材,基本都是以单片机为蓝本来学习计算机原理,而不纯为学习单片机技术,在教材、教学过程的安排上又没有考虑人的接受能力,使得学习的过程是一个充满不断挫折的过程,于是很多人认为单片机入门难。基于以上情况,作者尝试编制一套全新的教学方法,以任务为教学单元,打破原有界限,不管硬件结构、指令、编程的先后顺序,将各部份知识分解成一个个知识点,为了完成一个任务抽取每个部份的不同知识点,加以组合,完成第一个任务就能清楚单片机的开发过程,完成第二、三个任务,就能自已模仿性地编出自已的程序,使得学习过程是一个不断成功地完成任务的过程。当所有任务全部完成,知识点就全学完了。即便只完成部份任务,也可以去做一些程序了——事实并没有必要学完全部知识才可以去做开发的,作者在编第一个商用程序时,还不懂定时器怎么用,编第二个商用程序,写了长达2K行的代码,可当时我还不懂怎么样用中断编程,因为当时我根本还不需要用中断。以上的教学方法具有如下特点:1、以人的认知规律为主线,而不是以课程结构为主线。2、以任务为单元构建认知单元,而不是以单片机功能为单元构建。3、完成第一个任务即可进行单片机的初步应用尝试,不必学完单片机的全部知识体系。随着任务的逐渐进行,知识逐渐完善,能力逐渐提高,所有任务完成时,已具有初步开发能力。以上的教学目标是一个
本文标题:平凡老师的单片机教程
链接地址:https://www.777doc.com/doc-5508342 .html