找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2173|回复: 17
收起左侧

给大家拜年啦,请帮我看看LED2为什么不亮,谢谢!

  [复制链接]
ID:60021 发表于 2020-1-27 11:50 | 显示全部楼层 |阅读模式
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
sbit KEY4=P1^3;
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
uchar flag,num;
void delay(uint x)
{
        uint k,j;
        for(k=x;k>0;k--)
        {
                for(j=120;j>0;j--);
        }
}
void Timer_init()
{
        TMOD=1;
        TH0= (65536-50000)/256;               
        TL0= (65536-50000)%256;               
        ET0 = 1;       
        TR0 = 1;
        EA = 1;
}
void Timer0()interrupt 1
{                 
        TH0 = (65536-50000)/256;               
        TL0 = (65536-50000)%256;                       
        flag++;
        if(!KEY1)
        {
                delay(20);
                if(!KEY1)
                {
                        while(!KEY1);
                        switch(num)
                        {
                                case 0:  LED1=0;
                                             if(flag==10)
                                            {                                                                       
                                                 flag=0;
                                                 LED2=0;
                                            };
                                            num++;
                                            break;
                                case 1:                                                                                                                                                
                                                LED3=0;
                                                num++;
                                                break;
                                case 2:                                                                                                                                        
                                                LED4=0;
                                                LED1=1;                                                                       
                                                num=0;
                                                break;
                        }
                       
                }
               
        }
               
}
void main()
{
        Timer_init();
        while(1)
        {
                       
        }
}

回复

使用道具 举报

ID:688286 发表于 2020-1-27 12:38 | 显示全部楼层
单独试一下LED2是不是好的,如果是好的话先让LED1和LED2一起亮,不要加条件,一步步调试
回复

使用道具 举报

ID:688290 发表于 2020-1-27 13:07 | 显示全部楼层
你没有给num一个初值,给上一个初值0试一试
回复

使用道具 举报

ID:235200 发表于 2020-1-27 16:42 | 显示全部楼层
LED2亮起来要有两个条件,第一个条件是按KEY1后且num为0时(首次运行能够达到),第2个条件是flag为10时,这个条件只有50ms时间满足(因为定时计数器0是运行的),而LED2点亮50ms时你可能未肉眼看到,而误认为未亮
回复

使用道具 举报

ID:213173 发表于 2020-1-27 18:10 | 显示全部楼层
因为MCU上电复位后发生中断10次,500ms才出现一次if(flag==10),恰巧此时操作按键且键值num恰巧为0才会点亮LED2,错过这个机会flag不会清0继续自加1,直到溢出归0并在次加到10,才又出现一次if(flag==10)的机会。楼主想点亮LED2是有可能的,但几率非常低,如同中大奖。
回复

使用道具 举报

ID:89515 发表于 2020-1-27 21:03 | 显示全部楼层
num和flag又不能同步判定,怎么亮。逻辑错误了,自己理一下就好了
回复

使用道具 举报

ID:511890 发表于 2020-1-28 02:46 | 显示全部楼层
interrupt 1 是计时器0中断, flag++;放在中断里面, flag=10;只是很短的一瞬间。。说不定你还没按按键,它就过去了。所以你肯定看不到LED2亮。要想根据你的程序让LED2亮,那么把flag==10给改成flag<1000或者flag>100 && flag<1000应该就能看到。看不到再改大点。flag一定要是一个范围,不是==具体数值。不然看不到。毕竟在定时器中断中每执行一次中断的时间间隔很短(一般是毫秒级的),在这一瞬间是看不到变化的。更何况是在这一瞬间还要是你第一次按下按键。。。感觉是强人所难。。。
回复

使用道具 举报

ID:60021 发表于 2020-1-28 12:11 | 显示全部楼层
谢谢,把flag==10,改为flag<1000,就可以了。
回复

使用道具 举报

ID:60021 发表于 2020-1-28 17:43 | 显示全部楼层
wsh62 发表于 2020-1-28 12:11
谢谢,把flag==10,改为flag


没有起到延时的效果
回复

使用道具 举报

