完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
实验:要求是开机的时候led1灯点亮闪烁,用杜邦线给P32(外部中断0)接低电平时,led2灯点亮,led1灯熄灭。去除杜邦线P32回到高电平时,led1点亮闪烁,led2灯熄灭。
问题:现在问题是当给P32低电平的时候led2点亮了,但led1没有熄灭,而是闪烁的速度变慢了?P32回到高电平时,led2还是一直亮着? #include #define uint unsigned int #define uchar unsigned char void delay(uint); ***it led2=P2^7; //中断时点亮这LED灯 ***it led1=P2^0; void main() { EA=1; EX0=1; led1=0; //点亮LED灯 delay(1000); //延时 led1=1; //熄灭LED灯 delay(1000); ////延时 } void exter0() interrupt 0 { led2=0; } void delay(uint z) { uint x; uchar y; for(x=z;x>0;x--) for(y=1000;y>0;y--); } |
|
相关推荐
9个回答
|
|
中断触发方式勒 寄存器都没配置全
|
|
|
|
你好,选用外部中断时需要选择是触发方式,你这里用低电平触发,应该在初始化加一句IT0=0; //为1是高电平触发。
第二点,不管写任何程序都需要写大循环while(1);这里的led1=0; delay,led1=1;delay(1000); 应该写在while(1)里面循环。 第三点,你在外部中断里面只写了点亮led2。并没有写熄灭led1. 暂时只看出这三点,慢慢改吧。 |
|
|
|
上面说错了,为1是下降沿触发。
|
|
|
|
|
|
|
|
还需在while(1)大循环中加入led2=1;这样退出中断后就可以将led2熄灭
|
|
|
|
二楼说的对
|
|
|
|
七七德德 发表于 2015-8-1 10:26 书上说,要是不设置触发方式就默认是低电平触发的。 |
|
|
|
我把“led1=0; delay,led1=1;delay(1000); ”“放在while(1)大循环里。退出外部中断时也写了熄灭led2,现在给低电平时,led2灯亮了,但led1还是闪着,但闪烁的速度比之前慢了,
我在中断服务程序内容里面加上led1=1时,给低电平时,led2亮时,led1就可以熄了,但为什么要在中断服务里加上led1=1才能让led1灯熄呢?不是一直给中断低电平时,led2就一直亮着,led1不是已经中断了,为什么还会亮着的? #include #define uint unsigned int #define uchar unsigned char void delay(uint); ***it led2=P2^7; //中断时点亮这LED灯 ***it led1=P2^0; void main() { EA=1; EX0=1; IT0=0; while(1) { led2=1; led1=0; //点亮LED灯 delay(1000); //延时 led1=1; //熄灭LED灯 delay(1000); ////延时 } } void exter0() interrupt 0 { led2=0; led1=1; //为什么要写led1=1才能让中断时led1灯灭呢,不是中断启动的时候已经把led1灯灭了吗? } void delay(uint z) { uint x; uchar y; for(x=z;x>0;x--) for(y=1000;y>0;y--); } |
|
|
|
char flag=1;// 定义一个变量 规定值为1时led1亮 值为0时led1不亮 flag在中断中赋值为0 就是说当中断执行的时候 main里边的while就不要管led了
//这个在理论上是多余的 但是单片机运行的比较快 会给我们错觉 按下按键触发中断时 感觉上是按了一次 实际上处理了好几次 //感觉上正在执行中断代码 实际上在一段很短的时间内 执行了N个中断 b*N个while里的点led1 现象就是led1在那里闪 //led点亮也是要有电流 且持续一段时间才可以的 时间不足会暗或闪 呼吸灯就是这么搞得 可以利用占空比控制你的led成为呼吸灯 //所以实际应用要用好点的按键不要用生锈的、程序上注意消抖、等等 ***it KEY1 = P3^2;// p32可能是接的按键 。。。。。。。。(此处略去几个字) void main() { EA=1; EX0=1; IT0=0; while(1) { if(flag==1)//正常执行循环点灯 { led2=1; led1=0; //点亮LED灯 delay(1000); //延时 led1=1; //熄灭LED灯 delay(1000); ////延时 } } } void exter0() interrupt 0 { Delay(2); //为了按键按下消抖 if(KEY1 == 0) //低电平了 { flag=0;// while循环里 led1不可以亮了 led2=0;//点led flag=1;//while又起作用了 } Delay(30); 为了按键抬起消抖 } ........(此处略去一些字) 还可以利用定时中断让led1闪烁,在外中断里控制定时中断的使能 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
158 浏览 0 评论
【敏矽微ME32G070开发板免费体验】之原厂2812测试例程解析
237 浏览 0 评论
655 浏览 1 评论
《DNESP32S3使用指南-IDF版_V1.6》第二十六章 INFRARED_RECEPTION实验
563 浏览 0 评论
862 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12034 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 19:24 , Processed in 0.632054 second(s), Total 55, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号