(連載1)吳鑒鷹單片機項目精講(連載)之基于單片機的數字電子鐘設計
發布時間:2014-6-12 10:53
發布者:
吳鑒鷹
(連載1)吳鑒鷹單片機項目精講(連載)之基于單片機的數字電子鐘設計
先關的原理圖請點擊下載:
吳鑒鷹基于單片機的數字電子鐘.pdf
(295.38 KB)
2014-6-12 13:13 上傳
點擊文件名下載附件
下載積分: 積分 -1
現在來第一講,詳細解析如何制作基于單片機的數字時鐘,提供詳細的硬件原理圖和軟件程序。
開關K1:K1 = 0時,時鐘正常運行,此時不允許調整時鐘。數碼管的高兩位顯示小時,后兩位顯示分鐘,led每閃一次表示時鐘運行一次,在調整的過程中,led是停止發亮的。
一、 按鍵、開關功能說明:
* 按鍵RESET:按下能復位程序。
* 按鍵PULSE:提供單脈沖,從而實現單片機對外部脈沖的計數,利用單脈沖實現相應的位加一。
* 開關K0:K0 = 0能調整分位,K0 = 1能調整時位。
* 開關K2:k2為高電平時,使單脈沖輸入至INT1,通過外中斷實現相應值的加一功能。
二、地址分配和鏈接
* P2.7: 和寫信號一起組成字位口的片選信號,字位口的對應地址為8000H。
* P2.6: 和寫信號一起組成字位口的片選信號,字位口的對應地址為4000H。
* D0~D7: 單片機的數據總線,LED顯示的內容通過D0~D7數據線從單片機傳到LED。
* P2.0~P2.5:單片機的P2口,和2764的高位地址線相連,決定2764中的存儲單元的地址。
* P1.4~P1.7: 單片機的P1端口,和發光二極管L1~L4相連,通過單片機的P1.4~P1.7控制,所以顯示秒表和時鐘的時間變化。
* P1.0: 和開關K0相連,決定時間調整的字位。
* P1.1 : 和開關K1相連,決定時間運行的模式。
* P1.2: 和開關K2相連,決定外中斷的模式選擇。
三、整體功能簡介
LED顯示模塊與單片機的鏈接中,對LED顯示模塊的讀寫和字位、段碼的選擇通過口P2.6\P2.7完成的。
外部存儲器2764是通過鎖存器373和單片機相連,并且通過P2端口的相關信號線進行地址的分配。地址范圍是0000H~1FFFH。
四、程序設計
- /******************************************************
- *程序:吳鑒鷹數字電子鐘的設計
- ** 這一講的主要內容: 數字電子鐘的設計原理和程序
- ** 功能描述:
- ** 輸 入:
- ** 內容:
- ** 輸 出:
- **
- ** 全局變量:
- ** 調用模塊:
- **
- ** 作 者: 吳鑒鷹
- ** 日 期: 14.02.17
- 備注:有什么錯誤的地方,歡迎各大燒友指正
- O(∩_∩)O~
- *******************************************************/
- //變量定義和頭文件的調用
- //定義頭文件和各個輸入管腳以及變量聲明
- #include
- #include
- #define uint unsigned int
- #define uchar unsigned char
- /*定義字型字位口*/
- #define DIGPORT XBYTE [0X8000]
- #define WORDPORT XBYTE [0X4000]
- /*定義P1口各管腳*/
- sbit K0 = P1^0;
- sbit K1 = P1^1;
- sbit K2 = P1^2;
- sbit BEEP = P1^3;
- sbit L0 = P1^4;
- sbit L1 = P1^5
- sbit L2 = P1^6;
- sbit L3 = P1^7;
- uchar data BUFFER[2] = {0,0}; //顯示的緩存數組,依次為低位、高位
- uchar data CLOCK[4] = {0,0,0,0};
- uchar data SECOND[2] = {0,0};
- /*定義運行狀態*/
- uchar data STATE = 0;
- /*STATE = 0;秒表*/
- /*STATE = 4,或者7,時鐘運行*/
- /* STATE = 6,時鐘時調整 */
- bit bdata SND = 0; /* 秒表START(開始) */
- bit bdata RST = 0; /*秒表RESET(復位)*/
- /*數碼管顯示編碼“0”-“9”,"A","-"*/
- uchar code TABLE[] = {0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0X77,0X40};
- /******************************************************
- *程序:主程序
- ** 功能描述: 主干程序
- ** 輸 入:
- ** 內容:
- ** 輸 出:
- **
- ** 全局變量:
- ** 調用模塊:
- **
- ** 作 者: 吳鑒鷹
- ** 日 期: 14.02.17
- 備注:有什么錯誤的地方,歡迎各大燒友指正
- O(∩_∩)O~
- *******************************************************/
- void main()
- {
- uchar stabak;
- P1 = 0X0F;
- EA = 1;
- IT1 = 1;
- ET0 = 1;
- TMOD = 0X61;
- TH0 = -5000/256;
- TL0 = -5000%256;
- TH1 = 0XFF;
- TL1 = 0XFF;
- T2CON = 0;
- TH2 = -5000/256;
- TL2 = -5000%256;
- K0 = 1;
- K1 = 1;
- K2 = 1;
- STATE = P1&0X07;
- stabak = STATE;
- for(;;)
- {
- switch()
- {
- case 0:
- {
- EX1 = 0;
- ET1 = 1;
- ET2 = 1;
- TR1 = 1;
- SND = 1;
- L1 = 1;
- L0 = 0;
- L2 = 0;
- SECOND[0] = 0;
- SECOND[1] = 0;
- }break;
- case 5:
- {
- IE1 = 0;
- EX1 = 1;
- ET1 = 0;
- ET2 = 0;
- TR0 = 0;
- L0 = 1;
- L1 = 0;
- L2 = 0;
- }break;
- case 6:
- {
- IE1 = 0;
- EX1 = 1;
- ET1 = 0;
- ET2 = 1;
- TR0 = 0;
- }break;
- default:
- {
- EX1 = 0;
- ET1 = 0;
- ET2 = 1;
- L1 = 0;
- L2 = 0;
- }
- }
- while(STATE == stabak)
- {
- switch(STATE)
- {
- case 0:
- {
- BUFFER[0] = SECOND[0];
- BUFFER[1] = SECOND[1];
- }break;
-
- case 5:
- {
- BUFFER[0] = CLOCK[2];
- BUFFER[1] = 101;/*A-*/
- }break;
-
- case 6:
- {
- BUFFER[0] = 110;/*A-*/
- BUFFER[1] = CLOCK[3];
- }break;
-
- default:
- {
- BUFFER[0] = CLOCK[2];
- BUFFER[1] = CLOCK[3];
- }break;
-
- default:
- {
- BUFFER[0] = CLOCK[2];
- BUFFER[1] = CLOCK[3];
- }
-
- }
-
- //顯示函數
- display();
- K0 = 1;
- K1 = 1;
- K2 = 1;
- STATE = P1&0X07;
- }
- stabak = STATE;
- }
- }
- /******************************************************
- *程序:子函數(1):timer0(void)
- ** 功能描述: 用定時器0實現24小時的時鐘顯示
- ** 輸 入:
- ** 內容:
- ** 輸 出:
- **
- ** 全局變量:
- ** 調用模塊:
- **
- ** 作 者: 吳鑒鷹
- ** 日 期: 14.02.17
- 備注:有什么錯誤的地方,歡迎各大燒友指正
- O(∩_∩)O~
- *******************************************************/
- void timer0(void) interrupt 1 using 1
- {
- /*重置定時器初值*/
- TH0 = -5000/256;
- TL0 = -5000%256;
- /*定時器處理*/
- CLOCK[0] = CLOCK[0]+1;
- if((CLOCK[0] == 50) && (STATE >= 4))
- {
- L0 = !L0;
- }
- if(CLOCK[0] == 100)
- {
- if(STATE >= 4) L0 = !L0;
- CLOCK[0] = 0;
- CLOCK[1] = CLOCK[1] + 1;
-
- if(CLOCK[1] == 60)
- {
- CLOCK[1] = 0;
- CLOCK[2] = CLOCK[2] + 1;
- if(CLOCK[2] == 60)
- {
- CLOCK[2] == 0;
- CLOCK[3] == CLOCK[3] + 1;
- if(CLOCK[3] == 24)
- {
- CLOCK[3] = 0;
- }
- }
- }
- }
- }
- /******************************************************
- *程序:子函數(2):intsvr1(void)
- ** 功能描述: 對外中斷1的按鍵脈沖進行判斷和計數,并完成對應的時間調整功能。
- ** 輸 入:
- ** 內容:
- ** 輸 出:
- **
- ** 全局變量:
- ** 調用模塊:
- **
- ** 作 者: 吳鑒鷹
- ** 日 期: 14.02.17
- 備注:有什么錯誤的地方,歡迎各大燒友指正
- O(∩_∩)O~
- *******************************************************/
- void intsvr1(void) interrupt 2 using 2
- {
- if(STATE == 5)
- {
- CLOCK[2] == CLOCK[2] + 1;
- if(CLOCK[2] == 60) CLOCK[2] == 0;
- }
- if(STATE == 6)
- {
- CLOCK[3] == CLOCK[3] + 1;
- if(CLOCK[3] == 24) CLOCK[3] = 0;
- }
- }
- /******************************************************
- *程序:子函數(3):display(void)
- ** 功能描述: 用動態顯示的方法,將當前的時間或秒表內容通過數碼管顯示。
- ** 輸 入:
- ** 內容:
- ** 輸 出:
- **
- ** 全局變量:
- ** 調用模塊:
- **
- ** 作 者: 吳鑒鷹
- ** 日 期: 14.02.17
- 備注:有什么錯誤的地方,歡迎各大燒友指正
- O(∩_∩)O~
- *******************************************************/
- void diplay(void)
- {
- uchar i;
- uchar delay;
- uchar disp;
- uchar digit;
- digit = 0x08;
- for(i = 0;i < 2; i++)
- {
- if(BUFFET> 100)
- {
- disp = BUFFER%10 + 10;
- }
- else disp = BUFFER%10;
-
- DIGPORT = digit;
- WORDPORT = TABLE[disp];
-
- for(delay = 0;delay <= 200;delay ++);
- digit = digit >> 1;
- disp = BUFFER/10;
-
- DIGPORT = digit;
- WORDPORT = TABLE[disp];
-
- for(delay = 0;delay <= 200;delay ++);
- digit = digit >> 1;
- }
- }
復制代碼
|