wjzhongshi 发表于 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++;
}
/***************************************************************************************************/

Mr_Mo 发表于 2012-9-8 22:06:25

你的程序执行一次就没有了。。。
main函数应该弄成以下结构。
int main(void)
{
    //系统初始化。。
    while(1)
    {
      //按键判断、点灯、计时。。。
    }
}

zyyn123 发表于 2012-9-8 22:52:03

楼主,tt是不是没清0呀。

gracialee 发表于 2012-9-9 07:40:46

程序都飞了啊。。。

wjzhongshi 发表于 2012-9-9 10:59:07

gracialee 发表于 2012-9-9 07:40 static/image/common/back.gif
程序都飞了啊。。。

能不能说的具体点呢

gracialee 发表于 2012-9-9 15:04:08

2楼 已经给了你准确的回答。最后的时候,总要有一条停机指令,如SJIMP $,或者是while(1);

wjzhongshi 发表于 2012-9-9 16:18:02

gracialee 发表于 2012-9-9 15:04 static/image/common/back.gif
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++;
}
/***************************************************************************************************/

gracialee 发表于 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、您说不行,怎么一个不行法?您没有进一步说明。。。

lisingch 发表于 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;
                                }
                        }
                }
        }
}

wjzhongshi 发表于 2012-9-10 15:46:57

lisingch 发表于 2012-9-9 21:29 static/image/common/back.gif
我有一段控制led,按一下LED亮;再按一下LED灭,但是没有一分钟后熄灭。楼主参考下。
void lcd_light(void) ...

非常感谢楼上的led程序,感谢大家的帮忙,问题解决了{:lol:}
#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;
       }
}


页: [1]
查看完整版本: 高手进来帮忙看看,这段程序有什么错误,谢谢了