jjzjj

初学51单片机(STC89C52)一个倒计时显示器和大家分享

m0_74802518 2023-12-14 原文

  想要实现倒计时显示器,首先得确定从哪个时间开始倒计时,这就需要写出一个计数的程序来,通过按键来控制需要的数,从而开始倒计时。我的开发板上用的Key2,Key3,Key4,Key5这四个键,分别对应着加1,减1,乘2,开始计时四个功能。

  通过加一,减一,乘2三个操作,可以较快地得到想要设置的数。然后将所得到的数显示在数码管上(我这里使用的是共阴数码管)。这样就可以实时地看到自己所设置的数,然后就可以开始计时了。

具体实现步骤:

1.定义所用到的端口

2.定义一个数组,里面装0~9这十个数(用于后边的数码管显示,所以需要转化为对应的段选),例如0,就写成0X3F

3.写一个计数的程序,通过按键实现计数,并且在按下时数码管同步显示。

4.写一个计时的程序。(用时钟)

4.打开时钟中断,开始计时,运行计时程序。

5,打开蜂鸣器,提示计时结束。

以下为源代码:

#include<reg52.h>

/******************************************
程序作用:倒计时显示器
实现步骤:1.输入数字
          2.开始倒计时
                    3.蜂鸣器响1s提示计时结束

*******************************************/

sbit Key2=P3^4;
sbit Key3=P3^5;
sbit Key4=P3^6;
sbit Key5=P3^7;//定义按键端口


sbit wei1=P2^4;
sbit wei2=P2^5;
sbit wei3=P2^6;
sbit wei4=P2^7;//定义数码管端口


sbit bing=P2^3;//定义蜂鸣器端口


