找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機(jī)數(shù)碼管電子時(shí)鐘Proteus仿真圖+代碼注釋很詳細(xì)

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
①開機(jī)為走時(shí)模式,正常顯示時(shí)間。
②共設(shè)置3個(gè)按鍵,分別為模式鍵、功能鍵1、功能鍵2。按動模式鍵,模式將在“走時(shí)/調(diào)時(shí)/日期顯示及調(diào)整/鬧鐘顯示及調(diào)整”4個(gè)模式下切換。
③走時(shí)模式下按動功能鍵1/功能鍵2停止鬧鐘。
④調(diào)時(shí)模式下,功能鍵1上調(diào)時(shí)間,功能鍵2下調(diào)時(shí)間。

仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)


單片機(jī)源程序如下:
  1. #include  <reg51.h>
  2. #define uchar unsigned char
  3. uchar code tab[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};
  4. //共陽極數(shù)碼管顯示"0~9","滅"和"-"的字段碼
  5. //uchar code tab[]={0x3f,0x06,05b,0x4f,0x66,0x6d,07d,0x07,0x7f,0x6f,0x00,0x40};//共陰數(shù)碼管
  6. uchar code wetab[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};  //位選
  7. uchar data dis[8]={0x00,0x00,0x0b,0x00,0x00,0x0b,0x00,0x00};
  8. //顯示數(shù)據(jù)緩沖區(qū),時(shí)十、個(gè)位、分十、個(gè)位、秒十、個(gè)位初始為0,0x0b為"-"編碼
  9. uchar data timedat[3]={0x00,0x00,0x00};  //分別為秒、分和小時(shí)的計(jì)數(shù)值(記錄K1和K2次數(shù))
  10. uchar data  ms50=0x00, num=0x00,  n1=0x00,  n2=0x00;
  11. //定義定時(shí)次數(shù)變量,調(diào)整模式變量,按加1鍵次數(shù)變量,按減1鍵次數(shù)變量
  12. sbit  key0=P1^0 ;  //調(diào)整鍵--模式
  13. sbit  key1=P1^1 ;  //加1鍵
  14. sbit  key2=P1^2 ;  //減1鍵
  15. //---------------------------------------
  16. void  delay1ms( unsigned  int  z )  //定義延時(shí)1ms函數(shù)
  17. { unsigned  int  x, y ;
  18. for  ( x=z;  x>0;  x-- )
  19.                 for  ( y=120; y>0 ;  y-- )        ;
  20. }
  21. //---------------------------------------
  22. //按鍵處理函數(shù)。如果沒有按鍵則時(shí)鐘正常走時(shí)。當(dāng)按K0鍵1次→暫停走時(shí)進(jìn)入調(diào)小時(shí)狀態(tài);再按K0鍵1次→進(jìn)入調(diào)分鐘狀態(tài);再按K0鍵1次→回到正常走時(shí)狀態(tài)。對于K1和K2鍵,如果正常走時(shí)下→按K1K2鍵不起作用;如果進(jìn)入調(diào)時(shí)或者調(diào)分狀態(tài)→按K1鍵可對時(shí)或分加1操作,小時(shí)加到24則回0,分鐘加到60則回0。按K2鍵可對時(shí)或分減1操作,小時(shí)減到負(fù)則回23,分鐘減到負(fù)則回59。
  23. void keyscan(  void )
  24. {        EA=0;  //關(guān)中斷
  25.         if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
  26. if (key0==0)         { delay1ms(10);         while (key0==0);
  27.                         num++; TR0=0; ET0=0;  // 調(diào)整鍵K0每按1次--模式變量num加1
  28.                         if (num>=3)         {num=0;  ET0=1;  TR0=1;  }  // 啟動T0校時(shí)
  29.         }
  30.                 if (num!=0)        //模式變量不等于0
  31. {        if (key1==0)        // K1鍵確實(shí)按下
  32.          {        delay1ms(10);         while (key1==0);           timedat[num]++;  //記錄按鍵K1按下次數(shù)
  33.                                 if (num==2) n1=24;  else n1=60;                //模式變量等于小時(shí)2--則回遲到一天或60分鐘
  34. if (timedat[num]>=n1)          { timedat[num]=0; }          }
  35.                 }
  36.                 if (num!=0)
  37.                  {        if (key2==0)        
  38. {        delay1ms(10);        while (key2==0);                 timedat[num]--;  //記錄按鍵K2按下次數(shù)
  39.                                 if (num==2) n2=23;else n2=59;                        
  40.                                 if (timedat[num]<=0)                  {timedat[num]=n2; }          }
  41.                 }
  42.                  EA=1;
  43.         }
  44. //---------------------------------------
  45. //數(shù)碼管顯示函數(shù)。時(shí)間顯示先秒個(gè)位計(jì)算顯示→秒十位計(jì)算顯示→再分個(gè)位計(jì)算顯示→分十位顯示→再時(shí)個(gè)位計(jì)算顯示→時(shí)十位顯示。
  46.          void  display( void )
  47.         {          uchar k;
  48.                 if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
  49.                  dis[0]=timedat[0]%10;  dis[1]=timedat[0]/10;   //秒
  50. dis[3]=timedat[1]%10;  dis[4]=timedat[1]/10;  //分
  51. dis[6]=timedat[2]%10;  dis[7]=timedat[2]/10;  //時(shí)
  52. for ( k=0;  k<8;  k++ )
  53.                         {         P0=tab[ dis[k] ];  P2=wetab[k];    delay1ms(1);     P2=0x00;         }
  54.         }        
  55. //---------------------------------------
  56. //主函數(shù),時(shí)間顯示先秒個(gè)位計(jì)算顯示,然后是秒十位計(jì)算顯示;再就是分個(gè)位計(jì)算顯示,然后是分十位顯示;再就是時(shí)個(gè)位計(jì)算顯示,然后是時(shí)十位顯示。定時(shí)器中斷先檢測1秒是否到→1秒如果到則秒單元加1;1秒如果沒到就檢測1分鐘是否到→1分鐘如果到則分單元加1;如果沒到就檢測1小時(shí)是否到→1小時(shí)如果到則時(shí)單元加1;如果沒到→則顯示時(shí)間。
  57.          void main( void )
  58.         {   TMOD=0x01;   //T0定時(shí)50ms,方式1
  59.                 EA=1;  ET0=1;  TR0=1;  //開中斷,允許T0中斷,啟動T0
  60.                 TH0=0x3c;  TL0=0xb0;
  61.                 while (1)
  62.                         {         display( ) ;
  63.                                 keyscan( ) ;
  64.                         }
  65. }
  66. //定時(shí)器/計(jì)數(shù)器T0中斷服務(wù)函數(shù)。定時(shí)器中斷先檢測1秒是否到→1秒如果到則秒單元加1;1秒如果沒到就檢測1分鐘是否到→1分鐘如果到則分單元加1;如果沒到就檢測1小時(shí)是否到→1小時(shí)如果到則時(shí)單元加1;如果沒到→則顯示時(shí)間。
  67.   void  timer0(void)  interrupt  1
  68. { ET0=0; TR0=0;   //不許T0中斷也不啟動
  69. TH0=0x3c;  TL0=0xb0;  
  70. TR0=1;  //啟動T0
  71. ms50++;
  72. P1=0xf7;
  73.          if(timedat[0]==0&timedat[1]==0&timedat[2]==7)  {P1=0xff;}
  74. if (ms50==20)         {        ms50=0x00;  timedat[0]++;  //變量m回0,且秒加1
  75.                 if (timedat[0]==60)          {         timedat[0]=0;timedat[1]++;  //秒到60后回0,且分加1
  76.                         if (timedat[1]==60)         {         timedat[1]=0;timedat[2]++;  //分到60后回0,且時(shí)加1
  77.                                 if (timedat[2]==24)         {         timedat[2]=0;         }         }        }  //時(shí)到24后回0
  78.                                  
  79.         }
  80.         ET0=1;   //允許T0中斷
  81. }
