19、某单片机系统电路连接如下图,当按键S1闭合时,LED以1S为周期闪烁(亮500ms,灭500
答案:2 悬赏:0 手机版
解决时间 2021-03-17 14:55
- 提问者网友:遮云壑
- 2021-03-16 19:00
19、某单片机系统电路连接如下图,当按键S1闭合时,LED以1S为周期闪烁(亮500ms,灭500
最佳答案
- 五星知识达人网友:孤独的牧羊人
- 2021-03-16 19:49
按键S1 按一下就会进入一次外部中断0 ,这时候你在执行的是 P1^0 取反,就是小灯亮了,然后是延时,然后让小灯灭, 问题就出在延时上, 延时i<500 因为 i 是 unsigned char 的,所以最大只有255,不会达到500 ,程序到这里就停住了, 所以一直亮,
因为你设置外部中断1 最高优先,所以 不妨碍 S2 控制灯灭,
把i改成 unsigned int 的就可以修改一直亮的问题,但是因为你程序问题,会出现,按一下S1 小灯闪烁一次,按一下,小灯闪烁一次, 不会出现周期性闪烁,就是说不会一直闪烁,因为你只是在中断函数里执行的 亮灭 退出中断就不会再执行了
你可以按键S1按下 flag = 1;S2按下flag = 0;
在主循环里 判断flag
if(flag)
{
P1_0 = 0;
延时
P1_0 = 1;
延时
}
else
{
P1_0 = 1;
}
这样写应该是可以达到 周期性闪烁的,
因为你设置外部中断1 最高优先,所以 不妨碍 S2 控制灯灭,
把i改成 unsigned int 的就可以修改一直亮的问题,但是因为你程序问题,会出现,按一下S1 小灯闪烁一次,按一下,小灯闪烁一次, 不会出现周期性闪烁,就是说不会一直闪烁,因为你只是在中断函数里执行的 亮灭 退出中断就不会再执行了
你可以按键S1按下 flag = 1;S2按下flag = 0;
在主循环里 判断flag
if(flag)
{
P1_0 = 0;
延时
P1_0 = 1;
延时
}
else
{
P1_0 = 1;
}
这样写应该是可以达到 周期性闪烁的,
全部回答
- 1楼网友:低血压的长颈鹿
- 2021-03-16 20:48
中断里不要干太多事情,取反延时都在主程序里
#include
sbit P1_0=P1^0;
unsigned char i;
unsigned char j;
unsigned char flag;
void main()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=0;
PX1=1;
while(1)
{
if(flag==1)
{
for(i=0;i<500;i++)
for(j=0;j<125;j++);
P1_0=!P1_0;
}
else P1_0=1;
}
}
void int_0() interrupt 0
{
flag=1;
}
void int_1() interrupt 2
{
flag=0;
}
#include
sbit P1_0=P1^0;
unsigned char i;
unsigned char j;
unsigned char flag;
void main()
{
EA=1;
EX0=1;
EX1=1;
IT0=1;
IT1=1;
PX0=0;
PX1=1;
while(1)
{
if(flag==1)
{
for(i=0;i<500;i++)
for(j=0;j<125;j++);
P1_0=!P1_0;
}
else P1_0=1;
}
}
void int_0() interrupt 0
{
flag=1;
}
void int_1() interrupt 2
{
flag=0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