1、interrupt 表示中断优先级,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培训电话:13712969808一,中断的概念中断:当计算机执行正常程序时,系统中出现某些急需处 的 常 和 .中断的
3、执行:当CPU正在执行某一程序时, 有中断 应,则CPU转 执行中断 程序,当中断 程序执行后,CPU自 返回 来的程序 执行.中断 程序的语 函数的 相同,所 ,中断 程序也是函数, 在函数 部有不同(后 ).中断 程序的执行 函数的执行不同:函数的执行是有 定 的,是 函数的 用来 的; 中断 程序的执行是不 定 的, 有中断 应,在一定会 应中断,currency1执行中断 程序.,中断“中断“:fi计算机中断的fl,一般一 机器有个中断“.8051系单片机 有5个的中断(8052有6个,其它系”15个).面 5个中断“.8051单片机的 个中断“是:外部中断 0,INT0(P3.2)
4、入;外部中断 1,INT1(P3.3) 入;片定时器/计数器0出中断 ;片定时器/计数器1出中断 ;片串行口/中断 ., 中断有的寄存器1,定时/计数器 寄存器TCONTF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0D7 D6 D5 D4 D3 D2 D1 D0. IT0,IT1:外部中断0,1 , ;1 ,INT0/INT1 上 到 的 跳 fi中断;0电 , INT0/INT1 上 电 fi中断. IE0,IE1:外部中断0,1 ;当外部中断0,l 据 , 中断 时 (IE0/IE1=1);当CPU 应中断时 (IE0/IE1= 0). TR0,TR1: 定时/计数器0,1.
5、 TF0,TF1:定时器/计数器0,1(T/C0,T/C1)出中断 ;当T/C0,1计数出时 (TF0/TF1=l); 当CPU 应中断 (TFO/TF1=0)., 中断有的寄存器2,串行口 寄存器SCON TI RID7 D6 D5 D4 D3 D2 D1 D0. RI:串行口中断 ;当串行口 一 数据后 中断, (RI=1)RI “0“. TI:串行口中断 .当串行口 一 数据后 中断, (TI=1)TI “0“., 中断有的寄存器3,中断寄存器IE EA ET2 ES ET1 EX1 ET0 EX0D7 D6 D5 D4 D3 D2 D1 D0. EX0,EX1:外部中断0,1的中断 ;
6、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串行口中断. 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 D3 D2 D1 D0. PX0,PX1:外部中断0,1中断优先级 ;1 优先级;0 优先
7、级. PT0,PT1:定时器/计数器0,1中断优先级 ;1 优先级;0 优先级. PS:串行口中断优先级 ;1 优先级;0 优先级.8051 时,IP“0“,5个中断“在同一优先级,其部优先级的 序 到 : 外部中断0(IE0)定时器/计数器0(TF0)外部中断1(IE1)定时器/计数器1(TF1)串行口中断(RI+TI),中断 应8051的CPU在 个机器 中断“的中断 ,如果有,将在一个机器 应 的” 级中断 :1.CPU正在处 同级 更 级的中断;2.现行机器 不是所执行指令的”后一个机器 ;3.正在执行的是RETI 是访问IE IP的指令.CPU在中断 应后 如的操作:1. 相应的中断
8、 ;2.执行一 子程序,保护断点,并转向中断 程序人口 3.结束中断时执行RETI指令,恢断点,返回主程序.8051的CPU在 应中断 时, 自 形转向 该中断“对应的 程序入口地址,这种 向量中断 .,中断 程序的入口地址编号 中断“ 人口地址0 外部中断0 0003H1 定时器/计数器0 000BH2 外部中断1 0013H3 定时器/计数器1 001BH4 串行口中断 0023H中断 程序入口地址仅间隔8个字节,编译器在这些地址放入无转移指令跳转到 程序的实际地址.六,中断 程序的语 规则中断 程序的语 规则如:函数的返回值 函数名(参数) interrupt n using m函数体;
9、对中断程序 言,函数的返回值和参数一般void.interrupt n 中n的取值031的常数,不用表,表示中断向量的编号.using m 中m的取值03的常数,不用表,表示部RAM中的工作寄存器.七,中断说明中断不用于外部函数,它对函数目 代码影 如z当 用函数时,SFR中的ACC,B,DPH,DPL和PSW(当需时)入钱;.如果不使用寄存器组切换,甚 中断函数所需的所有工作寄存器入钱;.函数退出前,所有的寄存器容出钱;函数8051的指令“RETI“终.中断 程序使用的程序也使用同一寄存器组.八,中断子#include reg51.hunsigned char status;bit flag
10、;void service_int() interrupt 2 using 2 flag=1; status=P1;void main(void)IP=0x04; IE=0x84;for(;)if(flag)switch(status)case 0: break;case 1: break;case 2: break;case 3: break;default: ;flag=0; 图见书中P148习题试 计 的电路图:1 单片机 用89C51,时钟11.0592MHz;2 有4个指示灯表示状态;3 外12 A/D芯片AD574;4 有4 * 4的键盘;5 有字符型LCD(画插座形,12Pin插
11、座, 见书P253);6 有串行口 计算机连;7 8 进的地址,地址范围表示0255;8 外EEPROM.定时器/计数器(T/C)8051系单片机 有两个16 部定时器/计数器,8052有个定时器/计数器,其中有两个是基本定时器/计数器是定时器/计数器.它们既 编程定时器使用,也 编程计数器使用.是计数部晶振驱 时钟,它是定时器; 是计数,8051的 入 的脉冲信号,它是计数器.当T/C工作在定时器时,对振荡“12分频的脉冲计数,currency1 个机器 计数值加1,计数率=1/12f osc.当晶振12MHz时,计数率=1000kHz,currency1 1s计数值加1.当T/C工作在计数
12、器时,计数脉冲来自外部脉冲 入 T0(P3.4) T1(P3.5),当T0 T1 上 跳 时计数值加1.识别 上的 跳 需两个机器 ,currency124个振荡 .所 T0 T1 入的计数外部脉冲的” 频率1/24fosc,当晶振12MHZ时,” 计数率500kHz, 于 频率将计数出错. 一, T/C有的SFR1,计数寄存器Th和TL T/C是16 的,计数寄存器TH 8 和TL 8 构.在 功寄存器(SFR) 中,对应T/C0TH0和TL0;对应T/C1TH1和TL1.定时器/计数器的初始值 TH1/TH0和TL1/TL0 . 2,定时器/计数器 寄存器TCON前面已介绍., T/C有的
13、SFR3,T/C的 寄存器TMOD . C/T:计数器 定时器 ;1计数器;0定时器. GATE :门 信号;1 T/C的 受到双重 ,currency1 TR0/TR1和INT0/INT1同时 ;0 T/C的 仅受TR0 TR1 .GATE C/T M1 M0 GATE C/T M1 M0D7 D6 D5 D4 D3 D2 D1 D0T/C1T/C0, 种工作 M1 M0 功 0 0 0 13 定时器/计数器,TL是 5 ,TH是 8 0 1 1 16 定时器/计数器1 0 2 常数自 重装的8 定时器/计数器1 1 3 仅用于T/C0,是两个8 定时器/计数器利用定时器编 时钟程序.,T/
14、C工作 的说明1. 0:当TMOD中MlM0=00时,T/C工作在 0;013 的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是8 的自 重载的T/C, 计数值28;在 0和 1中,当计数 后, 进行一次定时/计数,
15、用向TH和TL重装预 计数初值;2中TH和TL当作两个8 计数器,计数 程中,TH寄存8 初值并保持不 ,TL进行8 计数.计数出时, 出中断 外,还自 将TH中初值重装到TL,currency1重装载.4. 3:3 适合于T/C0.当T/CO工作在 3时,TH0和TL0两个独立的8 计数器. ,定时器/计数器的初始化在使用8051的定时器/计数器前,应对它进行编程初始化,主是对TCON和TMOD编程;计算和装载T/C的计数初值.一般 几个步骤:(1)确定T/C的工作 编程TMOD寄存器;(2)计算T/C中的计数初值,并装载到TH和TL;(3)T/C在中断 工作时,CPU中断和“中断编程IE寄
16、存器;(4) 定时器/计数器编程TCON中TR1 TR0 .六,定时器/计数器的初值计算在定时器 ,T/C是对机器 脉冲计数的, fosc=12MHz,一个机器 12/fosc=1s,则: 0 13 定时器”大定时间隔=213 1s=8.192ms;1 16 定时器”大定时间隔=216 1s=65.536ms;2 8 定时器”大定时间隔=281s=256s.使T/C工作在定时器 1, 定时1ms, 计数初值. 计数初值x,则有:(216-x)1s=1000sx=216一1000 因 ,TH,TL -1000; currency1:TH= -1000/256;TL= -1000%256.对一般f
17、osc有公( 定时时间times):(216-x)12/fosc= time s1, 单片机的fosc=12MHz, 在P1.0 上 出 2ms的 波用查询 .#include reg51.hsbit P1_0=P10;void main(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;void timer0(void) interrupt 1using 1 P1_0=!P1_0; TH0= -
18、1000/256;TL0= -1000%256;void main(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 上的指示灯 一 一 .void main(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;TR1=1;for (;)#include sbit
19、P1_0=P10;sbit P1_7=P17;void timer0( ) interrupt 1 using 1P1_0=!P1_0;TH0= -50000/256;TL0= -50000%256;void timer1( ) interrupt3 using 2P1_7=!P1_7;3, 单片机的fosc=10MHz, 在P1.0 上 出 2.5s, 20%.#include #define uchar unsigned charuchar time;uchar period=250;uchar high=50;void timer0( ) interrupt l using 1TH0=
20、-8333/256;TL0= -8333%256;if(+time=high)P1=0;else if(time=period)time=0; P1=1;void main(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 int uchar time,status,percent,period;bit one_round;uint oldcount,target=500; voi
21、d pulse(void) interrupt 1using lTH0= -833/256;TL0= -833%256; ET0=l;if(+time=percent)P1=0;else if (time =100)time=0;P2=l; void tachmeter(void) interrupt 2 using 2union uint word;structuchar hi;uchar lo;byte; newcount;newcount_byte.hi=TH1;newcount_byte.lo=TLl;period=newcount.word-oldcounts;oldcount=ne
22、wcount.word;one -round=1;void main(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电 形, 信的数据 的编 来 .一, 串行口有的SFR1,串行口 寄存器SCONS
23、M0 SM1 SM2 REN TB8 RB8 TI RID7 D6 D5 D4 D3 D2 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:中断 ; , 0.一, 串行口有的SFR2,电“ 寄存器PCONSMOD D7 D6 D5 D4 D3 D2 D1 D0PCON的第7 SMOD是 串行口的波 率 有的 . SMO
24、D:串行口波 率加 .1 1,3波 率=定时器1出率/16; 2波 率fosc/32;0 1,3波 率=定时器1出率/32; 2波 率fosc/64. ,串行口的工作 1. 00移 寄存器 入/ 出 ,串行数据 RXD 入/ 出 ,TXD则用于 出移 时钟脉冲.0时,的数据8 , 在前.波 率 定fosc/12,其中fosc单片机外晶振频率.是 SBUF寄存器的指令始的,8 出结束时TI .0是在REN=1和RI=0同时 时始的.的数据装入SBUF中,结束时RI .移 寄存器 的也用于两个单片机 间的 信.和 常9600波 相 ,lMHz 信 对 信 人.,串行口的工作 2. 11是10 步
25、信 ,1 fi始 (0),8 数据 和1 (1).其中的fi始 和 在时是自 插入的.一 SBUF目的寄存器的指令 一次,的是TI=0, TI1; l的前提是SCON中的RENl,同时两个 ,本次有 ,将其装入SBUF和RB8 . 则放 结果.两个是:(1)RI=0;(2)SM2=0 到的 1;1的波 率是 的,波 率 计算公计算得到: 1波 率=2SMOD.(定时器1的出率)/32其中的SMODPCON的” .定时器1的 0,1,2, 使用,其出率定时时间的 数值.,串行口的工作 3. 2和 3这两种 是11 步/ ,它们的操作 程 一 ,所不同的是波 率:2波 率=2SMOD.(fosc/
26、64);3波 率同 1(定时器l作波 率器).2和 3的fi始于一“ SBUF“指令,当第9 数据(TB8) 出 后, TI.2和 3的前提也是REN1.在第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 ,currency1 TR1
27、1;(4) 确定串行口的 编程SCON;(5) 串行口在中断 工作时,CPU和“中断编程IE寄存器. ,串行口 1#include reg51.h#define uchar unsigned char#define uint unsigned intuchar idata trdata10=M,C,S,-,5,1, 0x0d, 0x0a,0x00; void main(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=t
28、rdatai;while(TI=0);TI=0; i+; for (j=0;j void main(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
29、 r_full,t_empty,t_done;code uchar m=“this is a test programrn“; serial( ) interrupt 4 using 1ifRI RI=0;r_in=+r_inif(r_in=r_out) r_full=1;else if (TI TI=0;t_out=+t_outift_out=t_in)t_empty=l; else if(TI)TI=0;t_done =1; void loadmsg(uchar code *msg) while(*msg!=0) msg+;t_in=+t_inif(t-done)TI=1;t_empty=t_done =0 ;void process(uchar ch)return;void processmsg(void)while(r_out+1)r_in)!=0)process(r_bufr_out);r_out=+r_out void main()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(processmsg();