《单片机C语言程序设计》课件第五部分 单片机中断系统_第1页
《单片机C语言程序设计》课件第五部分 单片机中断系统_第2页
《单片机C语言程序设计》课件第五部分 单片机中断系统_第3页
《单片机C语言程序设计》课件第五部分 单片机中断系统_第4页
《单片机C语言程序设计》课件第五部分 单片机中断系统_第5页
已阅读5页,还剩85页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第五部分单片机中断系统中断的定义:中断系统由4部分组成:中断源、中断标志位、中断控制位、优先级控制位组成。51系列的单片机的5个中断源分别是:外部中断0()、定时/计数器0(/C0)、外部中断1()、定时/计数器1(/C1)、串行口中断(TXD、RXD);中断标志位由:IE0、TF0、IE1、TF1、TI和RI组成;中断控制位由:EA、EX0、ET0、EX1、ET1、ES组成;中断优先级控制位由:PX0、PT0、PX1、PT1、PS组成。5.1中断系统总框架单片机在执行main函数时系统出现随机产生的突发事件,单片机暂停main函数的程序转而去处理突发事件,处理完后再返回到刚才暂停的位置继续执行main函数中的程序。中断系统总框架5.1.1中断源

中断源是引起中断的原因和申请中断的来源。51系列单片机有2个外部中断源、2个定时/计数器和1个串行口中断。(1)外部中断0和外部中断1:分别由P3.2、P3.3输入;有下降沿、低电平两种触发方式,分别由IT0和IT1控制。(2)定时/计数器0(C/0)和定时/计数器1(C/1):定时方式时由单片机晶振分频和定时模式及初值决定定时时间;计数方式时由P3.4和P3.5输入计数脉冲。(3)串行口中断(TXD、RXD):串行口中断来源有两个分别是:接收中断RXD和发送中断TXD组成;分别从P3.0和P3.1输入输出。5.1.2中断请求标志位(1)TCON:定时器/计数器的控制寄存器如表5.1.1所示(可位寻址)。

A、TF1和TF0:定时器/计数器溢出中断请求标志位。THx、TLx(x代表0、1)从初值加“1”计数,直至计数器全满产生溢出时,TFx自动为1。此时可通过中断法或查询法检测TFx位。若ETx=1、EA=1,即可向单片机请求中断。单片机响应中断后,TFx由硬件自动清零。若ETx、EA中有一个不为1,则不能响应中断,只能查询TF1位。76543210TCONTF1TR1TF0TR0IE1IT1IE0IT0B、IT1和IT0:外部中断的触发方式选择位。ITx=0,外部中断的中断请求信号为低电平触发。当单片机检测到P3.3(外部中断0)、P3.4(外部中断1)引脚的输入信号为低电平时,置位IEx;当P3.3、P3.4输入信号为高电平时,IEx自动清零。IT1=1,外部中断中断请求信号为下降沿触发。连续两个机器周期先检测到高电平后检测到低电平时,置位IEx;执行中断服务函数后,IEx自动清零。C、IE1和IE0:外部中断的中断请求标志位。外部中断(P3.3或P3.4)输入引脚有低电平触发或下降沿触发信号时,IEx自动为1。若外部中断是开启的,则单片机响应外部中断的中断服务请求。D、TR1和TR0:定时/计数器1和0的启动控制位。只有TRx=1才有机会开启相应的定时/计数器,此后THx、TLx加“1”计数到溢出,从而置位TFx。(2)SCON:串口中断控制寄存器如表5.1.2所示。SCON主要用于串行口的模式控制,这里与中断请求标志相关的只有TI和RI(可位寻址)。A、TI:串行口发送完中断标志位。当单片机将一个数据写入串行口发送缓冲区SBUF后,启动发送。每发送完一个串行帧,由硬件置位TI。此时,若ES=1、EA=1,则单片机响应串行口发送中断请求。若EA、ES中有一个不为1,则不允许中断,此时只能通过查询方式判断发送结束。76543210TCONSM0SM1SM2RENTB8RB8TIRIB、RI:串行口接收完中断标志位。当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。若EA=1、ES=1,则单片机响应串行口接收中断请求;若EA、ES中有一个不为1,则不允许中断,此时只能通过查询方式判断接收结束。IE为单片机中断的使能控制寄存器,中断使能开关分为两级:第1级为总开关EA,用于所有中断的控制;第2级为分级开关,分别对单片机的5个中断源进行控制。5.1.3中断使能寄存器IE5.1.3中断使能寄存器IE76543210IEEAESET1EX1ET0EX0(1)EA:使能所有中断的总开关。若EA=0,所有中断请求均被禁止;若EA=1,是否允许中断由各个中断控制寄存器决定。(3)外部中断1控制位EX1若EX1=1,允许外部中断1申请中断;若EX1=0,禁止外部中断1申请中断。(4)定时器/计数器0中断控制位ET0若ET0=1,允许定时器/计数器0申请中断;若ET0=0,禁止定时器/计数器0申请中断。(2)外部中断0控制位EX0若EX0=1,允许外部中断0申请中断;若EX0=0,禁止外部中断0申请中断。(5)定时器/计数器1中断控制位ET1若ET1=1,允许定时器/计数器1申请中断;若ET1=0,禁止定时器/计数器1申请中断。(6)串行口中断控制位ES若ES=1,允许串行口申请中断;若ES=0,禁止串行口申请中断。。5.1.4中断优先级别控制位IPC51的5个中断源有默认的中断优先级别,从高到低分别为:外部中断0、定时/计数器0、外部中断1、定时/计数器1、串行口中断。当单片机同时拉收到几个中断请求时,首先响应优先级高的中断请求;正在进行的中断服务程序可以被高优先级中断请求中断,但不被低优先级中断请求中断。如图5.1.0中断系统框架中断优先级有2个,可以用软件设置中断优先级别。表5.1.4为中断优先级别控制位IP(可位寻址):(1)外部中断0优先级控制位PX0若PX0=1,外部中断0被设定为高优先级中断;若PX0=0,外部中断0被设定为低优先级中断。(2)外部中断1优先级控制位PX1若PX1=1,外部中断1被设定为高优先级中断;若PX1=0,外部中断1被设定为低优先级中断。(3)定时器/计数器0中断优先级控制位PT0若PT0=1,定时器/计数器0被设定为高优先级中断;若PT0=0,定时器/计数器0被设定为低优先级中断。76543210IPPSPT1PX1PT0PX0(4)定时器/计数器1中断优先级控制位PT1若PT1=1,定时器/计数器1被设定为高优先级中断;若PT1=0,定时器/计数器1被设定为低优先级中断。(5)串行口中断优先级控制位PS若PS=1,串行口中断被设定为高优先级中断;若PS=0,串行口中断被设定为低优先级中断。

