找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2279|回复: 2
打印 上一主题 下一主题
收起左侧

数码秒表设计

[复制链接]
跳转到指定楼层
楼主
ID:237248 发表于 2017-10-4 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //实例65:数码秒表设计
  2. #include<reg51.h>  //  包含51单片机寄存器定义的头文件
  3. unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. //数码管显示0~9的段码表
  5. unsigned char int_time;        //记录中断次数
  6. unsigned char second;        //储存秒
  7. /***********************************************************************
  8. 函数功能:快速动态扫描延时,延时约0.6毫秒
  9. ************************************************************************/
  10. void delay(void)
  11. {
  12.   unsigned char i;
  13.   for(i=0;i<200;i++)
  14.         ;
  15. }
  16. /***********************************************************************
  17. 函数功能:显示秒
  18. 入口参数:k
  19. 出口参数:无
  20. ************************************************************************/
  21. void DisplaySecond(unsigned char k)
  22. {
  23.    
  24.    P2=0xfb;        //P2.6引脚输出低电平, DS6点亮
  25.    P0=Tab[k/10];          //显示十位
  26.    delay();

  27.    P2=0xf7;       //P2.7引脚输出低电平, DS7点亮
  28.    P0=Tab[k%10];         //显示个位
  29.         delay();
  30.         P2=0xff;     //关闭所有数码管



  31. }
  32.   void main(void)      //主函数
  33.    {
  34.           TMOD=0x01;                 //使用定时器T0
  35.           TH0=(65536-46083)/256;    //将定时器计时时间设定为46083×1.085微秒
  36. //=50000微秒=50毫秒
  37.            TL0=(65536-46083)%256;
  38.                 EA=1;                    //开启总中断
  39.                 ET0=1;                   //定时器T0中断允许
  40.                 TR0=1;                   //启动定时器T0开始运行
  41.                 int_time=0;     //中断次数初始化
  42.                 second=0;           //秒初始化               
  43.         while(1)
  44.                 {
  45.                DisplaySecond(second);        //调用秒的显示子程序
  46.                  }
  47.     }  
  48. //********************************************************
  49. //函数功能:定时器T0的中断服务程序
  50. //*******************************************************
  51.   void interserve(void ) interrupt 1 using 1  
  52.   {
  53.     TR0=0;    //关闭定时器T0
  54.     int_time ++;        //每来一次中断,中断次数int_time自加1       
  55.          if(int_time==20)   //够20次中断,即1秒钟进行一次检测结果采样
  56.           {
  57.         int_time=0;    //中断次数清0
  58.             second++;    //秒加1
  59.             if(second==60)
  60.               second =0; //秒等于60就返回0
  61.           }                     
  62.           TH0=(65536-46083)/256;   //重新给计数器T0赋初值
  63.         TL0=(65536-46083)%256;
  64.         TR0=1;     //启动定时器T0
  65. }  

  66. //实例65:数码秒表设计
  67. #include<reg51.h>  //  包含51单片机寄存器定义的头文件
  68. unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  69. //数码管显示0~9的段码表
  70. unsigned char int_time;        //记录中断次数
  71. unsigned char second;        //储存秒
  72. /***********************************************************************
  73. 函数功能:快速动态扫描延时,延时约0.6毫秒
  74. ************************************************************************/
  75. void delay(void)
  76. {
  77.   unsigned char i;
  78.   for(i=0;i<200;i++)
  79.         ;
  80. }
  81. /***********************************************************************
  82. 函数功能:显示秒
  83. 入口参数:k
  84. 出口参数:无
  85. ************************************************************************/
  86. void DisplaySecond(unsigned char k)
  87. {
  88.    
  89.    P2=0xfb;        //P2.6引脚输出低电平, DS6点亮
  90.    P0=Tab[k/10];          //显示十位
  91.    delay();

  92.    P2=0xf7;       //P2.7引脚输出低电平, DS7点亮
  93.    P0=Tab[k%10];         //显示个位
  94.         delay();
  95.         P2=0xff;     //关闭所有数码管



  96. }
  97.   void main(void)      //主函数
  98.    {
  99.           TMOD=0x01;                 //使用定时器T0
  100.           TH0=(65536-46083)/256;    //将定时器计时时间设定为46083×1.085微秒
  101. //=50000微秒=50毫秒
  102.            TL0=(65536-46083)%256;
  103.                 EA=1;                    //开启总中断
  104.                 ET0=1;                   //定时器T0中断允许
  105.                 TR0=1;                   //启动定时器T0开始运行
  106.                 int_time=0;     //中断次数初始化
  107.                 second=0;           //秒初始化               
  108.         while(1)
  109.                 {
  110.                DisplaySecond(second);        //调用秒的显示子程序
  111.                  }
  112.     }  
  113. //********************************************************
  114. //函数功能:定时器T0的中断服务程序
  115. //*******************************************************
  116.   void interserve(void ) interrupt 1 using 1  
  117.   {
  118.     TR0=0;    //关闭定时器T0
  119.     int_time ++;        //每来一次中断,中断次数int_time自加1       
  120.          if(int_time==20)   //够20次中断,即1秒钟进行一次检测结果采样
  121.           {
  122.         int_time=0;    //中断次数清0
  123.             second++;    //秒加1
  124.             if(second==60)
  125.               second =0; //秒等于60就返回0
  126.           }                     
  127.           TH0=(65536-46083)/256;   //重新给计数器T0赋初值
  128.         TL0=(65536-46083)%256;
  129.         TR0=1;     //启动定时器T0
  130. }  

复制代码
51单片机数码秒表设计。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:231376 发表于 2017-10-5 10:36 | 只看该作者
狗尾续貂,我也发一个,大一时候写的,适用于小开发板,写的很渣,只保留了一位小数~

