打印

闹钟设置哪里有问题!望高手帮忙解决

[复制链接]
1999|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 funfactory 于 2011-6-11 17:14 编辑

问题闹钟设置程序
#include <reg51.h> 
#define uchar unsigned char
#define uint unsigned int
unsigned char code dispcode[]={  
0x3f,  /*0*/
0x06,  /*1*/
0x5b,  /*2*/
0x4f,  /*3*/
0x66,  /*4*/
0x6d,  /*5*/
0x7d,  /*6*/
0x07,  /*7*/
0x7f,  /*8*/
0x6f,  /*9*/
0x40,  /* */};

unsigned char dispbuf[8]={0,0,10,0,0,10,0,0};
unsigned char clok_dispbuf[8]={0,0,10,0,0,10,0,0};
unsigned char dispbitcnt=0;
unsigned char second = 57;
unsigned char minite = 58;
unsigned char hour = 11;
unsigned int tcnt;
unsigned char mstcnt;
unsigned char i,j,k,flag,a,b,c,n;
uchar clok_second=0;
uchar clok_minite=0;
uchar clok_hour=0;
uchar clock_set;


sbit ksec=P0^0;
sbit kmin=P0^1;
sbit khour=P0^2;
sbit kalrm = P0^3;
sbit fmq = P2^7;
sbit led = P0^7;




void init()   
{
        TMOD=0X11;
        TH0=(65536-50000)/256;                //50ms
        TL0=(65536-50000)%256;
        TH1=(65536-1000)/256;                //1ms
        TL1=(65536-1000)%256;
        ET0=1;         ET1=1;
        TR0=1;         TR1=1;
        EA=1;
}

void delay(uint z)
{
        uint i, j;
        for (i=z; i>0;i--)
                for (j=110; j>0; j--);
}

void buzzer(uint h)
{
        for (k=h; k>0; k--)
        {       
                fmq = ~fmq;
                delay(1);
        }
}


void key_set()
{
        if(ksec==0)
    {
      for(i=5;i>0;i--)
      for(j=248;j>0;j--);
      if(ksec==0)
      {
                  buzzer(850);
          second++;
          if(second==60)
          {
             second=0;
           }
          dispbuf[0]=second%10;
          dispbuf[1]=second/10;
          while(ksec==0);
        }
      }
      if(kmin==0)
      {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
          if(kmin==0)
            {
                          buzzer(850);
              minite++;
              if(minite==60)
                {
                  minite=0;
                }
              dispbuf[3]=minite%10;
              dispbuf[4]=minite/10;
              while(kmin==0);
            }
        }
      if(khour==0)
      {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
          if(khour==0)
           {
                          buzzer(850);
              hour++;
              if(hour==24)
                {
                  hour=0;
                }
                                dispbuf[6]=hour%10;
                                dispbuf[7]=hour/10;

              while(khour==0);
            }
       }
if (clock_set == 1)
{
        if(ksec==0)
    {
      for(i=5;i>0;i--)
      for(j=248;j>0;j--);
      if(ksec==0)
      {
                  buzzer(850);
          clok_second++;
          if(clok_second==60)
          {
             clok_second=0;
           }
          clok_dispbuf[0]=clok_second%10;
          clok_dispbuf[1]=clok_second/10;
          while(ksec==0);
        }
      }
      if(kmin==0)
      {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
          if(kmin==0)
            {
                          buzzer(850);
              clok_minite++;
              if(minite==60)
                {
                  clok_minite=0;
                }
              clok_dispbuf[3]=clok_minite%10;
              clok_dispbuf[4]=clok_minite/10;
              while(kmin==0);
            }
        }
      if(khour==0)
      {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
          if(khour==0)
           {
                          buzzer(850);
              clok_hour++;
              if(clok_hour==24)
                {
                  clok_hour=0;
                }
                                clok_dispbuf[6]=clok_hour%10;
                                clok_dispbuf[7]=clok_hour/10;
              while(khour==0);
            }
       }
        }                  
}

void alarm_set()
{
        if (kalrm == 0)
        {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
                //delay(10);
                if (kalrm == 0)
                {
                        buzzer(850);        //蜂鸣器按键音       
                        clock_set++;                //闹钟设置标志位
                       
                        if (clock_set == 1)
                        {
                                led = 0;                //设置时led灯亮
                                key_set();                //按键控制时间的加减

                        }
                        if (clock_set == 2)
                        {
                                clock_set = 0;
                                led = 1;
                        }
                                       
                }
               
        }
}


void main(void)
{
        init();
        while(1)
    {


                key_set();
                alarm_set();
                if ((second==clok_second)&&(minite==clok_minite)&(&hour==clok_hour)&&(clock_set==0))
                {
                        for (n=100; n>0; n--)
                        {
                                buzzer(5000);
                        }
                }
                if ((second==0)&&(minite==0))                //整点报时
                {
                  buzzer(3000);       
                }
    }
}
void t0(void) interrupt 1  //
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        tcnt++;
  if(tcnt==20)
    {
      tcnt=0;
      second++;
      if(second==60)
        {
          second=0;
          minite++;
          if(minite==60)
            {
              minite=0;
              hour++;
              if(hour==24)
                {
                  hour=0;
                }
            }
        }
      dispbuf[0]=second%10;
      dispbuf[1]=second/10;
      dispbuf[3]=minite%10;
      dispbuf[4]=minite/10;
      dispbuf[6]=hour%10;
      dispbuf[7]=hour/10;
    }
}


