51单片机,郭天祥,第三章,PDF,Word

51单片机,郭天祥,第三章,PDF,Word
51单片机,郭天祥,第三章,PDF,Word

3.4中断概念

中断是为使单片机具有对外部或内部随机发生的事件实时处理而设置的,中断功能的存在,很大程度上提高了单片机处理外部或内部事件的能力。它也是单片机最重要的功能之一, 是我们学习单片机必须要掌握的。很多初学者被困在中断中,学了很久仍然不知道中断究竟是个什么东西,大家千万不要认为它有多难,其实只要掌握正确的学习方法,没有哪个知识点是学不会的。

51单片机内部一共有5个中断源,也就是说,有5种情况发生时,会使单片机去处理中断程序。在本章我们只讲解其中的一种中断情况——定时器中断,只要大家从理论和实践中真正明白了中断的概念,其他几种情况便能轻松掌握。

为了能让大家更容易理解中断概念,我们先来举一个生活事例:你打开火,烧上一壶水, 然后去洗衣服,在洗衣服的过程中,突然听到水壶发出水开的报警声,这时,你停止洗衣服动作,立即去关掉火,然后将开水灌入暖水瓶中,灌完开水后,你又回去继续洗衣服。这个过程中实际上就发生了一次中断,其流程图如图3.4.1所示。

对于单片机来讲,中断是指CPU在处理某一事件A时,发生了另一事件B,请求CPU 迅速去处理(中断发生);CPU暂时停止当前的工作(中断响应),转去处理事件B (中断服务);待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A (中断返回),这一过程称为中断,其流程图如图3.4.2所示。

再回来看前面讲的生活事例,与单片机中断结合分析,你的主任务是洗衣服,水开报警这是一个中断请求,这一时刻相当于断点处,你响应中断去关火,然后将开水灌入暖水瓶中,这一动作实际上就是处理中断程序,灌完开水后再回去继续洗衣服,相当于处理完中断程序后再返回主程序继续执行主程序。这里需要注意的是,水开是随时都有可能的,但是无论什么时候开,只要一开你将立即去处理它,处理完后再回来继续接着洗刚才那件衣服。单片机在执行程序时,中断也随时有可能发生,但无论何时发生,只要一旦发生,单片机将立即暂停当前程序,赶去处理中断程序,处理完中断程序后再返回刚才暂停处接着执行原来的程序。单片机在执行程序时其程序流程图如图3.4.3所示。

引起CPU中断的根源,称为中断源,中断源向CPU提出中断请求,CPU暂时中断原来的事务A,转去处理事件B,对事件B处理完毕后,再回到原来被中断的地方(即断点),称为中断返回。实现上述中断功能的部件称为中断系统(中断机构)。

中断的开启与关闭、设置启用哪一个中断等都是由单片机内部的一些特殊功能寄存器来决定的,在以前的学习中我们仅对单片机内部的特殊功能寄存器I/O 口寄存器设置过,从下节起我们将会设置单片机内部更多的特殊功能寄存器。

与中断有关的知识点还有一个叫中断嵌套,意思是说:如果单片机正在处理一个中断程序,此时,又有另一个中断现象发生,单片机将会停止当前的中断程序,而转去执行新的中断程序,新中断程序处理完毕后再回到刚才停止的中断程序处继续执行,执行完这个中断后再返回主程序继续执行主程序,流程图如图3.4.4所示。

联系前面的生活事例,如果你在往暖水瓶中灌开水的时候,突然你家的电话响起,此时,你将先停止灌开水,去接电话,接完电话后,再回去灌开水,灌完开水继续回去洗衣服。流程图如图3.4.5所不。

当涉及中断时,还有一个很重要的关键词——中断优先级。假如你在洗衣服的时候,突然水开了,同时电话也响起了,接下来你只能去处理一件事,那你该处理哪件事呢?你将会根据自己的实际情况来选择其中一件更重要的事先处理,在这里,你认为更重要的事就是优生级较高的事情。单片机在执行程序时同样也会遇到类似的状况,即同一时刻发生了两个中断,那么单片机该先执行哪个中断呢?这取决于单片机内部的一个特殊功能寄存器————中断优先级寄存器的设置情况,通过设置中断优先级寄存器,我们可以告诉单片机,当两个中断同时出现时先执行哪个中断程序。若没有人为操作优先级寄存器,单片机会按照默认的一套优先级自动处理,我们在具体使用时详细讲解。

52单片机一共有6个中断源,它们的符号、名称及产生的条件分别解释如下:

INTO—外部中断0,由P3.2端口线引入,低电平或下降沿引起。

INT1—外部中断1,由P3.3端口线引入,低电平或下降沿引起。

Th定时器/计数器0中断,由T0计数器计满回零引起。

T1 一定时器/计数器1中断,由T1计数器计满回零引起。

T2—定时器/计数器2中断,由T2计数器计满回零引起。

TI / RI—串行口中断,串行端口完成一帧字符发送/接收后引起。

以上6个中断源中,T2是52单片机特有的。它们默认的中断级别如表3.4.1所示。

单片机在使用中断功能时,通常需要设置两个与中断有关的寄存器:中断允许寄存器IE 和中断优先级寄存器IP。

知识点:.中断允许寄存器IE

中断允许寄存器用来设定各个中断源的打开和关闭,IE在特殊功能寄存器中,字节地址为A8H,位地址(由低位到高位)分别是A8H?AFH,该寄存器可进行位寻址,即可对该寄存器的每一位进行单独操作。单片机复位时IE全部被清0,各位定义见表3.4.2。

EA一全局中断允许位。

EA= 1,打开全局中断控制,在此条件下,由各个中断控制位确定相应中断的打开或关闭。EA = 0,关闭全部中断。

--—无效位。

ET2—定时器/计数器2中断允许位。

ET2= 1,打开T2中断。

ET2 = 0,关闭T2中断。

ES—串行口中断允许位。

ES=1,打开串行口中断。

ES = 0,关闭串行口中断。

ET1 —定时器/计数器1中断允许位。

ET1 = 1,打开T1中断。

ET1 =0,关闭T1中断。

EX1—外部中断1中断允许位。

EX1 = 1,打开外部中断1中断。

EX1 =0,关闭外部中断1中断。

ET0—定时器/计数器0中断允许位。

ET0= 1,打开TO中断。

ET0 = 0,关闭T0中断。

EX0—外部中断0中断允许位。

EX0=1,打开外部中断0中断。

EX0 = 0,关闭外部中断0中断。

知识点:中断优先级寄存器IP

中断优先级寄存器在特殊功能寄存器中,字节地址为B8H,位地址(由低位到高位)分别是B8H?BFH, IP用来设定各个中断源属于两级中断中的哪一级。该寄存器可进行位寻址,即可对该寄存器的每一位进行单独操作。单片机复位时IP全部被清0,各位定义见表3.4.3。

--一无效位。

PS—串行口中断优先级控制位。

PS = 1,串行口中断定义为高优先级中断。

PS = 0,串行口中断定义为低优先级中断。

PT1—定时器/计数器1中断优先级控制位。

PT1 = 1,定时器/计数器1中断定义为高优先级中断。

PT1 =0,定时器/计数器1中断定义为低优先级中断。

PX1—外部中断1中断优先级控制位。

PX1 = 1,外部中断1定义为高优先级中断。

PX1 =0,外部中断1定义为低优先级中断。

PT0—定时器/计数器0中断优先级控制位。

PT0=1,定时器/计数器0中断定义为高优先级中断。

PT0-0,定时器/计数器0中断定义为低优先级中断。

PX0—外部中断0中断优先级控制位。

PX0 = 1,外部中断0定义为高优先级中断。

PX0 = 0,外部中断0定义为低/fc先级中断。

在51单片机系列中,高优先级中断能够打断低优先级中断以形成中断嵌套,同优先级中断之间,或低级对高级中断则不能形成中断嵌套。若几个同级中断同时向CPU请求中断响应,在没有设置中断优先级情况下,按照默认中断级别响应中断,在设置中断优先级后,则按设置顺序确定响应的先后顺序。

3.5单片机的定时器中断