ID:68468 发表于 2020-1-28 23:38 | 显示全部楼层
要使LED2亮必须同时具备3个条件:1、KEY1按下抬起;2、num为0;3、flag==10。这几率太低,而且一晃而过,也看不出来。
回复

使用道具 举报

ID:511890 发表于 2020-1-29 00:29 | 显示全部楼层
wsh62 发表于 2020-1-28 17:43
没有起到延时的效果

要起到什么延时效果?有好几种延时效果,具体那种要具体分析。flag<1000的改法是在单片机运行的前一段时间LED2能亮,后面就不亮了。如果是要后面才亮那么要flag>1000。如果是其它的延时效果的话要看具体情况改程序。
回复

使用道具 举报

ID:652775 发表于 2020-1-29 12:56 | 显示全部楼层
flag==0,且刚好num=0,LED2才亮,要求那么高?自己模拟看看
回复

使用道具 举报

ID:60021 发表于 2020-1-29 17:09 | 显示全部楼层
我把程序改成如下:LED2就工作正常了,但是还有个问题,在 case 0:这条语句还没有执行完,想执行 case 1:和 case 2:这就不行了,必须要把 case 0:的程序运行完才可以执行下条程序。请大师不吝赐教,谢谢!

#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
sbit KEY4=P1^3;
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
uchar flag,num;
void delay(uint x)
{
        uint k,j;
        for(k=x;k>0;k--)
        {
                for(j=120;j>0;j--);
        }
}
void Timer_init()
{
        TMOD=1;
        TH0= (65536-50000)/256;               
        TL0= (65536-50000)%256;               
        ET0 = 1;       
        TR0 = 1;
        EA = 1;
}
void Timer0()interrupt 1
{                 
        TH0 = (65536-50000)/256;               
        TL0 = (65536-50000)%256;                       
        flag++;
}
void main()
{
        num=0;
        Timer_init();
        while(1)
        {
                if(!KEY1)                       
                {
                        delay(20);
                       
                        if(!KEY1)
                        {
                                while(!KEY1);
                                switch(num)
                                {
                                        case 0: LED1=0;
                                                   delay(2000);
                                                   if(flag>20 && flag<200)
                                                   {                                                                       
                                                        flag=0;
                                                        LED2=0;
                                                        delay(2000);
                                                        LED2=1;
                                                }
                                                LED1=1;
                                                num++;
                                                break;
                                        case 1:                                                                                                                                                
                                                LED3=0;
                                                num++;
                                                break;
                                        case 2:                                                                                                                                        
                                                LED4=0;                                                                               
                                                num=0;
                                                break;
                                         }                       
                                 }
                      }
           }
}
回复

使用道具 举报

ID:68468 发表于 2020-1-29 20:37 | 显示全部楼层
不明白楼主的意思,楼主如果不想执行完case 0那就把break 放在想终止的地方不就完了吗?另外,case 1、case 2的执行是由num的值决定的,想执行case 1、 case 2得让num=1、=2才行。
回复

使用道具 举报

ID:511890 发表于 2020-1-30 03:55 | 显示全部楼层
switch语句只能用break跳出。如果执行到哪要让程序跳出switch语句,那么就在那里用
if(跳出条件(如key2)) {num++;break;}那么你按下key2,程序就跳出case了。num++啦,关灯操作了(如果需要)也都放进去。这个是switch 和if镶套。应该不难想到呀。
回复

使用道具 举报

ID:60021 发表于 2020-1-30 11:24 | 显示全部楼层
我意思是按KEY1第一次,执行case 0: 里的程序,当case 0: 里程序还没有运行完,又第二次按下KEY1,他不会马上去执行case 1: 里的程序,他要把case 0: 里程序执行完后,再按KEY1时,才能执行case 1: 里的程序,就这个问题,我搞了好久,没搞定。
回复

使用道具 举报

ID:688784 发表于 2020-1-30 15:14 | 显示全部楼层
试一试灯是不是断路了,在看看初值
回复

使用道具 举报

ID:239055 发表于 2020-1-31 07:16 来自手机 | 显示全部楼层
你亮的时间太短了,几乎看不见
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表