久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1996|回復: 0
打印 上一主題 下一主題
收起左側

基于51單片機數碼管電子時鐘

[復制鏈接]
跳轉到指定樓層
樓主
ID:686142 發表于 2021-4-28 18:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
A. 該資源為基于51單片機的電子時鐘,具有仿真和程序源碼
B. 由數碼管作為顯示器,三個按鍵可以設置時間。
資源包內包括仿真


#include  <reg51.h>
#define uchar unsigned char
uchar code tab[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
//共陽極數碼管顯示"0~9","滅"和"-"的字段碼
//uchar code tab[]={0x3f,0x06,05b,0x4f,0x66,0x6d,07d,0x07,0x7f,0x6f,0x00,0x40};//共陰數碼管
uchar code wetab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //位選
uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
//顯示數據緩沖區,時十、個位、分十、個位、秒十、個位初始為0,0x0b為"-"編碼
uchar data timedat[3]={0x00,0x00,0x00};  //分別為秒、分和小時的計數值(記錄K1和K2次數)
uchar data  ms50=0x00, num=0x00,  n1=0x00,  n2=0x00;
//定義定時次數變量,調整模式變量,按加1鍵次數變量,按減1鍵次數變量
sbit  key0=P1^0 ;  //調整鍵--模式
sbit  key1=P1^1 ;  //加1鍵
sbit  key2=P1^2 ;  //減1鍵
//---------------------------------------
void  delay1ms( unsigned  int  z )  //定義延時1ms函數
{ unsigned  int  x, y ;
for  ( x=z;  x>0;  x-- )
                for  ( y=120; y>0 ;  y-- )        ;
}
//---------------------------------------
//按鍵處理函數。如果沒有按鍵則時鐘正常走時。當按K0鍵1次→暫停走時進入調小時狀態;再按K0鍵1次→進入調分鐘狀態;再按K0鍵1次→回到正常走時狀態。對于K1和K2鍵,如果正常走時下→按K1K2鍵不起作用;如果進入調時或者調分狀態→按K1鍵可對時或分加1操作,小時加到24則回0,分鐘加到60則回0。按K2鍵可對時或分減1操作,小時減到負則回23,分鐘減到負則回59。
void keyscan(  void )
{        EA=0;  //關中斷
        if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
if (key0==0)         { delay1ms(10);         while (key0==0);
                        num++; TR0=0; ET0=0;  // 調整鍵K0每按1次--模式變量num加1
                        if (num>=3)         {num=0;  ET0=1;  TR0=1;  }  // 啟動T0校時
        }
                if (num!=0)        //模式變量不等于0
{        if (key1==0)        // K1鍵確實按下
         {        delay1ms(10);         while (key1==0);           timedat[num]++;  //記錄按鍵K1按下次數
                                if (num==2) n1=24;  else n1=60;                //模式變量等于小時2--則回遲到一天或60分鐘
if (timedat[num]>=n1)          { timedat[num]=0; }          }
                }
                if (num!=0)
                 {        if (key2==0)       
{        delay1ms(10);        while (key2==0);                 timedat[num]--;  //記錄按鍵K2按下次數
                                if (num==2) n2=23;else n2=59;                       
                                if (timedat[num]<=0)                  {timedat[num]=n2; }          }
                }
                 EA=1;
        }
//---------------------------------------
//數碼管顯示函數。時間顯示先秒個位計算顯示→秒十位計算顯示→再分個位計算顯示→分十位顯示→再時個位計算顯示→時十位顯示。
         void  display( void )
        {          uchar k;
                if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
                 dis[0]=timedat[0]%10;  dis[1]=timedat[0]/10;   //秒
dis[3]=timedat[1]%10;  dis[4]=timedat[1]/10;  //分
dis[6]=timedat[2]%10;  dis[7]=timedat[2]/10;  //時
for ( k=0;  k<8;  k++ )
                        {         P0=tab[ dis[k] ];  P2=wetab[k];    delay1ms(1);     P2=0x00;         }
        }       
//---------------------------------------
//主函數,時間顯示先秒個位計算顯示,然后是秒十位計算顯示;再就是分個位計算顯示,然后是分十位顯示;再就是時個位計算顯示,然后是時十位顯示。定時器中斷先檢測1秒是否到→1秒如果到則秒單元加1;1秒如果沒到就檢測1分鐘是否到→1分鐘如果到則分單元加1;如果沒到就檢測1小時是否到→1小時如果到則時單元加1;如果沒到→則顯示時間。
         void main( void )
        {   TMOD=0x01;   //T0定時50ms,方式1
                EA=1;  ET0=1;  TR0=1;  //開中斷,允許T0中斷,啟動T0
                TH0=0x3c;  TL0=0xb0;
                while (1)
                        {         display( ) ;
                                keyscan( ) ;
                        }
}
//定時器/計數器T0中斷服務函數。定時器中斷先檢測1秒是否到→1秒如果到則秒單元加1;1秒如果沒到就檢測1分鐘是否到→1分鐘如果到則分單元加1;如果沒到就檢測1小時是否到→1小時如果到則時單元加1;如果沒到→則顯示時間。
  void  timer0(void)  interrupt  1
{ ET0=0; TR0=0;   //不許T0中斷也不啟動
TH0=0x3c;  TL0=0xb0;  
TR0=1;  //啟動T0
ms50++;
P1=0xf7;
         if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
if (ms50==20)         {        ms50=0x00;  timedat[0]++;  //變量m回0,且秒加1
                if (timedat[0]==60)          {         timedat[0]=0;timedat[1]++;  //秒到60后回0,且分加1
                        if (timedat[1]==60)         {         timedat[1]=0;timedat[2]++;  //分到60后回0,且時加1
                                if (timedat[2]==24)         {         timedat[2]=0;         }         }        }  //時到24后回0
                                 
        }
        ET0=1;   //允許T0中斷

}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产黄色麻豆视频 | 亚洲精品乱码久久久久久按摩 | 日本三级网站在线 | 国产伊人精品 | 丁香婷婷成人 | 精品中文字幕视频 | 欧美日韩亚洲一区二区 | 国产精品久久久久久久久久 | 久草欧美 | 久久亚洲欧美日韩精品专区 | www操操| 一区二区av | 国产精品人人做人人爽 | 在线午夜 | 久久精品国产久精国产 | 日韩精品中文字幕一区二区三区 | 国产精品久久久久久久久久免费看 | 欧美日本高清 | 色网站入口 | 欧美一区二区三区的 | 国产伦精品一区二区三区高清 | 成人高清网站 | 最新黄色在线观看 | 日韩久久久久 | 一级黄色录像片子 | 国产一区二区三区亚洲 | 成人欧美日韩一区二区三区 | 成人福利电影 | 视频一区二区三区在线观看 | 欧美一区日韩一区 | 日韩一区二区久久 | 国产一级黄色网 | 久久久久久国产精品久久 | 一区二区精品视频 | 国产一区二区三区在线视频 | 亚洲国产精品区 | 精品亚洲一区二区三区 | 91国产视频在线 | 久久伊人青青草 | 欧美日产国产成人免费图片 | 久久国产精品久久国产精品 |