我们先来了解一下单片机的定时器系统。51单片机内部共有两个16位可编程的定时器/ 计数器,即定时器T0和定时器T1。52单片机内部多一个T2定时器/计数器。它们既有定时功能又有计数功能,通过设置与它们相关的特殊功能寄存器可以选择启用定时功能或计数功能。需要注意的是,这个定时器系统是单片机内部一个独立的硬件部分,它与CPU和晶振通过内部某些控制线连接并相互作用,CPU—旦设置开启定时功能后,定时器便在晶振的作用下自动开始计时,当定时器的计数器计满后,会产生中断,即通知CPU该如何处理。结合生活事例,还是以烧开水为例,也就是说,当你打开火时,就注定不久就会响起水开的警报,这时你必定需要对该警报做出处理。烧开水是独立运行的一件事,但通过你打开火或者听到警报声来处理它。

定时器/计数器的实质是加1计数器(16位),由高8位和低8位两个寄存器组成。TMOD

是定时器/计数器的工作方式寄存器,确定工作方式和功能;TCON是控制寄存器,控制T0、T1的启动和停止及设置溢出标志。其结构框图如图3.5.1所示。

加1计数器输入的计数脉冲有两个来源,一个是由系统的时钟振荡器输出脉冲经12分频后送来;另一个是TO或T1引脚输入的外部脉冲源,每来一个脉冲计数器加1,当加到计数器为全1时,再输入一个脉冲就使计数器回零,且计数器的溢出使TCON寄存器中TF0或TF1 置1,向CPU发出中断请求(定时器/计数器中断允许时)。如果定时器/计数器工作于定时模式,则表示定时时间已到;如果工作于计数模式,则表示计数值已满。

由此可见,由溢出时计数器的值减去计数初值才是加1计数器的计数值。

设置为定时器模式时,加1计数器是对内部机器周期计数(1个机器周期等于12个振荡周期,即计数频率为晶振频率的1/12)。计数值N乘以机器周期Tey就是定时时间设置为计数器模式时,外部事件计数脉冲由TO或T1引脚输入到计数器。在每个机器周期的S5P2 (请查看10.5节图10.5.1介绍)期间釆样TO、T1引脚电平。当某周期釆样到一高电平输入,而下一周期又采样到一低电平时,则计数器加1,更新的计数值在下一个机器周期的S3P1期间装入计数器。由于检测一个从1?0的下降沿需要2个机器周期,因此要求被釆样的电平至少要维持一个机器周期。当晶振频率为12MHz时,最高计数频率不超过1/2MHZ,即计数脉冲的周期要大于2us。

单片机在使用定时器或计数器功能时,通常需要设置两个与定时器有关的寄存器:定时器/计数器工作方式寄存器TMOD与定时器/计数器控制寄存器TCON。

知识点:定时器/计数器工作方式寄存器TMOD

定时器/计数器工作方式寄存器在特殊功能寄存器中,字节地址为89H,不能位寻址,TMOD用来确定定时器的工作方式及功能选择。单片机复位时TMOD全部被清0。其各位的定义如表3.5.1。

由表3.5.1可知,TMOD的高4位用于设置定时器1,低4位用于设置定时器0,对应4 位的含义如下:

GA TE—门控制位。

GA TE=0,定时器/计数器启动与停止仅受TCON寄存器中TRX ( X=0, 1 )来控制。

GA TE=1,定时器/计数器启动与停止由TCON寄存器中TRX (X=0,1)和外部中断引脚(INTO 或INT1)上的电平状态来共同控制。

C/T 一定时器模式和计数器模式选择位。c/〒=l,为计数器模式;c/〒=o,为定时器模式。

M1M0-工作方式选择位。

每个定时器/计数器都有4种工作方式,它们由M1M0设定,对应关系如表3.5.2所示。

知识点:定时器/计数器控制寄存器TCON

定时器/计数器控制寄存器在特殊功能寄存器中,字节地址为88H,位地址(由低位到高位)分别是88H?8FH,该寄存器可进行位寻址。TCON寄存器用来控制定时器的启、停,标志定时器溢出和中断情况。单片机复位时TCON全部被清0。其各位定义如表3.5.3。其中,TFL TR1、TF0和TR0位用于定时器/计数器;正1、IT1、IE0和IT0位用于外部中断,在这里一并做介绍。

TF1 —定时器1溢出标志位。

当定时器1计满溢出时,由硬件使TF1置1,并且申请中断。进入中断服务程序后,由硬件自动清0。需要注意的是,如果使用定时器的中断,那么该位完全不用人为去操作,但是如果使用软件查询方式的话,当查询到该位置1后,就需要用软件清0。

TR1—定时器1运行控制位。

由软件清0关闭定时器1。当GA TE=1,且INTI为高电平时,TR1置1启动定时器1;

当GATE=0时,TR1置1启动定时器1。

TF0—定时器0溢出标志,其功能及操作方法同TF1。

TR0—定时器0运行控制位,其功能及操作方法同TR1。

IE1—外部中断1请求标志。

当IT1=0时,为电平触发方式,每个机器周期的S5P2采样INT1引脚,若INT1脚为低电平,则置1,否则IE1清0。

当IT1=1时,INT1为跳变沿触发方式,当第一个机器周期采样到INT1为低电平时,则IE1置1。IE1=1,表示外部中断1正在向CPU申请中断。当CPU响应中断,转向中断服务程序时,该位由硬件清0。

IT1—外部中断1触发方式选择位。

IT1=0,为电平触发方式,引脚INT1上低电平有效。

IT1 = 1,为跳变沿触发方式,引脚INT1上的电平从高到低的负跳变有效。

IE0—外部中断0请求标志,其功能及操作方法同IE1。

IT0—外部中断0触发方式选择位,其功能及操作方法同IT1。

从上面的知识点可知,每个定时器都有4种工作方式,可通过设置TMOD寄存器中的M1M0位来进行工作方式选择,在本节我们只讲了其中一个定时器的一种工作方式器0的工作方式1: 16位定时器。

方式1的计数位数是16位,对T0来说,由TL0寄存器作为低8位、TH0寄存器作为高8位,组成了16位加1计数器,其逻辑结构框图如图3.5.2所示

分析上面的逻辑图,当GA TE=0, TR0=1时,TL0便在机器周期的作用下开始加1计数, 当TL0计满后向TH0进一位,直到把TH0也计满,此时计数器溢出,置TF0为1,接着向CPU申请中断,接下来CPU进行中断处理。在这种情况下,只要TR0为1,那么计数就不会停止。这就是定时器0的工作方式1的工作过程,其他8位定时器、13位定时器的工作方式都大同小异。

接下来讲解如何计算定时器的初值问题。定时器一旦启动,它便在原来的数值上开始加1计数,若在程序开始时,我们没有设置TH0和TL0,它们的默认值都是0,假设时钟频率为12MHz, 12个时钟周期为一个机器周期,那么此时机器周期就是lps,计满TH0和TL0 就需要216-1个数,再来一个脉冲计数器溢出,随即向CPU申请中断。因此溢出一次共需65536us约等于65.5ms,如果我们要定时50ms的话,那么就需要先给TH0和TL0装一个初值,在这个初值的基础上计50000个数后,定时器溢出,此时刚好就是50ms中断一次,当需定时Is时,我们写程序时当产生20次50ms的定时器中断后便认为是1s,这样便可精确控

制定时时间了。要计50000个数时,TH0和TL0中应该装入的总数是65536-50000=15536, 把15536 对256 求模:15536/256=60 装入TH0 中,把15536 对256 求余:15536%256=176 装入TL0 中。

以上就是定时器初值的计算方法,总结后得出如下结论:当用定时器的方式1时,设机器周期为Tcy,定时器产生一次中断的时间为f,那么需要计数的个数N=t/Tcy装入THX和TLX 中的数分别为

THX=(65536-N)/256 ,TLX=(65536-N)%256

要计算机器周期Tey,就需要知道系统时钟频率,也就是单片机的晶振频率,TX-1C实验板上时钟频率为11.0592MHz,那么机器周期为12*(l/1059200)~1.09us,若f=50ms,那么N=50 000/1.09=45872,这是晶振在11.0592MHz下定时50ms时初值的计算方法,当晶振为12MHz 时,计算起来就比较方便了,用同样方法可算得N =50000。

