找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1501|回复: 0
收起左侧

基于51单片机的简单电子秒表

[复制链接]
ID:997916 发表于 2021-12-28 17:28 | 显示全部楼层 |阅读模式
#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;
                        }
       
        }
}


捕获.PNG
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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