当前位置:首页 >> 信息与通信 >>

C51中断设置心得,并附一段源码


一、控制和状态寄存器 (1)定时器控制寄存器(TCON) 位地址 位符号 8FH TF1 8EH TR1 8DH TF0 8CH TR0 8BH IE1 8AH IT1 89H IE0 88H IT0

TF1\TF0:定时器/计数器中断请求标志位。当定时器计数满溢出回零时,有硬件置位,并可 申请中断。当 CPU 响应中断并进入中断服务程序后,自动清零。 TR

1\TR0:定时器/计数器运行控制位,靠软件置位和清零。置位时开始工作,清零时停止 工作。 IE1\IE0:外部中断申请标志,检测到 INT 引脚出现的外部中断信号的下降沿时,由硬件置 位,申请中断,进入中断服务程序后被硬件自动清零。 IT1\IT0:外部中断的类型控制位。IT=1,由下跳沿触发;IT=0,由低电平触发;由软件设 置或清除。 (2)工作方式寄存器(TMOD):不能位寻址 位数 位符号 D7 GATE D6 C/T D5 M1 D4 M0 D3 GATE D2 C/T D1 M1 D0 M0

高 4 位控制定时器 1;低 4 位控制定时器 0. GATE:门控位,当=1 时,只有 INT0\1 引脚为高电平,且 TR 置 1 时,定时器/计数器才工 作;当=0 时,定时器/计数器仅受 TR 的控制,而不管 INT 引脚电平的高低。 C/T:定时器/计数器功能选择位。=0 时,设置为定时功能;=1 时,设置为计数功能。 M1M0:工作方式选择位; M1M0=00:工作方式 0(13 位方式) M1M0=01:工作方式 1(16 位方式) M1M0=10:工作方式 2(8 位自动装入时间常数方式) M1M0=11:工作方式 3(2 个 8 位方式,仅对 T0) 定时器/计数器设置实例: T0,0 方式下,TL0=5 位,TH0=8 位,共计 13 位。计数工作方式时,计数值的范围: 1~~8192(2 的 13 次方) 。 定时工作方式,定时时间的计算公式: (213-计数初值)*晶振周期*12 或(213-计数初值)*机器周期 最大定时时间为: 13-0)*机器周期 (2 最小定时时间为: 13-(213-1) (2 )*机器周期 (3)定时/计数器 2 TF2 EXF2 RCLK TCLK EXEN2 TR2 C/T2 CP/RL2

TF2:定时器 2 溢出标志,定时器溢出时置位,并申请中断,只能靠软件清除。当 RCLK 或 TCLK=1 时 TF2 将不会置位。 EXF2: 定时器 2 外部标志。 EXEN2=1, 当 T2EX 引脚出现负跳变产生捕获或重装时, EXF2 置位,申请中断。若以允许定时器 2 中断,=1 时,将使 CPU 从中断向量处执行定 时器 2 中断子程序。EXF2 必须用软件清零。当工作在向上或向下递增递减计数模 式时(方式控制寄存器 T2MOD 的 DCEN 位=1)时,不能激活中断。 RCLK:接收时钟标志。靠软件置位或清除。=1 时,用定时器 2 溢出脉冲作为串行口(工 作于方式 1 和 3 时)的接收时钟。=0 时,用定时器 1 的溢出脉冲作为接收时钟。

TCLK:发送时钟标志。靠软件置位或清除。=1 时,用定时器 2 溢出脉冲作为串行口(工 作于方式 1 和 3 时)的接收时钟。=0 时,用定时器 1 的溢出脉冲作为接收时钟。 EXEN2:定时器 2 外部允许标志。靠软件置位或清零。=1 时,未用作串行口波特率发生 器,在 T2EX 端出现负跳变脉冲时,激活定时器 2 捕获或重装。并置 EXF2 标志为 1,请求中断。=0 时,T2EX 端的外部信号无效。 TR2:靠软件置位或清除。=1 时启动,否则停止。 C/T2:=0 时,定时方式;=1 时,外部计数方式(下降沿触发) 。 CP/RL2:捕获/重装选择。=1 时,EXEN2=1,T2EX 端出现负跳变脉冲时发生捕获操作。 即把 TH2 和 TL2 的内容传递给 RCAP2H 和 RCAP2L。 时, =0 定时器 2 溢出或 EXEN1 =1 时,T2EX 端出现负跳变脉冲时,会出现重装载操作。即把 RCAP2H 和 RCAP2L 的内容传递给 TH2 和 TL2。当 RCLK=1 或 TCLK=1 时,该位无效。溢出时强制其 重装载。 --------------------------------------------T2OE DCEN T2OE:定时器输出允许位。 DCEN:置位时,允许定时器作为向上向下计数器。 二、中断系统 INT0:外部中断 0,由 P3.2 端口线引入,低电平或下跳沿引起。 INT1:外部中断 1,由 P3.3 端口线引入,低电平或下跳沿引起。 T0:定时器/计数器 0 中断,由 T0 计数溢出引起。 T1:定时器/计数器 0 中断,由 T1 计数溢出引起。 TI/RI:串行 I/O 中断,串行端口完成一帧字符发送/接收引起。 中断系统的控制寄存器 (1)中断允许寄存器 IE D7 IE EA 位地址 AFH * * ES ACH ET1 ABH EX1 AAH ET0 A9H EX0 A8H D6 D5 D4 D3 D2 D1 D0

EA:全局中断允许。 ES:串行 I/O 中断允许位。 ETI:定时/计数器 T1 中断允许位。 EXI:外部中断 1 允许位。 EX0:外部中断 0 允许位。 ET0:定时/计数器 T0 中断允许位。 (2)中断优先级寄存器 IP IP 位地址 D7 * D6 * D5 PT2 BDH D4D PS BCH D3 PT1 BBH D2 PX1 BAH D1 PT0 B9H D0 PX0 B8H

PT2:定时器 2=1 高优先级,=0 低优先级。 PS:串行 I/O 中断优先级控制位。 PT1:定时/计数 1 中断优先级。 PX1:外部中断 1 中断优先级。 PT0:定时器/计数器 0 中断优先级。

PX0:外部中断 0 中断优先级。 CPU 执行中断的顺序:INT0---T0---INT1---T1---RI/TI 必须在中断服务程序中清除中断标志位。 中断服务服务程序入口设置: 函数类型 函数名 (形参) 【interrupt m] [using n] m 0 1 2 3 4 5 外部中断 0 定时/计数器 0 溢出 外部中断 1 定时/计数器 1 溢出 串行口中断 定时/计数器 2 溢出 0003H 000BH 0013H 001BH 0023H 002BH