知识点?.中断服务程序的写法

C51的中断函数格式如下:

void函数名()interrupt中断号using工作组

{

中断服务程序内容

}

中断函数不能返回任何值,所以最前面用void;后面紧跟函数名,名字可以随便起,但不要与C语言中的关键字相同;中断函数不带任何参数,所以函数名后面的小括号内为空;中断号是指单片机中几个中断源的序号,请查看3.4节讲解中断时的表3.4.1。这个序号是编译器识别不同中断的唯一符号,因此在写中断服务程序时务必要写正确;最后面的“using工作组”是指这个中断函数使用单片机内存中4组工作寄存器中的哪一组,C51编译器在编译程序时会自动分配工作组,因此最后这句话我们通常省略不写,但大家以后若遇到这样的程序代码时要知道是什么意思。一个简单中断服务程序写法如下:

void Tl_time() interrupt 3

{

TH1 =(65536-10000)/256;

TL1=(65536-10000)%256;

}

上面这个代码是一个定时器1的中断服务程序,定时器1的中断序号是3,因此我们要写成interrupt 3,服务程序的内容是给两个初值寄存器装入新值。

在写单片机的定时器程序时,在程序开始处需要对定时器及中断寄存器做初始化设置,通常定时器初始化过程如下:

①对TMOD赋值,以确定T0和T1的工作方式。

②计算初值,并将初值写入THO、TL0或TH1、TL1。

③中断方式时,则对IE赋值,开放中断。

④使TR0或TR1置位,启动定时器/计数器定时或计数。

下面我们通过两个实例来讲解定时器0和定时器1方式1的具体用法。

【例3.5.1】利用定时器0工作方式1,在TX-1C实验板上实现第一个发光管以Is亮灭闪烁。新建文件part2.1_4.c,程序代码如下:

#include //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

sbit led1=P1^0;

uchar num;

void main()

{

TMOD=0x01; //设置定时器0为工作方式1(M1M0为01)

TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872

TL0=(65536-45872)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

TR0=1; // 启动定时器0

while(1); //程序停止在这里等待中断中断发生

}

void T0_time() interrupt 1

{

TH0=(65536-45872)/256; //重装初值

TL0=(65536-45872)%256;

num++; //num每加1次判断一次是否到20次

if(num==20) //如果到了20次,说明1秒时间到

{

num=0; //然后把num清0重新再计20次

led1=~led1; //让发光管状态取反

}

}

编译程序下载到实验板,我们可以看到实验板上第一个发光管以Is间隔闪动。

分析:进入主程序后,首先是对定时器和中断有关的寄存器初始化,我们按照上面讲到的通常的初始化过程来操作。定时50ms的初值我们在前面已讲过为45872。启动定时器后主程序停止在while(l)处,这里通常有很多人会有疑问:程序都停止在这里了,那么这个中断程序何时执行呢?主程序既然停止了为什么发光管却在闪烁呢?解释如下:一旦开启定时器,定时器便开始计数,当计数溢出时,自动进入中断服务程序执行代码,执行完中断程序后再回到原来处继续执行,也就是继续等待。就相当于你一旦打开火烧上开水后,不

管你是洗衣服还是洗袜子,过一会儿水都会开,那么你就要停止当前活去处理开水问题,处理完后再回来继续洗你的衣服或是袜子。

为了确保定时器的每次中断都是50ms,我们需要在中断函数中每次为TH0和TL0重新

装入初值,因为每进入一次中断需要时间50ms,在中断程序中做一判断是否进入了20次,也就是判断时间是否到了ls,若时间到则执行相应动作。

注意:一般我们在中断服务程序中不要写过多的处理语句,因为如果语句过多,中断服务程序中的代码还未执行完毕,而下一次中断又来临,这样我们就会丢失这次中断,当单片机循环执行代码时,这种丢失累积出现,程序便完全乱套。一般我们遵循的原则是:能在主程序中完成的功能就不在中断函数中写,若非要在中断函数中实现功能,那么一定要高效、简洁。这样一来,例3.5.1中的20次判断我们就可写在主程序中,实现如下。

while(l);处改为

while( 1)

{

if(num==20) //如果到了20次,说明1秒时间到

{

num=0; //然后把num清0重新再计20次

ledl=?ledl; //让发光管状态取反

}

}

中断函数中改为

void T0-time() interrupt 1

{

TH0=(65535-45872)/256; //重装初值

TL0=(65535-45872)%256;

num++;

}

【例3.5.2】在TX-1C实验板上完成如下功能:用定时器0的方式1实现第一个发光管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。新建文件part2.1 一5x,程序代码如下:

#include //52系列单片机头文件

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6; //申明U1锁存器的锁存端

sbit wela=P2^7; //申明U2锁存器的锁存端

sbit led1=P1^0;

unchar code table[]={

0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71};

void delayms(uint);

void display(uchar,uchar);

uchar num,num1,num2,shi,ge;

void main()

{

TMOD=0x11; //设置定时器0为工作方式1(M1M0为11)TH0=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872 TL0=(65536-45872)%256;

TH1=(65536-45872)/256; //装初值11.0592M晶振定时50ms数为45872 TL1=(65536-45872)%256;

EA=1; //开总中断

ET0=1; //开定时器0中断

ET1=1; //开定时器1中断

TR0=1; // 启动定时器0

TR1=1; // 启动定时器1

while(1); //程序停止在这里等待中断中断发生

{

display(shi,ge);

}

}

void display(uchar shi,uchar ge) //显示子函数

{

dula=1;

P0=table[shi]; //送段选数据

dula=0;

P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时

wela=1; //原来段选数据通过位选锁存器造成混乱

P0=0xfe; //送位选数据

wela=0;

delayms(5); //延时

dula=1;

P0=table[ge];//送段选数据

dula=0;

P0=0xff; //送位选数据前关闭所有显示,防止打开位选锁存时

wela=1; //原来段选数据通过位选锁存器造成混乱

P0=0xfd; //送位选数据

wela=0;

delayms(5); //延时

}

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--) //i=xms即延时约xms毫秒

for(j=110;j>0;j--);

}

void T0_time() interrupt 1

{

TH0=(65536-45872)/256; //重装初值

TL0=(65536-45872)%256;

num++;

if(num1==4) //如果到了4次,说明200ms时间到

{

num1=0; //然后把num1清0重新再计4次

led1=~led1; //让发光管状态取反

}

}

void T1_time() interrupt 3

{

TH1=(65536-45872)/256; //重装初值

TL1=(65536-45872)%256;

num2++;

if(num2==20) //如果到了20次,说明1秒刷新时间到

{

num2=0; //然后把num2清0重新再计4次

num++;

if(num==60) //这个数用来送数码管显示,到60后归0 num=0;

shi=num/10; //把一个2位数分离后分别送数码管显示

ge=num%10; //十位和个位

}

}

编译后下载,实验现象如题目所述。实际效果图如图3.5.3所示。

分析:例3.5.2中用了两个中断函数,单片机在区分进入哪个中断服务程序时是靠interrupt 后面的序号来决定的,两个定时器各自产生中断时都会有各自的中断服务程序。另外,主程序初始化定时器和中断寄存器后便进入数码管动态扫描大循环中不停地显示数码管,因为数

码管是动态显示,所以不能停止扫描程序,同时也是在等定时器中断的到来。

这里需要注意两点:

在例3.5.2中我们不能把判断发光管亮灭时间是否到达的语句写在主程序中,若写在主程序中,有可能有会发生如下错误情况:当主程序运行在数码管显示语句当中时,此时恰好定时器0进入中断并且numl刚好也加到4,当定时器0中断再次进入时,主程序仍未退出数码管显示语句,那么此时numl的值便成了5,这样的话,numl=4这个点便永远检测不到了,因此发光管的闪烁便失去了控制,虽然本例中这种情况不会发生,因为数码管显示语句的执行总时间约为10多ms,小于定时器0中断一次的时间。但写程序搞研究一定要严格,绝对不能抱侥幸心理,若要这种情况发生,大家可自行测试,将显示数码管代码里的delayms(5) 延长至delayms(30),或缩短定时器0中断一次的时间。

