51单片机+4位数码管计时器按键可调节

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51单片机+4位数码管计时器按键可调节相关的知识,希望对你有一定的参考价值。

51单片机+4位数码管计时器按键可调节

  • 4位数码管秒计时,采用定时器

  • proteus仿真
    在这里插入图片描述

  • 源代码

#include<reg51.h>          //单片机头文件
 
#define uint unsigned int
#define uchar unsigned char
#define CF P0                      //宏定义
 
uint sec=0;           //数码管显示同步定义数值sec 后面还会讲
 
sbit K1=P3^2;   //K1复位 就是将运行的程序结束 然后重新开始运行     
sbit K2=P3^1;        //暂停
sbit K3=P3^0;            //开始     
 
sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;        //位选定义
sbit LED4=P2^3;         
 
uchar disbuff[]={0,0,0,0}; //数码管显示位数的数值数组    
 
uchar const num[10]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f};                             //0-9的共阴显示码
 
void delay(int s)
{
    uint i,j;
    for(i=0;i<s;i++)              //延时函数
        for(j=114;j>0;j--);
}
 
void DigDisplay()                      //显示函数
{
    LED1=1;LED2=1;LED3=1;LED4=0;       //最右边一位开启  也就是个位
    CF = disbuff[0];
    delay(5);
    CF=0x00;//消隐
 
    LED1=1;LED2=1;LED3=0;LED4=1;           //十位
    CF=disbuff[1];                                           //因为人肉眼的可见变化最小为500ms 这个数码管此刻的变化为微秒级 所以不会看到有不显示的情况
    delay(5);
    CF=0x00;   //消隐
 
    LED1=1;LED2=0;LED3=1;LED4=1;             //百位
    CF=disbuff[2];
    delay(5);
    CF=0x00;     //消隐
 
    LED1=0;LED2=1;LED3=1;LED4=1;              //千位
    CF=disbuff[3];
    delay(5);
    CF=0x00;     //消隐
 
}
 
void Count()                              //计算函数
{
    disbuff[0]=num[sec%10];               //个位数字
    disbuff[1]=num[sec/10%10];            //十位数字
    disbuff[2]=num[sec/100%10];           //百位数字
    disbuff[3]=num[sec/1000%10];         //千位数字
}
 
void KEY()                              //按键函数
{
    if(K1==0);            //启动
    delay(10);
    if(K1==0)
    {TR0=1;}
    while(!K1) DigDisplay();Count();           //按键释放
    if(K2==0)
    {
        delay(5);
 
        if(K2==0)
        {
            TR0=0;      //关闭定时器
        }
    }    while(!K2)DigDisplay();Count();
 
    if(K3==0)
    {
        delay(10);
        if(K3==0)
        {
            sec=0;
            TH0=0x3c;//设定T0初始值(高八位)
            TL0=0xb0;
        }
    }
}  
 
void main()
{
    TMOD=0x11;//设定定时气的工作方式
    TH0=0x3c;//设定初始值(高八位)
    TL0=0xb0;//设定T0初始值(低五位)     设定时间为50ms
    ET0=1;   //内部中断                  
    EA=1;      //打开总中断
    TR0=1; //启动定时器0
 
    while(1)                             //  while循环
 
    {
        Count();    //计算
        DigDisplay();   //延时
        KEY();
 
    }
}
 
void time1() interrupt 1
{
    uchar m;
    TH0=0x3c;
    TL0=0xb0;       //重新赋初值
    m++;            //50ms m++          
    if(m==20)
    {              //       每50ms执行20次也就是一秒
        m=0;
        sec++;             //每一秒数码管的显示同步数值加一
        if(sec==10000)    //因为我们显示只能到9999 所以达到最大显示需要清零
        {
            sec=0;
            }
     
    }
}

以上是关于51单片机+4位数码管计时器按键可调节的主要内容,如果未能解决你的问题,请参考以下文章

51单片机定时器累加计数(000-999)+4位数码管(循环显示)+Proteus仿真

基于51单片机的按键计数设计,4位,0到9999

利用51单片机,4个数码管设计一个计时器,要求在数码管上显示的数据从0开始每1秒钟加1。

51单片机定时器累加计数(0000-9999)+4位数码管(循环显示)+Proteus仿真

怎样用51单片机实现累加计时和倒计时,并用六个共阴极数码管显示出来。用两个按键分别切换。

51 单片机定时器数码管 从1数到100(带三个按键控制开始,暂停,复位)