外部中断信号接到P3.3口,为INT0中断,程序如下
#include<reg51.h>
sbit X0=P1^0; //用X0表示P1.0
sbit X1=P1^1; //用X0表示P1.1
sbit X2=P1^2; //用X0表示P1.2
void main(void)
{
P1=0x00; //将P1口初始化位高电平,如果没有这句,初始化为低电平,这里可根据需要选择
EA=1; //中断允许
IT1=1; //触发方式为下降沿触发
EX1=1; //外部中断允许
while(1); //这里可以随便写你需要的主程序,我用了个死循环,目的是等待中断
}
void counter1(void) interrupt 2 //INT1中断
{
EX1=0; //禁止外部中断
ET0=1; //计时器中断0允许
ET1=1; //计时器中断1允许
TMOD=0x21; //T1用模式2、T0用模式1
IP=0x0a; //T1、T0为高优先级
X2=~X2; //每次中断就取反P1.2引脚
X1=1; //P1.1输出低电平0.3ms
X0=1; //P1.0输出低电平1.5ms
TH0=0xfd; //T0用模式1,16位计时器,在1.5ms后执行时间中断0
TL0=0x12;
TH1=0x6a; //T1用模式2,8位计时器,在0.3ms执行时间中断1
TL1=0x6a;
TR1=1; //启动计时器T1
TR0=1; //启动计时器T0
while(X0==1); //等待中断响应完成
EX1=1; //允许外部中断
}
void counter2(void) interrupt 1 //定时器0中断
{
X0=0;
}
void counter3(void) interrupt 3 //定时器1中断
{
X1=0;
}
程序已经经过仿真调试,可以完成你的要求,等待加分中。。。。
PS一下,如果满意的话,十分期待给好评,谢谢了
② 51单片机中断程序怎么写
用c语言的话中断程序是单独写在中断服务函数中的,51单片机的中断服务函数的定义:
void functionname(void) interrupt num //functionname是自己定义的函数名字,num对应实际的中断向量号
③ 51单片机中断程序怎么写
主函数:
EX0=1;
//外部中断0
IT0=1;
//
1:下降沿触发、0:低电平触发
EA=1;
//开启总中断
中断子程序:
void
inter0()
interrupt
0
{}
外部中断1将0换成1。
④ 51单片机中断执行过程坐等!!!
51单片机中断执行过程, 如外部中断。
当 CPU 检测到 有 中断触发 信号后,
首先 执行完成 当前执行的指令,将下一条指令 的 地址 压入堆栈,
CPU 进入中断 入口 地址,开始 执行 中断服务程序,
(当然在中断服务程序中不能破坏正常运行 程序的各种 寄存器的 状态 和 数据,)
中断服务 程序执行 完成, 最后 执行 一条 RETI 的中断返回指令,
堆栈 弹出 原先保存的 地址,完成中断服务程序,返回中断前的 下一条指令地址
继续执行 正常程序。
⑤ 关于51单片机的中断。
、中断的概念
CPU在处理某一事件A时,发生了另一事件B请求CPU迅速去处理(中断发生);
CPU暂时中断当前的工作,转去处理事件B(中断响应和中断服务);
待CPU将事件B处理完毕后,再回到原来事件A被中断的地方继续处理事件A(中断返回),这一过程称为中断
二、中断源
在51单片机中有5个中断源
中断号 优先级 中断源 中断入口地址
0 1(最高) 外部中断0 0003H
1 2 定时器0 000BH
2 3 外部中断1 0013H
3 4 定时器1 0018H
4 5 串口总段 0023H
三、中断寄存器
单片机有10个寄存器主要与中断程序的书写控制有关
1.中断允许控制寄存器IE
2.定时器控制寄存器TCON
3.串口控制寄存器SCON
4.中断优先控制寄存器IP
5.定时器工作方式控制寄存器TMOD
6.定时器初值赋予寄存器(TH0/TH1,TL0/TL1)
寄存器详细说明:http://blog.sina.com.cn/s/blog_a05b986d0101545c.html
四、寄存器功能与赋值说明
注:在用到中断时,必须要开总中断EA,即EA=1。 //开总中断
1.中断允许控制寄存器IE
EX0(EX1):外部中断允许控制位
EX0=1 外部中断0开关闭合 //开外部0中断
EX0=0 外部中断0开关断开
ET0(ET1):定时中断允许控制位
ET0=1 定时器中断0开关闭合 //开内部中断0
ET0=0 定时器中断0开关断开
ES: 串口中断允许控制位
ES=1 串口中断开关闭合 //开串口中断
ES=0 串口中断开关断开
2.定时器控制寄存器 TCON //控制外部中断和定时器中断
外部中断:
IE0(IE1):外部中断请求标志位
当INT0(INT1)引脚出现有效的请求信号,此位由单片机自动置1,cpu开始响应,处理终端,而当入
中断程序后由单片机自动置0.
//外部中断,即外部中断相应的引脚接入低电平或下降沿信号时,中断开始响应。
IT0(IT1):外部中断触发方式控制位 //选择有效信号
IT0(IT1)=1:脉冲触发方式,下降沿有效。
IT0(IT1)=0:电平触发方式,低电平有效。
内部中断:
TF0(TF1):内部定时器/计数器溢出中断标志位
当定时器、计数器计数溢出的时候,此位由单片机自动置1,cup开始响应,处理中断,而当进入中
断程序后由单片机自动置0.
//内部中断实际上就是利用内部的计数器,只不过提供计数的脉冲来自单片机自身。
TRO(TR1):定时器/计数器启动位 //启动定时器
TRO(TR1)=1; 启动定时器/计数器0
TR0(TR1)=0; 关闭定时器/计数器0
3.串口控制寄存器SCON
TI:串行口发送中断标志位
当单片机串口发送完一帧数据后,此位由单片机自动置1,而当进入中断服务程序后是不会自动清0的,
必须由用户在中断服务中用软件清0.
RI:串行口接收中断标志位
当单片机串口接收完一帧数据后,此位由单片机自动置1,而当进入中断服务程序后是不会自动清0的,
必须由用户在中断服务软件中用软件清0.
(IP以后补上,TMOD,TL0/TH0 在定时器/计数器中讲)
五、中断结构图:
六、定时器/计数器
1.计数的定义:
计数是指对外部事件进行计数,外部事件的发生以输入脉冲的形式表示,因此计数功能的实质就是对外来
的脉冲进行计数,在单片机中对应引脚T0和T1,两个脉冲输入端。
外部输入的脉冲在负跳变时有效(即外部脉冲由1变化到0),计数器加1.
2.定时器:
定时器是通过计数器的计数来实现的,不过此时的计数脉冲来自单片机的内部,因此定时器的实质是对内
部脉冲的计数,在单片机中,每个机器周期产生一次计数脉冲,计数器加1.
3.工作方式控制寄存器TMOD:
TMOD的低半字节(D0,D1,D2,D3)用来控制定时器/计数器0
TMOD的高半字节(D4,D5,D6,D7)用来控制定时器/计数器1
对TMOD中的内容说明:
GATE——门控制。
GATE=1时,由外部中断引脚INT0、INT1来启动定时器T0、T1。
当INT0引脚为高电平时TR0置位,启动定时器T0;
当INT1引脚为高电平时TR1置位,启动定时器T1。
GATE=0时,仅由TR0,TR1置位分别启动定时器T0、T1。
C/T——功能选择位
C/T=0时为定时功能,C/T=1时为计数功能。
M0、M1——方式选择功能
由于有2位,因此有4种工作方式
4.根据单片机晶振,所选TMOD的的工作方式,所要定的时间,来确定THO和TLO所要赋予的初值
(以12M晶振,工作方式1,16位计数器为例,设所定时间为Xus(16为计数器最大数65536,即65536us,若所
定时间大于65535,则要用if语句控制,现假设X<65535))
1.时钟周期的时间t=1/12M=1/12 us
2.机器周期的时间T=12*1/12=1 us
3.因为每经过一个机器周期计数器+1,所以,计数器+1,经过的时间为 1 us。
若所定时间为X,则要求经过Xus,中断响应,又因为16为计数器要全部置1(即达到65535)+1后,中断才会
响应,所以,初值=(65536-X)
4.将初值转化为16进制码,分别付给THO和TLO
eg:所定时间5ms
初值=(65536-5000)=60536=EC78
TH0=0XEC; TL0=0X78;
(当工作方式不同时,TH0/TL0的赋值也不同,个人觉得有了16位计数器了,其余的没什么用,不介绍了)
5.写程序时另一种THO/TLO赋值方法
TH0=(65536-20000)/256;
TL0=(65536-20000)%6;
这样设置,每经过20ms,发生一次中断,中断时间一般以秒为单位,所以经过n次中断即可。
⑥ c51单片机如何使用中断
将按键接到P3.2(INT0)或P3.3(INT1)
main(){
EA=1;//EA总中断控制,EA=0关,EA=1开
EX0=1;//INT0中断控制。0关1开,按键接P3.2用这个
EX1=1;//INT1中断控制。0关1开,按键接P3.3用这个
//默认情况下,直接使EX0=1或EX1=1来打开中断,INT0、INT1中断是电平触发的
while(1){
//主程序写这里
}
}
/**外部中断0服务程序,按下接P3.2的开关k=0下面程序被执行**/
int0()interrupt0
{
//程序代码写这里面
}
/**外部中断1服务程序,按下接P3.3的开关k=0下面程序被执行**/
int1()interrupt2
{
//程序代码写这里面
}
注意,上面的中断程序,如果执行完后,按键k还没有放开,则中断程序会再次被执行。为了防止这种情况发生,有以下几种处理办法以:
(1)可以在中断程序中进行判断,只有放开了按钮k=1了中断函数才返回。
(2)可以在进入中断后关闭中断,让EX0或EX1=0。然后在主程序中,需要的时候再开起。
⑦ 51单片机汇编语言定时器的使用(中断方式)
(1)
COUNT_INTEQU30H
LEDVALUEEQU31H
ORG0000H
LJMPSTART
ORG001BH
LJMPTimer1Interrupt
START:
MOVSP,#60H
MOVCOUNT_INT,#0
MOVLEDVALUE,#01H
LCALLInitTimer1
LOOP:
MOVA,LEDVALUE
MOVP2,A
LJMPLOOP
InitTimer1:
MOVTMOD,#10H;定时器T1为工作方式1,产生50ms定时
MOVTH1,#3CH
MOVTL1,#0B0H
SETBEA
SETBET1
SETBTR1
RET
Timer1Interrupt:
PUSHDPH
PUSHDPL
PUSHACC
MOVTH1,#3CH
MOVTL1,#0B0H
;========================
INCCOUNT_INT
MOVA,COUNT_INT;每50ms加1,
CJNEA,#2,Timer1Interrupt_EXIT;100ms
MOVCOUNT_INT,#0
MOVA,LEDVALUE
RLA
MOVLEDVALUE,A
;========================
Timer1Interrupt_EXIT:
POPACC
POPDPL
POPDPH
RETI
END
(2)
COUNT_INT_LEQU30H
COUNT_INT_HEQU31H
LEDVALUEEQU32H
ORG0000H
LJMPSTART
ORG001BH
LJMPTimer1Interrupt
START:
MOVSP,#60H
MOVCOUNT_INT_L,#0
MOVCOUNT_INT_H,#0
MOVLEDVALUE,#01H
LCALLInitTimer1
LOOP:
MOVA,LEDVALUE
MOVP2,A
LJMPLOOP
InitTimer1:
MOVTMOD,#20H;定时器T1为工作方式2,产生250us定时
MOVTH1,#00H
MOVTL1,#06H
SETBEA
SETBET1
SETBTR1
RET
Timer1Interrupt:
PUSHDPH
PUSHDPL
PUSHACC
MOVTH1,#00H
MOVTL1,#06H
;========================
INCCOUNT_INT_L
MOVA,COUNT_INT_L;每250us加1,
CJNEA,#40,Timer1Interrupt_EXIT;250US*40=10ms
MOVCOUNT_INT_L,#0
INCCOUNT_INT_H
MOVA,COUNT_INT_H;每10Ms加1,
CJNEA,#10,Timer1Interrupt_EXIT;10ms*10=100MS
MOVCOUNT_INT_H,#0
MOVA,LEDVALUE
RLA
MOVLEDVALUE,A
;========================
Timer1Interrupt_EXIT:
POPACC
POPDPL
POPDPH
RETI
END
⑧ 51单片机定时中断C语言的写法步骤,可追加分数
程序说明:51单片机定时器0工作于方式一,定时50ms中断一次
晶振为12M
#include
void
main
{
TOMD
=
0X01;
//配置定时器0工作于方式一
TH1
=
(65536-50000)/256;
//高八位装入初值
TL1
=
(65536-50000)%256;
//低八位装入初值
ET0
=
1;
//开定时器0中断
EA
=
1;
//开总中断
TR0
=
1;
//启动定时器0
while(1)
{
;
}
}
void
Timer0_int()
interrupt
1
{
//重新装初值
TH1
=
(65536-50000)/256;
//高八位装入初值
TL1
=
(65536-50000)%256;
//低八位装入初值
}
/***************************************************************************************************************/
上面是比较好理解的。如果实在要求简洁的话,看下面的,跟上面功能一样
#include
void
main
{
TOMD
=
0X01;
//配置定时器0工作于方式一
TH1
=
0x3c;
//高八位装入初值
TL1
=
0xb0;
//低八位装入初值
IE
=
0x82;//开总中断并开定时器0中断
TR0
=
1;
//启动定时器0
while(1)
{
;
}
}
void
Timer0_int()
interrupt
1
{
//重新装初值
TH1
=
0x3c;
//高八位装入初值
TL1
=
0xb0;
//低八位装入初值}
⑨ 51单片机中断程序怎么写
//sbit zd=P3^2; //外部中断口 //unsigned char a; void main(void)//主函数{TCON=0x01;EX0=1; //外部中断允许 EA=1;//开总中断while(1){//其他程序}} void int0(void) interrupt 0 //外部中断0 中断子程序{//这里面可以写中断子程序/*a++;if(a==2) a=0;while(!zd)if(a) TR0=1; //开关计时器 else TR0=0;*/} 由于对你的要求“按下INTO接的按键,使单片机执行间隔四灯轮流闪烁的中断子程序”不够理解,只能给你这样一个程序框架了 进入中断要执行中断子程序,不同的中断源要进入不同的中断子程序。对于51的C编程,可以用中断标号,如‘interrupt 0’来使中断进入不同的中断。 中断标号与它们的中断优先级一致,即 外部中断0 interrupt 0 定时器中断0 interrupt 1 外部中断1 interrupt 2 定时器中断1 interrupt3