找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机数码管电子表,注:时间上有微小的误差。

[复制链接]
ID:402350 发表于 2018-12-31 13:32 | 显示全部楼层 |阅读模式
1546233990614.jpg

#include <reg52.h>
#define uint  unsigned int
#define uchar unsigned char  
uint yi,er,si,wu,qi,ba;//数码管所显示的位置
uint num, b; k;//时分秒
uint num1;//定时器参数
uchar  code table1[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,0x40};//0到9和G数组
sbit dula=P2^6;//段选
sbit wela=P2^7;//位选
sbit s1=P3^0;//按键
sbit s2=P3^1;
sbit s3=P3^2;
sbit s4=P3^3;

void delay(uint z)//ms延时函数
{
uint i,j;
for(i=z;i>0;i--)
  for(j=114;j>0;j--);
}
void key()
{
if(s1==0)
   {
     delay(20);
     if(s1==0)
     b++;
while(!s1);
}
     if(s2==0)
   {
     delay(20);
     if(s2==0)
   k++;
while(!s2);
}
   if(s3==0)
   {
     delay(20);
     if(s2==0)
     num1++;
while(!s3);
}
  if(s4==0)
   {
     delay(20);
     if(s4==0)
{ b=0;k=0;num1=0; }
while(!s4);

}
}


void display(uchar yi, uchar er, uchar si,uchar wu,uchar qi,uchar ba)
{
//第一位数码管
P0=0XFF;
wela=1;
P0=0xfe;
wela=0;

dula=1;  
P0=table1[yi];
dula=0;
delay(1);
//第二位数码管
P0=0XFF;
wela=1;
P0=0xfd;
wela=0;

dula=1;  
P0=table1[er];
dula=0;
delay(1);
//第三位数码管,横杠
P0=0XFF;
wela=1;
P0=0xfb;
wela=0;

dula=1;
P0=table1[10];
dula=0;
delay(1);
//第四位数码管
P0=0XFF;
wela=1;
P0=0xf7;
wela=0;

dula=1;  
P0=table1[si];
dula=0;
delay(1);
//第五位数码管
P0=0XFF;
wela=1;
P0=0xef;
wela=0;

dula=1;  
P0=table1[wu];
dula=0;
delay(1);
//第六位数码管,横杠
P0=0XFF;
wela=1;
P0=0xdf;
wela=0;

dula=1;  
P0=table1[10];
dula=0;
delay(1);
//第七位数码管
P0=0XFF;
wela=1;
P0=0xbf;
wela=0;

dula=1;  
P0=table1[qi];
dula=0;
delay(1);
//第八位数码管
P0=0XFF;
wela=1;
P0=0x7f;
wela=0;

dula=1;  
P0=table1[ba];
dula=0;
delay(1);
}
//主函数
void main()
{
TMOD=0x01;
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;

EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;
while(1)//等待中断
  {

    key();
    display(yi,er,si,wu,qi,ba);
  }
}
void T0_time()interrupt 1{
   TH0=(65536-46083)/256; //重装初值
   TL0=(65536-46083)%256; //50ms
   num++;
   if(num==20)//当num到达20次是为1000ms也就是1s
   {
    num=0; //清零
    num1++;//秒自加
    if(num1==60)//当num1到达60次是为60s也就是1分钟
        {
         num1=0;//清零
         k++;//分自加
        }
    if(k==60)//当k到达60次是为60分钟也就是1小时
    {
          k=0;//清零
          b++;//时自加
        }
    if(b==24)//当k到达24次是为24小时
        {
     b=0;//此时为00点
        }
        yi=b/10;//求模运算
        er=b%10;//求余运算
        si=k/10;
        wu=k%10;
        qi=num1/10;
    ba=num1%10;
   }

}







回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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