冰楓論壇

 找回密碼
 立即註冊
ads_sugarbook
搜索
查看: 514|回覆: 0
打印 上一主題 下一主題

[閒聊] AT89C2051-24PU製作電子鐘

[複製鏈接]

2609

主題

0

好友

945

積分

高級會員

Rank: 4

UID
373967
帖子
7423
主題
2609
精華
0
積分
945
楓幣
1101
威望
925
存款
26000
贊助金額
0
推廣
0
GP
1205
閱讀權限
50
在線時間
407 小時
註冊時間
2023-1-12
最後登入
2024-5-2

2023端午節紀念勳章 2023中秋節紀念勳章 2023聖誕節紀念勳章

跳轉到指定樓層
1
發表於 2023-3-27 19:30:11 |只看該作者 |倒序瀏覽
AT89C2051-24PU 是一種低成本、高性能的單片機,可以用來製作許多不同的電子產品,包括電子鐘。下面是製作一個基於 AT89C2051-24PU 的電子鐘所需的明確零件、連接腳位和程式碼。

所需零件:

AT89C2051-24PU 單片機
32.768kHz 晶體
2 個 22pF 陶瓷電容
2 個 33pF 陶瓷電容
10uF 電解電容
2 個 1N4148 小信號二極管
4 個按鈕開關
4 顆 7 段顯示器
4 個 ULN2803 驅動芯片
4 個 BC547 NPN 電晶體
4 個 330Ω 電阻
4 個 1KΩ 電阻
4 個 10KΩ 電阻
電源線
杜邦線
連接腳位:

以下是 AT89C2051-24PU 的連接腳位,以及它們所對應的功能。


1. P1.0 - 七段顯示器 A 段控制輸入
2. P1.1 - 七段顯示器 B 段控制輸入
3. P1.2 - 七段顯示器 C 段控制輸入
4. P1.3 - 七段顯示器 D 段控制輸入
5. P1.4 - 七段顯示器 E 段控制輸入
6. P1.5 - 七段顯示器 F 段控制輸入
7. P1.6 - 七段顯示器 G 段控制輸入
8. P1.7 - 七段顯示器 DP 段控制輸入
9. RST - 外部重置輸入
10. P3.0 - 晶體振盪器 X1 輸入
11. P3.1 - 晶體振盪器 X2 輸入
12. P3.2 - 時間校準按鈕
13. P3.3 - 時間設置按鈕
14. P3.4 - 時間顯示按鈕
15. P3.5 - 時間顯示切換按鈕


程式碼:

下面是使用 Keil 軟體編寫的 AT89C2051-24PU 電子鐘程式碼。這個程式碼可以實現時間顯示、時間設置、時間校準、時間顯示切換等功能。


#include <reg2051.h>

unsigned char hour = 0, minute = 0, second = 0;
unsigned char flag = 0;

void timer0_init(void);
void display_time(void);
void delay(unsigned int);

void main(void)
{
  P1 = 0xff;
  P3 = 0xff;
  timer0_init();
  while (1)
  {
    if (flag == 0)
    {
      display_time();
    }
    else
    {
      if (P3_2 == 0)
      {
        delay(10);
        if (P3_2 == 0)
        {
          hour++;
          if (hour == 24)
          {
            hour = 0;
          }
        }
      }
      else if (P3_3 == 0)
      {
        delay(10);
        if (P3_3 == 0)
        {
          minute++;
          if (minute == 60)
          {
            minute = 0;
            hour++;
            if (hour == 24)
            {
              hour = 0;
            }
          }
        }
      }
      else if (P3_4 == 0)
      {
        delay(10);
        if (P3_4 == 0)
        {
          second = 0;
          hour = 0;
          minute = 0;
        }
      }
      else if (P3_5 == 0)
      {
        delay(10);
        if (P3_5 == 0)
        {
          flag = 0;
        }
      }
      display_time();
    }
  }
}

void timer0_init(void)
{
  TMOD = 0x01;
  TH0 = 0x4C;
  TL0 = 0x00;
  TR0 = 1;
  ET0 = 1;
  EA = 1;
}

void display_time(void)
{
  unsigned char s1, s2, m1, m2, h1, h2;
  s1 = second % 10;
  s2 = second / 10;
  m1 = minute % 10;
  m2 = minute / 10;
  h1 = hour % 10;
  h2 = hour / 10;

  P1 = 0xff;
  P0 = 0x01 << 4;
  P1 = ~(0x01 << s1);
  delay(5);

  P1 = 0xff;
  P0 = 0x02 << 4;
  P1 = ~(0x01 << s2);
  delay(5);

  P1 = 0xff;
  P0 = 0x04 << 4;
  P1 = ~(0x01 << m1);
  delay(5);

  P1 = 0xff;
  P0 = 0x08 << 4;
  P1 = ~(0x01 << m2);
  delay(5);

  P1 = 0xff;
  P0 = 0x10 << 4;
  P1 = ~(0x01 << h1);
  delay(5);

  P1 = 0xff;
  P0 = 0x20 << 4;

P1 = ~(0x01 << h2);
delay(5);
}

void delay(unsigned int i)
{
unsigned int j;
for (; i > 0; i--)
{
for (j = 112; j > 0; j--);
}
}

void timer0_isr(void) __interrupt(1)
{
TH0 = 0x4C;
TL0 = 0x00;
second++;
if (second == 60)
{
second = 0;
minute++;
if (minute == 60)
{
minute = 0;
hour++;
if (hour == 24)
{
hour = 0;
}
}
}
}



這個程式碼中,timer0_init 函數用於初始化 Timer0 計時器,display_time 函數用於顯示時間,delay 函數用於產生延遲,timer0_isr 函數用於實現計時器中斷處理程序。在主函數中,使用 P3_2 ~ P3_5 來實現時間設置和時間顯示切換功能,flag 變量用於記錄當前顯示模式。當 flag 等於 0 時,顯示時間;當 flag 不等於 0 時,進入時間設置模式,可以通過按鈕來設置時間。
收藏收藏0 推0 噓0


把本文推薦給朋友或其他網站上,每次被點擊增加您在本站積分: 1骰子
複製連結並發給好友,以賺取推廣點數
簡單兩步驟,註冊、分享網址,即可獲得獎勵! 一起推廣文章換商品、賺$$
高級模式
B Color Image Link Quote Code Smilies |上傳

廣告刊登意見回饋關於我們職位招聘本站規範DMCA隱私權政策

Copyright © 2011-2024 冰楓論壇, All rights reserved

免責聲明:本網站是以即時上載留言的方式運作,本站對所有留言的真實性、完整性及立場等,不負任何法律責任。

而一切留言之言論只代表留言者個人意見,並非本網站之立場,用戶不應信賴內容,並應自行判斷內容之真實性。

小黑屋|手機版|冰楓論壇

GMT+8, 2024-5-3 02:09

回頂部