在这里我们把数码管的显示部分写成了一个带参数的函数,两个参数分别为要显示的十位数和个位数,以后我们操作数码管时都可以写成类似这样的带参数函数,调用起来会非常方便。在定时器1的中断服务程序中,最后面有两条语句:

shi=num/10; //求模运算,也就是求出num中有多少个整数倍10

ge=num%10; //求余运算,也就是求出num中除去整数倍10的后的余数

这两句的作用是把一个两位数分离成两个一位数,因为数码管在显示的时候只能是一位一位的显示,不可能在一个数码管上同时显示两位数,因此这个操作是必须的,如果我们要把一个3位数分离成3个两位数,同样可用这样的方法:

Bai=num/100;

Shi=num% 100/10;

Ge=num%10;

大家可自己用笔算一算,再多写几个这样的程序下载到实验板观察效果,唯有多练习、多实践才是学好单片机的唯一捷径。

C51单片机和电脑串口通信电路图

C51单片机和电脑串口通信电路图与源码 51单片机有一个全双工的串行通讯口,所以单片机和电脑之间可以方便地进行串口通讯。进行串行通讯时要满足一定的条件,比如电脑的串口是RS232电平的,而单片机的串口是TTL电平的,两者之间必须有一个电平转换电路,我们采用了专用芯片MAX232进行转换,虽然也可以用几个三极管进行模拟转换,但是还是用专用芯片更简单可靠。我们采用了三线制连接串口,也就是说和电脑的9针串口只连接其中的3根线:第5脚的GND、第2脚的RXD、第3脚的TXD。这是最简单的连接方法,但是对我们来说已经足够使用了,电路如下图所示,MAX232的第10脚和单片机的11脚连接,第9脚和单片机的10脚连接,第15脚和单片机的20脚连接。 串口通讯的硬件电路如上图所示 在制作电路前我们先来看看要用的MAX232,这里我们不去具体讨论它,只要知道它是TTL和RS232电平相互转换的芯片和基本的引脚接线功能就行了。通常我会用两个小功率晶体管加少量的电路去替换MAX232,可以省一点,效果也不错,下图就是MAX232的基本接线图。

按图7-3加上MAX232就可以了。这大热天的拿烙铁焊焊,还真的是热气迫人来呀:P串口座用DB9的母头,这样就可以用买来的PC串口延长线进行和电脑相连接,也可以直接接到电脑com口上。

为了能够在电脑端看到单片机发出的数据,我们必须借助一个WINDOWS软件进行观察,这里我们利用一个免费的电脑串口调试软件。本串口软件在本网站https://www.360docs.net/doc/d510004746.html,可以找到 软件界面如上图,我们先要设置一下串口通讯的参数,将波特率调整为4800,勾选十六进制显示。串口选择为COM1,当然将网站提供的51单片机实验板的串口也要和电脑的COM1连接,将烧写有以下程序的单片机插入单片机实验板的万能插座中,并接通51单片机实验板的电源。

单片机原理与运用_第三章答案

第三章单片机的汇编语言与程序设计习题 1.设内部RAM中59H单元的内容为50H,写出当执行下列程序段后寄存器A,R0和内部RAM中50H,51H单元的内容为何值? MOV A,59H MOV R0,A MOV A,#00H MOV @R0,A MOV A,#25H MOV 51H,A MOV 52H,#70H 解:MOV A,59H ;A=50H MOV R0,A ;RO=50H MOV A,#00H ;A=00H MOV @R0,A ;50H=00H MOV A,#25H ;A=25H MOV 51H,A ;51H=25H MOV 52H,#70H ;52H=70H

所以:A=25H R0=50H ;50H=00H 51H=25H 2.请选用合适的指令对P0口内容做修改(例如使P0.0~P0.3不变,P0.4~P0.7为0)。 解:MOV A,P0 ANL A,0fh Mov P0,A 3.试问外部数据存储器和程序存储器可以用哪些指令来实现?举例说明。解:访问外部数据存储器指令有: MOVX @DPTR,A MOVX DPTR,#0100H MOV @DPTR,A MOVX A,@DPTR MOVX DPTR,#0200H MOV A,@DPTR MOVX A,@Ri MOVX A,@R0 MOVX @Ri,A MOVX @RI,A 访问程序存储器指令有: MOVX A,@A+PC

MOVX A,@A+DPTR 4.设堆栈指针SP中的内容为60H,内部RAM中30H和31H单元的内容分别为24H和10H,执行下列程序段后,61H,62H,30H,31H,DPTR及SP中的内容将有何变化? PUSH 30H PUSH 31H POP DPL POP DPH MOV 30H,#00H MOV 31H,#0FFH 解:PUSH 30H ;61H=24H PUSH 31H ;62=10H SP=62H POP DPL ;DPL=10H POP DPH ;DPH=24H SP=60H MOV 30H,#00H ;30H=00H MOV 31H,#0FFH ;31H=0FFH

郭天祥资料大全

研究生郭天祥放弃15万年薪回校自主创业 编者按: 国家统计局哈尔滨调查队最新调查数据显示,目前哈市大学生毕业去向中,自主创业者仅占调查人数的8.7%,这个比率在五个去向中是非常低的。今年高校毕业生就业形势严峻,国家有关部门大力提倡大学生自主创业,并出台了很多优惠、扶持政策。为了鼓励和支持大学生自主创业,从今天开始,本报推出“创业难贵在坚持”系列新闻故事,在为那些正在创业路上艰难行走的青年学子提供鼓励和支持的同时,也期盼有关部门能对创业学子所遇到的困难给与必要的重视和尽可能的帮助。 在读大学本科和研究生的6年中,郭天祥在学校的创新实验室足足待了4年。 今年,即将从哈尔滨工程大学硕士研究生毕业的郭天祥和该校的7名本科生、研究生共同组建了一家公司。虽然公司刚刚起步,但是他们在行业中已小有名气,首年销售额预计会达到一个令人惊喜的数额。 实验室成了家 “2002年刚入校时,我就给自己设定了一个目标,将来一定要自己去创业。大二下学期,我突然感觉到:如果想在自己的专业领域进行创业,必须要先学会动手。所以,我就找到同学商量一起参加学校的电子设计竞赛。”郭天祥说。 在首次尝试中,他失败了。当时学校教电路基础课的付永庆教授被两个年轻人的求知热情感动了,将他们吸纳入创新实验室工作。这之后,实验室便成了郭天祥的另一个家。 “单片机相当于电子产品的大脑,如果这个核心控制器件失灵的话,那么家里的电冰箱、微波炉、电视、空调等电子产品恐怕都要变成废品了。”得悉这个信息之后,郭天祥将自己的研究方向定在了单片机上。 当时苦于没有硬件实验环境,身边又没有会的人可以请教,郭天祥只好上网查找资料自学。看见网上有卖单片机学习板的,他省下生活费狠心买了一块300多元的单片机学习板做练习用。“那时我每天就摆弄单片机,自己一个人摸索非常难懂的汇编语言。快放暑假时,终于做出来第一个单片机作品——一个电子钟。” 为寻找锻炼的机会,郭天祥每天早上起床后就拿着书去实验室,白天在实验室写程序、调电路,做各种硬件练习,晚上回来补充理论知识,模电、数电、高频一遍遍地重复看,几乎每天都要熬到第二天凌晨两点。这一年中,郭天祥陆续参加了国家及省级竞赛,也获得了不少奖项。 放弃15万年薪回校创业 2007年9月,郭天祥以实习生的身份到一家太阳能公司做硕士课题。实习期间,他经常与技术人员热烈讨论并交流,在一次次研发思路碰撞中,他们的产品创新思路也在一步步地改进完善。

单片机电路图详解