復(fù)制代碼

所有資料51hei提供下載:
電子時(shí)鐘.7z (45.58 KB, 下載次數(shù): 667)



評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵(lì)!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏20 分享淘帖 頂13 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:482149 發(fā)表于 2019-3-23 09:19 | 只看該作者
日期和鬧鐘怎么顯示啊
回復(fù)

使用道具 舉報(bào)

板凳
ID:565105 發(fā)表于 2019-6-17 22:19 | 只看該作者
請問這個(gè)單片機(jī)怎么用呢
回復(fù)

使用道具 舉報(bào)

地板
ID:571632 發(fā)表于 2019-6-25 13:06 | 只看該作者
希望你能以后多多上傳資料
回復(fù)

使用道具 舉報(bào)

5#
ID:412002 發(fā)表于 2020-6-8 12:11 | 只看該作者
請問用什么仿真軟件?
回復(fù)

使用道具 舉報(bào)

6#
ID:785922 發(fā)表于 2020-6-21 20:08 | 只看該作者
這個(gè)使用共陰極數(shù)碼管做的嗎?我看代碼里面既有共陽也有共陰
回復(fù)

使用道具 舉報(bào)

7#
ID:515926 發(fā)表于 2020-7-3 15:21 | 只看該作者
這個(gè)代碼編寫的行數(shù)少,收下學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