RAM 使用 4 个工作寄存器组,称 0—3 组。每个寄存器组包含 8 个工作寄存器(R0 -R7) 。可用 using n 选择不同的工作寄存器组。n=0-3。 三、串口控制寄存器 (1)串行口控制寄存器 SCON: SCON D7 SM0 D6 SM1 D5 SM2 D4 REN D3 TB8 D2 RB8 D1 TI D0 RI

SM0\SM1:串行口工作方式控制位。 00:-------0;01:-------1;10:---------2;11:-------3. SM2:用于方式 2 和方式 3 多机通讯控制位。 TI:发送中断标志位。发送前必须软件清零,发送过程中 TI 保持 0 电平,发送完一帧后, 由硬件自动置 1.如果在发送,必须用软件清零。 RI:接收中断标志位。接收前必须软件清零,接收过程中保持低电平,接收完一帧后,硬 件置 1.如果再接收,必须软件清零。 REN:串行接收允许位。1-----允许。 SMOD=1,数据传输率加倍。 时间常数 x=256-fosc*(SMOD+1)/(384*数据传输率)

附一段一调试过的源码 #define HEAD 1 #define ADDRESS 2 #define COMM1 3 #define COMM2 4 #define DATA1 5 #define DATA2 6 #define CHECK 7 #define UP4 #define DOWN4 #define LEFT4 #define RIGHT4 0x08 0x10 0x04 0x02

