初学单片机几个不易掌握的概念1.docx
《初学单片机几个不易掌握的概念1.docx》由会员分享,可在线阅读,更多相关《初学单片机几个不易掌握的概念1.docx(71页珍藏版)》请在冰豆网上搜索。
![初学单片机几个不易掌握的概念1.docx](https://file1.bdocx.com/fileroot1/2023-7/3/82937d93-6915-4cbb-8489-4a6d826ca67c/82937d93-6915-4cbb-8489-4a6d826ca67c1.gif)
初学单片机几个不易掌握的概念1
初学单片机几个不易掌握的概念
随着电子技术的迅速发展,计算机已深入地渗透到我们的生活中,许多电子爱好者开始学习单片机知识,但单片机的内容比较抽象,相对电子爱好者已熟悉的模拟电路、数字电路,单片机中有一些新的概念,这些概念非常基本以至于一般作者不屑去谈,教材自然也不会很深入地讲解这些概念,但这些内容又是学习中必须要理解的,下面就结合本人的学习、教学经验,对这些最基本概念作一说明,希望对自学者有所帮助。
一、总线:
我们知道,一个电路总是由元器件通过电线连接而成的,在模拟电路中,连线并不成为一个问题,因为各器件间一般是串行关系,各器件之间的连线并不很多,但计算机电路却不一样,它是以微处理器为核心,各器件都要与微处理器相连,各器件之间的工作必须相互协调,所以就需要的连线就很多了,如果仍如同模拟电路一样,在各微处理器和各器件间单独连线,则线的数量将多得惊人,所以在微处理机中引入了总线的概念,各个器件共同享用连线,所有器件的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的目标文件,一般编程器能够识别这种格式的文件,只要将此文件调入即可写片。
在此,为使大家对整个过程有个认识,举一例说明:
ORG0000HLJMPSTARTORG040H
START:
MOVSP,#5FH;设堆栈LOOP:
NOPLJMPLOOP;循环END;结束
表1
:
03000000020040BB
:
0700400075815F000200431F
表2
020040FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF75815F00020043
表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仿真好。
流水灯
学习了一段时间,有了一定经验的朋友,肯定会觉得不过瘾,老是纸上谈兵,点个LED有什么用?
能不能来点实际点的。
好的,我们就安排一点实际一点的,这次是点亮真的电灯了,不过要注意安全,莫要发生触电事故,另外这次要用到双向可控硅了,强电没接触过的朋友,先预习吧,正好我要花点时间准备一下了。
上传啦,是一块线路板图,单面板,红线代表跳线。
没有原理图,简单地说一下吧。
A17是一个8芯的插针,可以用它与单片机的P1口相连,记得我上传的板子吗?
在P1口接LED前也有一个8芯插座的位置,装上去,用一根8芯扁平电缆相连就行了,记住,两块板子要用一只电源,也就是要共地。
板上用的器件,如果用外接5V电源,那么D1、D2、D3、D4及C1、C2、C3、C4、C5、C6及T9(7805)、A18(散热器)均不需要装,如果用外接交流电,则将它们装上去,A26是一插座,可以用来向单片机板供电。
IC1到IC8上使用交流光耦,型号为MOC3020,注意,MOC3020是6脚封装,由于没有找到6脚的插座,所以全是用的8脚的插座,插时最上两只不用,即靠插座底安装,R9——R16是限流电阻,470殴,1/4W,金属膜。
R1——R8是限流电阻,330殴,1/2W,金属膜。
T1——T8是晶闸管(可控硅),型号是BTA06-800C,用ST的比较好,6安培,800V电压,加上合适的散热片后,带500W以内的负载应没问题。
A1-A8是相应的散热片的位置,我用的散热片比较小,因为只带灯,又是间隙亮,所以问题不大。
P1——P5是接线端子。
根据各人条件去买吧——也用不着菲尼克斯的,哈哈。
好了,一切装好,OK了,通电吧,当心,再次提醒大家,小心触电哦。
电源一端接P2,另一端接到P3——P5,负载则一端接P3——P5中的一个(它们都是连着的),另一端则接P1的八个输出端子之一。
至于软件,就自已编了,原来让LED怎么亮的,现在改成了让电灯亮,如此而已。
有了这么一个东东,其实也可以让它和PC机接起来,让PC机来做流水灯或做更多的事情,顺便上传一个文件给大家玩玩,我用C++BUILD编的,只有玩的价值,没什么用途。
就是用它来控制计算机的打印接口,输出高或低电平而已。
大家可以去电脑商场买一根并口电缆(不是打印电缆,是两端都可以和计算机相连的那种),载去一头,把它的八根数据线接到A17的八个输入端,然后将地线相连,就可以演示了,放心,板子是光耦隔离的,不会对计算机造成伤害。
单片机音乐程序的设计与实验
周振安
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。
本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。
1.单片机的基本发音实验
我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的“高”电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制“高”“低”电平的持续时间,就能改变输出频率,从而改变音调。
例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为:
其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ音频,其周期为1/200秒,即5ms。
这样,当P1.4的高电平或低电平的持续时间为2.5ms,即R3的时间常数取2500/20=125(7DH)时,就能发出200HZ的音调。
将上述程序键入学习机,并不断修改R3的常数可以感到音调的变化。
乐曲中,每一音符对应着确定的频率,表1给出C调时各音符频率及其相应的时间常数。
读者可以根据表1所提供的常数,将其16进制代码送入R3,反复练习体会。
根据表1可以奏出音符。
仅这还不够,要准确奏出一首曲子,必须准确地控制乐曲节奏,即一音符的持续时间。
音符的节拍我们可以用定时器T0来控制,送入不同的初值,就可以产生不同的定时时间。
便如某歌曲的节奏为每分钟94拍,即一拍为0.64秒。
其它节拍与时间的对应关系见表2。
但时,由于T0的最大定时时间只能为131毫秒,因此不可能直接用改变T0的时间初值来实现不同节拍。
我们可以用T0来产生10毫秒的时间基准,然后设置一个中断计数器,通过判别中断计数器的值来控制节拍时间的长短。
表2中也给出了各种节拍所对应的时间常数。
例如对1/4拍音符,定时时间为0.16秒,相应的时间常数为16(即10H);对3拍音符,定时时间为1.92秒,相应时间长数为192(即C0H)。
我们将每一音符的时间常数和其相应的节拍常数作为一组,按顺序将乐曲中的所有常数排列成一个表,然后由查表程序依次取出,产生音符并控制节奏,就可以实现演奏效果。
此外,结束符和体止符可以分别用代码00H和FFH来表示,若查表结果为00H,则表示曲子终了;若查表结果为FFH,则产生相应的停顿效果。
为了产生手弹的节奏感,在某些音符(例如两个相同音符)音插入一个时间单位的频率略有不同的音符。
程序框图如图2所示。
下面给出程序序请单,可直接在TD-III型学习机上演奏,对其它不同型号的学习机,只需相应地改变一下地址即可。
本程序演奏的是民歌“八月桂花遍地开”,C调,节奏为94拍/分。
读者也可以自行找出一首歌,按表1和表2给定的常数,将乐曲翻译成码表输入机器,而程序不变。
本实验方法简便,即使不懂音乐的人,将一首陌生的曲子翻译成代码也是易事,和着机器的演奏学唱一首歌曲,其趣味无穷。
程序清单(略,请参看源程序的说明)。
《无线电》1992年第3期。
下载两个音乐文件的源代码和HEX代码。
硬件连接说明:
随便找一个仿真机或者什么单片机实验板,只要能工作的就行,将程序输入,运行,然后找个音箱(你计算机旁边应当就有一对吧)拨出插头,插头的前端接在P1。
0上,后面部分找根线接单片机的地,就应当有声了,然后怎么改进硬件连接就是你的事了。
。
。
。
试试看,不看书,您能得几分?
总分是83分(还有两题主观题,谈学习、实验感受的)。
单片机期中测验
一、填空(每格1分共15分)
1.单片机有各种型号,我们以INTEL公司的_______系列为例来学习单片机技术。
2.半导体存储器中有一类在掉电后不会丢失数据,称之为_________,有一类掉电后会丢失数据,称之为____________。
3.我们用的单片机一共有______个引脚。
其中第9脚是______引脚。
4.单片机的存储器空间一共有四个,分别是_______________、_____________、_____________和_____________。
5.我们要让单片机工作,得要向单片机发布指令,单片机只能接受_______格式的指令,而我们人则不习惯于这种方式,因此我们通常用_______的格式写指令。
6.MOVA,#14H中,#14H的寻址方式称之为___________________。
MOV类指令称之为___________________。
7.关于堆栈类操作的两条指令分别是______________、____________。
二、判断题(每题1分共10分)
1.8031芯片内一共有4K的ROM,256字节的RAM。
………………………………………()
2.8位构成一个字节,一个字节所能表达的数的范围是0-255。
…………………………….()
3.8031中的工作寄存器就是内部RAM中的一部份。
…………………………………………()
4.8031中特殊功能寄存器(SFR)就是内部RAM中的一部份。
…………………………….()
5.MOVA,@R0这条指令中@R0的寻址方式称之为寄存器间址寻址。
…………………()
6.P0口是真正的双向I/O口,而P1、P2、P3则是“准”双向I/O口。
………………………()
7.MOVA,30H这条指令执行后的结果是(A)=30H………………………………………()
8.MOVA,@R7,将R7单元中的数据作为地址,从该地址中取数,送入A中。
……….()
9.SP称之为堆栈指针,堆栈是单片机内部的一个特殊区域,与RAM无关。
……………….()
10.MOVA,#30H这条指令的执行的结果是(A)=30H…………………………………….()
三、名词解释(每题3分,共15分)
1.字节
2.位
3.特殊功能寄存器
4.寻址
5.并行I/O口
四、写出下列指令执行的结果(每格1分,共14分)
1、
MOVA,#10H……__________
MOVR0,#20H…__________
MOV17H,R0……__________
MOV@R0,A………__________
MOV22H,A………__________
MOVR1,#17H……_________
MOVA,@R1………__________
MOV22H,A……__________
MOV11H,22H……__________
2、
MOVDPTR,#2314H
MOVR0,DPH
MOV14H,#22H
MOVR1,DPL
MOV23H,#56H
MOVA,@R0
XCHA,DPH执行以上指令后A=______________DPTR=__________
3、
MOVA,R0
MOVDPTR,#TAB
MOVCA,@A+DPTR
.
.
TAB:
DB13H,22H,33H,44H,67H
设执行该段程序之前(R0)=2,则执行完后(A)=___________。
4、
MOVA,#23H
MOVB,#33H
PUSHA
PUSHB
POPA
POPB
执行完本段指令后(A)=_________(B)=_______
五、简答
1.画出8031的引脚分布图,标明各个引脚的名称(6分)
2.简述复位的用途,复位的方法。
(6分)
3.简述时钟周期、机器周期、指令周期的概念及三者之间的关系。
(6分)
4、简述指令、目标程序、汇编程序的概念及其之间的相互关系。
(6分)
五、计算:
已知单片机系的晶振是12M,请计算该单片机的时钟周期、机器周期。
(6分)
教学内容:
单片机概述
1、何谓单片机一台能够工作的计算机要有这样几个部份构成:
CPU(进行运算、控制)、RAM(数据存储)、ROM(程序存储)、输入/输出设备(例如:
串行口、并行输出口等)。
在个人计算机上这些部份被分成若干块芯片,安装一个称之为主板的印刷线路板上。
而在单片机中,这些部份,全部被做到一块集成电路芯片中了,所以就称为单片(单芯片)机,而且有一些单片机中除了上述部份外,还集成了其它部份如A/D,D/A等。
天!
PC中的CPU一块就要卖几千块钱,这么多东西做在一起,还不得买个天价!
再说这块芯片也得非常大了。
不,价格并不高,从几元人民币到几十元人民币,体积也不大,一般用40脚封装,当然功能多一些单片机也有引脚比较多的,如68引脚,功能少的只有10多个或20多个引脚,有的甚至只8只引脚。
为什么会这样呢?
功能有强弱,打个比方,市场上面有的组合音响一套才卖几百块钱,可是有的一台功放机就要卖好几千。
另外这种芯片的生产量很大,技术也很成熟,51系列的单片机已经做了十几年,所以价格就低了。
既然如此,单片机的功能肯定不强,干吗要学它呢?
话不能这样说,实际工作中并不是任何需要计算机的场合都要求计算机有很高的性能,一个控制电冰箱温度的计算机难道要用PIII?
应用的关键是看是否够用,是否有很好的性能价格比。
所以8051出来十多年,依然没有被淘汰,还在不断的发展中。
2、MCS51单片机和8051、8031、89C51等的关系
我们平常老是讲8051,又有什么8031,现在又有89C51,它们之间究竟是什么关系?
MCS51是指由美国INTEL公司(对了,就是大名鼎鼎的INTEL)生产的一系列单片机的总称,这一系列单片机包括了好些品种,如8031,8051,8751,8032,8052,8752等,其中8051是最早最典型的产品,该系列其它单片机都是在8051的基础上进行功能的增、减、改变而来的,所以人们习惯于用8051来称呼MCS51系列单片机,而8031是前些年在我国最流行的单片机,所以很多场合会看到8031的名称。
INTEL公司将MCS51的核心技术授权给了很多其它公司,所以有很多公司在做以8051为核心的单片机,当然,功能或多或少有些改变,以满足不同的需求,其中89C51就是这几年在我国非常流行的单片机,它是由美国ATMEL公司开发生产的。
以后我们将用89C51来完成一系列的实验。
单片机教学
(2)
单片机的内部、外部结构
(一)
一、单片机的外部结构
拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。
1、电源:
这当然是必不可少的了。
单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。
2、振蒎电路:
单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。
只要买来晶振,电容,连上就可以了,按图1接上即可。
3、复位引脚:
按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。
4、EA引脚:
EA引脚接到正电源端。
至此,一个单片机就接好,通上电,单片机就开始工作了。
图1
二、任务分析
我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个引脚相连,否则单片机就没法控制它了,那么和哪个引脚相连呢?
单片机上除了刚才用掉的5个引脚,还有35个,我们将这个LED和1脚相连。
(见图1,其中R1是限流电阻)
按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。
因此要1脚我们要能够控制,也就是说,我们要能够让1引脚按要求变为高或低电平。
即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?
叫它什么名字呢?
设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不可以由我们来更改。
名字有了,我们又怎样让它变'高'或变'低'呢?
叫人做事,说一声就可以,这叫发布命令,要计算机做事,也得要向计算机发命令,计算机能听得懂的命令称之为计算机的指令。
让一个引脚输出高电平的指令是SETB,让一个引脚输出低电平的指令是CLR。
因此,我们要P1.0输出高电平,只要写SETBP1.0,要P1.0输出低电平,只要写CLRP1.0就可以了。
现在我们已经有办法让计算机去将P10输出高或低电平了,但是我们怎样才能计算机执行这条指令呢?
总不能也对计算机也说一声了事吧。
要解决这个问题,还得有几步要走。
第一,计算机看不懂SETBCLR之类的指令,我们得把指令翻译成计算机能懂的方式,再让计算