找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2659|回復(fù): 2
打印 上一主題 下一主題
收起左側(cè)

數(shù)碼秒表設(shè)計(jì)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:237248 發(fā)表于 2017-10-4 16:41 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
  1. //實(shí)例65:數(shù)碼秒表設(shè)計(jì)
  2. #include<reg51.h>  //  包含51單片機(jī)寄存器定義的頭文件
  3. unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  4. //數(shù)碼管顯示0~9的段碼表
  5. unsigned char int_time;        //記錄中斷次數(shù)
  6. unsigned char second;        //儲(chǔ)存秒
  7. /***********************************************************************
  8. 函數(shù)功能:快速動(dòng)態(tài)掃描延時(shí),延時(shí)約0.6毫秒
  9. ************************************************************************/
  10. void delay(void)
  11. {
  12.   unsigned char i;
  13.   for(i=0;i<200;i++)
  14.         ;
  15. }
  16. /***********************************************************************
  17. 函數(shù)功能:顯示秒
  18. 入口參數(shù):k
  19. 出口參數(shù):無
  20. ************************************************************************/
  21. void DisplaySecond(unsigned char k)
  22. {
  23.    
  24.    P2=0xfb;        //P2.6引腳輸出低電平, DS6點(diǎn)亮
  25.    P0=Tab[k/10];          //顯示十位
  26.    delay();

  27.    P2=0xf7;       //P2.7引腳輸出低電平, DS7點(diǎn)亮
  28.    P0=Tab[k%10];         //顯示個(gè)位
  29.         delay();
  30.         P2=0xff;     //關(guān)閉所有數(shù)碼管



  31. }
  32.   void main(void)      //主函數(shù)
  33.    {
  34.           TMOD=0x01;                 //使用定時(shí)器T0
  35.           TH0=(65536-46083)/256;    //將定時(shí)器計(jì)時(shí)時(shí)間設(shè)定為46083×1.085微秒
  36. //=50000微秒=50毫秒
  37.            TL0=(65536-46083)%256;
  38.                 EA=1;                    //開啟總中斷
  39.                 ET0=1;                   //定時(shí)器T0中斷允許
  40.                 TR0=1;                   //啟動(dòng)定時(shí)器T0開始運(yùn)行
  41.                 int_time=0;     //中斷次數(shù)初始化
  42.                 second=0;           //秒初始化               
  43.         while(1)
  44.                 {
  45.                DisplaySecond(second);        //調(diào)用秒的顯示子程序
  46.                  }
  47.     }  
  48. //********************************************************
  49. //函數(shù)功能:定時(shí)器T0的中斷服務(wù)程序
  50. //*******************************************************
  51.   void interserve(void ) interrupt 1 using 1  
  52.   {
  53.     TR0=0;    //關(guān)閉定時(shí)器T0
  54.     int_time ++;        //每來一次中斷,中斷次數(shù)int_time自加1       
  55.          if(int_time==20)   //夠20次中斷,即1秒鐘進(jìn)行一次檢測結(jié)果采樣
  56.           {
  57.         int_time=0;    //中斷次數(shù)清0
  58.             second++;    //秒加1
  59.             if(second==60)
  60.               second =0; //秒等于60就返回0
  61.           }                     
  62.           TH0=(65536-46083)/256;   //重新給計(jì)數(shù)器T0賦初值
  63.         TL0=(65536-46083)%256;
  64.         TR0=1;     //啟動(dòng)定時(shí)器T0
  65. }  

  66. //實(shí)例65:數(shù)碼秒表設(shè)計(jì)
  67. #include<reg51.h>  //  包含51單片機(jī)寄存器定義的頭文件
  68. unsigned char code Tab[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  69. //數(shù)碼管顯示0~9的段碼表
  70. unsigned char int_time;        //記錄中斷次數(shù)
  71. unsigned char second;        //儲(chǔ)存秒
  72. /***********************************************************************
  73. 函數(shù)功能:快速動(dòng)態(tài)掃描延時(shí),延時(shí)約0.6毫秒
  74. ************************************************************************/
  75. void delay(void)
  76. {
  77.   unsigned char i;
  78.   for(i=0;i<200;i++)
  79.         ;
  80. }
  81. /***********************************************************************
  82. 函數(shù)功能:顯示秒
  83. 入口參數(shù):k
  84. 出口參數(shù):無
  85. ************************************************************************/
  86. void DisplaySecond(unsigned char k)
  87. {
  88.    
  89.    P2=0xfb;        //P2.6引腳輸出低電平, DS6點(diǎn)亮
  90.    P0=Tab[k/10];          //顯示十位
  91.    delay();

  92.    P2=0xf7;       //P2.7引腳輸出低電平, DS7點(diǎn)亮
  93.    P0=Tab[k%10];         //顯示個(gè)位
  94.         delay();
  95.         P2=0xff;     //關(guān)閉所有數(shù)碼管



  96. }
  97.   void main(void)      //主函數(shù)
  98.    {
  99.           TMOD=0x01;                 //使用定時(shí)器T0
  100.           TH0=(65536-46083)/256;    //將定時(shí)器計(jì)時(shí)時(shí)間設(shè)定為46083×1.085微秒
  101. //=50000微秒=50毫秒
  102.            TL0=(65536-46083)%256;
  103.                 EA=1;                    //開啟總中斷
  104.                 ET0=1;                   //定時(shí)器T0中斷允許
  105.                 TR0=1;                   //啟動(dòng)定時(shí)器T0開始運(yùn)行
  106.                 int_time=0;     //中斷次數(shù)初始化
  107.                 second=0;           //秒初始化               
  108.         while(1)
  109.                 {
  110.                DisplaySecond(second);        //調(diào)用秒的顯示子程序
  111.                  }
  112.     }  
  113. //********************************************************
  114. //函數(shù)功能:定時(shí)器T0的中斷服務(wù)程序
  115. //*******************************************************
  116.   void interserve(void ) interrupt 1 using 1  
  117.   {
  118.     TR0=0;    //關(guān)閉定時(shí)器T0
  119.     int_time ++;        //每來一次中斷,中斷次數(shù)int_time自加1       
  120.          if(int_time==20)   //夠20次中斷,即1秒鐘進(jìn)行一次檢測結(jié)果采樣
  121.           {
  122.         int_time=0;    //中斷次數(shù)清0
  123.             second++;    //秒加1
  124.             if(second==60)
  125.               second =0; //秒等于60就返回0
  126.           }                     
  127.           TH0=(65536-46083)/256;   //重新給計(jì)數(shù)器T0賦初值
  128.         TL0=(65536-46083)%256;
  129.         TR0=1;     //啟動(dòng)定時(shí)器T0
  130. }  

復(fù)制代碼
51單片機(jī)數(shù)碼秒表設(shè)計(jì)。
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:231376 發(fā)表于 2017-10-5 10:36 | 只看該作者
狗尾續(xù)貂,我也發(fā)一個(gè),大一時(shí)候?qū)懙,適用于小開發(fā)板,寫的很渣,只保留了一位小數(shù)~