void timer1() interrupt 3      //扫面显示
{
        TH1=(65536-1000)/256;
        TL1=(65536-1000)%256;
        //dispbitcnt++;

        if (clock_set == 1)
        {
                P3=~(0x01<<dispbitcnt);
                P1=dispcode[clok_dispbuf[dispbitcnt]];
        }
        else
        P3=~(0x01<<dispbitcnt);
        P1=dispcode[dispbuf[dispbitcnt]];

        if(dispbitcnt++==8)
        {
                dispbitcnt=0;
        }

}
评分
参与人数 1威望 +1 收起 理由
mscj20072380 + 1

相关帖子

沙发
funfactory|  楼主 | 2011-6-5 16:00 | 只看该作者
本帖最后由 funfactory 于 2011-6-11 18:09 编辑

使用特权

评论回复
板凳
funfactory|  楼主 | 2011-6-11 19:12 | 只看该作者
难道就要这样一沉到底了??

使用特权

评论回复
地板
邪恶猛男| | 2011-6-11 20:37 | 只看该作者
我来看下

使用特权

评论回复
5
邪恶猛男| | 2011-6-11 20:39 | 只看该作者
参数下问题嘛!这代码完全看会伤神的,好针对性.我等你

使用特权

评论回复
6
funfactory|  楼主 | 2011-6-12 09:59 | 只看该作者

void alarm_set()
{
        if (kalrm == 0)
        {
          for(i=5;i>0;i--)
          for(j=248;j>0;j--);
                //delay(10);
                if (kalrm == 0)
                {
                        buzzer(850);        //蜂鸣器按键音       
                        clock_set++;                //闹钟设置标志位
                       
                        if (clock_set == 1)
                        {
                                led = 0;                //设置时led灯亮
                                key_set();                //按键控制时间的加减

                        }
                        if (clock_set == 2)
                        {
                                clock_set = 0;
                                led = 1;
                        }
                                       
                }
               
        }
}
做的实物与仿真问题都出现在这里,按下按纽kalrm,clock_set闹钟的标志位为1,理论上应该指示灯会亮起,数码管应该显示全为0。但是现象是指示灯闪几下,数码管也没有任何变化!

使用特权

评论回复
7
funfactory|  楼主 | 2011-6-12 10:02 | 只看该作者
5# 邪恶猛男
实在看不出问题在哪里了!
幸苦了,这代码谁看着都累,嘿嘿!

使用特权

评论回复
8
邪恶猛男| | 2011-6-12 11:05 | 只看该作者
kalrm ==1;的状态在那里

使用特权

评论回复
9
邪恶猛男| | 2011-6-12 11:06 | 只看该作者
if (kalrm == 0)??

        {

          for(i=5;i>0;i--)

          for(j=248;j>0;j--);

                //delay(10);

                if (kalrm == 0)   ??

使用特权

评论回复
10
邪恶猛男| | 2011-6-12 11:07 | 只看该作者
上面是去抖动? 你是低表示按键有动作?

使用特权

评论回复
11
邪恶猛男| | 2011-6-12 11:09 | 只看该作者
个人觉得你这个抖动估计处理不是很好
          for(i=5;i>0;i--)

          for(j=248;j>0;j--);
这个时间你能控制好?

使用特权

评论回复
12
邪恶猛男| | 2011-6-12 11:23 | 只看该作者
clock_set++;                //闹钟设置标志位

你这个                        if (clock_set == 1)

                        if (clock_set == 2)
你这个有BUG如果出现 ==3 一直到255情况你都处理不了

使用特权

评论回复
13
funfactory|  楼主 | 2011-6-12 18:00 | 只看该作者
本帖最后由 funfactory 于 2011-6-12 18:14 编辑

10# 邪恶猛男
是代表消抖!低电平起作用!低电平后
clock_set++
消抖应该没问题!试了很多中方法,这个最不错了!

使用特权

评论回复
14
mscj20072380| | 2011-6-12 18:02 | 只看该作者
没看出来

使用特权

评论回复
15
funfactory|  楼主 | 2011-6-12 18:22 | 只看该作者

                        if (clock_set == 1)
                        {
                                led = 0;                //设置时led灯亮
                                key_set();                //按键控制时间的加减

                        }
                        if (clock_set == 2)
                        {
                                clock_set = 0;      //clock_set不会大于3吧,这里清0了,难道这样写不严密
                                led = 1;
                        }

使用特权

评论回复
16
funfactory|  楼主 | 2011-6-12 19:08 | 只看该作者
本帖最后由 funfactory 于 2011-6-29 14:17 编辑

[local]1[/local]

项目二.rar

38.87 KB

使用特权

评论回复
17
funfactory|  楼主 | 2011-6-12 19:43 | 只看该作者
楼上是c文件和仿真图

使用特权

评论回复
18
funfactory|  楼主 | 2011-6-13 18:52 | 只看该作者

使用特权

评论回复
19
funfactory|  楼主 | 2011-7-9 15:19 | 只看该作者

gf.gif (34.12 KB )

gf.gif

使用特权

评论回复
20
lc13659669235| | 2011-7-9 15:33 | 只看该作者
额 ,看不懂程序,

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

68

帖子

1

粉丝