- UID
- 373967
- 帖子
- 8867
- 主題
- 2609
- 精華
- 0
- 積分
- 1000
- 楓幣
- 15
- 威望
- 977
- 存款
- 34822
- 贊助金額
- 0
- 推廣
- 0
- GP
- 1205
- 閱讀權限
- 70
- 在線時間
- 455 小時
- 註冊時間
- 2023-1-12
- 最後登入
- 2024-11-22
|
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 時,進入時間設置模式,可以通過按鈕來設置時間。 |
|