中断服务函数是当中断源申请中断后,单片机中断main函数的程序转而去执行的函数。中断服务函数优先于main函数。中断服务函数的格式:5.2中断服务函数void函数名(void)interrupt中断编号using工作寄存器组编号{中断服务程序}其中:中断编号如表5.2.0,是C51语句为方便使用而对中断源进行的编号。工作寄存器组编号从0~2任选。中断编号中断源0外部中断01定时/计数器02外部中断13定时/计数器14串口中断【例5.2.1】编写一个外部中断0的中断服务函数,在外部中断0服务函数中,P2.7取反。voidINT_0(void)interrupt0using0{P2_7=!P2_7;}中断服务函数编写,应特注意以下几点:(1)中断服务服务函数优先于main函数,不能直接被main函数调用,否则将导致编译错误。(2)中断服务函数没有返回值,即应将中断服务函数定义为void类型。(3)中断服务函数为无参函数,中断服务函数即不能有传参列表,否则将导致编译错误。(5)若中断服务函数中调用了其他函数,则被调用函数使用的寄存器组编号必须与中断函数相同,也就是using后面的数字必须一样。(6)中断服务服务函数使用浮点运算时要保存浮点寄存器的状态。51系列的单片机有2个外部中断:外部中断0和外部中断1,输入引脚分别是:P3.2和P3.3。从中断系统框架图5.1.0可看到外部中断的触发方式有2种:下降沿触发和低电平触发。当设为低电平触发时(ITx=0),单片机在每个机器周期都检查中断源引脚,只要有低电平,中断请求标志位置位,向CPU申请中断;当设为下降沿触发时(ITx=1),单片机在上一机器周期检测到中断源引脚为高电平,下一机器周期检测到低电平,即置位中断请求标志位,向CPU申请中断。5.3外部中断

与外部中断相关的特殊寄存器如表5.3.1所示,当对外部中断进行初始化和中断服务函数编写时时这些特殊寄存器都要考虑上。5.3.1与外部中断相关的特殊寄存器序号寄存器功能0IT0、IT1设置外部中断触发方式:0为低电平,1为下降沿触发。1EX0、EX1使能外部中断:0为关断,1为开启。2IE0、IE1外部中断的中断请求标志位:1为有中断请求。3PX0、PX1外部中断的优先级设置:0为默认级,1为高级优先级。4EA所有中断的总开关:0为关断,1为开启。