#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;//十位數(shù)

static unsigned char signal1=0;//1為顯示十位數(shù),0為不顯示,控制個(gè)位數(shù),直接寫死=1
static unsigned char signal2=0;//1為顯示十位數(shù),0為不顯示
static unsigned char signal3=0;//1為顯示百位數(shù),0為不顯示
static unsigned char signal4=0;//1為顯示百位數(shù),0為不顯示

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

void IntiTimer()//初始化定時(shí)器
{
        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()//控制數(shù)碼管
{
        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;
        }
}
//一個(gè)數(shù)碼管點(diǎn)亮1s后熄滅
//實(shí)現(xiàn)第一個(gè)stop鍵
void key0scanf()//檢測鍵盤 stop
{
        if(key0==0)//按下
        {
                dely(10);
                if(key0==0)
                {
                        while(!key0);//松手
                        TR0=~TR0;//定時(shí)器停止       
                }
        }
        if(key1==0)//按下        reset
        {
                dely(10);
                if(key1==0)
                {
                        while(!key1);//松手
                        IntiTimer();//初始化定時(shí)器
                        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;//開始計(jì)時(shí)
                }
        }
}
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//定時(shí)器
{
         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;//數(shù)位滿后停止計(jì)時(shí)
                         }
                }
                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;
                        }
                }
        }
}

評(píng)分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:237272 發(fā)表于 2017-10-16 15:19 | 只看該作者
51黑有你更精彩!!!
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表