搜索
bottom↓
回复: 9

高手进来帮忙看看,这段程序有什么错误,谢谢了

[复制链接]

出0入0汤圆

发表于 2012-9-8 18:43:15 | 显示全部楼层 |阅读模式
我想实现功能:按一下按键led点亮,在按一下led熄灭,如果按一下后led点亮,1分钟没有在按第二下则自动熄灭led
我是个纯新手搞了好几天了怎么也不行,各位高手能帮我看看嘛,谢谢了先
#include<STC12C2052AD.H>
#define uchar unsigned char
#define uint unsigned int
sbit led= P3^5;//LED
sbit key= P3^4;//按键
uchar id;
uint tt;
void delay (uint a)
{
uint i;
while( --a != 0)
{
  for(i = 0; i < 600; i++);
}         
}


void qhcx ()
{
key=1;//key初始化
led=1;//key初始化
id=0;//id初始化
if(key==0)//判断key是否被按下
{
  delay(20);//延时去抖
  if(key==0)//在判断key是否被按下
  {
   id++;//如果key被按下id自加1
   if(id==1)//判断id是否为1
   {
    led=0;//如果id为1点亮led
    delay(600);
    while(id)
    {
     if(key==0)
     {
      delay(20);
      if(key==0)
      {
       id++;
       if(id==2)
       {
        led=1;
        delay(600);
        id=0;
       }
      }
     }
    }
   }
   
  }
}
}
void main ()
{
  P3=0xff;
  EA=1;
  ET0=1;
  TMOD=0X01;
  TH0=-50000/256;
  TL0=-50000%256;
  TR0=1;
  qhcx();
  if(tt==1200)
   {
    led=1;
   }
}

****************************************************************************************************/
void intserv1 (void) interrupt 1 using 1
{
TH0=-50000/256;
TL0=-50000%256;
tt++;
}
/***************************************************************************************************/

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2012-9-8 22:06:25 | 显示全部楼层
你的程序执行一次就没有了。。。
main函数应该弄成以下结构。
int main(void)
{
    //系统初始化。。
    while(1)
    {
        //按键判断、点灯、计时。。。
    }
}

出0入0汤圆

发表于 2012-9-8 22:52:03 | 显示全部楼层
楼主,tt是不是没清0呀。

出0入0汤圆

发表于 2012-9-9 07:40:46 | 显示全部楼层
程序都飞了啊。。。

出0入0汤圆

 楼主| 发表于 2012-9-9 10:59:07 | 显示全部楼层
gracialee 发表于 2012-9-9 07:40
程序都飞了啊。。。

能不能说的具体点呢

出0入0汤圆

发表于 2012-9-9 15:04:08 | 显示全部楼层
2楼 已经给了你准确的回答。最后的时候,总要有一条停机指令,如SJIMP $,或者是while(1);

出0入0汤圆

 楼主| 发表于 2012-9-9 16:18:02 | 显示全部楼层
gracialee 发表于 2012-9-9 15:04
2楼 已经给了你准确的回答。最后的时候,总要有一条停机指令,如SJIMP $,或者是while(1); ...

根据楼上的提示将程序改了一下,但是还是不行啊!!!问题出在哪里了呢
#include<STC12C2052AD.H>


#define uchar unsigned char
#define uint unsigned int


sbit led= P3^5;//LED
sbit key= P3^4;//按键
sbit jdq= P3^3;//继电器


uchar id;
uint tt;
void delay (uint a)// 1ms延时程序(12MHz 10倍于51单片机速度时)
{
        uint i;
        while( --a != 0)
        {
                for(i = 0; i < 600; i++);
        }                                     
}


void qhcx ()
{
        key=1;//key初始化
        led=1;//key初始化
        id=0;//id初始化
        if(key==0)//判断key是否被按下
        {
                delay(20);//延时去抖
                if(key==0)//在判断key是否被按下
                {
                        id++;//如果key被按下id自加1
                        if(id==1)//判断id是否为1
                        {
                                led=0;//如果id为1点亮led
                                jdq=0;
                                delay(600);
                                while(id)
                                {
                                        if(key==0)
                                        {
                                                delay(20);
                                                if(key==0)
                                                {
                                                        id++;
                                                        if(id==2)
                                                        {
                                                                led=1;
                                                                jdq=1;
                                                                delay(600);
                                                                id=0;
                                                        }
                                                }
                                        }
                                }
                        }
                               
                }
        }
}





