标题: 单片机倒计时代码哪里错误? [打印本页]

作者: hjx5548    时间: 2023-8-29 23:48
标题: 单片机倒计时代码哪里错误?
/*
功能:第一步、上电后,停止灯熄灭,数码管显示1.00,进入待机模式。
      第二步、短按启动健,xiaodu高电平,运行灯亮,数码管显示每秒减一,倒计时开始,直至倒计时结束,spk高,运行灯和数码管全部熄灭。
                        如果继续短按启动键,倒计时时间的百位加一,最高到九,即十分钟,按照预置时间倒计时运行。
                        如果长按启动键3秒关机。也就是启动健有三种功能,一,启动,二,预置时间,三,长按关机。
                        第三步、倒计时时间到,显示和运行灯熄灭,停止灯点亮,spk高电平,经过八秒后,进入待机状态,显示点亮显示1.00,等待下次启动。
                        第四步、长按key关机,xiaodu低电平,显示和运行灯熄灭
            短按蜂鸣器响一下
*/

#include"STC15.H"
#include"intrins.H"
#define uint unsigned int
#define uchar unsigned char

#define shi  P30   //1111  1110  0xfe
#define  ge P31    //1111  1101  0xfd
#define key  P32
#define sp  P33
#define xiaodu  P34
#define power  P35
#define bai  P36    //1011  1111   0fbf
#define fmq  P37

//#define a P17
//#define b P16
//#define c P15
//#define d P14
//#define e P13
//#define f P12
//#define g P11
#define h P10

//定义需要显示的数字
uchar code dis[]={0xfc,0x60,0xda,0x8f,0xcc,0xed,0xfd,0x07,0xff,0xef};
//void key();

//延时函数
void delay(uint n)
{
  uint i,j;
  for(i=n;i>0;i--)
    for(j=110;j>0;j--);
}

void Delay10us()                //@11.0592MHz
{
        unsigned char i;

        _nop_();
        i = 25;
        while (--i);
}


//数码管显示函数
void display(uchar n)
{
  P1=dis[n%10];   //个位数
  P3=0xfe;        //COM1显示
  delay(1);

  P1=dis[n/10];   //十位数
  P3=0xfd;        //COM2显示
  delay(1);
       
//        P1=dis[n/100%10];   //百位数
//  P3=0xbf;        //COM3显示
//  delay(1);
}

void baiwie_display(uchar n)
{
        P1=dis[n];   //百位数
  P3=0xbf;        //COM3显示
  delay(1);
}

//倒计时函数
void countdown()
{
  uchar i;
  for(i=60;i>0;i--)
  {  xiaodu=1;
    display(i);   //显示剩余时间
    delay(1000);  //延时1秒
                if(i=60);
                 P3=0xff;
  }
}

//按键函数
void anjian()
{
        uchar i;
if(!key)
        Delay10us();
if(!key)
{
        countdown();
for(i=9;i>0;i++)
         baiwie_display(i);
  }
else if (!key)
        Delay10us();
if(!key)
{
        delay(1000); delay(1000);delay(1000); //延时3秒
        power=0;
}
}

//主函数
void main()
{
       
  anjian();
  while(1);
}

Screenshot_2023_0829_234654.png (97.42 KB, 下载次数: 43)

Screenshot_2023_0829_234654.png

作者: jhczy    时间: 2023-8-30 08:59
主程序里错了
作者: jhczy    时间: 2023-8-30 08:59
主函数错了
作者: xuyaqi    时间: 2023-8-30 09:38
if(i=60); 不能有分号,判断要用==。
作者: sj820224    时间: 2023-8-30 15:37
主函数错了
作者: hjx5548    时间: 2023-8-30 20:41
xuyaqi 发表于 2023-8-30 09:38
if(i=60); 不能有分号,判断要用==。

按键功能对不对?
作者: hjx5548    时间: 2023-8-30 20:42
sj820224 发表于 2023-8-30 15:37
主函数错了