/********************定义数组******************/
int base[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
/********************定义数组******************/

/********************定义全局变量******************/
   int num;
   int time=0; 
   int time_1s=0;
   int qian;//千位数字
     int bai;//百位数字
   int shi;//十位数字
     int ge;//个位数字
/********************定义全局变量******************/

void xianshi();
void Time_begin();
int num_scp(int num);
int delay(int x);//函数声明


void main()
{
    
    num=0;
    /*************初始化端口*************/
    wei1=0;//第一位数码管
    wei2=0;//第二位数码管
    wei3=0;//第三位数码管
    wei4=0;//第四位数码管
    Key2=1;//加一开关
    Key3=1;//减一开关
    Key4=1;//乘二开关
    Key5=1;//计时开关
    /*************初始化端口*************/
    
    
    while(1){
        Key2=1;//加一开关
      Key3=1;//减一开关
      Key4=1;//乘2开关
      Key5=1;//开始计时
        
        
        if(Key2==0)
        {
            delay(10);
        while(Key2==1){num++;break;}
            
        }//按下Key2键   时间加1s
        
        
        if(Key3==0)
        {
            delay(10);
            while(Key3==1){num--;break;}
        }//按下Key3键   时间减1s
        
        
        if(Key4==0)
        {
            delay(10);
            while(Key4==1){num=num*2;break;}
        }//按下Key4键   时间乘2
        
        
        if(Key5==0)
        {
            delay(10);
            while(Key5==1)
            {
                Time_begin();
                while(1)
    {
        num_scp(time_1s);
        xianshi();
        if(time_1s==1){bing=0;delay(1000);bing=1;}
    }
           }
       }    //按下Key5键   开始计时
        
         
         
    
        while(1)
        {
            num_scp(num);
            xianshi();
            if(Key2==0||Key3==0||Key4==0||Key5==0){break;}
        }//显示设置的时间


}

}

/*****************************
定义函数num_scp
sc代表scanf;p代表put
函数作用:扫描数据并进行拆分
参数列表:x
*******************************/
int num_scp(int x)
{    
    qian=(x/1000)%10;//千位数字
    bai=(x/100)%10;//百位数字
    shi=(x/10)%10;//十位数字
    ge=x%10;//个位数字
    return 0;
}    
    
    
    
    /*****************************
定义函数delay
函数作用:延时x_ms
参数列表:x
*******************************/

int delay(int x)
{
  unsigned int time;
    time=9206*x-2;
    while(time--);
    return 0;//较粗略的延时函数,主要用于按键消抖,不可用于计时
}
    
    
    /*****************************
定义函数Timer0
函数作用:定时计数
参数列表:time time_1s
*******************************/
void Timer0() interrupt 1 using 1//准确的时钟,可用于计时
{
    TH0=0x4c;//定时器0装初值 定时50ms
    TH1=0x00;
    time++;
    if(time>=20)
    {
        if(time_1s==0){time_1s=num+1;}
        time_1s--;
        time=0;
    }
    
}
/*****************************
定义函数Time_begin
函数作用:开启定时计数器
参数列表:
*******************************/
void Time_begin(){
TMOD &=0xf0;//低四位全部置0 设置定时器0 方式1
    TMOD |=0x01;//最低位置1
    TH0=0x4c;//定时器0装初值 定时50ms
    TH1=0x00;
    
    TR0=1;//定时器0 启动计数
    ET0=1;//打开ET0 中断允许位
    EA=1;//打开总中断
}


/*****************************
定义函数显示
函数作用:数码管显示
参数列表:qian bai shi ge 
*******************************/
void xianshi(){
      P0=0x00;
    P0=base[qian];
        wei1=1;
        wei1=0;
        P0=base[bai];
        wei2=1;
        wei2=0;
        P0=base[shi];
        wei3=1;
        wei3=0;
        P0=base[ge];
        wei4=1;
        wei4=0;//显示具体数字
}

有关初学51单片机(STC89C52)一个倒计时显示器和大家分享的更多相关文章

  1. ruby-on-rails - 有没有办法为 CarrierWave/Fog 设置上传进度指示器? - 2

    我在Rails应用程序中使用CarrierWave/Fog将视频上传到AmazonS3。有没有办法判断上传的进度,让我可以显示上传进度如何? 最佳答案 CarrierWave和Fog本身没有这种功能;你需要一个前端uploader来显示进度。当我不得不解决这个问题时,我使用了jQueryfileupload因为我的堆栈中已经有jQuery。甚至还有apostonCarrierWaveintegration因此您只需按照那里的说明操作即可获得适用于您的应用的进度条。 关于ruby-on-r

  2. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

    说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

  3. ruby - 易于初学者理解的 Ruby 库 - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5

  4. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  5. 电脑启动后显示器黑屏怎么办?排查下面4个问题,快速解决 - 2

    电脑启动出现显示器黑屏是一个相当常见的问题。如果您遇到了这个问题,不要惊慌,因为它有很多可能的原因,可以采取一些简单的措施来解决它。在本文中,小编将介绍下面4种常见的电脑启动后显示器黑屏的原因,排查这些原因,快速解决! 演示机型:联想Ideapad700-15ISK-ISE系统版本:Windows10一、显示器问题如果出现电脑启动后显示器黑屏的情况。那么首先您需要检查一下显示器是否正常工作。您可以通过更换另一个显示器或将当前显示器连接到另一台计算机来检查显示器是否存在问题。如果问题仍然存在,那么您可以排除显示器故障的可能性。 二、显卡问题如果您的电脑配备了独立显卡,那么显卡故障也可能是导致电脑

  6. micropython复现经典单片机项目(二)可视化音频 频谱解析(基本搞定) - 2

    本人是音乐爱好者,从小就特别喜欢那个随着音乐跳动的方框效果,就是这个:arduino上一大把对,我忍你很久了,我就想用mpy做,全网没有,行我自己研究。果然兴趣是最好的老师,我之前有篇博客专门讲音频,有兴趣的可以回顾一下。提到可视化频谱,必然绕不开fft,大学学过这玩意,当时一心玩,老师讲的一个字都么听进去,网上教程简略扫了一下,大该就是把时域转频域的工具,我大mpy居然没有fft函数,奶奶的,先放着。音频信息如何收集?第一种傻瓜式的ADC,模拟转数字,原始粗暴,第二种,I2S库,我之前博客有讲过,数据是PCM编码。然后又去学PCM编码,一学豁然开朗,舒服,以代码为例:audio_in=I2S

  7. ruby-on-rails - 遵循 DCI 设计时在哪里进行验证? - 2

    我正在按照DCI构建新Rails应用程序的行为,但我对将验证放在哪里有一些疑问。传统上,如果您要使用ActiveRecord模型管理您的数据,验证是在继承自AR的特定类中定义的,并且它们似乎适合作为数据层的一部分。然而,在我看来,只在特定角色下进行某些验证是有意义的,并且只有当对象在该上下文中时才应检查它们,在所有其他情况下都将被忽略。这基本上意味着这些验证应该在特定角色上定义,并且当对象在有意义的上下文中使用时,应该使用这些角色模块扩展对象。您认为将这些验证保留在角色上是个好主意吗?如果是这样,您如何声明它们而不污染与对象相同的类的其他实例?如果我想使用ActiveRecord验证,

  8. 51单片机——74HC595的应用(SPI实践) - 2

    目录SPI总线SPI总线概述 SPI总线分类SPI优点及缺点SPI接口硬件原理SPI四种工作模式 74HC595应用74HC595芯片概述74HC595封装及管脚功能74HC595工作原理 ​编辑 74HC595串行转并行点亮LED灯 程序实现  Proteus运行结构示意图SPI总线SPI总线概述 SPI(SerialPeripheralinterface):串行外围设备接口 用途:用来在微控制器与外围设备芯片之间实现数据交换 特点:高速、全双工、同步 SPI总线分类四线制全双工SPI(同时收发)MISO    主机输入/从机输出MOSI    主机输出/从机输入SCLK   串行时钟CS或

  9. 【毕业设计】基于单片机的智能温控农业大棚系统 - 物联网 stm32 - 2

    文章目录1简介2绪论2.1课题背景与目的3系统设计详细设计描述3.2硬件部分温度测量电路其他电路部分3.3软件部分主程序子系统程序温湿度程序流程键盘显示子程序3.4实现效果3.5部分相关代码4最后1简介Hi,大家好,这里是丹成学长,今天向大家介绍一个单片机项目基于单片机的智能温控农业大棚系统大家可用于课程设计或毕业设计单片机-嵌入式毕设选题大全及项目分享:https://blog.csdn.net/m0_71572576/article/details/1254090522绪论2.1课题背景与目的近年来我国的温室控制取得了长足的进步,首先在温室群控制方面,进行了初步的探索和理论研究,其次在温室

  10. AT24C04、AT24C08、AT24C16系列EEPROM芯片单片机读写驱动程序 - 2

    一、概述在之前的一篇博文中,记录了AT24C01、AT24C02芯片的读写驱动,先将之前的相关文章include一下:1.IIC驱动:4位数码管显示模块TM1637芯片C语言驱动程序2.AT24C01/AT24C02读写:AT24C01/AT24C02系列EEPROM芯片单片机读写驱动程序本文记录分享AT24C04、AT24C08、AT24C16芯片的单片机C语言读写驱动程序。二、芯片对比介绍型号容量bit容量byte页数字节/页器件寻址位可寻址器件数WordAddress位数/字节数备注AT24C044k5123216A2A149/1WordAddress使用P0位AT24C088k1024

随机推荐