#define LEFT_UP4 #define RIGHT_UP4 #define LEFT_DOWN4 #define RIGHT_DOWN4 #defineIRIS_OPEN3 #defineIRIS_CLOSE3 #defineFOCUS_NEAR3 #defineFOCUS_FAR4 #defineZOOM_WIDE4 #defineZOOM_TELE4 sbit light1= P1^2 ; sbit light2= P1^3 ; void delay(); unsigned char state=HEAD; unsigned char judgment=0; unsigned char t1[7]; void init_serial(); unsigned Data_processing(); void pelco_d(); void main() {

0x0C 0x0A 0x14 0x12 0x02 0x04 0x01 0x80 0x40 0x20

init_serial(); while (1) { if(_testbit_(judgment)) { Data_processing(); } } } void pelco_d() { switch (state) { case HEAD: if(SBUF == 0xff) state = ADDRESS; break; case ADDRESS:

//串口初始化

//PELCO-D 协议接收

if(SBUF == 0x01) { t1[2] = SBUF; state = COMM1; } break; case COMM1: { t1[3] = SBUF; state = COMM2; } break; case COMM2: { t1[4] = SBUF; state = DATA1; } break; case DATA1: { t1[5] = SBUF; state = DATA2; } break; case DATA2: { t1[6] = SBUF; state = CHECK; } break; case CHECK: { t1[7] = SBUF; if (((t1[1]+t1[2]+t1[3]+t1[4]+t1[5])% 0x1000) == t1[7]) 比较第 7 位,相当于 2-6 数据之和%256(0x1000) judgment = 1; else state = HEAD; } break; default: state = HEAD; break; } }

//校验

/*串口初始化*/ void init_serial () { SCON=0x50; 异步通讯方式 TMOD|=0x20; 2.8 位自动重装 PCON|=0x80; 率加倍 TH1=0xF4; 4800,,11.0592 IE|=0x90; TR1=1; PS=1; 先级 } //工作方式 1,8 位 //定时器 1,方式 //SMOD=1,传输 //数据传输率: //允许串行中断 //启动定时器 1 //串口为高中断优