能不能实现功能
作者: hjx5548    时间: 2023-8-31 02:45
jhczy 发表于 2023-8-30 08:59
主函数错了

能不能指导一下,具体点。
作者: 123456ZXC1    时间: 2023-8-31 08:45
#include "STC15.H"
#include "intrins.H"

#define uint unsigned int
#define uchar unsigned char

sbit shi = P3^0;
sbit ge = P3^1;
sbit key = P3^2;
sbit sp = P3^3;
sbit xiaodu = P3^4;
sbit power = P3^5;
sbit bai = P3^6;
sbit fmq = P3^7;

uchar code dis[] = {0xFC, 0x60, 0xDA, 0x8F, 0xCC, 0xED, 0xFD, 0x07, 0xFF, 0xEF};

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

void Delay10us() {
    unsigned char i;
    _nop_();
    i = 25;
    while (--i);
}

void display(uchar n) {
    shi = 1;
    ge = 0;
    P1 = dis[n % 10];
    delay(1);

    shi = 0;
    ge = 1;
    P1 = dis[n / 10];
    delay(1);
}

void countdown() {
    uchar i;
    for (i = 60; i > 0; i--) {
        xiaodu = 1;
        display(i);
        delay(1000);
        if (i == 60) {
            P1 = 0xFF;  // Clear the display if i is 60
        }
    }
}

void main() {
    uchar timeSetting = 1;  // Initialize time setting to 1 minute

    while (1) {
        // Check if the key is pressed
        if (!key) {
            Delay10us();
            if (!key) {
                countdown();  // Start countdown
                fmq = 0;  // Short beep
            }
        }
        // Check if the power button is pressed
        if (!power) {
            delay(100);  // Debounce
            if (!power) {
                xiaodu = 0;
                fmq = 1;  // Long beep
                delay(3000);  // Delay for 3 seconds
                power = 0;  // Turn off power
            }
        }
        // Check if the key is held for 3 seconds
        if (!key) {
            Delay10us();
            if (!key) {
                Delay10us();
                if (!key) {
                    delay(3000);  // Wait for 3 seconds
                    power = 0;    // Turn off power
                }
            }
        }
    }
}

作者: tyrl800    时间: 2023-8-31 17:37
#include<reg51.h>
#include<intrins.h>
#define u8 unsigned char
#define u16 unsigned int

u8 code ledcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
u8 cnt_1ms,smg_bit,keynum;
u8 tmp_old=0xf0,tmp_new;
u16 cnt_10ms,beep_time,keypush_time,cnt_s;
bit flag_1ms,flag_10ms,flagpush,flag_beep,flag_run,flag_stop,flag_down;
sbit beep=P3^7;
sbit key=P3^6;
sbit led_run=P3^0;
sbit led_stop=P3^1;
u8 t_bai,t_shi,t_ge,keycnt;
int time,s_time;
/********************************************************************/
void init(void)
  {TMOD=0x01;
   TH0=(65536-500)/256;
   TL0=(65536-500)%256;
   EA=ET0=TR0=1;
   P2=0xff;
  }
/********************************************************************/
void display(void)
   {
    P2=P2|0x0f;
        if(!flag_down)
                {switch(smg_bit)
                  {case 0: P0=ledcode[t_ge];P2=P2&0xfe;break;
                   case 1: P0=ledcode[t_shi];P2=P2&0xfd;break;;
                   case 2: P0=ledcode[t_bai];P2=P2&0xfb;break;
                   case 3: P0=0x0;P2=P2&0xf7;break;
                  }
                }
        else
           {switch(smg_bit)
                  {case 0: P0=0x00;P2=P2|0x0f;break;
                   case 1: P0=0x00;P2=P2|0x0f;break;;
                   case 2: P0=0x00;P2=P2|0x0f;break;
                   case 3: P0=0x00;P2=P2|0x0f;break;
                  }
                }
   }

