《含IO口方波生成实例单片机中断的使用详解.doc》由会员分享,可在线阅读,更多相关《含IO口方波生成实例单片机中断的使用详解.doc(26页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、void timer1(void) interrupt 3 using 3interrupt 表示中断优先级,using表示所用工作存放器组。interrupt x using y 跟在interrupt 后面的xx 值得是中断号,就是说这个函数对应第几个中断端口,一般在51中 0 外部中断0 1 定时器0 2 外部中断1 3 定时器1 4 串行中断 其它的根据相应得单片机有自己的含义,实际上c在编译的时候就是把你这个函数的入口地址放到这个对应中断的跳转地址 using y 这个y是说这个中断函数使用的那个存放器组就是51里面一般有4个 r0 - r7存放器,如果你的终端函数与别的程序用的不是
2、同一个存放器组那么进入中断的时候就不会将存放器组压入堆栈返回时也不会弹出来 节省代码与时间外部中断INT0void intsvr0(void) interrupt 0 using 1定时/计数器T0void timer0(void) interrupt 1 using 1外部中断INT1void intsvr1(void) interrupt 2 using 1定时/计数器T1void timer1(void) interrupt 3 using 1串口中断void serial0(void) interrupt4 using 1单片机的C语言HNBCC培训 :一,中断的概念中断:当计算机执行
3、正常程序时,系统中出现某些急需处理的异常情况与特殊请求.中断的执行:当CPU正在执行某一程序时,假设有中断响应,那么CPU转而执行中断效劳程序,当中断效劳程序执行完毕后,CPU自动返回原来的程序继续执行.中断效劳程序的语句写法与函数的写法完全一样,所以,中断效劳程序也是函数,只在函数头部有不同(后续).中断效劳程序的执行与函数的执行不同:函数的执行是有固定位置的,是通过函数的调用来完成的;而中断效劳程序的执行是不固定位置的,只要有中断响应,在一定条件下都会去响应中断,即执行中断效劳程序.二,中断源中断源:任何引起计算机中断的事件,一般一台机器允许有许多个中断源.8051系列单片机至少有5个可能
4、的中断(8052有6个,其它系列成员最多可达15个).下面以5个中断源为例.8051单片机的五个中断源是:外部中断请求0,由INT0(P3.2)输入;外部中断请求1,由INT1(P3.3)输入;片内定时器/计数器0溢出中断请求;片内定时器/计数器1溢出中断请求;片内串行口发送/接收中断请求.三,与中断有关的存放器1,定时/计数器控制存放器TCONTF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0D7 D6 D5 D4 D3D2 D1 D0. IT0,IT1:外部中断0,1触发方式选择位,由软件设置;1下降沿触发方式,INT0/INT1管脚上高到低的负跳变可引起中断;0电平触发方式,
5、 INT0/INT1管脚上低电平可引起中断. IE0,IE1:外部中断0,1请求标志位;当外部中断0,l依据触发方式满足条件,产生中断请求时由硬件置位 (IE0/IE1=1);当CPU响应中断时由硬件去除(IE0/IE1= 0). TR0,TR1: 启动定时/计数器0,1. TF0,TF1:定时器/计数器0,1(T/C0,T/C1)溢出中断请求标志;当T/C0,1计数溢出时由硬件置位(TF0/TF1=l);当CPU响应中断由硬件去除(TFO/TF1=0).三,与中断有关的存放器2,串行口控制存放器SCONTI RID7 D6 D5 D4 D3D2 D1 D0. RI:串行口接收中断请求标志位;
6、当串行口接收完一帧数据后请求中断,由硬件置位(RI=1)RI必须由软件清0. TI:串行口发送中断请求标志位.当串行口发送完一帧数据后请求中断,由硬件置位(TI=1)TI必须由软件清0.三,与中断有关的存放器3,中断允许存放器IEEA ET2 ES ET1 EX1 ET0 EX0D7 D6 D5 D4 D3D2 D1 D0. EX0,EX1:外部中断0,1的中断允许位;l外部中断0,1开中断;0外部中断0,1关中断. ET0,ET1:定时器/计数器0,1(T/C0,T/C1)溢出中断允许位;1T/C0,T/Cl开中断;0T/C0,T/Cl关中断. ES:串行口中断允许位;1串行口开中断;0串行
7、口关中断. ET2:定时器/计数器2(T/C2)溢出中断允许位;1T/C2开中断;0T/C2关中断. EA:CPU开/关中断控制位.1CPU开中断.0CPU关中断.8051复位时,IE被清0,此时CPU关中断,各中断源的中断也都屏蔽三,与中断有关的存放器4,中断优先级存放器IPPS PT1 PX1 PT0 PX0D7 D6 D5 D4 D3D2 D1 D0. PX0,PX1:外部中断0,1中断优先级控制位;1高优先级;0低优先级. PT0,PT1:定时器/计数器0,1中断优先级控制位;1高优先级;0低优先级. PS:串行口中断优先级控制位;1高优先级;0低优先级.8051复位时,IP被清0,5
8、个中断源都在同一优先级,其内部优先级的顺序从高到低为: 外部中断0(IE0)定时器/计数器0(TF0)外部中断1(IE1)定时器/计数器1(TF1)串行口中断(RI+TI)四,中断响应8051的CPU在每个机器周期采样各中断源的中断请求标志位,如果没有下述阻止条件,将在下一个机器周期响应被激活了的最高级中断请求:1.CPU正在处理同级或更高级的中断;2.现行机器周期不是所执行指令的最后一个机器周期;3.正在执行的是RETI或是访问IE或IP的指令.CPU在中断响应后完成如下的操作:1.硬件去除相应的中断请求标志;2.执行一条硬件子程序,保护断点,并转向中断效劳程序人口3.完毕中断时执行RETI
9、指令,恢复断点,返回主程序.8051的CPU在响应中断请求时,由硬件自动形成转向与该中断源对应的效劳程序入口地址,这种方法为硬件向量中断法.五,中断效劳程序的入口地址编号 中断源 人口地址0 外部中断0 0003H1 定时器/计数器0 000BH2 外部中断1 0013H3定时器/计数器1 001BH4 串行口中断 0023H各中断效劳程序入口地址仅间隔8个字节,编译器在这些地址放入无条件转移指令跳转到效劳程序的实际地址.六,中断效劳程序的语法规那么中断效劳程序的语法规那么如下:函数的返回值 函数名(参数)interruptn m函数体;对中断程序而言,函数的返回值与参数一般为void.int
10、erruptn 中n的取值为031的常数,不允许用表达式,表示中断向量的编号.m 中m的取值为03的常数,不允许用表达式,表示内部RAM中的工作存放器.七,中断说明中断不允许用于外部函数,它对函数目标代码影响如下z当调用函数时,SFR中的ACC,B,DPH,DPL与PSW(当需要时)入钱;.如果不使用存放器组切换,甚至中断函数所需的所有工作存放器都入钱;.函数退出前,所有的存放器内容出钱;函数由8051的指令RETI终止.中断效劳程序使用的任何程序也使用同一存放器组.八,中断例子#include reg51.hunsigned char status;bit flag;voidservice_
11、int()interrupt22 flag=1;status=P1;voidmain(void)IP=0x04; IE=0x84;for(;)if(flag)switch(status)case 0: break;case 1: break;case 2: break;case3: break;default: ;flag=0;图见书中P148习题试设计满足以下要求的电路图:1 单片机采用89C51,时钟11.0592MHz;2 有4个指示灯表示状态;3外接12位A/D芯片AD574;4 有4 * 4的键盘;5 有字符型LCD(画成插座形式,12Pin插座,管脚接法见书P253);6 有串行接
12、口与计算机连接;7 设置8位二进制的地址,地址范围可表示为0255;8 外接EEPROM.定时器/计数器(T/C)8051系列单片机至少有两个16位内部定时器/计数器,8052有三个定时器/计数器,其中有两个是根本定时器/计数器是定时器/计数器.它们既可以编程为定时器使用,也可以编程为计数器使用.假设是计数内部晶振驱动时钟,它是定时器;假设是计数,8051的输入管脚的脉冲信号,它是计数器.当T/C工作在定时器时,对振荡源12分频的脉冲计数,即每个机器周期计数值加1,计数率=1/12f osc.例当晶振为12MHz时,计数率=1000kHz,即每1s计数值加1.当T/C工作在计数器时,计数脉冲来
13、自外部脉冲输入管脚T0(P3.4)或T1(P3.5),当T0或T1脚上负跳变时计数值加1.识别管脚上的负跳变需两个机器周期,即24个振荡周期.所以T0或T1脚输入的可计数外部脉冲的最高频率为1/24fosc,当晶振为12MHZ时,最高计数率为500kHz,高于此频率将计数出错.一,与T/C有关的SFR1,计数存放器Th与TLT/C是16位的,计数存放器由TH高8位与TL低8位构成.在特殊功能存放器(SFR) 中,对应T/C0为TH0与TL0;对应T/C1为TH1与TL1.定时器/计数器的初始值通过TH1/TH0与TL1/TL0设置.2,定时器/计数器控制存放器TCON前面已介绍.二,与T/C有
14、关的SFR3,T/C的方式控制存放器TMOD. C/T:计数器或定时器选择位;1为计数器;0为定时器. GATE :门控信号;1 T/C的启动受到双重控制,即要求TR0/TR1与INT0/INT1同时为高;0 T/C的启动仅受TR0或TR1控制.GATE C/T M1 M0 GATE C/T M1 M0D7 D6 D5 D4 D3D2 D1 D0T/C1T/C0三,四种工作方式M1 M0 方式 功 能0 0 0 13位定时器/计数器,TL是低5位,TH是高8位0 1 1 16位定时器/计数器1 0 2 常数自动重装的8位定时器/计数器1 13仅用于T/C0,是两个8位定时器/计数器利用定时器编
15、写时钟程序.四,T/C工作方式的说明1. 方式0:当TMOD中MlM0=00时,T/C工作在方式0;方式0为13位的T/C,由TH的高8位,TL的低5位的计数值,满计数值213,但启动前可以预置计数初值.假设T/C开中断(ET=1)且CPU开中断(EA=1)时,那么定时器/计数器溢出时,CPU转向中断效劳程序时,且TF白动清0.2. 方式1:当TMOD中MlM0=01时,T/C工作在方式1;方式1与方式0根本一样.唯一区别在于计数存放器的位数是16位的,由TH与TL存放器各提供8位,满计数值为216.四,T/C工作方式的说明3. 方式2:当TMOD中MlM0=10时,T/C工作在方式2;方式2
16、是8位的可自动重载的T/C,满计数值为28;在方式0与方式1中,当计数满后,假设要进展下一次定时/计数,须用软件向TH与TL重装预置计数初值;方式2中TH与TL被当作两个8位计数器,计数过程中,TH存放8位初值并保持不变,由TL进展8位计数.计数溢出时,除产生溢出中断请求外,还自动将TH中初值重装到TL,即重装载.4. 方式3:方式33时,TH0与TL0成为两个独立的8位计数器.五,定时器/计数器的初始化在使用8051的定时器/计数器前,应对它进展编程初始化,主要是对TCON与TMOD编程;计算与装载T/C的计数初值.一般完成以下几个步骤:(1)确定T/C的工作方式编程TMOD存放器;(2)计
17、算T/C中的计数初值,并装载到TH与TL;(3)T/C在中断方式工作时,须开CPU中断与源中断编程IE存放器;(4)启动定时器/计数器编程TCON中TR1或TR0位.六,定时器/计数器的初值计算在定时器方式下,T/C是对机器周期脉冲计数的,假设fosc=12MHz,一个机器周期为12/fosc=1s,那么:方式0 13位定时器最大定时间隔=21336ms;方式2 8位定时器最大定时间隔=281s=256s.假设使T/C工作在定时器方式1,要求定时1ms,求计数初值.设计数初值为x,那么有:(216-x)1s=1000s或x=216一1000因此,TH,TL可置-1000;即:TH= -1000
18、/256;TL= -1000%256.对一般fosc有以下公式(设定时时间为times):(216-x)12/fosc= time s例1,设单片机的fosc=12MHz,要求在P1.0脚上输出周期为2ms的方波采用查询方式.#include reg51.hsbit P1_0=P10;voidmain(void TMOD=0x01; TR0=1;for(;)TH0= -1000/256;TL0= -1000%256;do while(!TF0);P1_0=!P1_0;TF0=0;采用中断方式.#include reg51.hsbit P1_0=P10;voidtimer0(void)inter
19、rupt11 P1_0=!P1_0; TH0= -1000/256;TL0= -1000%256;voidmain(void)TMOD=0x01; P1_0=0;TH0= -1000/256;TL0= -1000%256;EA=1;ET0=1;TR0=1;do while(1);例2,设单片机的fosc=6MHz,要求在P1.7脚上的指示灯亮一秒灭一秒.voidmain(void)P1_7=0; P1_0=1;TMOD=0x61;TH0= -50000/256;TL0= -50000%256;TH1= -5; TL1= -5;IP=0x08;EA=l; ET0=1;ET1=l; TR0=l;T
20、R1=1;for (;)#includesbit P1_0=P10;sbit P1_7=P17;voidtimer0( )interrupt11P1_0=!P1_0;TH0= -50000/256;TL0= -50000%256;voidtimer1( )interrupt32P1_7=!P1_7;例3,设单片机的fosc=10MHz,要求在P1.0脚上输出周期为2.5s,占空比20%.#include#define uchar unsigned charuchar time;uchar period=250;uchar high=50;voidtimer0( )interruptl1TH0=
21、 -8333/256;TL0= -8333%256;if(+time=high)P1=0;else if(time=period)time=0; P1=1;voidmain(void)TMOD=0x01;TH0= -8333/256;TL0= -8333%256;EA=l;ET0=1;TR0=1;do )while(1);#include#define uchar unsigned char#define uint unsigned intuchar time,status,percent,period;bit one_round;uint oldcount,target=500;voidpu
22、lse(void)interrupt1lTH0= -833/256;TL0= -833%256; ET0=l;if(+time=percent)P1=0;else if (time =100)time=0;P2=l;voidtachmeter(void)interrupt22union uint word;structuchar hi;uchar lo;byte; newcount;newcount_byte.hi=TH1;newcount_byte.lo=TLl;period=newcount.word-oldcounts;oldcount=newcount.word;one -round=
23、1;voidmain(void)IP=0x04;TMOD=0x01;TCON=0x54;TH1=0;TL1=0;IE=0x86;for(;)if(one_round)if(periodif(percent0)-percent;串行口8051系列单片机有一个标准的串行通信接口,发送数据时由TXD端口送出,接收数据时由RXD端口输入.内置两个缓冲器SBUF,一个承受缓冲器,另一个是接收缓冲器,可实行全双工的串行通信.近距离可直接用TTL电平,假设与计算机通信,那么需要将电平转换成RS232电平形式,假设需长距离通信可以采用RS485电平形式,通信的数据必须通过软件的编写来完成.一,与串行口有关的S
24、FR1,串行口控制存放器SCONSM0 SM1 SM2 REN TB8 RB8 TI RID7 D6 D5 D4 D3D2 D1 D0. SM0,SM1:串行口工作方式控制位(见书P158). SM2:多机通信控制位(方式2,3);1只有接收到第9位(RB8)为1,RI才置位;0接收到字符RI就置位. REN :串行口接收允许位;1允许串行口接收;0制止串行口接收. TB8:方式2与方式3时,为发送的第9位数据,也可以作奇偶校验位. RB8:方式2与方式3时,为接收到的第9位数据;方式1时,为接收到的停顿位. TI:发送中断标志;由硬件置位,必须由软件清0. RI:接收中断标志;由硬件置位,必
25、须由软件清0.一,与串行口有关的SFR2,电源控制存放器PCONSMODD7 D6 D5 D4 D3D2 D1 D0PCON的第7位SMOD是与串行口的波特率设置有关的选择位. SMOD:串行口波特率加倍位.1方式1,3波特率=定时器1溢出率/16;方式2波特率为fosc/32;0方式1,3波特率=定时器1溢出率/32;方式2波特率为fosc/64.二,串行口的工作方式1. 方式0方式0为移位存放器输入/输出方式,串行数据通过RXD输入/输出 ,TXD那么用于输出移位时钟脉冲.方式0时,收发的数据为8位,低位在前.波特率固定为fosc/12,其中fosc为单片机外接晶振频率.发送是以写SBUF
26、存放器的指令开场的,8位输出完毕时TI被置位.方式0接收是在REN=1与RI=0同时满足时开场的.接收的数据装入SBUF中,完毕时RI被置位.移位存放器方式的也可用于两个单片机之间的通信.与通常9600波特相比,lMHz通信能力对短距离通信很吸引人.二,串行口的工作方式2. 方式1方式1是10位异步通信方式,1位起始位(0),8位数据位与1位停顿位(1).其中的起始 位与停顿位在发送时是自动插入的.任何一条以SBUF为目的存放器的指令都启动一次发送,发送的条件是TI=0,发送完置TI为1;方式l接收的前提条件是SCON中的REN为l,同时以下两个条件都满足,本次接收有效,将其装入SBUF与RB
27、8位.否那么放弃接收结果.两个条件是:(1)RI=0;(2)SM2=0或接收到的停顿位为1;方式1的波特率是可变的,波特率可由以下计算公式计算得到: 方式1波特率=2SMOD.(定时器1的溢出率)/32其中的SMOD为PCON的最高位.定时器1的方式0,1,2,都可以使用,其溢出率为定时时间的倒数值.二,串行口的工作方式3. 方式2与方式3这两种方式都是11位异步接收/发送方式,它们的操作过程完全一样,所不同的是波特率:方式2波特率=2SMOD.(fosc/64);方式3波特率同方式1(定时器l作波特率发生器).方式2与方式3的发送起始于任何一条写SBUF指令,当第9位数据(TB8)输出之后,
28、置位TI.方式2与方式3的接收前提条件也是REN为1.在第9位数据接收到后,如果以下条件同时满足(1)RI=0;(2)SM2=0或接收到的第9位为1,那么将已接收的数据装入SBUF与RB8,并置位RI,如果条件不满足,那么接收无效.三,串行口的初始化在使用串行口之前,应对它进展编程初始化,主要是设置产生波特率的定时器1,串行口控制与中断控制存放器.具体步骤如下:(1) 确定定时器1的工作方式编程TMOD存放器;(2) 计算定时器1的初值装载TH1,TL1,具体TH1与TL1的值可查表得到;(3) 启动定时器1编程TCON中的TR1位,即置TR1为1;(4) 确定串行口的控制编程SCON;(5)
29、 串行口在中断方式工作时,须开CPU与源中断编程IE存放器.四,串行口举例1#include reg51.h#define uchar unsigned char#define uint unsigned intuchar idata trdata10=M,C,S,-,5,1, 0x0d,0x0a,0x00;voidmain(void) uchar i; uint j;TMOD=0x20;TL1=0xfd;TH1=0xfd;SCON=0xd8;PCON=0x00;TR1=1;while(1)i=0;while(trdatai!=0x00)SBUF=trdatai;while(TI=0);TI=
30、0; i+;for (j=0;jvoidmain(voidunsigned char a;TMOD=Ox20;TL1=0xfd;TH1=0xfd;SCON=Oxd8;PCON=0x00;TR1=1;while (1)while (RI=0); RI=0;a=SBUF; SBUF=a;while (TI=O); TI=0;#include reg51.h#define uchar unsigned charuchar xdata r_buf32;uchar xdata t_buf32;uchar r_in,r_out,t_in,t_out;bit r_full,t_empty,t_done;co
31、de uchar m=this is a testprogramrn;serial( )interrupt41ifRI&r_full) r_bufr_in=SBUF; RI=0;r_in=+r_in&0xlf;if(r_in=r_out) r_full=1;else if (TI &t_empty)SBUF=t_buft_out; TI=0;t_out=+t_out&0x1f;ift_out=t_in)t_empty=l;else if(TI)TI=0;t_done =1;voidloadmsg(uchar code *msg) while(*msg!=0)&(t_in+1) t_out)&0
32、xlf)!=0) t_buft_in= *msg; msg+;t_in=+t_in&0x1f;if(t-done)TI=1;t_empty=t_done =0 ;voidprocess(uchar ch)return;voidprocessmsg(void)while(r_out+1)r_in)!=0)process(r_bufr_out);r_out=+r_out&0x1f;voidmain()TMOD=0x20;TH1=0xfd;TCON=0x40;SCON=0x50;IE=0x90;t_empty=t_done =1;r_full=0;r_out=t_in=t_out=l;r_in=1;for(;)loadmsg(&m);processmsg();第 26 页