找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1364|回复: 13
打印 上一主题 下一主题
收起左侧

单片机倒计时代码哪里错误?

[复制链接]
跳转到指定楼层
楼主
ID:72649 发表于 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, 下载次数: 10)

Screenshot_2023_0829_234654.png
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:170318 发表于 2023-8-30 08:59 | 只看该作者
主程序里错了
回复

使用道具 举报

板凳
ID:170318 发表于 2023-8-30 08:59 | 只看该作者
主函数错了
回复

使用道具 举报

地板
ID:94031 发表于 2023-8-30 09:38 | 只看该作者
if(i=60); 不能有分号,判断要用==。
回复

使用道具 举报

5#
ID:1092275 发表于 2023-8-30 15:37 | 只看该作者
主函数错了
回复

使用道具 举报

6#
ID:72649 发表于 2023-8-30 20:41 来自手机 | 只看该作者
xuyaqi 发表于 2023-8-30 09:38
if(i=60); 不能有分号,判断要用==。

按键功能对不对?
回复

使用道具 举报

7#
ID:72649 发表于 2023-8-30 20:42 来自手机 | 只看该作者
sj820224 发表于 2023-8-30 15:37
主函数错了

能不能实现功能
回复

使用道具 举报

8#
ID:72649 发表于 2023-8-31 02:45 来自手机 | 只看该作者
jhczy 发表于 2023-8-30 08:59
主函数错了

能不能指导一下,具体点。
回复

使用道具 举报

9#
ID:526543 发表于 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
                }
            }
        }
    }
}
回复

使用道具 举报

10#
ID:275826 发表于 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;}
                        }
             }
      }
  }
/********************************************************************/

改下脚位可以用
回复

使用道具 举报

11#
ID:1040201 发表于 2023-9-1 21:07 | 只看该作者
初始化  和数码管你都 没有用调用。
回复

使用道具 举报

12#
ID:72649 发表于 2023-9-1 22:24 来自手机 | 只看该作者
tyrl800 发表于 2023-8-31 17:37
#include
#include
#define u8 unsigned char

如果把倒计时最大时间可以设置到9.60,即十分钟,代码怎么修改?
回复

使用道具 举报

13#
ID:275826 发表于 2023-9-2 07:55 | 只看该作者
现在程序可以设置到900,加个修改十位的代码可以设置960
回复

使用道具 举报

14#
ID:213173 发表于 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)


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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