void main ()
{
        key=1;
        led=1;
        tt=0;
        P3=0xff;
        EA=1;
        ET0=1;
        TMOD=0X01;
        TH0=-50000/256;
        TL0=-50000%256;
        TR0=1;       
        while(1)
        {
                qhcx();
                if(tt==20)
                        {
                                tt=0;
                                led=1;
                                jdq=1;
                        }
          }
}

void intserv1 (void) interrupt 1 using 1
{
        TH0=-50000/256;
        TL0=-50000%256;
        tt++;
}
/***************************************************************************************************/

出0入0汤圆

发表于 2012-9-9 20:53:04 | 显示全部楼层
本帖最后由 gracialee 于 2012-9-9 20:54 编辑

貌似这是一个路灯管理程序?按一下亮1分钟, 如何没有再按的话,1分钟后熄灯。

有个问题是
while(1)
        {
                qhcx();
                if(tt==20)
                        {
                                tt=0;
                                led=1;
                                jdq=1;
                        }
          }
1、要是TT出现》20的时候了,这是不是永远也不可能清零的了。。。。
2、去抖动是不是太过于麻烦了些?
3、您说不行,怎么一个不行法?您没有进一步说明。。。

出0入0汤圆

发表于 2012-9-9 21:29:12 | 显示全部楼层
我有一段控制led,按一下LED亮;再按一下LED灭,但是没有一分钟后熄灭。楼主参考下。
void lcd_light(void) //LCD背光控制
{
        static unsigned char num = 0;

        if(lcd_key == 0)
        {
                delayms(20);
                if(lcd_key == 0)
                {
                        num++;
                        while(!lcd_key)
                        {
                                if(num == 1)
                                {
                                        lcd_blacK = 0;
                                }
                                       
                                else if(num == 2)
                                {
                                        lcd_blacK = 1;
                                        num = 0;
                                }
                        }
                }
        }
}

出0入0汤圆

 楼主| 发表于 2012-9-10 15:46:57 | 显示全部楼层
lisingch 发表于 2012-9-9 21:29
我有一段控制led,按一下LED亮;再按一下LED灭,但是没有一分钟后熄灭。楼主参考下。
void lcd_light(void) ...

非常感谢楼上的led程序,感谢大家的帮忙,问题解决了
#include<STC12C2052AD.H>
#define uchar unsigned char
#define uint unsigned int

sbit led= P3^5;//LED
sbit key= P3^4;//按键


uint tt;
void delay (uint a)
{
        uint i;
        while( --a != 0)
        {
                for(i = 0; i < 600; i++);
        }                                     
}
void qhcx ()
{
        static unsigned char num =  0;
        if(key == 0)
        {
                delay(20);
                if(key == 0)
                {
                        num++;
                        while(!key)
                        {
                                if(num == 1)
                                {
                                        led = 0;
                                       
                                }
                                else if(num == 2)
                                {
                                        led = 1;
                                        num = 0;
                                }
                        }
                }
        }
}
void InitTimer0(void)
{
    TMOD = 0x01;
    TH0 = 0x15;
    TL0 = 0x0A0;
    EA = 1;
    ET0 = 1;
    TR0 = 1;
}
void main(void)
{
        key = 1;//端口初始化
        led = 1;
        jdq = 1;
        tt=0;
        AUXR = AUXR|0x80;  // T0, 1T Mode
        InitTimer0();
        while(1)
        {
                qhcx ();
        }
}


void Timer0Interrupt() interrupt 1
{
    TH0 = 0x15;
    TL0 = 0x0A0;
    tt++;
         if(tt >=12000 )
         {
                 tt = 0;
                led = 1;
         }
}


回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 22:20

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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