单片机:交通灯课程设计(一) 目录 摘要--------------------------------------------------------- 1 1.概述 -------------------------------------------------------- 2 2.硬件设计----------------------------------------------------- 3 2.1单片机及其外围--------------------------------------------3 2.1.1单片机的选择-----------------------------------------3 2.1.2单片机的特点及其应用范围----------------------------- 3 2.1.3存储器的扩展----------------------------------------- 4 2.1.4内存的扩展------------------------------------------- 6 2.1.5MCS-52的I/O接口扩展--------------------------------- 8 2.2电路部分--------------------------------------------------11 2.2.1元器件选用-------------------------------------------11 2.2.2电路完成功能-----------------------------------------13 3.软件设计------------------------------------------------------15 3.1软件概述-------------------------------------------------15 3.2汇编语言指令说明-----------------------------------------16 3.3定时/计数器的原理----------------------------------------16 3.3.1定时/计数器的概述-----------------------------------16 3.3.2 8255A片选及各端口地址-------------------------------18 3.3.3信号控制码------------------------------------------18 3.3.4工作方式寄存器--------------------------------------19 3.3.5定时/计数器初值及定时器T0的工作方式----------------20

单片机原理及应用第三章习题答案

习题三 1.在MCS-51单片机中,寻址方式有几种?其中对片内RAM 可以用哪几种寻址方式?对片外RAM可以用哪几种寻址方式? 答:寻址方式可分为数的寻址和指令寻址,数的寻址有:常数寻址(立即寻址)、寄存器数寻址(寄存器寻址)、存储器数寻址(直接寻址方式、寄存器间接寻址方式、变址寻址方式)和位寻址,指令的寻址有绝对寻址和相对寻址。片内RAM寻址有:寄存器寻址、直接寻址方式和寄存器间接寻址方式。片外RAM寻址有:寄存器间接寻址方式。2.在对片外RAM单元寻址中,用Ri间接寻址与用DPTR 间接寻址有什么区别? 答:片外数据存储器寻址中,用Ri间接寻址只能访问低端的256字节单元,而用DPTR作指针间接访问可访问整个64K字节。 3.在位处理中,位地址的表示方式有哪几种? 答:1.直接位地址(00H~0FFH)。例如:20H 2.字节地址带位号。例如:20H.3表示20H单元的3位。 3.特殊功能寄存器名带位号。例如:P0.1表示P0口的1位。 4.位符号地址。例如:TR0是定时/计数器T0的启动位。 4.写出完成下列操作的指令。 (1)R0的内容送到R1中。 MOV A,R0 MOV R1,A (2)片内RAM的20H单元内容送到片内RAM的40H单元中。 MOV 40H,20H (3)片内RAM的30H单元内容送到片外RAM的50H单元中。 MOV A,30H MOV R0,#50H MOVX @R0,A (4)片内RAM的50H单元内容送到片外RAM的3000H 单元中。 MOV A,50H MOV DPTR,#3000H MOVX @DPTR,A (5)片外RAM的2000H单元内容送到片内RAM的20H 单元中。 MOV DPTR,#2000H MOVX A,@DPTR MOV 20H,A (6)片外RAM的1000H单元内容送到片外RAM的4000H 单元中。 MOV DPTR,#1000H MOVX A,@DPTR MOV DPTR,#4000H MOV @DPTR,A (7)ROM的1000H单元内容送到片内RAM的50H单元中。 MOV A,#0 MOV DPTR,#1000H MOVC A,@A+DPTR MOV 50H,A (8)ROM的1000H单元内容送到片外RAM的1000H单元中。 MOV A,#0 MOV DPTR,#1000H MOVC A,@A+DPTR MOVX @DPTR,A 5.区分下列指令有什么不同? (1)MOV A,20H和MOV A,#20H 答:前者源操作数是直接寻址,后者源操作数立即寻址。 (2)MOV A,@R1和MOVX A,@R1 答:前者源操作数是访问片内数据存储器,后者源操作数访问片外数据存储器低256字节。 (3)MOV A,R1和MOV A,@R1 答:前者源操作数是寄存器寻址,后者源操作数寄存器间接寻址。 (4)MOVX A,@R1和MOVX A,@DPTR 答:前者源操作数是访问片外数据存储器低256字节,后者源操作数访问片外数据存储器整个64K字节。 (5)MOVX A,@DPTR和MOVC A,@A+DPTR 答:前者源操作数是访问片外数据存储器,后者源操作数访问程序数据存储器。 6.设片内RAM的(20H)=40H,(40H)=10H,(10H)=50H,(P1)=0CAH。分析下列指令执行后片内RAM的20H、40H、10H单元以及P1、P2中的内容。 MOV R0,#20H ;R0=20H MOV A,@R0 ;A=40H MOV R1,A ;R1=40H MOV A,@R1 ;A=10H MOV @R0,P1 ;(40H)=0CAH MOV P2,P1 ;P2=0CAH MOV 10H,A ;(10H)=10H 1

郭天祥新概念51单片机C语言教程例题

