导航:首页 > 操作系统 > 51单片机高电平触发中断代码

51单片机高电平触发中断代码

发布时间:2022-12-26 23:52:47

1. MCS-51单片机外部中断的触发方式如何设定和选择

1、首先在Proteus软件中添加元器件,如下图所示。

2. 小弟新学的C51单片机,编了个电平触发式中断程序,不知道为什么和跳变沿的一样了,诸位大哥大姐帮忙看看

不会的,你这个程序中设置IT0=0,说明是低电平触发,所以只要P3^2口一直是低电平那么主程序停止,所以发光二极管点亮,如果P3^2口变为高电平,主程序继续,发光二极管熄灭。另一种情况是当IT0=1的时候是负跳变触发,就是当P3^2口检测到一个又高电平到低电平的跳变后,触发中断,在中断函数中点亮灯,立即出中断,执行到d1=1时熄灯。看到的现象就是灯闪一下,直到又检测到一个负跳变,灯又闪一下。两种触发方式的现象是不一样的,如果你硬件没问题的话。

3. 求一段51单片机的程序。要求外部中断高电平触发时,定时器0开始计数。

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit la=P2^6;
sbit wela=P2^7;
sbit d1=P1^0;
char num,tt;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(uint z);
void main()
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
EA=1;//开总中?
ET0=1;//开定时器0终中断
TR0=1;//启动定时器0
wela=1;
P0=0xea;
wela=0;
la=1;
P0=0x3f;
la=0;
while(1)
{
if(tt==20)
{
tt=0;
num++;
if(num==16)
num=0;
d1=1;
la=1;
P0=table[num];
la=0;
delay(1000);//o xie le
}
}
}

void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void exter0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
tt++;
}

4. 关于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次中断即可。

5. 51单片机中断程序怎么写

主函数:
EX0=1;
//外部中断0
IT0=1;
//
1:下降沿触发、0:低电平触发
EA=1;
//开启总中断
中断子程序:
void
inter0()
interrupt
0
{}
外部中断1将0换成1。

