[51单片机] 51单片机中断和定时的问题

[复制链接]
1982|13
 楼主| Easy_Deng 发表于 2014-3-21 21:41 | 显示全部楼层 |阅读模式
51单片机外中断0为下降沿触发,触发后开始定时两毫秒然后产生一个1毫秒的高电平怎么做
 楼主| Easy_Deng 发表于 2014-3-21 21:43 | 显示全部楼层
时序如下

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
df_flying 发表于 2014-3-21 21:54 | 显示全部楼层
加个定时器,下降沿中断触发定时器,定个几百us什么的,用定时器中断产生所需电平...
ningling_21 发表于 2014-3-21 22:18 | 显示全部楼层
在外部中断中启动定时器2毫秒的,2毫秒定时中断后把管脚置1同时关闭定时器,同时启动另一个定时器1毫秒的,中断后关闭定时器,等下一个下降沿信号...
弹弓 发表于 2014-3-21 22:50 | 显示全部楼层
楼上方法可行。
 楼主| Easy_Deng 发表于 2014-3-22 08:48 | 显示全部楼层
ningling_21 发表于 2014-3-21 22:18
在外部中断中启动定时器2毫秒的,2毫秒定时中断后把管脚置1同时关闭定时器,同时启动另一个定时器1毫秒的, ...

好的,我试试,谢谢哦
651927693 发表于 2014-3-22 08:55 来自手机 | 显示全部楼层
你的描述和最后的解决方案也只有一步之遥,自己稍微思考下就出来了呀。
ayb_ice 发表于 2014-3-22 09:10 | 显示全部楼层
产生外部中断后,直接在中断延时产生信号就搞定了
 楼主| Easy_Deng 发表于 2014-3-22 15:05 | 显示全部楼层
ningling_21 发表于 2014-3-21 22:18
在外部中断中启动定时器2毫秒的,2毫秒定时中断后把管脚置1同时关闭定时器,同时启动另一个定时器1毫秒的, ...

我不知道问题出在哪里了,仿真一直为高电平,程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit shuchu=P0^0;

//*********主函数*********//
void main()
{
TMOD=0x11;                                         //定时器T0模式1,定时T1模式1
EA=1;                                                 //总中断开
TH0=(65536-2000)/256;                 //12Mhz定时2MS
TL0=(65536-2000)%256;
TH1=(65536-1000)/256;                 //12Mhz定时1MS
TL1=(65536-1000)%256;
EX0=1;                                                 //允许外中断0
IT0=1;                                                 //下降沿触发
}

//**********外中断0中断函数*********//
void EX0_time() interrupt 0
{
     EX0=0;                                                //关闭外中断0
     ET0=1;                                                 //定时器T0中断开
     TR0=1;                                                 //定时器T0开
}

//**********定时器T0中断函数*********//
void T0_time() interrupt 1
{
shuchu=1;                                         //2毫秒后输出高电平
ET1=1;                                                 //定时器T1中断开
TR1=1;                                                 //定时器T1开
TR0=0;                                                 //定时器T0关
TH0=(65536-2000)/256;                 
TL0=(65536-2000)%256;
}

//**********定时器T1中断函数*********//
void T1_time() interrupt 3
{
TR1=0;                                       //定时器1关闭
shuchu=0;                                   //1毫秒后输出拉低                    
TH1=(65536-1000)/256;
TL1=(65536-1000)%256;
EX0=1;                                      //允许外中断0
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
ningling_21 发表于 2014-3-22 15:30 | 显示全部楼层
Easy_Deng 发表于 2014-3-22 15:05
我不知道问题出在哪里了,仿真一直为高电平,程序如下:
#include
#define uchar unsigned char

主程序怎么连个 while(1); 都没有...
lkl0305 发表于 2014-3-22 18:15 | 显示全部楼层
如上,主函数必须设置成死循环(while(1)),不然你的主函数执行完后,单片机执行哪里的程序了?
天风立马 发表于 2014-3-22 20:37 | 显示全部楼层
遇到问题先自己想,实在想不通再问。多查资料。问、答、用。你却不能融汇贯通,再遇到问题,你还得问,没有自己的解决思路。当然某些时候还是拿来主义优先,不造车轮。起步阶段还是自己明白为主。
张_彦雷 发表于 2014-3-22 22:26 | 显示全部楼层
ningling_21 发表于 2014-3-22 15:30
主程序怎么连个 while(1); 都没有...

一个定时器就行,每一毫秒计数加一初始为零,等于三时清零,等于零时设为低电平在等于2时取反,再等于零时取反就行了。
 楼主| Easy_Deng 发表于 2014-3-23 21:02 | 显示全部楼层
ningling_21 发表于 2014-3-22 15:30
主程序怎么连个 while(1); 都没有...

谢谢哦,问题解决了,自己不小心忘了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

14

主题

27

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部