目录 例2.2.1编写程序,点亮第一个发光二极管(part2_1.c P27 ).............. - 4 -例2.5.1利用for语句延时特性,编写第一个发光二极管以间隔1S亮灭闪动的程序(part2_3.c P42) ......................................................................................... - 5 -例2.6.1编写程序使第一个发光二极管以间隔500ms亮灭闪动。(part2_4.c P48)................................................................................................................................... - 5 - 例2.7.1编写程序使第一个二极管以亮200ms、灭800ms的方式闪动。(part2_5.c P49) ........................................................................................................................... - 6 -例2.8.3利用C51自带库_crol_(),以间隔500ms,实现流水灯程序(part2_6.c P53) ........................................................................................................................ - 6 -例3.2.1编写程序使第一个数码管显示8(part2.1_.1c P59)..................... - 8 -例3.2.2让实验板上6个数码管同时点亮,依次显示0到F,时间间隔为0.5ms,循环下去。(part2.1_2.c P61) ............................................................................ - 8 -例3.3.1第一个数码管显示1,时间为0.5s,然后关闭它,立即让第二个数码 管显示2,时间为0.5s,在关闭它……一直到最后一个数码管显示6,时间同样为0.5s,关闭它之后再回来显示第一个数码管,一直循环下去。(part2.1_3.c P62)................................................................................................................................... - 9 -例3.5.1利用定时器0工作方式1,在实验板上实现第一个发光管以1s亮灭闪烁。(part2.1.4.c P74) ................................................................................... - 11 -例3.5.2用定时器0的方式1实现个第一发光二极管以200ms间隔闪烁,用定时器1的方式1实现数码管前两位59s循环计时。(part2.1_5.c P75)... - 12 -例4.1.1用数码管前两位显示一个十进制数,变化范围为00~59,开始时显示00,每按下S2键一次,数值加1;每按下S3键一次,数值减1;每按下S4键一次,数值归零;按下S5键一次,利用定时器功能使数值开始自动每秒加1,再次按下S5键,数值停止加1,保持显示原数。(part2.2_1.c P82) ......... - 14 -例4.2.1实验班上电时,数码管不显示,顺序按下矩阵键盘后,数码管上依次显示0~F,六个数码管同时静态显示即可。(part2.2_2.c P87)............... - 17 -例5.3.1用单片机控制ADC0804进行数模转换,当拧动实验板上A/D旁边的电位时,在数码管的前三位以十进制方式显示出A/D转换后的数字量(8位

单片机原理及应用第三章课后答案

第三章作业答案 2. MCS-51有(4)个8位并行I/O口,在作为通用I/O口使用时P0~P3是准双向口,所以由输出转输入时必须先写入(1)。 6. 设(TMOD)=0A5H,则定时器T0的状态是( 方式1计数),定时器T1的状态是( 方式2定时)。或 设(TMOD)=0A5H,则定时器T0的状态是( 软件控制的16位计数器),定时器T1的状态是(软硬件控制的可自动重装初值的8位定时器)。 27.请写出1 INT为低电平触发的中断系统初始化程序。 解: INT为低电平触发的中断系统初始化程序如下: 1 ORG 0000H LJMP MAIN ORG 0013H LJMP INTN1 ORG 0100H MAIN:MOV SP,#60H SETB EA SETB EX1;开1 INT中断 CLR PX1 ;令1 INT为低优先级 CLR IT1 ;令1 INT为电平触发 SJMP $ INTN1:…… RETI END 用MOV指令实现: MOV IE,#84H ANL IP,#0FBH(或ORL IP,#04H) ANL TCON,#0FBH 28.MCS-51单片机响应中断后,写出中断服务子程序的入口地址。 解:

36.使用一个定时器,如何通过软硬结合方法实现较长时间的定时? 解: 设定好定时器的定时时间,采用中断方式用软件进行溢出次数累计,从而得到较长的定时时间,定时时间=定时器的定时时间×软件累计的溢出次数。 37.利用定时器输出周期为2 ms的方波, 设单片机晶振频率为6 MHz。试编程实现之。 解: 选用定时器/计数器T0 作定时器,工作在方式1,输出为P1.0 引脚,2 ms 的方波可由1 ms的高低电平相间隔而成,因而只要每隔1 ms对P1.0 取反一次即可得到这个方波。初值的计算如下:T0=12/(6×106)= 2×10-6S TC=M-T/T0=216-1×10-3/2×10-6=65536-500=65036=FE0CH 当定时器/计数器采用方式0时,初值为: TC=M-T/T0=213-1×10-3/2×10-6=8192-500=7692=1E0CH, 则真正的16位计数初值为:1E0CH(高8位,低5位) 利用定时器/计数器时,必须用文字说明工作方式的设置,计算初值。 程序如下: ORG 0000H LJMP T0INT ;T0中断入口 START:MOV SP,#60H ;初始化程序 MOV TL0,#0CH ;T0赋初值 MOV TH0, MOV TMOD,#01H ;定时器/计数器0工作于方式1 SETB TR0 ;启动T0 SETB ET0 ;开T0中断 SETB EA ;开总允许中断 T0INT:PUSH ACC PUSH PSW MOV TL0, MOV TH0,#0FEH SETB TR0 ;启动T0 POP PSW POP ACC RETI END 当采用查询方式时: 兰色字部分应该为: LP1: JBC TF0, LP2

51单片机基础知识及期末复习

51单片机简答题部分(经典) 1、什么叫堆栈? 答:堆栈是在片内RAM中专门开辟出来的一个区域,数据的存取是以"后进先出"的结构方式处理的。实质上,堆栈就是一个按照"后进先出"原则组织的一段内存区域。 2、进位和溢出? 答:两数运算的结果若没有超出字长的表示范围,则由此产生的进位是自然进位;若两数的运算结果超出了字长的表示范围(即结果不合理),则称为溢出。 3、在单片机中,片内ROM的配置有几种形式?各有什么特点? 答:单片机片内程序存储器的配置形式主要有以下几种形式:(1)掩膜(Msak)ROM型单片机:内部具有工厂掩膜编程的ROM,ROM中的程序只能由单片机制造厂家用掩膜工艺固 化,用户不能修改ROM中的程序。掩膜ROM单片机适合于 大批量生产的产品。用户可委托芯片生产厂家采用掩膜方法 将程序制作在芯片的ROM。 (2)EPROM型单片机:内部具有紫外线可擦除电可编程的只读存储器,用户可以自行将程序写入到芯片内部的EPROM 中,也可以将EPROM中的信息全部擦除。擦去信息的芯片 还可以再次写入新的程序,允许反复改写。 (3)无ROM型单片机:内部没有程序存储器,它必须连接程序存储器才能组成完整的应用系统。 无ROM型单片机价格低廉,用户可根据程序的大小来选择外接 程序存储器的容量。这种单片机扩展灵活,但系统结构较复 杂。 (4)E2ROM型单片机:内部具有电可擦除叫可编程的程序存储器,使用更为方便。该类型目前比较常用 (5)OTP(One Time Programmable)ROM单片机:内部具有一次可编程的程序存储器,用户可以在编程器上将程序写入片内程 序存储器中,程序写入后不能再改写。这种芯片的价格也较 低。 4、什么是单片机的机器周期、状态周期、振荡周期和指令周期?它们之间是什么关系? 答:某条指令的执行周期由若干个机器周期(简称M周期)构成,一个机器周期包含6个状态周期(又称时钟周期,简称S周期),而一个状态周期又包含两个振荡周期(P1和P2,简称P周期)。也就是说,指令执行周期有长有短,但一个机器周期恒等于6个状态周期或12个振荡周

51单片机AD89电路设计程序+原理图

AD0809在51单片机中的应用 我们在做一个单片机系统时,常常会遇到这样那样的数据采集,在这些被采集的数据中,大部分可以通过我们的I/O口扩展接口电路直接得到,由于51单片机大部分不带AD转换器,所以模拟量的采集就必须靠A/D或V/F实现。下现我们就来了解一下AD0809与51单片机的接口及其程序设计。 1、AD0809的逻辑结构 ADC0809是8位逐次逼近型A/D转换器。它由一个8路模拟开关、一个地址锁存译码器、一个A/D转换器和一个三态输出锁存器组成(见图1)。多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用A/D转换器进行转换。三态输出锁器用于锁存A/D转换完的数字量,当OE端为高电平时,才可以从三态输出锁存器取走转换完的数据。

2、AD0809的工作原理 IN0-IN7:8条模拟量输入通道 ADC0809对输入模拟量要求:信号单极性,电压围是0-5V,若信号太小,必须进行放大;输入的模拟量在转换过程中应该保持不变,如若模拟量变化太快,则需在输入前增加采样保持电路。 地址输入和控制线:4条 ALE为地址锁存允许输入线,高电平有效。当ALE线为高电平时,地址锁存与译码器将A,B,C三条地址线的地址信号进行锁存,经译码后被选中的通道

的模拟量进转换器进行转换。A,B和C为地址输入线,用于选通IN0-IN7上的一路模拟量输入。通道选择表如下表所示。 C B A 选择的通道 0 0 0 IN0 0 0 1 IN1 0 1 0 IN2 0 1 1 IN3 1 0 0 IN4 1 0 1 IN5 1 1 0 IN6 1 1 1 IN7 数字量输出及控制线:11条 ST为转换启动信号。当ST上跳沿时,所有部寄存器清零;下跳沿时,开始进行A/D转换;在转换期间,ST应保持低电平。EOC为转换结束信号。当EOC为高电平时,表明转换结束;否则,表明正在进行A/D转换。OE为输出允许信号,用于控制三条输出锁存器向单片机输出转换得到的数据。OE=1,输出转换得到的数据;OE=0,输出数据线呈高阻状态。D7-D0为数字量输出线。 CLK为时钟输入信号线。因ADC0809的部没有时钟电路,所需时钟信号必须由外界提供,通常使用频率为500KHZ, VREF(+),VREF(-)为参考电压输入。

MCS-51单片机存储器结构

MCS-51单片机在物理结构上有四个存储空间: 1、片内程序存储器 2、片外程序存储器 3、片内数据存储器 4、片外数据存储器 但在逻辑上,即从用户的角度上,8051单片机有三个存储空间: 1、片内外统一编址的64K的程序存储器地址空间(MOVC) 2、256B的片内数据存储器的地址空间(MOV) 3、以及64K片外数据存储器的地址空间(MOVX) 在访问三个不同的逻辑空间时,应采用不同形式的指令(具体我们在后面的指令系统学习时将会讲解),以产生不同的存储器空间的选通信号。 程序内存ROM 寻址范围:0000H ~ FFFFH 容量64KB EA = 1,寻址内部ROM;EA = 0,寻址外部ROM 地址长度:16位 作用:存放程序及程序运行时所需的常数。 七个具有特殊含义的单元是: 0000H ——系统复位,PC指向此处; 0003H ——外部中断0入口 000BH —— T0溢出中断入口

0013H ——外中断1入口 001BH —— T1溢出中断入口 0023H ——串口中断入口 002BH —— T2溢出中断入口 内部数据存储器RAM 物理上分为两大区:00H ~ 7FH即128B内RAM 和SFR区。 作用:作数据缓冲器用。 下图是8051单片机存储器的空间结构图 程序存储器 一个微处理器能够聪明地执行某种任务,除了它们强大的硬件外,还需要它们运行的软件,其实微处理器并不聪明,它们只是完全按照人们预先编写的程序而执行之。那么设

计人员编写的程序就存放在微处理器的程序存储器中,俗称只读程序存储器(ROM)。程序相当于给微处理器处理问题的一系列命令。其实程序和数据一样,都是由机器码组成的代码串。只是程序代码则存放于程序存储器中。 MCS-51具有64kB程序存储器寻址空间,它是用于存放用户程序、数据和表格等信息。对于内部无ROM的8031单片机,它的程序存储器必须外接,空间地址为64kB,此时单片机的端必须接地。强制CPU从外部程序存储器读取程序。对于内部有ROM的8051等单片机,正常运行时,则需接高电平,使CPU先从内部的程序存储中读取程序,当PC值超过内部ROM的容量时,才会转向外部的程序存储器读取程序。 当=1时,程序从片内ROM开始执行,当PC值超过片内ROM容量时会自动转向外部ROM空间。 当=0时,程序从外部存储器开始执行,例如前面提到的片内无ROM的8031单片机,在实际应用中就要把8031的引脚接为低电平。 8051片内有4kB的程序存储单元,其地址为0000H—0FFFH,单片机启动复位后,程序计数器的内容为0000H,所以系统将从0000H单元开始执行程序。但在程序存储中有些特殊的单元,这在使用中应加以注意: 其中一组特殊是0000H—0002H单元,系统复位后,PC为0000H,单片机从0000H 单元开始执行程序,如果程序不是从0000H单元开始,则应在这三个单元中存放一条无条件转移指令,让CPU直接去执行用户指定的程序。 另一组特殊单元是0003H—002AH,这40个单元各有用途,它们被均匀地分为五段,它们的定义如下: 0003H—000AH 外部中断0中断地址区。 000BH—0012H 定时/计数器0中断地址区。

51单片机经典教程

单片机经典教程 目录
第一课 第二课 第三课 第四课 第五课 第六课 第七课 第八课 第九课 第十课 第十一课 第十二课 第十三课 第十四课 第十五课 第十六课 第十七课 第十八课 第十九课 第二十课 第二十一课 第二十二课 第二十三课 第二十四课 单片机的概述 单片机的硬件结构与开发过程 单片机的内部结构 一 半导体存储器 单片机的内部结构 二 工作寄存器 单片机的内部结构 三 时序与时钟 单片机的内部结构 四 并行口 单片机的内部结构 五 数据与地址 单片机的内部结构 六 特殊功能存储器 单片机的工作方式 单片机的寻址 单片机的指令 一 数据传递类指令 单片机的指令 二 数据传递类指令 单片机的指令 三 算术逻辑运算类指令 单片机的指令 四 控制转移类指令 单片机的指令 五 位及位操作指令 单片机的程序设计方法 单片机的定时 计数器 单片机的中断系统 单片机的定时/中断实验 一 单片机的定时/中断实验 二 键盘接口及编程方法 一 独立式按键 键盘接口及编程方法 二 矩阵式按键 单片机显示器接口及编程方法 数码管的静态扫描与编程方法 6 9 11 15 18 20 24 27 29 32 35 38 42 47 51 55 64 68 73 78 81 87 90 94
4

第一课 单片机的概述
因为我们的主要课程是单片机的应用 本来不想讲解单片机的历史与发展 这话说现状更确切 些 但为了兼顾大多数朋友 我还是简单的介绍一下这方面的相关知识 一 单片机的由来 单片机 专业名称—Micro Controller Unit(微控制器件) 它是由大名鼎鼎的 INTEL 公司发明的 最早的系列是 MCS-48 后来有了 MCS-51 我们经常说的 51 系列单片机就是 MCS-51 micro controller system 它是一种 8 位的单片机 8 位是什么意思 我们以后再讲 后来 INTEL 公司把它的核心技术转让给了世界上很多的小公司 不过 再小也有几个亿的销售/ 年哦 所以世界上就有许多公司生产 51 系列兼容单片机 比如飞利浦的 87LPC 系列 华邦的 W78 系列 达拉斯的 DS87 系列 现代的 GSM97 系列等等 目前在我国比较流行的就是美国 ATMEL 公司的 89C51 它是一种带 Flash ROM 的单片机 至于什么是 Flash ROM 我在这儿先不作介绍 等以后大家学到相 关的知识时自然就会明白 我们的讲座就是以该型号的单片机来作实验的 讲到这里 也许有的人会 问 我平时在各种书上看到全是讲解 8031 8051 等型号的单片机 它们又有什么不同呢 其实它们同 属于一个系列 只是 89C51 的单片机更新型一点(事实上,89C51 目前正在用 89S51 代替 我们的实验系 统采用就是 89S52 的 兼容 89C52) 这里随便说一下 目前国内的单片机教材都是以 8051 为蓝本的 尽管其内核也是 51 系列的 但毕竟 8051 的单片机已经属于淘汰产品 在市场上也很少见到了 所以由 此感叹 国内的高等教育是如此的跟不上时代的发展需要 这话可能会引起很多人的不满,所以大家别 说是我讲的哦 二 主要单片机的分类 接着上面的话题 再给大家介绍一下我们经常在各种刊物上看到的 AVR 系列和 PIC 系列单片机是 怎么回事 以便让大家对单片机的发展有一个较全面的认识 在没有学习单片机之前 这是一个令很多 初学者非常困惑的问题 这么多的单片机我该先学哪一种呢 AVR 系列单片机也是 ATMEL 公司生产的一种 8 位单片机 它采用的是一种叫 RISC 精简指令集单 片机 的结构 所以它的技术和 51 系列有所不同 开发设备也和 51 系列是不通用的 它的一条指令的 运行速度可以达到纳秒级 即每秒 1000000000 次 是 8 位单片机中的高端产品 由于它的出色性能 目前应用范围越来越广 大有取代 51 系列的趋势 所以学完了 51 系列的 看来必须学会 AVR 的才行 可叹知识爆炸 人生苦短 说完了 AVR 的 再来说说另一种--PIC 系列单片机 它是美国 MICROCHIP 公 司 唉 又是老美 叫微芯公司的生产的另一种 8 位单片机 它采用的也是 RISC 的指令集 它的指令 系统和开发工具与 51 系列更是不同 但由于它的低价格和出色性能 目前国内使用的人越来越多 国 内也有很多的公司在推广它 不过它的影响力远没有 51 系列的大 所以作为初学者 51 系列当然是首 选 以上几种只是比较多见的系列 其实世界上还有许多的公司生产各种各样的单片机 比如 MOTOROLA 的 MC68H 系列 老牌的单片机 TI 的 MSP430C 系列 极低功耗的单片机 德国的西门子 SIEMENS 等等 它们都有各自的结构体系 并不与 51 系列兼容 为了不搞大家的脑筋 这里就不介绍了 等大 家入了门以后自己去研究它吧 我们还是回来了解一下 51 系列单片机到底是个什么东西 它有那些部 分组成 请接着往下看 三 单片机的结构及组成 单片机到底是一种什么 DD 它究竟能做什么呢 其实它就是一种能进行数学和逻辑运算 根据不 同使用对象完成不同控制任务的面向控制而设计的集成电路 此话好象有点绕口 没关系 大家都应该 知道我们经常使用的电脑吧 在电脑上 我们可以用不同的软件在相同的硬件上实现不同的工作 比如 我们用 WORD 可以打字 用 PROTEL 可以设计图纸等等 单片机其实也是如此 同样的芯片可以根据我们 不同的要求做出截然不同的产品 只不过电脑是面向应用的 而单片机是面向控制的 比如控制一个指
6

(完整版)单片机,第三章答案

思考题: 【3-1 】汇编语言与 C 语言哪种语言的可读性和可移植性强?在对速度和时序敏感的场合应该使用什么语言?对于复杂的单片机系统一般采用 C 与汇编混合编程的形式这句话对吗? 【3-2】二进制机器语言与C和汇编语言两者之间是什么关系?用C或汇编编制的程序在ROM中是 以编译后的二进制代码的形式存放这句话对吗? 【3-3】80C51系列单片机指令的格式包含哪几个部分?各部分之间的间隔符是什么?四个部分中哪 个部分是必须存在的,哪几个部分是可有可无的?标号的格式和代表的意义是? 【3-4 】80C51 系列单片机有哪几种寻址方式? 【3-5】80C51单片机中立即数是存放在ROM中还是RAM中? 【3-6 】判断下列说法是否正确。 (1)立即数寻址方式是被操作的数据本身就在指令中,而不是它的地址在指令中。()(2)指令周期是执行一条指令的时间。() (3)指令中直接给出的操作数称为直接寻址。() (4)内部寄存器Rn (n=0~7)可作为间接寻址寄存器。() 【3-7 】80C51 单片机可以进行直接寻址的区域是? 【3-8 】80C51 单片机可以进行寄存器寻址的范围是? 【3-9 】80C51 单片机可以进行寄存器间接寻址的寄存器是?寻址的范围是? 【3-10 】在寄存器间接寻址方式中,其“间接”体现在指令中寄存器的内容不是操作数,而是操作 数的()。 【3-11 】80C51 单片机变址寻址方式中可以作基址的寄存器是?可以作变址的寄存器是?@A+P,C @A+DPT所找到的操作数是在ROM中对吗? 【3-12】80C51单片机相对寻址改变的是PC的当前值,即改变的CPU执行指令的顺序这句话对否? 【3-13 】若访问特殊功能寄存器,只可以采用那种寻址方式? 【3-14】若访问外部RAM单元,只可以使用哪种寻址方式? 【3-15】若访问内部RAM单元,可使用哪些寻址方式? 【3-16 】若访问内外程序存储器,可使用哪些寻址方式? 【3-17 】80C51 单片机可以进行位寻址的字节单元范围除11 个可位寻址的特殊功能寄存器外还包括 哪个区域?分别找出位地址是00H 08H 22H、7FH D0H E0H对应的字节地址? 【3-18】已知(30H)=40H,(40H)=10H,(10H)=32H,(P1)=0EFH试写出执行以下程序段后有关单元的内容。 MOV R0,#30H MOV A ,@R0 MOV R1,A MOV B ,@Ri MOV @R1,P1 MOV P2,P1 MOV 10H, #20H MOV 30H,10H 【3-19】为什么对基本型的51子系列单片机(片内RAM为128B),其寄存器间接寻址方式(例如MOV A,@R0中,规定R0或R1的内容不能超过7FH? 【3-20】外部RAM数据传送指令有几条?试比较下面每一组中两条指令的区别? ( 1 )MOVX A,@R1 MOVX A ,@DPTR (2)MOVX A,@DPTR MOVX @DPTR, A (3)MOV @R0, A MOVX @R0 , A

51单片机外部存储器的使用

纠结了这么久,现在总算有点儿头绪了,先把它整理到这里先,有几点还是j经常被弄糊涂:地址和数据,地址/数据复用,地址的计算,总线的概念,执行指令跟脉冲的关系,哎呀呀,看来计算机组成和原理不看不行啊,得找个时间瞧瞧,过把瘾了解了解。。。 使用ALE信号作为低8位地址的锁存控制信号。以PSEN信号作为扩展程序存储器的读选通信号,在读外部ROM是PSEN是低电平有效,以实现对ROM 的读操作。 由RD和WR信号作为扩展数据存储器和I/O口的读选通、写选通信号。 ALE/PROG: 当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。 在FLASH编程期间,此引脚用于输入编程脉冲。 在平时,ALE端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。因此它可用作对外部输出的脉冲或用于定时目的。然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。如想禁止ALE的输出可在SFR8EH地址上置0。此时,ALE只有在执行MOVX,MOVC指令是ALE才起作用。另外,该引脚被略微拉高。如果微处理器在外部执行状态ALE禁止,置位无效。 当访问外部存储器时,ALE作为锁存扩展地址的低8位字节的控制信号。 当访问外部数据存储器时,ALE以十二分之一振荡频率输出正脉冲,同时这个引脚也是EPROM编程时的编程脉冲输入端。] 当非访问外部数据存储器时,ALE以六分之一振荡频率固定输出正脉冲,8051一个机器周期=6个状态周期=12个振荡周期,若采用6MHz的晶体振荡器,则ALE会发出1MHz的固定的正脉冲。因此它可以用来做外部时钟或定时。如果我们把这个功能应用与实际,可能给我们的设计带来简化,降低生产成本。 ALE脚是在使用MOVX、MOVC指令时才会变成有效(这些指令都使用到外部RAM或ROM 的地址。这些指令都有一个特点:地址和数据分时出现在P0口)。使用C写程序时,要使用它有效,可用访问内部RAM地址的方法。如:uVariable=*((char *)0x12C),把0x12C地址的内容给uVariable变量。这个过程有效的脚为ALE、RD。 这个信号线的信号生成是MCU硬件电路实现的,不可以人工控制。 在某些内置TOM的MCU里,可以关闭ALE信号输出,以降低EMI。