/********************************************************************/
u8 keyscan(void)
   { u8 temp_keynum=0;
     tmp_new=key;
         if(((tmp_new&0x01)==0)&&((tmp_old&0x01)==1))  {flagpush=1;}
         if(flagpush)keypush_time++;
         if(key)
            {if((keypush_time>1)&&(keypush_time<100))
                    {temp_keynum=1;flag_beep=1;}
                 else if (keypush_time>=300)
                    {temp_keynum=2;flag_beep=1;}
                 if (keypush_time==0) temp_keynum=0;
                 keypush_time=0;
                 flagpush=0;
                }  
         tmp_old=tmp_new;
    return temp_keynum;
   }
/********************************************************************/
void keyfunction(u8 kf)
   {
     switch(kf)
           {
             case 1: if(keycnt==1) {t_bai++;if(t_bai>9){keycnt=0; t_bai=9;}
                                                time=100*t_bai+10*t_shi+t_ge;
                                                }
                                 else {flag_run=1;keycnt=1;flag_down=0;flag_stop=0;time=100;}
                         break;
                 case 2: {flag_down=1;keycnt=0;flag_run=0;} break;
           }
   }

/********************************************************************/
void main(void)
  {
   init();
   t_bai=0;
   time=100;
   while(1)
     {
          led_run=!flag_run;
          led_stop=!flag_stop;
          if(flag_1ms)
            {
                  flag_1ms=0;
                 
                 t_ge=time%10;
                 t_shi=time/10%10;
                 t_bai=time/100;
                 display();
                 smg_bit=++smg_bit%4;
                }
          if(flag_10ms)
             {
                  flag_10ms=0;
                  keynum=keyscan();
                  keyfunction(keynum);
                  if(flag_stop)
                    {
                         s_time++;
                         if(s_time>799)
                            {
                                 time=100;
                                 keycnt=0;
                                 flag_down=0;
                                }
                        }
             }
           }

  }
/********************************************************************/
void tt0(void) interrupt 1        using 1
  {
   TH0=(65536-500)/256;
   TL0=(65536-500)%256;
   if(flag_beep)
     {beep_time++;
          beep=!beep;
          if(beep_time>300)
             {
                  beep_time=0;
                  flag_beep=0;
                  beep=1;
                 }
         }
   
   cnt_1ms++;
   if(cnt_1ms>1)
      {flag_1ms=1; cnt_10ms++;cnt_1ms=0;
       if(cnt_10ms>9)
         {flag_10ms=1;
                  if(flag_run)cnt_s++;
              cnt_10ms=0;
                     if(cnt_s>99)
                    {cnt_s=0;
                         time=time-1;
                         if(time<=0){time=0;flag_stop=1;flag_run=0;flag_down=1;keycnt=0;}
                        }
             }
      }
  }
/********************************************************************/

改下脚位可以用
作者: liucan2020    时间: 2023-9-1 21:07
初始化  和数码管你都 没有用调用。
作者: hjx5548    时间: 2023-9-1 22:24
tyrl800 发表于 2023-8-31 17:37
#include
#include
#define u8 unsigned char

如果把倒计时最大时间可以设置到9.60,即十分钟,代码怎么修改?
作者: tyrl800    时间: 2023-9-2 07:55
现在程序可以设置到900,加个修改十位的代码可以设置960
作者: wulin    时间: 2023-9-5 16:36
hjx5548 发表于 2023-9-1 22:24
如果把倒计时最大时间可以设置到9.60,即十分钟,代码怎么修改?

从你写的代码看,你目前还不具备写一个单健控制倒计时的项目。依照你的硬件图给你重新组织改写了一个单健控制倒计时程序的构架。加电即开机。短按功能:开机、启动倒计时、设置状态循环加分0~9、十位秒循环加0~5、个位秒循环加0~9。长按1:设置分闪烁,长按2:设置十位秒闪烁,长按3:设置个位秒闪烁,长按4:恢复待机。设置过程超过5秒不按健自动恢复待机。长按超过5秒不松手关机。有详细注释,仔细看慢慢能理解。蜂鸣器、消毒灯,指示灯功能很简单你自己加进去。 单健倒计时.rar (17.2 KB, 下载次数: 7)







欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1