在开启任何中断前都必须对中断做相应的设置,外部中断只须设置5.3.1小节中相关的寄存器即可。【例5.3.1】开启外部中断0,设置其为下降沿触发,采用默认优先级。voidINIT(void){IT0=1;//设置外部中断0为下降沿触发。EX0=1;//使能外部中断0。PX0=0;//可以省略,默认为0。EA=1;//开启总中断。}5.3.2外部中断产初始化【例5.3.2】开启两个外部中断,设置外部中断0为低电平触发、外部中断1为下降沿触发,且外部中断1的优先级比外部中断0优先级高。

voidINIT(void)

{

IT0=0;IT1=1;

EX0=1;EX1=1;

PX0=0;PX1=1;

EA=1;

}

中断服务函数在5.2节有介绍过,不同的中断服务函数只要满足中断编号对应,函数名合法,其它的规则都大同小异。5.3.3外部中断服务函数

设计一个程序通过外部中断0控制P2.7取反。综合例5.2.1的中断服务函数和例5.3.1的中断初始化,编写程序如下:【例5.3.3】硬件电路如图5.3.3所示,此硬件电路中P3.2接按键模拟外部中断0的中断源。因为外部中断触发方式只有两种:低电平、下降源触发,所以按键的一端必须接地。#include<REGX51.H>voidINIT(void)//外部中断开启步骤有4条。{IT0=1;//设置外部中断0为下降沿触发。EX0=1;//使能外部中断0。PX0=0;//可以省略,默认为0。EA=1;//开启总中断。}voidmain(){INIT();//调用INIT函数。while(1);}voidINT_0(void)interrupt0using0//外部中断0中断服务函数。{P2_7=!P2_7;//P2.7取非。}

51系列单片机至少有两个16位的定时/计数器。如图5.4.0所示,可以通过编程使其工作在定时状态或计数状态。定时器是采用内部晶振分频后的时钟脉冲为基准的。计数则是通过单片机的P3.4和P3.5引脚获得外部脉冲信号。由此可见定时/计数器的本质其实是计数器。(1)当做定时器使用时:定时器对晶振12分频后的脉冲计数。若晶振采用12M,12分频后为1MHz(1us),计数多少个脉冲就是多少us。5.4定时/计数器工作原理(2)当做计数器使用时:计数器对单片机的P3.4、P3.5的脉冲进行加1计数。理论上51系列单片机可计数脉冲最高频率为500kHz。5.4.1与定时/计数器相关的特殊寄存器序号寄存器功能1TMOD定时/计数器的工作模式寄存器2TR0、TR1定时/计数器的启动标志位3ET0、ET1定时/计数器中断使能:0为关断,1为开启。4TH0、TL0、TH1、TL1定时/计数器初值寄存器5TF0、TF1定时/计数器的中断请求标志位:1为有中断请求。6PT0、PT1定时/计数器的优先级设置:0为默认级,1为高级优先级。7EA所有中断的总开关:0为关断,1为开启。(1)定时计数器模式控制寄存器如表5.4.2,TMOD(不可位寻址)的高四位用于对定时/计数器1进行设置,低四位用于对定时/计数器0进行设置。TMODGATEM1M0GATEM1M0

定时/计数器1定时/计数器0A、当GATE等于1时,定时/计数器的启动需要TRx=1和INTx引脚为高电平。当GATE等于0时,定时/计数器的启动只TRx=1,一般都采用此模式。B、:等于0时单片机工作于定时器模式,等于1时工作于计数器模式。C、M1M0:为单片机定时/计数器的工作方式选择位M1M0工作方式00方式0,最大计数213,不自动重装初值。01方式1,最大计数216,不自动重装初值。10方式2,最大计数28,自动重装初值。11TL0为定时器/计数器,TH0只能定时。5.4.2定时/计数器的工作方式及编程方式0,如图5.4.1所示为定时/计数器0的方式0工作框图。A、当TMOD中的M1=0、M0=0时,单片机定时/计数器0工作于方式0。方式0中定时/计数器的初值为13位,即THx提供高8位,TLx提供低5位。B、当定时/计数器工作于定时模式时:THx=(213-X)*12/fosc/32;TLx=(213-X)*12/fosc%32;X为定时时间,即Xus后定时/计数时溢出。C、当定时/计数器工作于计数模式时:THx=(213-X)/32;TLx=(213-X)%32;X为脉冲个数,即X个脉冲后定时/计数器溢出。D、上诉公式X对32求整求余,其实是将X转化成2进制,取其高8位给THx,低5位给TLx。【例5.4.1】硬件电路如图5.4.2所示(晶振12MHz),此时定时/计数器可定时最大时间为8192us,计数脉冲为8192个。现设置定时/计数器0工作于方式0,定时1ms,让P2.0产生2ms周期的方波。初值计算:12/fosc=1;1ms=1000us;TH0=(8192-1000)/32;TL0=(8192-1000)%32;或:TH0=(8192-1000)>>5;TL0=(8192-1000);或:TH0=0xe0;TL0=0x18;。采用查询定时/计数器0的溢出标志位的方法编程:#include<REGX51.H>voidINIT(){TMOD=0X00;//设置定时器为定时模式,方式0;TR0=1;TH0=(8192-1000)/32;TL0=(8192-1000)%32;}voidmain(){INIT();//调用INIT函数,初始化中断。while(1){TH0=(8192-1000)/32;TL0=(8192-1000)%32;//初值重装;while(!TF0);TF0=0;//等待TF0=1;P1_0=!P1_0;//取非P1_0;产生方波;}}采用查询法,只需最少条件让TH0、TL0自加1,即TR0=1,GATE=0。此后,TH0、TL0从初值自加到8192溢出后,置位TF0。上诉程序中采用while(!TF0)等待TF0为1后程序才往下执行,但TF0只有执行定时计数器0的中断服务函数后才会自动清零,而程序中但没有中断服务函数,所以要人为清零TF0。采用中断法编程:#include<REGX51.H>voidINIT()//定时计数器初始化的6条程序;{TMOD=0X00; //设置定时器为定时模式,方式0;TR0=1;//启动定时计数器;ET0=1; //使能定时计数器中断;TH0=(8192-1000)>>5;//初值计数;TL0=(8192-1000);EA=1;//中断总开关;}voidmain(){INIT();//调用INIT函数,初始化中断。while(1);}voidTimer0()interrupt1//定时计数器0中断服务函数;{TH0=(8192-1000)>>5;TL0=(8192-1000);//初值重装;P1_0=!P1_0;//取非P1.0;产生方波;}采用中断法,初始化定时计数器的程序有6条。此时必须使能定时计数器中断和中断总开关。Timer0函数并没有在main函数中出现,因为中断函数比main函数高级不被其调用;Timer0函数仅做重装初值和取非P1.0两件事。采用中断法编程:A、当TMOD中的M1=0、M0=1时,单片机定时/计数器工作于方式1。方式1中定时/计数器的初值为16位,即THx提供高8位,TLx提供低8位。B、当定时/计数器工作于定时模式时:THx=(216-X)*12/fosc/256;TLx=(216-X)*12/fosc%256;X为定时时间,即Xus后定时/计数时溢出。C、当定时/计数器工作于计数模式时:THx=(216-X)/256;TLx=(216-X)%256;X为脉冲个数,即X个脉冲后定时/计数器溢出。解析:使用方式1可以直接定时10ms,但不能一次性定时100ms。所以程序中要定时变量t用于计算定时计数器的溢出10次后对P1.0取非。初值计算:12/fosc=1;1ms=10000us;TH0=(65536-10000)/256;TL0=(65536-10000)%256;或:TH0=(65536-10000)>>8;TL0=65536-10000;(THx为高8位,TLx为低8位,晶振为12MHz)或:TH0=0xd8;TL0=0xf0;【例5.4.2】硬件电路如图5.4.2所示(晶振12MHz),此时定时/计数器可定时最大时间为65536us,计数脉冲为65536个。现设置定时/计数器0工作于方式1,定时10ms,让P1.0产生100ms周期的方波。采用查询定时/计数器0的溢出标志位的方法编程:#include<REGX51.H>voidINIT(){TMOD=0X01;//设置定时器0为定时模式,方式1;TR0=1;TH0=(65536-10000)/256;TL0=(65536-10000)%256;}voidmain(){unsignedchart;//定义t;INIT();//调用INIT函数;while(1){TH0=(65536-10000)/256;TL0=(65536-10000)%256;//初值重装;while(!TF0);TF0=0;//等待TF0=1;if(t++>=9)//t用于计算定时计数器的溢出次数;{ t=0;//溢出10后清零;P1_0=!P1_0;//取非P1_0;产生方波;}}}采用中断法编程:#include<REGX51.H>voidINIT()//定时计数器初始化的6条程序;{TMOD=0X01; //设置定时器为定时模式,方式1;TR0=1;//启动定时计数器;ET0=1; //使能定时计数器中断;TH0=(65536-10000)>>8;//初值10ms;TL0=(65536-10000);EA=1;//中断总开关;}voidmain(){INIT();//调用INIT函数,初始化中断。while(1);}voidTimer0()interrupt1//定时计数器0中断服务函数;{TH0=(65536-10000)>>8;//初值10ms;TL0=(65536-10000);P1_0=!P1_0;//取反P1.0;产生方波;}方式1的定时10ms,其它方法不能直接定时这么长时间。(3)方式2,如图5.4.4所示为定时计数器0的方式2工作框图。A、当TMOD中的M1=1、M0=0时,单片机定时/计数器工作于方式2。方式2中定时/计数器的初值为8位,即THx和TLx都8位。每次溢出后,THx的值会自动加载到TLx中。B、当定时/计数器工作于定时模式时:THx=TLx=(28-X)*12/fosc;X为定时时间,即Xus后定时/计数时溢出。C、当定时/计数器工作于计数模式时:THx=TLx=(28-X);X为脉冲个数,即X个脉冲后定时/计数器溢出。【例5.4.3】硬件电路如图5.4.5所示(晶振12MHz),此时定时/计数器可定时最大时间为256us,计数脉冲为256个。现设置定时/计数器1计数脉冲10个溢出,让P1.0取非。初值计算:12/fosc=1;TH1=TL1=256-10;采用查询定时/计数器1的溢出标志位的方法编程:#include<REGX51.H>voidINIT(){TMOD=0X60;//设置定时器1为计数模式,方式2;TR1=1;TH1=TL1=256-10;}voidmain(){INIT();//调用INIT函数;while(1){while(!TF1);TF1=0;//等待TF1=1;P1_0=!P1_0;//取非P1_0;}此时定时计数器1对TMOD的设置集中在高4位如表5.4.2,设置GATE=0,=1;M1=1,M0=0;即:TMOD=0x60;方式2中初值是自动重装的,当TL1从初值自加到256溢出后,TH1将本身的值传输给TL1。采用中断法编程:#include<REGX51.H>voidINIT()//定时计数器初始化的6条程序;{TMOD=0X60; //设置定时器为定时模式,方式1;TR1=1;//启动定时计数器;ET1=1; //使能定时计数器中断;TH1=TL1=256-10;EA=1;//中断总开关;}voidmain(){INIT();//调用INIT函数,初始化中断。while(1);}voidTimer1()interrupt3//定时计数器0中断服务函数;{P1_0=!P1_0;//取反P1.0;产生方波;}采用中断法必须让ET1=1、EA=1,当中断标志位置位后,中断服务函数才有机会执行。定时计数器1的中断编号:3。(3)方式2,如图5.4.4所示为定时计数器0的方式2工作框图。A、当TMOD中的定时计数器0的M1=1、M0=1时,单片机定时/计数器0工作于方式3。方式3中定时/计数器0被分成两部分:TH0占用了定时计数器1的中断溢出标志位和中断源,只用于定时,开启受控于TR1。TL0占用了定时计数器0的中断溢出标志位和中断源,即可定时又可计数。定时计数器1仍可工作于方式0~2,但不能产生中断。。B、当定时/计数器工作于定时模式时,初值不能自动重装:TH0=(28-X)*12/fosc;TL0=(28-X)*12/fosc;X为定时时间,即Xus后定时/计数时溢出。C、当定时/计数器工作于计数模式时:TL0=(28-X);X为脉冲个数,即X个脉冲后定时/计数器溢出。【例5.4.4】硬件电路如图5.4.7所示(晶振12MHz),单片机定时计数器0工作于方式3,此时定时/计数器可定时最大时间为256us,计数脉冲为256个。现设置定时/计数器0定时时间为100us让P1.0产生200us的方波,按键按5次后计数脉冲溢出让P1.7的LED取非,TMOD=0x07。初值计算:12/fosc=1;TL0=256-100;TH1=256-5;采用中断法编程:#include<REGX51.H>voidINIT()//定时计数器初始化的6条程序;{TMOD=0X07; //设置定时器方式3;TH0为定时器,TL0为计数。TR0=1;TR1=1;//启动定时计数器;ET0=1;ET1=1; //使能定时计数器中断;TH0=256-100;//只能定时;TL0=256-5;EA=1;//中断总开关;}voidmain(){INIT();//调用INIT函数,初始化中断。while(1);}voidTimer0()interrupt3//定时计数器0的TF0占用定时计数器1的中断服务函数;{TH0=256-100;//只能定时;P1_0=!P1_0;}voidCounter0()interrupt1//定时计数器0中断服务函数;{TL0=256-5;P1_7=!P1_7;}

51系列单片机有定时计数器2个,定时计数器0和定时计数器1,工作方式有2种,模式有4种。模式1下的定时计数最大;模式2的初值可以自动重装;模式3下定时计数器1的中断服务函数被占用,一般仅用于为串行口生成波特率。5.4.3定时计数器小结(1)一般通信可分为2种:串行通信和并行通信如图5.5.0所示。5.5串行口中断(2)串行通信按数据传送方向可分为:单工通信、半双工通信、全双工通信3种如图5.5.1。A、单工通信:数据传输是单向的。当通信一方为发送方时,另一方只能固定为接收方。单工通信仅需一根数据线。B、半双工通信:数据传输是准双向的。当通信任一方为发送时,另一方只能接收对方的数据;反之,当一方为接收端时,另一方只能作为发送端。任一方的发送或接收不能同时进行,但可以通过编程改变收发方向。通信一般采用两根数据线。C、全双工通信:数据传输是双向的。通信双向均可同时收发数据。通信采用两根数据线。(3)同步通信和异步通信串行通信按时钟控制方式和信息组成格式可分为:同步通信和异步通信。A、同步通信:一次传输一帧数据中,可包含多个的字符。传输时应在数据前加上同步字符,后面加上校验字符,如图5.5.2所示。同步通信传输的速度快,但对接收和发送时钟要求严格同步。同步字符数据块1~n校验字符B、异步通信:一次传输一帧数据中,一般包含1个字符。一帧数据内包含:起始位、数据位、校验位、停止位,如图5.5.3所示。传输时先发送一个低电平的起始位,再发送数据位(低位在前高位在后),接着发送校验位和一个高电平的停止位。异步通信中接收端和发送端的时钟是独立的,不需要同步。C、波特率:波特率是指每秒中传输二进制的位数,单位为bps(b/s)。波特率是衡量串行通信速度的标准。5.5.2串行口的工作原理串行口主要由发送数据缓冲器、接收数据缓冲器、发送控制器TI、接收控制器RI、波特率生成器、输入移位寄存器、串行口控制寄存器SCON、输出控制门电路、TXD发送端、RXD接收端等组成,如图5.5.4所示。(1)发送数据将数据写入发送缓冲串SBUF中,在定时器1的波特率产生器的时钟控制下,SBUF的内容按低位在前,高位在后的顺序通过P3.1逐位发送出去。发送一帧数据后,TI硬件置1。(TI必须人为清零后才能发送下一帧数据)(2)接收数据当串行口控制寄存器SCON中的REN为1、RI(接收中断标志位)为0时,串行口可接收数据。串行数据从P3.0(RXD)按波特率时钟要求按位进入移位寄存器,完成接收到一个完整的字节后存入SBUF中,此时RI硬件置1(RI必须人为清零后才能接收下一帧数据)。5.5.3与串行口相关的特殊寄存器与串行口相关的特殊寄存器有两个:SCON和PCON。SCON是串行口控制寄存器,用于设置串行口工作方式。PCON为电源控制寄存器,用于设置单片机电源相关控制。(1)SCON:如表5.5.1所示,为SCON串行口控制寄存器各相关位(可位寻址)。SCONSM0SM1SM2RENTB8RB8TIRI地址9FH9EH9DH9CH9BH9AH99H98HA、SM0和SM1为串行口方式选择位,有4种方式供设计者选择如表5.5.2所示。工作方式SM0SM1波特率功能方式000fosc/12移位寄存器,主要用于IO扩展。方式101可变10位帧结构的UART,无校验位。方式210fosc/32或fosc/6411位帧结构的UART,有校验位。方式311可变11位帧结构的UART,有校验位。B、SM2为多机通信控制位。方式0时:SM2必须为0。方式1时:使能接收REN=1时,若SM2=1,只有接收到有效停止位时,RI才置1。方式2和方式3时:若SM2=1且RB8=1,RI置1;若SM2=1但RB8=0,即使接收完数据RI也不置1。若SM2=0,不论RB8为0还是为1,接收完数据后RI置1。C、REN为接收使能控制位:当REN=1时,允许接收;当REN=0时,禁止接收。D、TB8和RB8:TB8为发送数据的第9位,RB8为接收数据的第9位。在方式2和方式3中,TB8和RB8一般用于奇偶校验位。在多机通信时,可用于区分是地址或数据。E、TI为发送中断标志位:发送完一帧数据后由硬件自动置1。当串行口工作于方式0做IO扩展时,TI由硬件自动清零;当串行口工作于其它3种状态时,TI由软件清零。当TI置1时,可申请中断,软件清零后可发送下一帧数据。F、RI为接收中断标志位:接收完一帧数据后由硬件自动置1。当串行口工作于方式0做IO扩展时,RI由硬件自动清零;当串行口工作于其它3种状态时,RI由软件清零。当RI置1时,可申请中断,软件清零后可接收下一帧数据。(2)PCON:如表5.5.2所示,为PCON电源控制寄存器各相关位(不可位寻址)。PCONSMOD

GF1GF0PDIDL地址8EH8DH8CH8BH8AH89H88H87HA、SMOD为波特率倍频位:当串行口工作于方式1~3时,若SMOD=1,波特率*2;若SMOD=0,波特率不变。当串行口工作于方式0时,与SMOD无关。B、GF1和GF0:用户自定义位,无具体用途。C、PD为掉电方式位:PD=0单片机处于正常工作状态。PD=1单片机进入掉电(PowerDown)模式,可由外部中断或硬件复位模式唤醒,进入掉电模式后,外部晶振停振,CPU、定时器、串行口全部停止工作,只有外部中断工作。D、IDL为待机方式位:IDL=0单片机处于正常工作状态。IDL=1单片机进入空闲模式,除CPU不工作外,其余的振荡器、中断系统仍继续工作,在空闲模式下可由任一个中断或硬件复位唤醒。5.5.4串行口的工作方式及编程串行口有4种工作方式:方式0用于IO扩展;方式1~3用于通信。方式0和方式2的波特率是固定的,方式1和方式3的波特率由定时器1的溢出率决定。(1)方式0方式0工作方式下,串行口相当于一个8位的移位寄存器,波特率为晶振的12分频。P3.0(RXD)为数据的输入输出端,P3.1(TXD)为移位寄存器的时钟脉冲输出端。接收和发送数据的顺序都是低位在前,高位在后。A、发送数据:将数据写入SBUF,串行口将数据以波特率(fosc/12)的速度送入移位寄存器中转换成串行数据,通过RXD(P3.0)输入或输出。TXD(P3.1)作为移位寄存器的同步时钟输出。发送完一帧数据后,硬件置位TI并向单片机申请中断。执行完上诉过程后,若想再发送数据必须软件清零TI。B、接收数据:接收数据的前提必须使REN=1。此时串行数据通过RXD接收进入移位寄存器变成并行数据后,存入SBUF中;TXD作为移位寄存器的同步时钟。接收完一帧数据后,硬件置位RI并向单片机申请中断。执行完上诉过程后,若想再接收数据必须软件清零RI。【例5.5.1】硬件电路如图5.5.5所示(晶振12MHz),RXD接094的D(串行输入)端,TXD接4096的CLK(时钟)端。当单片机串行口工作于方式0时,使用CD4094设计一流水灯程序。采用查询法编程:查询TI。#include<REGX51.H>unsignedcharnum[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voiddelay()//延时函数;{unsignedinta=50000;while(a--);}voidmain(){unsignedchari;//定义i;SCON=0x00;while(1){SBUF=num[i++];//将数据写入SBUF中;delay();//延时;if(i>=8)i=0;//当i大于等于8时,清零i;while(!TI);//等待数据发送完;其实当延时时间足够长时,此句可省略,即:等待法。TI=0;//软件清零TI,准备下一帧数据的发送。}}采用中断法编程:#include<REGX51.H>unsignedcharnum[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};voiddelay()//延时函数;{unsignedinta=50000;while(a--);}voidmain(){unsignedchari;//定义i;SCON=0x00;ES=1;//使能串行口中断;EA=1;//中断总开关;while(1){SBUF=num[i++];//将数据写入SBUF中;delay();//延时;if(i>=8)i=0;//当i大于等于8时,清零i;}}voidSerial(void)interrupt4{TI=0;//软件清零TI,准备下一帧数据的发送。}【例5.5.2】硬件电路如图5.5.6所示(晶振12MHz),RXD接4014的Q7端,TXD接4014的串行时钟信号端CLK,P3.2接4014的P/S方式控制端。当单片机串行口工作于方式0时,扩展8个IO8接个按键用于控制对应的LED灯。采用查询法编程:查询RI。#include<REGX51.H>sbitPS4014=P3^2;voidmain(){SCON=0x10;while(1){PS4014=1;PS4014=0;while(!RI);RI=0;P2=SBUF; }}4014为并入串出芯片:当P/S=1时,4014的D7~D0的数据将锁存在内部的寄存器中;当P/S=0时,在CLK作用在,内部寄存器的内容按高位在前低位在后的原则,依次输出至Q7~Q5。RXD读取Q7的串行数据,存入SBUF中。(2)方式1方式1下,串行口为一个波特率可调的10位异步串行通信口。10位的帧结构由1位起始位、8位数据位和1位结束位组成。此时的特波率公式如下:其中:SMOD为PCOND的波特率倍频位,其值只能为1或0;波特波晶振SMOD定时器1初值19200bps11.0592MHz00xfe9600bps11.0592MHz00xfd9600bps11.0592MHz10xfa19200bps22.1184MHz00xfd9600bps22.1184MHz00xfa4800bps22.1184MHz00xf4【例5.5.3】硬件电路如图5.5.7所示(晶振11.0592MHz),串行口工作于方式1,波特率为9600bps,编写程序从串口发送字符“Guilinuniversityofelectronictechnology”。选择串口仿真模块VirtualTerminal,并设置波特率为9600bps;仿真中单片机的晶振也应改为11.0592MHz。采用查询法编程:#include<REGX51.H>unsignedcharnum[]={'G','u','i','l','i','n','','u','n','i','v','e','r','s','i','t','y','','o','f','','e','l','e','c','t','r','o','n','i','c','','t','e','c','h','n','o','l','o','g','y',''};voidINIT()//初始化串口;{TMOD=0x20;//定时计数器1工作于方式2,初值自动重装;TR1=1;TH1=0xfd;TL1=0xfd;//波特率为9600bpsSCON=0x40;//串行口工作于方式1,REN=0不接收;}voidmain(){unsignedchari;INIT();//调用函数,初始化串口;while(1){for(i=0;i<43;i++)//发送43个字符;{SBUF=num[i];//将num数组的值传入SBUF中发送; while(!TI);//查询TI是否为1,不为1则等待; TI=0;//TI为1后,软件清零,准备发送下一个数据。}while(1);//发送完43个字符后停止发送。}}采用中断法编程:#include<REGX51.H>unsignedcharnum[]={'G','u','i','l','i','n','','u','n','i','v','e','r','s','i','t','y','','o','f','','e','l','e','c','t','r','o','n','i','c','',t','e','c','h','n','o','l','o','g','y',''};voiddelay(unsignedinta){while(a--);}voidINIT(){TMOD=0x20;//设置定时计数器1工作于方式2;TR1=1;TH1=0xfd;TL1=0xfd;//波特率为9600bpsSCON=0x40;//方式1,REN=0;ES=1; //使能串口中断;EA=1; //中断总开关开启。}voidmain(){unsignedchari;INIT();//调用函数,初始化串口;while(1){for(i=0;i<43;i++)//发送43个字符;{SBUF=num[i];//将num数组的值传入SBUF中发送;delay(1000);//延时}while(1);}}voidSerial()interrupt4//串行口中断服务程序。{TI=0;//TI为1后,软件清零,准备发送下一个数据。}(2)方式1方式1下,串行口为一个波特率可调的10位异步串行通信口。10位的帧结构由1位起始位、8位数据位和1位结束位组成。此时的特波率公式如下:【例5.5.4】设单片机晶振12MHz,串行口工作于方式2(odd奇校验),SMOD=0,波特率为:12M/64bps=19.2Kbps,编写程序从串口发送字符“Guilinuniversityofelectronictechnology”。Proteus的串口仿真模块VirtualTerminal最高波特率为5.76Kbps,接收不到正确数据,只能用Keil仿真。采用查询法:#include<REGX51.H>unsignedcharnum[]={'G','u','i','l','i','n','','u','n','i','v','e','r','s','i','t','y','','o','f','','e','l','e','c','t','r','o','n','i','c','','t','e','c','h','n','o','l','o','g','y',''};voidINIT()//初始化串口;{SCON=0X80;//串行口工作于方式1,REN=0不接收;}voidmain(){unsignedchari;INIT();//调用函数,初始化串口;while(1){for(i=0;i<43;i++)//发送43个字符;{ACC=num[i];//将num数组的值传入SBUF中发送; TB8=P;//奇校验; SBUF=ACC; while(!TI);//查询TI是否为1,不为1则等待; TI=0;//TI为1后,软件清零,准备发送下一个数据。}while(1);//发送完43个字符后停止发送。}}采用中断法:#include<REGX51.H>unsignedcharnum[]={'G','u','i','l','i','n','','u','n','i','v','e','r','s','i','t','y','','o','f','','e','l','e','c','t','r','o','n','i','c','','t','e','c','h','n','o','l','o','g','y',''};voiddelay(unsignedinta){while(a--);}voidINIT()//初始化串口;{SCON=0X80;//串行口工作于方式1,REN=0不接收;ES=1;EA=1;}voidmain(){unsignedchari;INIT();//调用函数,初始化串口;while(1){for(i=0;i<43;i++)//发送43个字符;{ACC=num[i];//将num数组的值传入SBUF中发送; TB8=P;//奇校验; SBUF=ACC; delay(1000);//速度太快,所以加延时以免通信出错。}while(1);//发送完43个字符后停止发送。}}voidSerial()interrupt4{TI=0;//TI为1后,软件清零,准备发送下一个数据。}【例5.5.5】硬件电路如图

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论