6. 求一个51单片机简单的中断C语言程序

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit beep=P3^5;
uchar i;
uchar code table1[]={
0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f,};
uchar code table[]= {
0x02 , 0x9F, 0x25, 0x0D , 0x99 ,
0x49 , 0x40, 0x1F, 0x00, 0x08,
0x10, 0xC0, 0x62, 0x84, 0X60, 0x70
} ;
uchar num;
uint m;
void delay(uint z);
void main()
{
EA=1;
EX0=1;
IT0=1;
EX1=1;
IT1=1;
while(1)
{
// EA=1;
// EX0=1;
// IT0=1;
// EX1=1;
// IT1=1;
for(num=0;num<8;num++)
{
delay(50) ;
P2=0X00;
P0=table1[num];
}
}
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void enter0()interrupt 0 //第一个中断无源蜂鸣器响,无源蜂鸣器响要给响,需要不停给高低电平。
{
while(1)
{ P0=0X11;
for(i=100;i>0;i--)
beep=~beep;

}
}

void enter1()interrupt 2 第二个中断是数码管从0到F闪烁。
{
while(1)
{
for(i=0;i<17;i++)
{
P2=0XFF;
P0=table[i] ;
delay(200) ;
}
}

}
注释: P0是控制LED, P2控制数码管。

7. MCS-51单片机中断c语言或汇编编写完整程序

ORG0000H
LJMPMAIN
ORG0003H
LJMPEXT0
ORG0030H
MAIN:
SETBEX0
SETBIT0
SETBEA
CLRP1.0
SJMP$
EXT0:
SETBP1.0
JNBP3.2,$
CLRP1.0
RETI
END

8. 51单片机中设置外部中断0为下降沿触发的语句怎么写啊

51单片机的外部中断是有两种触发方式的,如外部中断0: IT0(TCON.0) ,外部中断 0触发方式控制位。 当IT0=0时,为电平触发方式。 当IT0=1时,为边沿触发方式(下降沿有效)。 51单片机中断系统初始化: 开相应中断源的中断; (IE) 设定中断优先级;(IP) 若为外部中断,设定外部中断的触发方式。 void Outside_Init(void) { EX0 = 1; //开外部中断0 IT0 = 1; //负边沿触发 EA = 1; //开总中断 } void Outside_Int(void) interrupt 0 //外部0中断函数 { EX0 = 0; //关中断 这里写要实现的功能 EX0 = 1; //开中断 }

9. 51单片机外部中断的触发方式

51单片机的外部中断有两种触发方式可选:电平触发和边沿触发。选择电平触发时,单片机在每个机器周期检查中断源口线,检测到低电平,即置位中断请求标志,向CPU请求中断。选择边沿触发方式时,单片机在上一个机器周期检测到中断源口线为高电平,下一个机器周期检测到低电平,即置位中断标志,请求中断。

这个原理很好理解。但应用时需要特别注意的几点:

1) 电平触发方式时,中断标志寄存器不锁存中断请求信号。也就是说,单片机把每个机器周期的S5P2采样到的外部中断源口线的电平逻辑直接赋值到中断标志寄存器。标志寄存器对于请求信号来说是透明的。这样当中断请求被阻塞而没有得到及时响应时,将被丢失。换句话说,要使电平触发的中断被CPU响应并执行,必须保证外部中断源口线的低电平维持到中断被执行为止。因此当CPU正在执行同级中断或更高级中断期间,产生的外部中断源(产生低电平)如果在该中断执行完毕之前撤销(变为高电平)了,那么将得不到响应,就如同没发生一样。同样,当CPU在执行不可被中断的指令(如RETI)时,产生的电平触发中断如果时间太短,也得不到执行。

2) 边沿触发方式时,中断标志寄存器锁存了中断请求。中断口线上一个从高到低的跳变将记录在标志寄存器中,直到CPU响应并转向该中断服务程序时,由硬件自动清除。因此当CPU正在执行同级中断(甚至是外部中断本身)或高级中断时,产生的外部中断(负跳变)同样将被记录在中断标志寄存器中。在该中断退出后,将被响应执行。如果你不希望这样,必须在中断退出之前,手工清除外部中断标志。

3) 中断标志可以手工清除。一个中断如果在没有得到响应之前就已经被手工清除,则该中断将被CPU忽略。就如同没有发生一样。

4) 选择电平触发还是边沿触发方式,TCON 控制寄存器
设置。应从系统使用外部中断的目的上去考虑,而不是如许多资料上说的根据中断源信号的特性来取舍。比如,有的书上说(《Keil C51使用技巧及实战》),就有类似的观点。

10. 51单片机的高级中断无法打断低级中断里的循环,怎么办,具体程序如下

void guangdian() interrupt 2

{ TR0=1;//开启定时器
flag=1;//标志位置1
while(flag==1)
{
fmq=1;//蜂鸣器响
}//使蜂鸣器不断响
}
程序有两个致命问题:
1、中断里面不要使用while,否则其他中断就执行不了了,就是你描述的“高级中断无法打断低级中断”
2、中断里面不要使用延时,中断里面的延时没有执行完,又来中断,导致程序执行效率低下,延时和while等操作尽量放到主程序里执行

阅读全文

与51单片机高电平触发中断代码相关的资料

热点内容
javatomcat图片 浏览:415
程序员生产智能创意 浏览:65
汇和银行app怎么登录 浏览:381
腾讯服务器如何上传源码 浏览:739
单片机的原理概述 浏览:508
火控pdf 浏览:267
如何复制云服务器centos环境 浏览:984
债权pdf 浏览:301
红色番字的app怎么下载 浏览:876
云服务器流程教课 浏览:702
中国农业银行app怎么没有网 浏览:997
几率表算法 浏览:902
程序员理工科 浏览:708
企业邮箱登录收件服务器地址 浏览:558
计算机思维与算法设计的重要性 浏览:664
linux刷新磁盘命令 浏览:76
我的世界如何查看服务器种子pc 浏览:284
linuxlamp编译安装 浏览:609
枚举算法ppt 浏览:184
cmd查看进程命令 浏览:956