8#
ID:462715 發(fā)表于 2020-11-22 14:32 | 只看該作者
jhlaox 發(fā)表于 2020-6-8 12:11
請問用什么仿真軟件?

Proteus
回復(fù)

使用道具 舉報(bào)

9#
ID:846768 發(fā)表于 2020-11-22 22:10 | 只看該作者
timedat[0]==0&timedat[1]==0&timedat[2]==7后面這個(gè)為啥等于7?
回復(fù)

使用道具 舉報(bào)

10#
ID:848043 發(fā)表于 2020-11-24 20:35 | 只看該作者
里面沒有protures 的文件啊
回復(fù)

使用道具 舉報(bào)

11#
ID:529972 發(fā)表于 2020-12-2 20:49 | 只看該作者
654654141 發(fā)表于 2020-11-22 22:10
timedat[0]==0&timedat[1]==0&timedat[2]==7后面這個(gè)為啥等于7?

7:00鬧鐘亮
回復(fù)

使用道具 舉報(bào)

12#
ID:858511 發(fā)表于 2020-12-11 09:34 | 只看該作者
jhlaox 發(fā)表于 2020-6-8 12:11
請問用什么仿真軟件?

Proteus
回復(fù)

使用道具 舉報(bào)

13#
ID:858511 發(fā)表于 2020-12-11 09:35 | 只看該作者
內(nèi)容詳細(xì),對初學(xué)者非常有幫助
回復(fù)

使用道具 舉報(bào)

14#
ID:859848 發(fā)表于 2020-12-14 01:39 來自手機(jī) | 只看該作者
jhlaox 發(fā)表于 2020-6-8 12:11
請問用什么仿真軟件?

protues軟件仿真,keil軟件編程
回復(fù)

使用道具 舉報(bào)

15#
ID:857685 發(fā)表于 2020-12-28 19:26 | 只看該作者
這個(gè)可以啊,很強(qiáng)
回復(fù)

使用道具 舉報(bào)

16#
ID:925453 發(fā)表于 2021-5-24 12:26 | 只看該作者
大神,protus可以用嗎
回復(fù)

使用道具 舉報(bào)

17#
ID:245820 發(fā)表于 2021-11-12 22:22 | 只看該作者

應(yīng)該是開機(jī)顯示7:00
回復(fù)

使用道具 舉報(bào)

18#
ID:999989 發(fā)表于 2022-1-5 14:23 | 只看該作者
文件里的仿真圖為啥打不開呢
回復(fù)

使用道具 舉報(bào)

19#
ID:262 發(fā)表于 2022-1-5 16:32 | 只看該作者
LBJ236 發(fā)表于 2022-1-5 14:23
文件里的仿真圖為啥打不開呢

右鍵dsn文件  打開方式選擇Proteus8即可打開 如圖

或者安裝Proteus7.5可以直接打開老版本的dsn文件

51hei.gif (75.33 KB, 下載次數(shù): 163)

51hei.gif
回復(fù)

使用道具 舉報(bào)

20#
ID:1043621 發(fā)表于 2022-9-2 14:06 | 只看該作者
大佬,整點(diǎn)報(bào)時(shí)怎么能做到
回復(fù)

使用道具 舉報(bào)

21#
ID:232619 發(fā)表于 2022-9-24 22:43 | 只看該作者
這個(gè)代碼編寫的行數(shù)少,收下學(xué)習(xí)。
回復(fù)

使用道具 舉報(bào)

22#
ID:1003452 發(fā)表于 2022-12-23 10:43 | 只看該作者
jhlaox 發(fā)表于 2020-6-8 12:11
請問用什么仿真軟件?

Proteus
回復(fù)

使用道具 舉報(bào)

23#
ID:1118204 發(fā)表于 2024-4-24 23:20 | 只看該作者
這個(gè)有沒有文檔?
回復(fù)

使用道具 舉報(bào)

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

本版積分規(guī)則

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

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

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