51单片机上电位复位时什么中断源

51单片机上电位复位时什么中断源,第1张

标准51有5个中断向量(不算复位),分别是外部中断0,定时器0,外部中断1,定时器1,串行口;总共有6个中断标志,串行口的发送和接受共享一个中断向量。

各个终端标志产生情况如下:

外部中断可以设置边沿触发或者电平触发,边沿触发进入中断程序后硬件自动清中断标志,电平触发需要软件清标志位;

定时器T0,T1计数溢出产生中断,进入中断程序硬件自动清标志位;

串行口发送完成或者接收到数据就触发中断,由于是两个中断标志共享一个中断向量,所以需要在中断程序里由软件判断是发送中断还是接受中断,并且只能由软件清标志位;

以上是标准51的中断系统,52由于多了一个T2定时器(T2定时器跟T0,T1功能相差很大,T2要强大很多),因此多了一个中断向量2个中断标志(溢出中断和T2外部中断),T2中断标志必须由软件清除标志位

中断使能位于IE寄存器

各中断标志位于相应的模块控制寄存器里面

模块 位地位 位名称 说明

T1 TCON7 TF1 T1溢出标志

T0 TCON5 TF0 T0溢出标志

T2 T2CON7 TF2 T2溢出中断标志

T2CON6 EXF2 T2外部中断标志

外部中断1 TCON3 IE1 外部中断1标志

外部中断0 TCON1 IE0 外部中断0标志

串行口 SCON1 TI 发送中断标志

SCON0 RI 接受中断标志

51看1、先初始化,设置外部中断、串口工作模式,开中断;2、写中断服务程序;//--------------------------------------------///初始化//--------------------------------------------/voidinit(void){TMOD|=0x20;//工作模式SCON=0x50;TH1=0xfd;//定时器1初值,设置波特率TL1=0xfd;//波特率为9600TR1=1;//启动定时器1ES=1;//串口中断允许工作于方式1IT0=1;//外部中断0下降沿触发方式IT1=1;//外部中断1下降沿触发方式EX0=1;//开外部中断0EX1=1;//开外部中断1EA=1;//开总中断}////中断服务程序//voidint0(void)interrupt0//外部0中断服务{}//--------------------------------------------//复位中断//--------------------------------------------voidint1(void)interrupt2//外部1中断服务{}//--------------------------------------------/voiduart(void)interrupt4//串口中断{uchar;if(RI)//接收{RI=0;ud=SBUF;//取收到的字节}elseTI=0;//发送完成}

你需要先缩小问题的范围:

1、先不要用看门狗

2、将程序中的中断关闭(EA=0),如果还复位就是硬件的问题

3、试着一个一个地允许中断(有多个中断时可能还需要组合),碰到哪个中断被允许后出现复位,问题往往就出在那里

4、有时候问题并不一定在中断程序中,看不到程序很难说。通常可能的几种情况:堆栈不平衡、堆栈溢出、意外访问SFR等等

#include "reg52h"

#define u8 unsigned char

#define u16 unsigned int

#define u32 unsigned long

u16 ms=0;

u32 sec=0;

u8 flag=0;

sbit sb=P1^0;

void time_init(void)//计时器初始

{

TMOD=0x01;

TH0=-1000/256;//1ms定时

TL0=-1000%256;

TR0=1;

ET0=1;

EA=1;

}

//扫描按键

u8 ajsm(void)

{

static u8 key_ms;

static u8 key_s;

if(sb==0)

{

if((key_s==0)&&(++key_ms>=5))//松手加去抖,我习惯用的按键扫描方式

{

key_s=1;

return 1;

}

}

else

{

key_s=0;

key_ms=0;

}

return 0;

}

void main(void)

{

time_init();

while(1)

{

if(ajsm()==1)//按键按下

{

sec=0;

ms=0;

}

}

}

void t0_int(void)interrupt 1

{

if(++ms>=1000)//1秒到

{

ms=0;

sec++;

if(sec>=605)//5分钟

{

sec=0;

}

}

TH0=-1000/256;

TL0=-1000%256;

}

硬件电路上用一个I/O口连接到复位端,然后直接在单片机的中断程序的最后加一个控制该I/O口的电平的指令就好了。或者我百度的其他人的资料:

这不是复位,只是把程序转到地址0去执行,不如用一个JMP更直接。目前可能极少数单片机或者用户已经自行添加Boot load时用户程序的程序开始地址并不为0x0000,所以需要查找这些特定单片机的启动地址。

在keil C51下面可以这样实现:

void soft_reset(void)

{

((void (code ) (void)) 0x0000) ();

}

在需要软件复位的地方使用语句:

soft_reset();

一般可实现软件复位。

以上就是关于51单片机上电位复位时什么中断源全部的内容,包括:51单片机上电位复位时什么中断源、中断初始化配置方法、为什么我的89S52单片机产生外部中断就自动复位等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9678787.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存