STC单片机:程序目的就是产生一个1ms的中断,然后经过1000*300次=5min,将P1.5的状态改变一下,中断就进不去

STC单片机:程序目的就是产生一个1ms的中断,然后经过1000*300次=5min,将P1.5的状态改变一下,中断就进不去,第1张

(1)程序不会超限,但是你要注意。在新建项目的时候不要把A51这个默认的带进来。这样就不会超限了。

(2)你while(1);最好写成这样while(1){;;};让程序进行空 *** 作。

单片机有时候 就是有这样的爱好,非要来点空 *** 作才比较爽。

(3)你时钟要注意,我现在把时间 改得比较短,反正是能运行的。你自己再试试我的程序。

#include"reg51h"

#include"intrinsh"

#define FOSC 6000

#define T1MS (65536-6000)

sfr AUXR=0x8e;

sfr CLK_DIV=0x97;

sbit TEST_LED = P1^5;

int count=2;

int innercount=2;

void main(void)

{

AUXR=0x80;

CLK_DIV=0x00;

TMOD=0x01;

TL0= T1MS%256;

TH0=T1MS/8;

TR0=1;

ET0=1;

EA=1;

TEST_LED=0;

while(1);

{

;;

}

}

void T0_isr(void) interrupt 1

{

TL0= T1MS%256;

TH0=T1MS/8;

if(count--==0)

{

count=2;

if(innercount--==0)

{

TEST_LED=!TEST_LED;

innercount=2;

}

}

}

请问你这个触发中断是一个按键?你触发的方式是长时间按下还是瞬间按下?我觉得你应该是长时间按下的。回到正题,你这个中断服务函数里只有一句代码,那么中断服务函数执行的速度会很快的,所以如果你只按了一下的话那么看起来就感觉没有执行一样,更重要的是你这个中断服务函数里没有对按键进行消抖,同时也没有关闭中断,这就可能会引起,当你瞬间按下中断按钮后,其实中断被执行了多次,而当你长时间按下中断按钮后,那么程序会不停的在main和中断服务函数之间快速不停的切换,这就导致了main函数断断续续的运行,看起来就像是main运行变慢了,其实是因为程序需要不停的进入中断服务函数,所以看起来就像运行变慢一样。

改进建议:在中断服务函数里加入按键消抖的语句,或是直接进入中断后关闭中断,处理完后再开启。而且如果想明显的看到效果的话请在中断服务函数里加一些延时语句。

P4 EQU 0C0H

ORG 0000H

LJMP MAIN

ORG 0003H

LJMP EXT0

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

    MOV TMOD,#01H

    MOV TH0,#HIGH(65536-50000)

    MOV TL0,#LOW(65536-50000)

    SETB TR0

    SETB ET0

    SETB EX0

    SETB IT0

    SETB EA

    MOV R3,#10

    MOV R2,#0

    CLR P17

    SJMP $

EXT0:

    CLR TR0

    RETI

T0ISR:

    CLR TR0

    MOV TH0,#HIGH(65536-50000)

    MOV TL0,#LOW(65536-50000)

    SETB TR0

    DJNZ R3,T0E

    MOV R3,#10

    MOV A,R2

    CLR C

    RRC A

    JNZ T01

T00:

    CPL P17

    RETI

T01:

    DEC A

    JNZ T02

    CPL P47

    RETI

T02:

    DEC A

    JNZ T03

    CPL P27

    RETI

T03:

    MOV R2,#0

    SJMP T00

T0E:

    INC R2

    RETI

    END

教你一招,不同晶振下都方便

#include<reg52h>

#define CPU_Fosc 11059200UL //输入晶振频率Hz,程序自动适应5MHz~21MHz

#define TIME 10000 //定时时间10000us,程序自动适应100us~20ms

THH = ( (65536- TIME(CPU_Fosc/100)/120000 )/256 ); //定时器高8位自动基准

TLL = ( (65536- TIME(CPU_Fosc/100)/120000 )%256 ); //定时器低8位自动基准

unsigned char i;

main()

{

P2=0xff;

TMOD=0X01; //一般用方式1

EA=1;

ET0=1;

TH0 = THH;

TL0 = TLL;

TR0=1;

while(1);

}

void time0() interrupt 1 //定时器0

{

TH0 = THH;

TL0 = TLL; //重新装初值

P2--;

}

void adc_isr() interrupt 5 using 1

{

ch++;

}

请教您是如何测试判断,程序根本就没有进入过AD的中断处理程序

0——外部中断0

1——定时器0中断

2——外部中断1

3——定时器1中断

4——串口中断

附加的:

5——定时器2中断

外部中断 > 定时器中断 > 串口中断,0 > 1

以上就是关于STC单片机:程序目的就是产生一个1ms的中断,然后经过1000*300次=5min,将P1.5的状态改变一下,中断就进不去全部的内容,包括:STC单片机:程序目的就是产生一个1ms的中断,然后经过1000*300次=5min,将P1.5的状态改变一下,中断就进不去、stc51单片机的外部中断问题、51单片机编程:用外部中断编程,型号是STC15等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址: http://outofmemory.cn/zz/9534048.html

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

发表评论

登录后才能评论

评论列表(0条)

保存