电子表设计

  • 仿真电路图
  • 秒表实现

  • #include <reg51.h>
    #include <intrins.h>
    int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
    int sec=54;
    int dis[]={5,4};
    void display();
    void renew();
    void delay(int i)
    {
    int k,j;
    for(k=0;k<i;k++)
    for(j=0;j<100;j++);
    }
    void display()
    {
    int j;
    int i,k=500;
    while(k--)
    {
    j=0x7f;
    for(i=0;i<2;i++)//内循环;位扫描;
    {
    P2=j;//01111111
    P0=seg[dis[i]];
    delay(1);//总线延长;
    j=_cror_(j,1);
    }
    }
    }
    void renew()
    {
    sec++;
    if(sec==60)
    sec=0;
    dis[0]=sec/10;
    dis[1]=sec%10;
    }
    void main() 
    {
    while(1)
    {
    display();
    renew();
    }}
    

      

  • 使用定时器实现时钟
  • /***************************************************************
    项目名称:项目2 简易电子表
    任务名称:任务3秒表
    任务描述:单片机控制8个数码管,显示日期.
    班级日期:物联网1602班,2019-04-11.
    中断系统:计算机执行程序时,遇到突发事件,自动打断当前程序,
    转而自动执行中断服务程序(标识interrupt n),执行完服务程序后,
    再自动返回被打断的程序继续执行。应激性
    中断源:能引发中断的源头。51单片机有5个中断源:0-外部中断0(P3.2)
    1-定时器T0(计数器P3.4)  2-外部中断1(P3.3) 3-定时器T1(计数器P3.5) 
    4-串行通信(P3.0和P3.1),外部中断用来管理设备,一般以故障信号作为中断信号
    定时器中断专门用于定时和提醒。
    定时器工作原理:51单片机有2个16位定时/计数器。 
       对内部机器周期(规则变化信号)计数可以确定时间--定时器
       对外部引脚信号计数不能确定时间--计数器
    用法:先初始化,启动后按照设定的信号自动加1计数,
          数到溢出(65536)时自动申请中断,提醒。
    初始化:1.通过TMOD设置工作方式,
            2.通过TH、TL填装计数初值(根据定时时间计算计数初值),
            3.打开中断允许。ET和EA(enable),4.启动定时器。TR
    定时器中断服务程序:1.确定时间是否达到,2.执行中断事件处理程序,
                          3.如果需要连续中断,必须重新填装初值。
    ****************************************************************/
    #include <reg51.h>
    #include <intrins.h>
    int min=0;
    int hour=0;
    int seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf};//
    int sec=0;//计数变量
    int dis[8];//显示数组
    int num=0;//累计中断次数
    void display();
    /**************************************************************/
    void delay(int i)
    {
     int j,k;
     for(k=0;k<i;k++)
      for(j=0;j<500;j++);
    }
    /**************************************************************/
    void display()
    {
     int j;
     int i;
     j=0x7f;
     for(i=0;i<8;i++) //内循环:位扫描
     {
      P2=j;//01111111
      P0=seg[dis[i]];
      delay(1);//总线延时
      j=_cror_(j,1);
     }  
    }
    /**************************************************************/
    void t_0()interrupt 1//50毫秒进入一次
    {
     num++;
     if(num==20)//累计20次中断,1秒到了
     {
      num=0;
      sec++;
      if(sec==60)
    {
    sec=0;
    min++;
    if(min==60)
        {
    min=0;
    hour++;
        if(hour==24)
        {
            hour=0;
        }
        }
        
    }
    dis[0]=hour/10;
    dis[1]=hour%10;
    dis[2]=10;
    dis[3]=min/10;
    dis[4]=min%10;
    dis[5]=10;
    dis[6]=sec/10;
    dis[7]=sec%10;
     }
     TH0=(65536-50000*11059/12000)/256;//定时50毫秒=50000微秒 19456/256
     TL0=(65536-50000*11059/12000)%256;
    }//自动返回被打断的程序
    /**************************************************************/
    void main()
    {
      TMOD=0x01;//选择T0用作16位定时器
      TH0=(65536-50000*11059/12000)/256;//定时50毫秒=50000微秒 19456/256
      TL0=(65536-50000*11059/12000)%256;//50毫秒中断1次,累计20次中断刷新1次显示值
      ET0=1;
      EA=1;//定时器t0中断允许
      TR0=1;//启动定时器t0:
            //启动后按照设定的信号自动加1计数,数到溢出(65536)时自动申请中断
      while(1)
      {
       display();//无限循环,中断系统可以打断循环,执行中断服务程序,在中断里刷新显示值   
      }            //自动找中断服务程序,找带interrupt 1标识的函数
    }

原文地址:https://www.cnblogs.com/ssxblog/p/10957238.html