51单片机教程

原作:平凡的单片机

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来完成一系列的实验。 一、单片机的外部结构 拿到一块芯片,想要使用它,首先必须要知道怎样连线,我们用的一块称之为89C51的芯片,下面我们就看一下如何给它连线。1、电源:这当然是必不可少的了。单片机使用的是5V电源,其中正极接40引脚,负极(地)接20引脚。2、振蒎电路:单片机是一种时序电路,必须提供脉冲信号才能正常工作,在单片机内部已集成了振荡器,使用晶体振荡器,接18、19脚。只要买来晶振,电容,连上就可以了,按图1接上即可。3、复位引脚:按图1中画法连好,至于复位是何含义及为何需要复要复位,在单片机功能中介绍。4、EA引脚:EA引脚接到正电源端。至此,一个单片机就接好,通上电,单片机就开始工作了。 我们的第一个任务是要用单片机点亮一只发光二极管LED,显然,这个LED必须要和单片机的某个引脚相连,否则单片机就没法控制它了,那么和哪个引脚相连呢?单片机上除了刚才用掉的5个引脚,还有35个,我们将这个LED和1脚相连。(见图1,其中R1是限流电阻) 按照这个图的接法,当1脚是高电平时,LED不亮,只有1脚是低电平时,LED才发亮。因此要1脚我们要能够控制,也就是说,我们要能够让1引脚按要求变为高或低电平。即然我们要控制1脚,就得给它起个名字,总不能就叫它一脚吧?叫它什么名字呢?设计51芯片的INTEL公司已经起好了,就叫它P1.0,这是规定,不可以由我们来更改。

