单片机延时程序程序问题

单片机常见问题(一)
我的图书馆
单片机常见问题(一)
1.什么是单片机?
简单地说,单片机就是一个小计算机系统。为了说明清楚这个问题,得要从计算机说起。提到计算机,大家可能马上会想到“显示器、鼠标、键盘”,不过,这不是一个计算机的核心和关键,计算机的核心部分在一边的机箱里呢。打开机箱,可以看到,机箱里有主板、硬盘、光驱等。仔细观察主板,这上面有CPU、内存条、BIOS芯片,通常还有25针的打印机接口等,这些部件都是通过主板上的连线相互连接。
不论计算机复杂程度如何,它总是由运算器,控制器,存储器,输入/输出接口,总线这五个部分组成。通常运算器和控制器被做成一块芯片,也就是CPU(中央处理器)。在计算机主板上,内存条和BIOS芯片就是存储器,25针打印机接口就是输出/输出设备,而总线则被设计在主板上,即各部件相互连接的线路。
在一些应用场合,人们不需要计算机完成十分复杂的运算,但却希望计算机小巧,可靠,价格低。于是人们就把组成计算机的这5个部分全部集成到一块芯片上,也说是一块芯片就能构成一个独立的计算机,在当时的技术条件下,这是一件了不起的事情,于是人们就用这个特征来为之命名,称为“单片机”。
将构成一个计算机所需要的5个部分全部都集成到一块芯片中,这块芯片是否要很大、价格是否很高呢?并非如此。如果要把图1所示主板上的所有元件都集成到一块芯片中,那当然非常昂贵,可能技术上也无法实现,但很多单片机中所需要用到的功能完全没必要那么强大,因此很多单片机体积很小,价格也很低。如市场上常见的单片机有8,14,16,18,20,28,40,84等引脚,有些甚至只有6个引脚,如图2所示是微芯公司(Microchip)发布的一款6引脚单片机。而价格从几元到几十、上百元的都有,有些品种在大批量定购时甚至可以低至1元以下。
刚接触到单片机的人往往会有个疑惑:既然人们已经有能力制造功能强大的计算机,为何还要生产些功能不强的计算机?其实,功能强弱并不是决定是否生产的决定因素,市场需要才是关键。比如,用来控制一台电箱的计算机显然没必要使用“奔腾”芯片的强大运算能力,只要进行非常简单的计算,作个比较,看一看温度是否在所控制区间之内,然后再做出相应的控制就行了。
单片机在人们的生活中、工农业生产设备中处处有应用,例如各定时装置、自动控制装置等。爱好者学习单片机应该注意观察事物,找到自己周围能够使用单片机的场合,从而将学到的知识应用到实际中去。例如,使用单片机技术改造传统的机电设备、在特定的场合使用单片机替代PLC等就有着广阔的应用前景;又如,使用单片机控制电扇、抽油烟机、空调等,从而制作出具有更强功能、能够通用的控制器,也是可以尝试的。
2.单片机是如何工作的?
单片机的工作过程就是一个不断“取指令-分析指令-执行指令”的过程。单片机的程序以一条一条指令的形式存放在程序存储器中,单片机开始工作后,就从程序存储器的特定位置开始取指令,然后由单片机内部的控制器对指令进行分析,根据指令要求,进行“取数、送数、算术运算、逻辑运算、跳转”等基本操作中的一种或几种,这些操作都在一个规定的周期中完成,执行完了以后,到下一个存储器单元中取指令,重复刚才的操作(当然,这些要执行的操作具体内容可能跟上一次不一样了),如此不断重复,直到断电为止。这里所说的“存储器特定位置”、“规定的周期”等与单片机的型号有关,下面以51系列单片机为例来说明。
在51系列单片机中有一个名为PC的寄存器(就是用来存数的一个容器),在单片机复位后,这个寄存器中的内容被置为0000H,单片机内部的控制器总是根据PC寄存器中的值去相应的程序存储器单元取指令,因此,开机后,将从0000H单元取第一条指令,分析执行,同时,PC值将作相应的调整,指向将要执行的下一条指令的位置,下一条指令的位置在哪里呢?对于51单片机来说,一条指令可能占用一个字节、二个字节或三个字节,如果第一条指令是单字节指令,取完第一条指令以后,PC的值就会变为0001H,因此,第一条指令执行完毕以后,将从0001H单元中取出第二条指令来执行,以此类推。如果程序是顺序执行的,PC的值将始终不断增加,如果程序中有跳转指令,该指令将影响PC中的值,使PC中的值指向将要执行的下一条指令所在地址单元。这种跳转既可能是正向的,例如由0000H跳转到0030H,也可能是反向的,即往回跳转,如由200H跳转到100H。正是由于指令可以影响到PC中的值,才使得程序可以实现“分支”、“循环”等各种功能。那么,执行一条指令的时间又是多少呢?对于51单片机来说,指令执行时间有三种可能,单周期、双周期和四周期,不管一条指令需要做多少工作,都必然在规定的时间内完成。
3.单片机程序的作用是什么?如何编写?如何写入单片机?
单片机程序的用途是让单片机“听话”,按人们所预定的设计完成一系列动作,最终实现一个特定的功能。
例如使用单片机控制流水灯,接通电源后,第一次灯亮,然后延时一段时间,第二次灯亮,然后延时一段时间,第三次灯亮……,延时一段时间后又回到第一次灯亮,如此循环不已。这里就有这样的一些问题:第一次亮几盏灯、延时多少时间、一个循环中设置多少次不同的灯亮的情况……,这些决定了流水灯的花样,流动的速度,而这些,单片机显然没有自我判断能力,必须依靠人们给它“布置”任务,而它则是按人们的设计依次执行。
要让单片机“听话”,就要用单片机能够听懂的语言发布命令,单片机能够听懂的语言称之为“指令”。任何一种型号单片机能够接受的指令都是有限的,51单片机的指令条数为111条,而PIC单片机的指令仅有35条。每一条指令完成一个最基本的动作,人们为了要完成一个特定的功能,就要将这些指令排列组合,成为一个指令序列,这就是程序。
指令的表示形式有两种:机器语言和汇编语言。以51为例,如果要让P1.0引脚变为低电平,用机器语言来表示就是 C2H 90H,将这两个数放进单片机的程序存储器中,单片机执行后,就可以让P1.0引脚变为低电平了;而要让P1.0引脚变为高电平,用机器语言来表示就是D2H,90H。至于为什么是这两个数字,大家没必要追究,这是设计这块芯片的设计工程师规定的,我们不能更改,只能学习。
C2H,90H就是一条指令,显然这样的指令形式是很难记忆的,编程也非常困难,于是人们使用了“助记符”来代替这些数字。例如C2H,90H的助记符是CLR P1.0,而D2H,90H的助记符是SETB P1.0,由于助记符采用了英语字母的缩写,有一定含义,因此比数字形式的指令易记、易用。使用助记符形式的指令来编写程序就称之为“汇编语言源程序”。但是汇编语言源程序是没有办法直接送到单片机内部去的,使用助记符形式的指令编写的程序最终还是要变成为诸如:C2H,90H,D2H,90H,这种形式的指令才能被送入单片机的程序存储器。将助记符形式的指令变为数字形式的指令的过程称之“汇编”。汇编有两种方法,一种是“手工汇编”,即人们通过查表的形式找到所写汇编指令的数字形式然后写下来;另一种是“机器汇编”,即编写好汇编语言源程序以后,使用一个计算机软件对这些源程序进行处理,从而得到数字形式的指令序列,这个指令序列通常被称为“机器码”,即可以直接被机器所执行的代码。
机器汇编后得到的数字形式的指令序列以一个文件的形式保存在磁盘上,这个文件的扩展名一般是HEX,即人们常说的HEX文件。得到了HEX文件后,就可以将其写入程序存储器中了。要将程序写入芯片,通常需要一个称之为“编程器”的专用设备,在计算机上运行与之配套的编程软件,然后在这个软件中打开HEX文件,即可将其写入芯片中。随着技术的发展,编程方式越来越多,但总的概念是这样的,具体的细节,将在另一个问题“单片机编程器是什么”中回答。
<span style="color: #ff位、16位、32位单片机中的“XX位”指什么?
8位、16位、32位是指单片机的“字长”,也就是一次运算中参与运算的数据长度,这个位是指二进制位。以8位为例,8位二进制的表达范围是~即十进制的0~255,即每次参与运算的数据最大不能超过255。而16位机的字长是16位,其数据表达范围是0~65535,即每次参与运算的数据最大不能超过65535;32位单片机的字长是32位,其数据表达范围是0~,即每次参与运算的数据最大不能超过。
8位、16位、32位与单片机的性能密切相关,通常32位机的性能要高于16位机,而16位机的性能又要高于8位机。为什么会这样呢?这要从2个方面来分析。第一,位数不同,运算效率不同。对于8位机而言,由于在一次运算中的每一个数都不能超过8位,因此即便如100+200=300这样的运算,它也不能一次完成,因为300已超过了8位所能表达的最大范围(255),因此,要对这样的一个式子进行运算,就要编写一段程序,将运算分步完成,最后合成起来得到一个正确的结果。而如果采用16位单片机来运算的话,那么一次运算就够了,显然分步完成所需要的时间要远远大于单步完成所需要的时间。同样道理,当某个运算的结果或者中间值大于65535时,16位机也不能一次运算,要分步实现它,而32位机则可以一次运算完成。第二,商业因素。通常运算能力越高,表示这个单片机性能越强,当然,价格高一些人们也可以接受,有了价格空间,生产商通常都会在这些芯片中提供更多的其他的功能,使得芯片的整体性能得到更大的提升。
典型的单片机中,80C51系列,PIC系列,AVR系列都是8位单片机;80C196、MSP430系列是16位机;而目前非常热门的ARM系列则是32位机。
5. 单片机编程器、仿真器、烧写器、下载线各是什么?有什么用处?
单片机编程器是用来将程序代码写入存储器芯片或者单片机内部的工具,如图5-1所示是一个典型的编程的外形。图中黑色的集成电路插座,通过拔动手柄可以将置于其中的集成电路芯片锁紧或松开。编程时锁紧以保证接触良好,编程完毕松开,可以更换下一片芯片。
图5-1编程器
当芯片是双列直插形式时,直接插在座子上就可以烧写了,但如果遇到如图5-2所示的各种封装形式的芯片,又如何写烧写呢?一种方法是使用适配器,如图5-3所示是各种封装芯片所使用的适配器。
图5-2 各种封装形式的集成电路
QFN32 适配器 SOP28适配器
图5-3 各种封装的编程适配器
另一种方法是使用下载线。随着技术的进步,越来越多的单片机芯片开始支持“ISP”功能,即In System Programmer,在线可编程技术。利用这种技术,将空白的(尚未编程的)芯片直接焊在印刷线路板上,利用预先留下的几个引脚即可对芯片进行编程,不必将芯片拆下来放到编程器上,因此,这给小批量制作带来了极大的方便,也省去了购买价格昂贵的适配器。如图5-4所示是使用下载线对芯片进行在线编程的示意图。
图5-4 下载线对芯片进行在线编程示意图
6.自学单片机必备的硬件设备有哪些?
学习单片机,除了需要电脑以外,还需要以下的一些器材。
如果你对单片机还一无所知,那么自制或者购买一块实验板是比较好的选择。通常在实验板上会设计一些开关、LED指示灯、数码管、各种接口芯片等常用器件,通过对这些器件的编程练习,逐步掌握单片机的编程技术。
仿真机的用途是替代电路板上的单片机芯片,仿真机通过串行口、USB接口等方式与与PC机联机通信,接收PC端控制软件发出的指令,以单步、过程单步、全速运行等各种方式来执行程序,以单步或过程单步方式执行程时,每次执行完程序后可以将执行的结果反馈到PC端的控制软件中显示出来。由于单片机编程时必须要明确每一条指令执行完毕后会有什么样的结果,弄清实际运行后的结果是否与设想的结果相符,因此,仿真功能对于单片机的学习和开发可以起到很重要的帮助作用。
3.编程器或者下载线
其用途是将代码写入单片机芯片内部。对于学习者来说,有了仿真机也可暂时不配编程器或下载线,因为有了实验板、仿真机就可以做实验了。但是建议配置一台,这样可以对单片机开发的各个环节都有所了解。
4.万用表、电烙铁等电子制作工具
单片机开发,不是简单的编程,到目前为止,还少有纯粹的“单片机程序员”,通常要求开发者软、硬件方面都要熟悉,因此,这些电子制作工作还是要配备的。
需要说明的是,这里所说的仿真机、实验板、下载线或编程器等都是就一般概念而言的,并不涉及到具体的产品,市场上也有一些产品在设计时将实验板、仿真功能、下载或编程功能等中的一部分或者全部都集成到一块板上,构成一整套的实验系统。
上面介绍的这些设备,都需要有一定的投入,爱好者未必一定能够购买,其实,只要有一定动手能力,也可以自制一些简易的实验设备,同样可以开始学习。这里推荐采用STC单片机进行学习的方案,STC系列单片机的特点是可以直接通过串口下载程序,从而将开发工具的成本降到最低。如图6-1所示是一个完整的电路,器件成本仅20多元,但可以实现诸如单灯闪烁、流水灯、键控灯、PC控制灯等一些常用功能,从而学习基本指令、定时器、计数器、串口通信等单片机知识。
图6-1 简单的单片机实验电路板
图中R1~R9为1K电阻,D1~D8是发光二极管,E1用10u电解,Y1用11.0592M晶振,C1和C2用27P小磁片,C3~C7用104磁片,U1使用STC89C52芯片,U2用MAX232。再自制或购买一条串口电缆,用于和电脑的通信,制作线时使J1与电脑的串口端2,3,5分别相连即可。
制作好这个电路板以后,使用Keil软件(在http://www.keil.com/demo/default.asp?bhcp=1可以下载DEMO版)编译、链接程序,得到Hex文件,使用STC_ISP软件(在http://www.mcu-memory.com下载)将Hex文件写入芯片中,从而观察程序运行的效果。
7.目前国内常用的单片机有哪些?
1.80C51及其兼容系列
(1)80C51系列,这是最基本的系列。包括80C31,80C51,87C51,80C32,80C52,87C52等芯片,虽然这些芯片已基本不再使用,但它们是后续发展的芯片的基础。其中80C31单片机片内没有ROM,80C51内部是一次性可写4K的PROM,87C51内部是4K的EEPROM,这几种芯片内部RAM均为128字节。而后三种芯片其内部RAM均为8K,后两种芯片的片内ROM为8K字节。
(2)80C51兼容系列
这些芯片通常都与51系列单片机在指令一级兼容,但都扩充了诸多的新功能。常见的主要有以下一些。
STC89系列单片机,其主要特点有:直接通过串口对单片机编程;可编程为倍速运行;超低功耗;内置看门狗;内部FLASH  ROM可作为EEPROM作断电保存数据之用。
STC12系列单片机,其主要特点有:单时钟周期,工作频率0~35M,相当于普通80C510~420M;宽电压范围;低功耗;芯片内置E2PROM功能;内置硬件看门狗;通用I/O口可以设置为四种工作模式,在强上拉模式时可以“吐出”电流。
菲利普的LPC系列,其主要特点有:内置RC置振荡器,选择RC振荡器时不需外接振荡器件;所有口线均有20mA的LED驱动能力;有较宽的工作电压范围。
C8051F系列,其主要特点有:一个机器周期仅为一个时钟周期;增加了中断源;有内部独立的时钟源或接外部时钟,并能在程序运行时实现内、外部时钟的切换。每个I/O口引脚都可以设置为推挽或漏极开路输出,C8051F系列单片机I/O口最为独特的是增加了数字交叉开关,利用数字交叉开关可将内部数字系统资源定向到P0、P1和P2端口I/O引脚。这个系列很多型号的芯片具有ADC、DAC、PCA等功能。
PIC单片机的发展思路与51单片机不同,它不搞单纯的功能堆积,而是从实际出发,重视产品的性能与价格比,依靠发展多种型号来满足不同层次的应用要求;精简指令使其执行效率大为提高。目前有PIC10、PIC12、PIC16、PIC18系列数百个品种。以PIC16F676芯片为例,该芯片内置1K字FLASH ROM,128字节EEPROM,64字节RAM,8路10位AD转换器,内置精度高达±1%的振荡器,极低功耗,宽工作电压范围,这样一款高性能的14脚芯片,价格不到¥7,性价比相当高。
AVR系列单片机是增强型RISC结构的单片机,其主要特点是:速度快,一个机器周期仅为一个时钟周期;品种丰富,与PIC系列类似,依靠发展多种型号来满足不同层次的应用要求;支持ISP、IAP功能,可在线编程,方便远程维护;工作范围宽、抗干扰能力强。以ATMEGA8芯片为例,该芯片内置8K Flash ROM,512字节EEPROM,1K字节的RAM,8路10位AD,内置RC振荡器。这样一款高性能28引脚的芯片,价格仅在¥7左右,性价比也相当高。
其他常用的单片机包括:ST、EMC、摩托罗拉、三星等等。这些单片机有些市场用量很大,但我们并没有重点介绍,因为我们介绍的内容主要针对业余爱好者,有些芯片虽然功能强大、性价比也很高,但其并不针对业余爱好者,小批量的芯片很难买到,仿真机、C编译器等开发工具价格极其昂贵,所以这里不作介绍,有兴趣可以在网络上搜索有关资料。
8.常用单片机的大致价位是多少?
单片机的价格相差很大,从小于1元到几十元,上百元不等。下面就大致介绍一下常用单片机的价格。
单片机的价格与其出货量、性能等有很大的关系。以80C51系列单片机为例,这是一个庞大的系列,这个系列中的单片机性能有很大差别。如内部ROM不同,从1K~64K不等;引脚数不同,从14脚到84脚不等;内部RAM不同,从128字节到2K不等;内部模块不等,如有一些单片机内部配置了8位模数转换器,有一些配置了10位模数转换器,有一些内部带有CCP模块等等。不同配置的单片机价格不同,一般爱好者常用的89S52单片机芯片价格约为6元左右。这款芯片片内ROM为8K,片内RAM为128字节,内部有看门狗电路。一种常用的PIC单片机PIC16F676,14引脚,带有10位的AD转换器,价格仅7元左右。通常功能越强,价格也越高,但这并不绝对,尤其是不同厂商的同内类产品,往往没法直接加以比较,因此,读者如希望了解各种芯片的价格,还是要针对具体的型号进行查找,有一些网站有相关报价,可以供参考。
馆藏&80925
TA的最新馆藏
喜欢该文的人也喜欢&&&&&&&&&&&
单片机的最小系统?内部的主要结构?
答:最小系统:电源、晶振(为系统提供基本的时钟信号)、复位电路;内部结构:ROM/RAM、计时器、中断、I/O串并行口、总线扩展控制。
RAM和ROM的区别?
答:ROM(只读存储器):它的信息一次写入后只能被读出,而不能被操作者修改或者删除。一般用于存放固定的程序或数据表格。但是,“只读”这个概念有时候可以被一些新特性的器件颠覆。
RAM(随机存储器):它就是我们平时说的内存,主要用来存放各种现场的输入/输出数据、中间计算结果,以及与外部存储器交换信息,或者作堆栈(特点:先进后出,后进先出)用。它的存储单元根据具体需要可以读出或者改写。
两者区别:RAM只能用于暂时存放程序与数据。一旦电源关闭或发生断电,RAM中的数据就会丢失。而ROM中的数据在电源关闭或者断电后仍然会保留下来。
简而言之:相同点它们都是用来存储数据的
&&&&&&&&&&不同点存储数据的方式与数据能不能在二次加工不同
单片机I/O口有什么作用?I/0口的驱动能力?上拉电阻与下拉电阻的作用?
答:I/O口最主要的功能用来与外部器件实现数据信息的交互、速度匹配、数据传送方式和增强单片机的负载能力。它在两者之间扮演桥梁的作用,单片机拥有着串行与并行接口。每个种类的单片机的不同并行口也有着各自不同的功能。
单片机输出低电平时,将允许外部器件,向单片机引脚内灌入电流,这个电流,称为“灌电流”,外部电路称为“灌电流负载”。
&&& 单片机输出高电平时,则允许外部器件,从单片机的引脚拉出电流,这个电流,称为“拉电流”,外部电路称为“拉电流负载”。
单片机输出驱动能力的问题:每个单个的引脚,输出低电平的时候,允许外部电路,向引脚灌入的最大电流为 10 mA;每个 8 位的接口(P1、P2 以及 P3),允许向引脚灌入的总电流最大为 15 mA,而 P0 的能力强一些,允许向引脚灌入的最大总电流为26 mA;全部的四个接口所允许的灌电流之和,最大为 71 mA。而当这些引脚“输出高电平”的时候,单片机的“拉电流”能力呢?可以说是太差了,竟然不到 1 mA。
结论就是:单片机输出低电平的时候,驱动能力尚可,而输出高电平的时候,就没有输出电流的能力。
综上所述:灌电流负载,是合理的;而“拉电流负载”和“上拉电阻”会产生很大的无效电流,并且功耗大。
设计单片机的负载电路,应该采用“灌电流负载”的电路形式,以避免无谓的电流消耗。
在数字电路中,只有二种状态,要么是高电平,要么是低电平,在通电初期,这些输出状态是不确定的,为了使电路确定状态,必需使用上拉电阻或下拉电阻,使一个原来不确定电平变高的叫上拉电阻,否则就是下拉电阻,上拉电阻就是从电源上接一只电阻到这个状态口上就可以了,(就是把高的电压加到这个点上去,这个点的电位就高了)下拉电阻的接法,从这个状态口接一只电阻到负极(或数字接地),因电路形式与类别不同,当输入端有信号,这种变化会反应到输出口,从输出口得到了一个状态,本来应该完成任务了,但这会儿输入口已没信号了,可输出端还是这个状态(这个人习惯不好,开门后总是不关门,加一只弹簧,(电阻)让它自己关门,)这时候也要用到上下拉电阻,这里有复位的作用。
常见的时钟电路有哪些?为什么要使用PLL?
答:先了解一下什么是时钟电路?
时钟电路就是产生像时钟一样准确运动的振荡电路,任何工作都按时间顺序。用于产生这个时间的电路就是时钟电路。
&& 组成:晶体振荡器、晶震控制芯片和电容组成。
现在流行的串行时钟电路有:DS1302、DS1307、PCF8485等
它们的特点:接口简单、价格低廉、使用方便。
DS1302:具有涓细电流充电能力的电路,主要特点:采用串行数据传输,可为掉电保护电源提供可编程的充电功能,并且可以关闭充电功能。采用普通32.768KHz晶振。
PLL(PhaseLocked Loop):锁相环电路。用来统一整合时脉讯号,使高频器件正常工作。如:内存的存取资料等。PLL用于振荡器中的反馈技术。许多电子设备要正常工作,通常需要外部的输入信号与内部的振荡信号同步。一般的晶振由于工艺与成本原因,做不到很高的频率,而在需要高频应用时,有相应的器件VCO,实现转成高频,但不稳定,故利用锁相环路就可以实现稳定且高频的时脉冲讯号。
什么是时脉:指同步电路中时钟的基础频率,它以(若千次周期每秒)来度量,单位是(Hz)
总之:PLL可以同步频率,相位正交。倍频、变频。
单片机的寻址方式有哪些?
答:80C51有七种寻址方式:
<span style="color: #、立即寻址,寻址空间为ROM;
<span style="color: #、直接寻址,寻址空间为片内RAM的低<span style="color: #8B和特殊功能寄存器;
<span style="color: #、寄存器寻址,寻址空间为A、B、DPTR、CY、通用工作寄存器等;
<span style="color: #、寄存器间接寻址,片内RAM低<span style="color: #8B、片外RAM;
<span style="color: #、相对寻址,寻址空间为ROM;
<span style="color: #、变址寻址,寻址空间为ROM;
<span style="color: #、位寻址,寻址空间为片内RAM低<span style="color: #8B的位寻址区的<span style="color: #8个位,其字节地址为<span style="color: #H~2FH;以及部分可以位寻址的特殊功能寄存器。
参考:AT89C51单片机能直接认识和执行的机器指令有<span style="color: #5条,有<span style="color: #种寻址方式,即立即寻址、直接寻址、寄存器寻址、寄存器间接寻址、变址寻址、相对寻址和位寻址。
1. 直接寻址:
指令中直接给出参与操作的数据的地址,该地址一般用direct表示。
汇编指令:MOV A,direct
该指令的功能是将片内RAM地址direct单元中的内容(参与操作的数据)传送到累加器A中,双字节指令。
2. 立即寻址:
指令中直接给出参与操作的数据,称立即数,用data表示。在汇编语言中,为标明立即数,为data加前缀”#”。立即数可以是<span style="color: #位和<span style="color: #位二进制数,分别用#data和#data16表示。
汇编语言指令:MOV A,#data
该指令将立即数data传送到累加器A中,双字节指令。
3. 寄存器寻址:
参与操作的数据存放在寄存器中,汇编指令中直接以寄存器名来表示参与操作的数据地址,寄存器包括工作寄存器R0~R7、累加器A、AB、数据指针DPTR和位运算寄存器C。
汇编语言指令:MOV A,Rn=0~7
该指令将Rn中的内容传送到累加器A中,单字节指令。
4. 寄存器间接寻址:
寄存器间接寻址为二次寻址,第一次寻址得到寄存器的内容为(Ri)或(DPTR),第二次寻址是将第一次寻址得到的寄存器内容作为地址,并在其中存、取参与操作的数据。汇编语言中,寄存器前缀@是寄存器间接寻址的标志,有@Ri、@DPTR等。
汇编语言指令:MOV A,@Ri=0、<span style="color: #
该指令是将Ri中的内容作为地址,再将该地址中的内容传送到累加器A中,单字节指令。
5. 变址寻址:
间接寻址由两个寄存器提供。若由A、PC提供,在汇编语言指令中寻址地址表示为@A+PC;若由A和DPTR提供,在汇编语言指令中寻址地址为@A+DPTR。其中,PC或DPTR被称为基址寄存器,A被称为变址寄存器,基址与变址相加为<span style="color: #位无符号加法。若变址寄存器A中内容加基址寄存器DPTR(或PC)中内容时,低<span style="color: #位有进位,则该进位直接加到高位,不影响进位标志。因变址寻址指令多用于查表,故常称为查表指令。
汇编语言指令:MOVC A,@A+DPTR
该指令将DPTR中的内容加上A中的内容作为地址,再将该地址中的内容传送到累加器A中,单字节指令。
6. 相对寻址:
相对寻址是以相对寻址指令的下一条指令的程序计数器PC的内容为基值,加上指令机器代码中的“相对地址”,形成新的PC值(要转移的指令地址)的寻址方式。指令机器代码中“相对地址”指的是用一个带符号的<span style="color: #位二进制补码表示的偏移字节数,其取值范围为-128~+127,负数表示向后转移,正数表示向前转移。
若(PC)表示该指令在ROM中的首地址,该指令字节数为<span style="color: #,执行时分两步操作:(PC)←(PC)+2,(PC)←(PC)+相对地址。第一步完成后,PC中的值为该指令的下一条指令的首地址;第二步完成后,PC中的内容(PC)为转移的目标地址。所以,转移的目标地址范围是该相对寻址指令的下一条指令首址加上-128~—+127字节的地址。
汇编语言指令:SJMP rel
汇编语言相对寻址指令中的”rel”往往是一个标号地址,表示ROM中某转移目标地址。汇编软件对该汇编语言指令进行汇编时,自动算出“相对地址”并填入机器代码中,应将”rel”理解为“带有相对意义的转移目标地址”。
Rel=(PC)+相对寻址指令字节数+相对地址
其中,(PC)为该指令所在ROM中的首地址。
7. 位寻址:
参与操作的数据为“位”,而不是字节,是对片内数据存储器RAM和SFR中可位寻址单元的位进行操作的寻址方式。
汇编语言指令:ANL C,bit
该指令将bit(位地址)中的内容(<span style="color: #或<span style="color: #)与C中的内容进行与操作,再将结果传送到PSW中的进位标志C中。
什么是时钟周期?机器周期?指令周期?它们之间的关系?
答:1、时钟周期又叫做振荡周期;单片机内部时钟电路产生(或外部时钟电路送入)的信号周期,单片机的时序信号是以时钟周期信号为基础而形成的,在它的基础上形成了机器周期、指令周期和各种时序信号。定义为时钟脉冲的倒数(可以这样理解:时钟周期就是单片机外接晶振的倒数,例如:12M的晶振,它的时钟周期就是1/12us),是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。
2、计算机中,为了便于管理,常把一条指令的执行过程划分为若干个阶段,每一个阶段完成一项工作。例如:取指令、存储器读、存储器写等,这每一项工作称为一个基本操作。完成一项基本操作所需要的时间成为机器周期。一般情况,一个机器周期由若干个S周期(状态周期)组成。机器周期是单片机的基本操作周期,每个机器周期包含S1、S2、……S6这6个状态,每个状态包含两拍P1和P2,每个拍为一个时钟周期(振荡周期)。因此,一个机器周期包含12个时钟周期。依次可表示为S1P1、S1P2、S2P1、S2P2……、S6P1、S6P2。
3、指令周期:计算机从取一条指令开始,到执行完该指令所需要的时间称为指令周期。不同的指令,指令长度不同,指令周期也不一样。但指令周期以机器周期为单位,指令不同,所需的机器指令也不同。
51单片机指令根据指令长度与执行周期分为:
1) 单字节单周期指令
2) 单字节双周期指令
3) 双字节单周期指令
4) 双字节双周期指令
5) 三字节双周期指令
6) 一字节四周期指令
总结:时钟周期是最小单位,机器周期需要1个或者多个时钟周期,指令周期需要1个或者多个机器周期;机器周期是指完成一个基本操作的时间。指令周期是CPU的关键指标,指取出并执行一条指令的时间。一般以机器周期为单位,分单指令执行周期、双指令执行周期等。机器周期是完成一个基本操作的时间单元。时钟周期是CPU的晶振的工作频率的倒数。
单片机有哪些接口,各模块有哪些特性及应用环境?
答:接口电路——用于衔接外设与总线,实现存储空间扩展、I/O口线扩展、类型转换(电平转换、串并转换、A/D转换)、功能模块、通信扩展、总线扩展等。
外围设备——工作设备,连接在接口电路上,主要有输出设备和输入设备。
看门狗相关问题:
看门狗的原理?
答:工作原理:在系统运行以后就启动看门狗计数器,此时看门狗就开始自动计时,如果达到一定的时间还不去给它进行清零,看门狗计数器就会溢出从而引起看门狗中断,造成系统的复位。
为什么会溢出呢?
&&&因为看门狗是一个计数器,而计数器位数有限。能够装的数值也就有限(比如8位的最多装256个数,16位的最多装65536个数),从开启看门狗那刻起,它就开始不停的数机器周期,数一个机器周期就计数器加1,加到计数器盛不下了(这就是溢出)就产生一个复位信号,重启系统。
看门狗分为软件看门狗和硬件看门狗,在什么情况下软件看门狗失效?
答:硬件看门狗是利用一个定时器电路,其定时输出连接到电路的复位端,程序在一定时间范围内对定时器清零,因此程序正常工作时,定时器总不能溢出,也就不能产生复位信号。如果程序出现故障,不在定时周期内复位看门狗,就使得看门狗定时器溢出产生复位信号并重启系统。
&&& 软件看门狗原理上一样,只是将硬件电路上的定时器用处理器的内部定时器代替,这样可以简化硬件电路设计,但是在可靠性方面不如硬件定时器。
1、系统内部定时器自身发生故障看门狗就会失效(当然可以通过双定时器相互监视,成本高);
2、中断系统故障导致定时器中断失效。
3、整个程序死机。主程序出现异常。
什么时候喂狗?怎么喂狗?喂狗的注意事项?
答:在实际的单片机应用系统中,到底选用哪种型号的看门狗,采用何种喂狗方式和看门狗连接方式以及在编程中喂狗命令应该放在程序中什么位置,这要根据现场干扰源的特点、已采用的干扰措施、单片机硬件资源和软件结构特点以及对单片机系统的可靠性等具体情况而定。
看门狗一般应用到程序的那些位置?
答: 一些重要的程序,必须让它一直跑着;而且还要时时关心它的状态——不能让它出现死锁现象。(当然,如果一个主程序会出现死锁,肯定是设计或者编程上的失误。首要做的事是Debug。)但如果时间紧迫可以用软件看门狗,暂时应急。
喂狗命令放置位置:
定时中断服务子程序中;
复位相关问题:
复位时单片机有什么动作?
答:主要做的就是初始化每个寄存器,包括最重要的PC指针,不包括RAM,然后单片机从复位地址开始执行程序。
必须使RST引脚(9)加上持续两个机器周期(即24个振荡周期)的高电平。单片机就执行复位操作。如果RST持续为高电平,单片机就处于循环复位状态。
单片机有哪些复位源,什么情况下会导致各个复位源
TM4C123GH6PM微控制器有6个复位源:
(1)上电复位(POR);
(2)外部复位输入引脚有效(RST);
(3)掉电检测可以用于由以下任一事件引起:①& 低于BOR0,触发值是BOR0的&最高电压值;②& 低于BOR1,触发值是BOR1的最高& 电压值。
(4)软件启动复位(利用软件复位寄存器);
(5)违反看门狗复位条件;
(6)MOSC故障。
STM8S共有9个复位源:
NRST引脚产生的外部复位
上电复位(POR)
掉电复位(BOR)
独立看门狗复位
窗口看门狗复位
非法操作码复位
EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位
所有的复位源最终都作用于NRST管脚,并在复位过程中保持低电平。复位入口向量在内存映射中位于固定的地址6000h。&
复位的两种启动方式?
答:1、上电复位:要求接通电源后,自动实现复位操作。
&&& 2、按钮复位:要求接通电源后,单片机自动复位,并且在单片机运行期间,使用开关也可以实现复位。
复位存在哪些问题?
答:采用上电复位:复位信号上电过程中有掉电现象,可能会造成逻辑方面的错误导致相关芯片复位时间不够、二次复位等、从而不能够正常工作起来。原因:产生的复位信号给了几个芯片用,导致这个复位信号的负载压力比较大,驱动能力不够从而往下调电,此现象常常出现在RC复位上。
复位信号上电前有毛刺与复位信号上电时有毛刺,可能会造成逻辑方面的错误导致相关芯片复位时间不够。方案:加大上拉电阻的阻值。
复位电路有哪些?那种比较好?
答:单片机复位电路主要有四种类型:
(1)微分型复位电路:
(2)积分型复位电路:
(3)比较器型复位电路:
比较器型复位电路的基本原理。上电复位时,由于组成了一个RC低通网络,所以比较器的正相输入端的电压比负相端输入电压延迟一定时间.而比较器的负相端网络的时间常数远远小于正相端RC网络的时间常数,因此在正端电压还没有超过负端电压时,比较器输出低电平,经反相器后产生高电平.复位脉冲的宽度主要取决于正常电压上升的速度.由于负端电压放电回路时间常数较大,因此对电源电压的波动不敏感.但是容易产生以下二种不利现象:
1)电源二次开关间隔太短时,复位不可靠:
2)当电源电压中有浪涌现象时,可能在浪涌消失后不能产生复位脉冲。
为此,将改进比较器重定电路,可以利用数字逻辑的方法和比较器配合,设计的比较器重定电路。此电路稍加改进即可作为上电复位和看门狗复位电路共同复位的电路,大大提高了复位的可靠性。
(4)看门狗型复位电路.
看门狗型复位电路主要利用CPU正常工作时,定时复位计数器,使得计数器的值不超过某一设定的值;当CPU不能正常工作时,由于计数器不能被复位,因此其计数会超过某一值,从而产生复位脉冲,使得CPU恢复正常工作状态。此复位电路的可靠性主要取决于软件设计,即将定时向复位电路发出脉冲的程序放在何处是最优的设计。一般设计,将此段程序放在定时器中断服务子程序中。然而,有时这种设计仍然会引起程序走飞或工作不正常。原因主要是:当程序"走飞"发生时,定时器初始化以及开中断之后的话,这种"走飞"情况就有可能不能由Watchdog复位电路校正回来.因为定时器中断一真在产生,即使程序不正常,Watchdog也能被正常复位.为此提出定时器加预设的设计方法.即在初始化时压入堆栈一个地址,在此地址内执行的是一条关中断和一条死循环语句.在所有不被程序代码占用的地址尽可能地用子程序返回指令RET代替.这样,当程序走飞后,其进入陷阱的可能性将大大增加.而一旦进入陷阱,定时器停止工作并且关闭中断,从而使Watchdog复位电路会产生一个复位脉冲将CPU复位.当然这种技术用于实时性较强的控制或处理软件中有一定的困难。
由此可见,四种复位电路中,看门狗型复位电路较其他三中复位电路更加适合。
堆栈相关问题:
堆栈的原理?过程怎么操作?
答:单片机RAM中,常常会指定一个专门的区域来存放某些特别的数据,它遵循先进后出、后进先出的原则。这个RAM区就是堆栈。堆栈是一种数据结构(数据项按序排列:堆,顺序随意。栈,后进先出)。使用一个称作堆栈指针的专用寄存器指示前的操作位置,堆栈指针总是指向栈顶。
&&& 操作过程:
1) 堆栈的建立(初始化)
2) 参数入栈(push)
3) 参数出栈(pop)(后进先出)
堆栈应用在什么地方?存在什么问题?怎么解决?
答:在80C51单片机中,堆栈在子程序调用和中断时会把断点地址自动进栈和出栈。进栈和出栈的指令(PUSH、POP)操作可用于保护现场和恢复现场。由于子程序调用和中断都允许嵌套,并可以多级嵌套,而现场的保护也往往使用堆栈,所以一定要注意给堆栈以一定的深度,以免造成堆栈内容的破坏而引起程序执行的“跑飞”。
堆栈指针SP在80C51中存放当前的堆栈栈顶所指存储单元地址的一个8位寄存器。80C51单片机的堆栈是向上生成的,即进栈时SP的内容是增加的;出栈时SP的内容是减少的。
系统复位后。80C51的SP内容为07H。若不重新定义,则以07H为栈底,压栈的内容从08H单元开始存放。但工作寄存器R0~R7有4组,占有内部RAM地址为00H~1FH,位寻址区占有内部RAM地址为20H~2FH。若程序中使用了工作寄存器1~3组或位寻址区,则必须通过软件对SP的内容重新定义,使堆栈区设定在片内数据RAM区中的某一区域内(如30H),堆栈深度不能超过片内RAM空间。
学习堆栈的作用?
答:在片内RAM中,常常要指定一个专门的区域来存放某些特别的数据,它遵循顺序存取和后进先出(LIFO/FILO)的原则,这个RAM区叫堆栈。
1.子程序调用和中断服务时CPU自动将当前PC值压栈保存,返回时自动将PC值弹栈。
2.保护现场/恢复现场
3.数据传输
也就是说,堆栈是进入中断的时候用到的,单片机一旦遇到中断请求,就会去处理中断,处理完后再回来处理主程序,这样就涉及到了一个问题,单片机要保存中断之前的信息,以便处理完后能够回到主程序中,单片机会在响应中断前,把单片机现在的指针地址(也就是处理完要返回的地址),以及一些必要的数据压入堆栈(没有这些数据,单片机处理完中断后就无法确定主程序的状态)。
中断相关问题:
中断的响应过程?优先级?
答:1、响应过程:
1)根据响应的中断源的中断优先级,使相应的优先级状态触发器置1;
2) 执行硬件中断服务子程序调用,并把当前程序计数器PC的内容压入堆栈,保护断点,寻找中断源。
3) 清除相应的中断请求标志位(串行口中断请求标志RI和TI除外);
4) 把被响应的中断源所对应的中断服务程序的入口地址(中断矢量)送入PC,从而转入相应的中断服务程序。
5) 中断返回,程序返回断点处进行执行。
2、优先级:中断的优先级有两个:查询优先级与执行优先级
查询优先级:查询优先级是不可以更改和设置的
1)系统默认的优先级(逻辑上):
外部中断0 & 定时器中断0 & 外部中断1 & 定时器中断1 & 串行中断
2)由IP寄存器来决定优先级。当IP对应位置为1时,该中断级别提高。同为1是按默认级别
中断嵌套的好处与坏处?
答:中断嵌套:CPU在处理级别较低的中断过程中,出现了级别较高的中断请求。CPU停止执行低级别中断,执行高级别的中断处理程序后,再接着执行低级别的未被处理完的中断程序。
使用中断嵌套可以使高优先级别的中断得到及时的响应和处理。
1) CPU与外部设备并行工作
2) 能够处理例外事件
3) 实现实时处理
4) 实现人机联系
5) 实现用户程序与操作系统的联系
6) 实现多道程序并行执行
7) 在多处理机系统中,实现处理机之间的联系
坏处:高级别的中断一直持续的话会影响低级别中断的处理。
中断向量表的理解
答:中断源的识别标志,可用来形成相应的中断服务程序的入口地址或存放中断服务程序的首地址称为中断向量。把所有的中断向量集中起来,按中断类型号从小到大的顺序存放到存储器的某一区域内,这个存放中断向量的存储区叫做中断向量表,即中断服务程序入口地址表。
中断在单片机中起到什么作用?
答:中断能实现快速的CPU与慢速的外设同步工作,实现数据传送、故障检测与处理、人机联系、多机系统、多道程序分时操作、实时信息处理等。
什么是临界段,哪些情况下会存在临界段的问题,如何进行临界段保护。
答:1.临界段代码,也叫临界区,是指那些必须完整连续运行,不可被打断的代码段。
2. ①读取或者修改变量(特别是用于任务间通信的全局变量)的代码,一般来说这是最常见的临界代码。
②调用公共函数的代码,特别是不可重入的函数,如果多个任务都访问这个函数,结果是可想而知的。总之,对于临界段要做到执行时间越短越好,否则会影响系统的实时性。
3.中断处理程序和任务都会访问的临界段代码,需要使用关中断的方法加以保护;仅由任务访问的临界段代码,可以通过给调度器上锁的方法来保护。
什么是可重入型函数,使用时需要注意哪些问题
答:可重入函数
不为连续的调用持有静态数据。
不返回指向静态数据的指针;所有数据都由函数的调用者提供。
使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。
如果必须访问全局变量,记住利用互斥信号量来保护全局变量。
绝不调用任何不可重入函数。
注意事项:
1 :编写可重入函数时,应注意局部变量的使用(如编写C/C++ 语言的可重入函数时,应使用auto 即缺省态局部变量或寄存器变量)
说明:编写C/C++语言的可重入函数时,不应使用static局部变量,否则必须经过特殊处理,才能使函数具有可重入性。
2 :编写可重入函数时,若使用全局变量,则应通过关中断、信号量(即P 、V 操作)等手段对其加以保护
说明:若对所使用的全局变量不加以保护,则此函数就不具有可重入性,即当多个进程调用此函数时,很有可能使有关全局变量变为不可知状态。
专用词汇解释:
VCC:C=circuit 表示电路的意思, 即接入电路的电压;
VDD:D=device 表示器件的意思, 即器件&& 内部的工作电压;
对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc&Vdd),VSS是接地点;有些IC既有VDD引脚又有VCC引脚,说明这种器件自身带有电压转换功能。
VEE:发射极电源电压, Emitter Voltage, 一般用于 ECL 电路的负电源电压.
VSS:S=series 表示公共连接的意思,通常是指电路公共接地端电压。
VPP:不同芯片对Vpp的定义稍有不同,比如电压峰峰值,单片机中Vpp多数定义为编程电压
在场效应管(或COMS器件)中,VDD为漏极,VSS为源极,VDD和VSS指的是元件引脚,而不表示供电电压。一般来说VCC=模拟电源,VDD=数字电源,VSS=数字地,VEE=负电源
阅读(...) 评论()

我要回帖

更多关于 单片机程序 的文章

 

随机推荐