单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管秒表:按键实现开始计时、停止计时和清零。并用数码管2位显示分和2位...

[复制链接]
jtgckuyc 发表于 2020-6-22 19:43 | 显示全部楼层 |阅读模式
5黑币
#include<reg52.h>

#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit WE1=P2^0;
sbit WE2=P2^1;
sbit WE3=P2^2;
sbit WE4=P2^3;

sbit key1=P3^5;
sbit key2=P3^4;

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,};

uint cnt=0;
uint num=0;
uint num1=0;//0.1s的次数的计数值


void delay(uint i)    //延时函数

{
uchar t;
while(i--)
{
for(t=0;t<120;t++);  
}
}
        
void initTimer0()
        {

                TMOD=0x01;
                TH0=(65536-45872)/256;
                TL0=(65536-45872)%256;
                EA=1;
                ET0=1;
                TR0=0;

        }

void display(uchar qian,uint bai,uint shi,uint ge)
{           

                WE1=0;
                P0=tab[qian]; delay(1);
                WE1=1;


                WE2=0;
                P0=tab[bai]+0x08; delay(1);
                WE2=1;



                WE3=0;
                P0=tab[shi]; delay(1);
                WE3=1;


                WE4=0;
                P0=tab[ge];         delay(1);
                WE4=1;


                 }        
               

void main()
{

uint ms100=0;//秒的十位
uint s,s1,min,min1,minu=0; //依次是秒的个位,秒的十位,分的个位,分的十位
initTimer0();

        if(key1==0)
        {
        delay(20);
          if(key1==0)
          {
                   TR0=!TR0;
                 while(!key1);
                  }
        }        
if(key2==0)
        {
                  delay(20);
                num1=0;
                num=0;
                ms100=0;
                cnt=0;
                minu=0;
                while(!key2);
                  }

          {         
                  if(num1>=2)//检测是否达到0.1s,(两个50ms)
                 {
                 num1=0;//进入中断次数值清零
                 ms100++;//秒的十位的计数值加1
                 if(ms100>=10)//若秒的十分位计数值达到10
                         {
                           ms100=0;//清零秒的十分位的计数值
                          num1=0;
                         }
                        }
           if(num>=20)
                                   {
                                     num=0;
                                        cnt++;

                        if(cnt>=60)
                                        {
                                        cnt=0;
                                        minu++;
                                        if(minu>=60)
                                        {
                                        TR0=!TR0;
                                        num1=0;
                                        num=0;
                                        ms100=0;
                                        cnt=0;
                                        minu=0;

                                        }
                                        }
                                        }

                        s=cnt%10;//从秒的计数值里面分离秒的个位
                        s1=cnt/10;//从秒的计数值里面分离秒的十位
                        min=minu%10;//从分的计数值里面分离分的个位
                        min1=minu/10;//从分的计数值里面分离分的十位

                        display(min1,min,s1,s);//显示这4个数        

                        }
                           }
                        

         

void time0() interrupt 1
  {
                   TH0=(65536-45872)/256;
                 TL0=(65536-45872)%256;
                 num++;
                 num1++;
  }

出来效果是这样的

出来效果是这样的
5f42cfb80da38d9fb76a61a30e56c4c.png
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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