#include<reg52.h>

unsigned char code Test[10] ={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07,0x7F,0x6F};//1-10
unsigned char code DULA[4]={0xf7,0xfb,0xfd,0xfe};//控制显示第几位

sbit key0=P3^2;
sbit key1=P3^3;
sbit key2=P3^4;

static unsigned int counter=0;
static unsigned char i=0;

static unsigned char second=0;//十位数

static unsigned char signal1=0;//1为显示十位数,0为不显示,控制个位数,直接写死=1
static unsigned char signal2=0;//1为显示十位数,0为不显示
static unsigned char signal3=0;//1为显示百位数,0为不显示
static unsigned char signal4=0;//1为显示百位数,0为不显示

static unsigned char ten=0;
static unsigned char hundred=0;
static unsigned char thousand=0;

void IntiTimer()//初始化定时器
{
        TH0=(65536-45872)/256;//45872是50ms
        TL0=(65536-45872)%256;
}
               
void dely(unsigned int k)
{       
        unsigned int i=0;
        unsigned char j=0;

        for(i=0;i<k;i++)
        {
                for(j=0;j<110;j++)
                {       
                       
                }
        }
}
void display()//控制数码管
{
        if(signal2==0)
        {
                P2=0xf7;
                P0=~Test[i];
                P0=~0x00;
                P2=0xfb;//第二位为0
                P0=~(Test[0]|0x80);
                P0=~0x00;
        }
        if(signal2==1&&signal3==0)
        {
                P2=0xf7;
                P0=~Test[i];
                P0=~0x00;
                P2=0xfb;
                P0=~(Test[ten]|0x80);
                P0=~0x00;
               
        }
        if(signal2==1&&signal3==1&&signal4==0)
        {
                P2=0xf7;
                P0=~Test[i];
                P0=~0x00;
                P2=0xfb;
                P0=~(Test[ten]|0x80);
                P0=~0x00;
                P2=0xfd;//第三位
                P0=~Test[hundred];
                P0=~0x00;
               
        }
                if(signal2==1&&signal3==1&&signal4==1)
        {
                P2=0xf7;
                P0=~Test[i];
                P0=~0x00;
                P2=0xfb;
                P0=~(Test[ten]|0x80);
                P0=~0x00;
                P2=0xfd;//第三位
                P0=~Test[hundred];
                P0=~0x00;
                P2=0xfe;//第四位
                P0=~Test[thousand];
                P0=~0x00;
               
        }
        if(i==10)
        {
                i=0;
        }
}
//一个数码管点亮1s后熄灭
//实现第一个stop键
void key0scanf()//检测键盘 stop
{
        if(key0==0)//按下
        {
                dely(10);
                if(key0==0)
                {
                        while(!key0);//松手
                        TR0=~TR0;//定时器停止       
                }
        }
        if(key1==0)//按下        reset
        {
                dely(10);
                if(key1==0)
                {
                        while(!key1);//松手
                        IntiTimer();//初始化定时器
                        counter=0;
                        i=0;
                        signal1=0;
                        signal2=0;
                        signal3=0;
                        signal4=0;
                        ten=0;
                        hundred=0;
                        thousand=0;
                               
                }
        }
        if(key2==0)
        {
                dely(10);
                if(key2==0)
                {
                        while(!key2);
                        TR0=1;//开始计时
                }
        }
}
void Timer()
{
                TMOD=0x01;  //0101,GATA=0,C/T=1,M1MO=01
                EA=1;          
                TH0=(65536-45872)/256;
                TL0=(65536-45872)%256;//50mS
                ET0=1;
                TR0=0;
}
void main()
{
        Timer();
        while(1)
        {
                key0scanf();
                display();
        }       
}

void TimerInterrupt() interrupt 1//定时器
{
         IntiTimer();//初始化
         counter++;

        if(counter>=2&&counter<20)//1-9
        {
                if(counter%2==0)
                {
                        i++;
                }
                if(i==10)
                {
                        i=0;
                }
        }
        if(counter>=20&&counter<200)//10s-99s
        {
                signal2=1;//开启十位

                if(counter%20==0)//每10s
                {
                        ten++;
                        if(ten==10)
                        {
                                ten=0;
                        }       
                }
                if(counter%2==0)//1s
                {
                        i++;
                        if(i==10)
                        {
                                i=0;
                        }
                }
        }
        if(counter>=200&&counter<2000)//100-999s
        {
                signal2=1;//开启十位
                signal3=1;//开启百位
                if(counter%200==0)//每100s
                {
                         hundred++;
                }
                if(counter%20==0)
                {
                        ten++;
                        if(ten==10)
                        {
                                ten=0;
                        }               
                }
               
                if(counter%2==0)//0.1s
                {
                        i++;
                        if(i==10)
                        {
                                i=0;
                        }
                }
        }
        if(counter>=2000&&counter<20000)
        {
                signal2=1;//开启十位
                signal3=1;//开启百位
                signal4=1;//开启百位
                if(counter%2000==0)//每100s
                {
                         thousand++;
                         if(thousand==10)
                         {
                                 thousand=0;
                                TR0=~TR0;//数位满后停止计时
                         }
                }
                if(counter%200==0)
                {
                        hundred++;
                        if(hundred==10)
                        {
                                hundred=0;
                        }               
                }
               
                if(counter%20==0)//1s
                {
                        ten++;
                        if(ten==10)
                        {
                                ten=0;
                        }
                }
                if(counter%2==0)
                {
                        i++;
                        if(i==10)
                        {
                                i=0;
                        }
                }
        }
}

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:237272 发表于 2017-10-16 15:19 | 只看该作者
51黑有你更精彩!!!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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