[求助] 中断控制程序中加定时器延时子程序,外部中断后灯一直暗。

后中争先 2012-10-14 08:16:19

#include <reg51.h>
void delay(unsigned char x);/*延时x秒*/
void main()
{
IT0=1;
EA=1;
EX0=1;
for(;;)
P1=0x00;
}
void f()interrupt 0
{
P1=0xff;
delay(1);
}
void delay(unsigned char x)
{
unsigned char i,j;
for(j=1;j<=x;j)
for(i=1;i<=20;i++)/*一秒*/
{
TMOD=0x01;
TH0=0x3c;
TL0=0xB0;
TR0=1;
while(!TF0);
TF0=0;
}
}
...全文
442 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
aydf1 2012-10-30
  • 打赏
  • 举报
回复
中断里面不要放延时
h_w_m 2012-10-29
  • 打赏
  • 举报
回复
//这个程序在楼主的程序需求上改进了一点点
//演示了有外部中断处理、外部中断的延时防抖、时间中断处理、有中断情况下的delay()写法
//不见得是最好的模式,但可以实用,也方便的扩展 所谓
//“多任务”不过是更复杂一点,依旧是一个程序而已 希望本程序起到抛砖引玉的作用,

#include <reg51.h>
bit tictflag;
unsigned char data ex0delay;
unsigned int data delaytime,_delaytime;

unsigned int code delaylist[] = {1000,1500,2000,2500,3000};

void delay(unsigned char x);/*延时x秒*/

void main()
{
unsigned char index;
//初始化
P1 = 0x00;
TMOD = 0x02;
TH0 = 0x38;//0.2ms每次
TL0 = 0x38;
TR0 = 1;

ET0 = 1;
IT0 = 1;
EX0 = 1;

_delaytime = delaylist[0];
index = 0;

EA = 1; //中断总开关开启前, 初始化要做完

while(1)
{
_delaytime = delaylist[index];
delay(60);//每分钟变更一次亮起时长 外部中断发生后时分别亮起 1秒 / 1.5秒 / 2秒 / 2.5秒 / 3秒
if(++index>=5)
index=0;
}
}

void EX0_fun() interrupt 0 using 2
{
if(ex0delay==0)
{
P1=0xff; //亮起
delaytime = _delaytime; //设置亮起时间 误差0到-1毫秒
ex0delay = 20; //延时防抖,每次发生中断则20毫秒内忽略外部中断信号不处理
}
}

void TIME0_fun() interrupt 1 using 1 //0.2毫秒溢出一次 把1毫秒分成五个时间片
{
static unsigned char data tict = 0;
if(++tict>=5)
tict = 0;
switch(tict) //每个case都是1毫秒执行一次
{
case 0: //让每个case中的代码运行时间少于0.2毫秒
if(delaytime)
{
delaytime--;
if(delaytime==0)
P1=0x00; //熄灭
}
break;
case 1:
if(ex0delay)
ex0delay--;
break;
case 2:
break;
case 3:
break;
case 4:
break;
}

tictflag = 1; //0.2毫秒每次改写信号 配合delay()计时
}

void delay(unsigned char x) //延时x秒,总误差0到-0.2毫秒
{
unsigned char data t,m = x;
unsigned int data i;
while(m--)
{
for(i=1000; i>0; i--)
for(t=5; t>0; t--)
{ //首轮除外 每轮延时都是0.2毫秒
tictflag = 0;
while(!tictflag);//<<< 利用了时间中断信号,初始化完成之前不得调用此函数
//几乎不受外部中断和时间中断的影响,前提是时间中断和外部中断的处理时间之和总小于一个时间片(即小于0.2毫秒)
}
}
}
Binzo 2012-10-19
  • 打赏
  • 举报
回复
都没看都中断使能开、关。
蒲公英的翅膀 2012-10-19
  • 打赏
  • 举报
回复
你是想通过外部中断比如按键实现还是……?
定时器初始化为什么还放在延时函数里呢?初始化一遍就够了啊!
中断函数名没那样写的吧,至少得让人直观地看懂什么中断啊~
建议先多看下别人的基本例程,先规范一下格式~
woshi_ziyu 2012-10-16
  • 打赏
  • 举报
回复
中断里面不要放延时
dsoyy 2012-10-15
  • 打赏
  • 举报
回复
这程序,一沓糊涂。

延时怎么还有寄存器的设置??
定时器怎么还有延时?

目的是什么,逻辑不清啊。

找找例程,学一学,理清思路在写。

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