51单片机的若干电路原理图

51单片机的若干电路原理图 单片机 2007-10-23 20:36:31 阅读198 评论0 字号:大中小订阅 利用下面这些原理图,就可以自己动手做个简单的实验板啦~~~~ 1 外接电源供电电路及电源指示灯 在单片机实训板上为系统设计了一个外接电源供电电路,这个电源电路具备两种电源供电方式:一种是直接采用PC的USB接口5V直流电源给实训板供电,然后在电源电路中加入一个500mA电流限制的自恢复保险丝给PC的USB电源提供了保护的作用;另一种是采用小型直流稳压电源供电,输出的9V直流电源加入到电源电路中,通过LM7805稳压芯片的降压作用,给实训板提供工作所需的5V电源。 如图2.4所示为采用LM7805稳压芯片进行降压供电的电源电路。 图2.4 外接电源供电电路 同时,为了显示外接电源给实训板提供了电源,在系统中增加了电源指示灯电路,如图2.5。 发光二极管工作在正常工作状态时,流过LED的电流只需要5~10mA左右就行,在电路中采用白发红高亮LED,所以可以取5mA左右

的电流值,通过计算,可知:连接LED的限流电阻的阻值可以采用680Ω。 图2.5 电源指示灯电路 2 系统复位电路 复位是单片机的初始化操作,只要给RESET引脚加上2个机器周期以上的高电平信号,即可使单片机复位。除了进入系统的正常初始化之外,当程序运行出错或是操作错误使系统处于死锁状态时,为了摆脱死锁状态,也需要按复位键重新复位。 在系统中,为了实现上述的两项功能,采用常用的按键电平复位电路,如图2.6所示。 2.6 按键电平复位电路 从途中可以看出,当系统得到工作电压的时候,复位电路工作在上电自动复位状态,通过外部复位电路的电容充电来实现,只要Vcc

相关文档
最新文档