/*串口接收中断函数*/ void serial() interrupt 4 using 1 { if (RI) { RI=0; pelco_d(); }

//串口接收 //清中断

} unsigned Data_processing() { unsigned char i= 0; light1=0; light2=0; if(t1[4]==UP4) { if(t1[6]!=0) 直速度量灯闪 {

//假如检测到上控制信号,根据垂

light1=1; delay(); light1=~light1; while(i<t1[6]); } } else { if(t1[4]==DOWN4) { if(t1[6]!=0) 直速度量灯闪 { light1=1; delay(); light1=~light1; while(i<t1[6]); } } } if (t1[4]==LEFT4) { if(t1[5]!=0) 量灯闪 { light2=1; delay(); light2=~light2; while(i<t1[5]); } } else { if(t1[4]==RIGHT4) { if(t1[5]!=0) 闪 { light2=1; delay(); light2=~light2; while(i<t1[5]); } //假如检测到下控制信号,根据垂

//假如检测到左控制信号,根据水平速度

//假如检测到右控制信号,根据水平速度量灯

} } if (t1[4]==LEFT_UP4) { if(t1[5]&&t1[6]!=0) 按水平速度量再按垂直速度量灯闪 { light1=1; light1=~light1; while(i<t1[5]); light1=1; delay(); light1=~light1; while(i<t1[6]); } } else { if(t1[4]==RIGHT_UP4) { if(t1[5]&&t1[6]!=0) 按水平速度量再按垂直速度量灯闪 { light2=1; light2=~light2; while(i<t1[5]); light2=1; delay(); light2=~light2; while(i<t1[6]); } } } if (t1[4]==LEFT_DOWN4) { if(t1[5]&&t1[6]!=0) 按水平速度量再按垂直速度量灯闪 { light1=1; delay(); light1=~light1; while(i<t1[5]); //假如检测到左上控制信号,根据先

//假如检测到右上控制信号,根据先

//假如检测到左上控制信号,根据先

light1=1; delay(); light1=~light1; while(i<t1[6]); } } else { if(t1[4]==RIGHT_UP4) { if(t1[5]&&t1[6]!=0) //假如检测到右上控制信号,根据先 按水平速度量再按垂直速度量灯闪 { light2=1; delay(); light2=~light2; while(i<t1[5]); light2=1; delay(); light2=~light2; while(i<t1[6]); } } } if(t1[3]==IRIS_OPEN3) //假如检测到光圈打开,灯 1 亮 { light1=1; } else if(t1[3]==IRIS_CLOSE3) //假如检测到光圈关闭,灯 1 灭 { light1=~light1; } if(t1[3]==FOCUS_NEAR3) //假如检测到光圈打开,灯 1 亮 { light2=1; } else if(t1[4]==FOCUS_FAR4) //假如检测到光圈关闭,灯 1 灭 { light2=~light2; } if(t1[4]==ZOOM_WIDE4) //假如检测到 zoomWIDE,灯 1 亮 {

light1=1; light2=1; } else if(t1[4]==ZOOM_TELE4) { light1=~light1; light2=~light2; } if(t1[3]|t1[4]|t1[5]|t1[6]==0) { light1=0; light2=0; } return 0; } void delay() { int x, j; for (x=50000;x>=0;x--) { for (j=1000;j>=0;j--);} } //延时 //假如检测到 ZOOMTELE,灯 1 灭

//假如检测到停止位,灯全灭

Yinxuehui 2011-12-31


相关文章:
C51单片机和电脑串口通信电路图与源码
C51 单片机和电脑串口通信电路图与源码 51 单片机有个全双工的串行通讯口,...(主机)=== ; 功能: 使用串行中断,接收数据并显示 ; 硬件环境: 自制单片机...
C51单片机定时器及数码管控制实验报告_图文
C51单片机定时器及数码管控制实验报告_工学_高等教育...每个中断源都对应中断请求位,它们设置在特 殊...八、 源代码 #include <reg52.h> #include <...
51单片机操作系统的实现+源代码
Keil C51 的集成开发环境,完全可以开发出适用于 51 系列单片机的操作 系统代码...可重入函数任何时候都可以被中断,一段时间后又可以 运行, 而应用数据不会丢失...
51汇编外部中断
计数 60s 后退出定时器 中断并清除显示。 方案...中断 图 2 中断服务子程序流程图 四、 程序源码及...51单片机外部中断C51编... 7页 免费 ©...
基于C51多功能电子密码锁设计源程序代码
基于C51多功能电子密码锁设计源程序代码_电子/电路_...程序首先执行 等待按键并确认有无按键按下的程序段...可进入T0中断去发音 //演奏一个音符 //控制音调 ...
直流电机控制Keil c51源代码
直流电机控制Keil c51源代码_电子/电路_工程科技_专业...个补偿周期结束,计数器清零 //计算实际转速 //...中断设置 void main() { direction=1; //设定...
基于c51的红外解码源代码
基于c51的红外解码源代码 暂无评价|0人阅读|0次下载|举报文档 #include<reg52...说明不 //跳出中断并返回一个值为 0 的按键码, 表明 //关闭定时器 0 //...
at89c51单片机_交通灯控制系统(含源码及仿真图)大全
87c51、 80c31 三个型号;52 系列有 5021、8752、...设置中断工作方式、触发方式、初始化 运行过程 N ...,并用 Proreus 软件自己绘制自己编写程序实现的一个...
51单片机INTO、INT1中断计数c语言源程序
51单片机INTO、INT1中断计数c语言源程序_电子/电路_...的段码 uchar code DSY_CODE[]={0x3f,0x06,0x...前 3 位组,后 3 位组 uchar data Buffer_...
at89c51单片机_交通灯控制系统(含源码及仿真图)
87c51、 80c31 三个型号; 系列有 5021、 52 8752...是一种带 4K 字节闪存可编程可擦除只读存储器(FPE...设置中断工作方式、触发方式、初始化 运行过程 N ...
更多相关标签: