【正文】
l e d6Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d7Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d8Y E L L O W C Aa a a a a a a ab b b b b b b bccccccccd d d d d d d deeeeeeeef f f f f f f fggggggggh h h h h h h h12345678 圖 LED數(shù)碼管 5)總體控制方案 按鍵:共四個(gè) key1~key4 當(dāng) key1 鍵按下時(shí)處于停止?fàn)顟B(tài),同時(shí)按 key2 實(shí)現(xiàn)秒加加,一次加一,再按一下 key1 就可以實(shí)現(xiàn)調(diào)分,再按 key2 實(shí)現(xiàn)分加加,按第三次 key1 實(shí)現(xiàn)時(shí)加加。 key3 可以實(shí)現(xiàn)鬧鐘調(diào)試 ,按一下整個(gè)界面跳為 000000,在按 key2 實(shí)現(xiàn)鬧鐘的秒加加,在按 key3 實(shí)現(xiàn)鬧鐘分調(diào)狀態(tài),按下 key2 實(shí)現(xiàn)分加加,在按下 key2 實(shí)現(xiàn)鬧鐘調(diào)時(shí), key2 鬧時(shí)加加,在按 key3 時(shí)鐘又到正常工作狀態(tài)。 6)系統(tǒng)所能實(shí)現(xiàn)的功能 ( 1) 時(shí)間為 24 小時(shí)一個(gè)周期 ( 2) 7段數(shù)碼管顯示時(shí)、分、秒。 ( 4) 可調(diào)鬧,整點(diǎn)報(bào)時(shí)功能。 AT89C52的芯片有四個(gè) IO 口,分別是 P0 , P1, P2, P3。因?yàn)?p0口沒有上拉電阻,所以外接的時(shí)候要接上拉電阻。 P3 口: P3 口有第二功能,第一功能和 P2口一樣有 IO輸入輸出的功能第二功能為 RxD() 串行輸入口 TxD() 串行輸出口 INT0() 外部中斷 0 INT1() 外部中斷 T0() 定時(shí)器 0 外部輸入 T1() 定時(shí)器 1 外部輸入 WR() 外部數(shù)據(jù)存儲(chǔ)器寫信號(hào) RD() 外部數(shù)據(jù)存儲(chǔ)器讀信號(hào) 這就是 P3 口的第二功能敘述。 REST:復(fù)位 當(dāng)晶振在運(yùn)行中只要復(fù)位管腳出現(xiàn) 2 個(gè)機(jī)器周期高電平即可復(fù)位內(nèi)部有擴(kuò)散電阻連接到 Vss 僅需要外接一個(gè)電容到 Vcc 即可實(shí)現(xiàn)上電復(fù)位。我這里主要用到定時(shí)功能所以我先介紹一下定時(shí)功能。 AT89C52 共有 6個(gè)中斷向量:兩個(gè)外中斷( INT0 和 INT1), 3 個(gè)定時(shí)器中斷(定時(shí)器 0、 2)和串行口中斷。 IE 也有一個(gè)總禁止位 EA,ijklmnopm1m2m3m4m5m6m7m8J1J2FENGS1S2S3S4abcdefghP1021P1122P1223P1324P1425P1526P1627P1728INT129INT030T131T032EA/VP33X134X235RESET36RD37WR38VCC39GND40P001P012P023P034P045P056P067P078P209P2110P2211P2312P2413P2514P2615P2716RXD17TXD18ALE/P19PSEN20AT89C52u189c52 圖 AT89C52 《單片機(jī)應(yīng)用系統(tǒng)》項(xiàng)目設(shè)計(jì)報(bào)告 7 它能控制所有中斷的允許或禁止。 定時(shí)器 2 的中斷是由 T2CON 中的 TF2 和 EXF2 邏輯或產(chǎn)生的,當(dāng)轉(zhuǎn)向中斷服務(wù)程序時(shí),這些標(biāo)志位不能被硬件清除,事實(shí)上,服務(wù)程序需確定是 TF2 或 EXF2 產(chǎn)生中斷,而由軟件清除中斷標(biāo)志位。然而,定時(shí)器 2 的標(biāo)志位TF2 在定時(shí)器溢出的那個(gè)機(jī)器周期的 S2P2 狀態(tài)置位,并在同一個(gè)機(jī)器周期內(nèi)查詢到該標(biāo)志。 保證一定的掃描循環(huán) 。 靜態(tài)顯示驅(qū)動(dòng) 靜態(tài)驅(qū)動(dòng)也稱直流驅(qū)動(dòng)。靜態(tài)驅(qū)動(dòng)的優(yōu)點(diǎn)是編程簡單,顯示亮度高,缺點(diǎn)是占用 I/O 端口多,如驅(qū)動(dòng) 5 個(gè)數(shù)碼管靜態(tài)顯示則需要 58=40 根 I/O 端口來驅(qū)動(dòng),要知道一個(gè)89S51 單片機(jī)可用的 I/O 端口才 32 個(gè)呢:),實(shí)際應(yīng)用時(shí)必須增加譯碼驅(qū)動(dòng)器進(jìn)行驅(qū)動(dòng),增加了硬件電路的復(fù)雜性。通過分時(shí)輪流控制各個(gè)數(shù)碼管的abfcgdeV C C1234567abcdefg8 dp dp9l e d1Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d2Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d3Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d4Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d5Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d6Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d7Y E L L O W C AabfcgdeV C C1234567abcdefg8 dp dp9l e d8Y E L L O W C Aa a a a a a a ab b b b b b b bccccccccd d d d d d d deeeeeeeef f f f f f f fggggggggh h h h h h h h12345678 如圖 7段共陽極 led碼管數(shù) 《單片機(jī)應(yīng)用系統(tǒng)》項(xiàng)目設(shè)計(jì)報(bào)告 8 的 COM 端,就使各個(gè)數(shù)碼管輪流受控顯示,這就是動(dòng)態(tài)驅(qū)動(dòng)。 3) 74LS245 驅(qū)動(dòng) 74LS245 是我們常用的芯片,用來驅(qū)動(dòng) led 或者其他的設(shè)備,它是 8路同相三態(tài)雙向總線收發(fā)器,可雙向傳輸數(shù)據(jù)。 當(dāng) 8051單片機(jī)的 P0口總線負(fù)載達(dá)到或超過 P0最大負(fù)載能力時(shí),必須接入 74LS245等總線驅(qū)動(dòng)器。 由于 P2口始終輸出地址的高 8位,接口時(shí) 74LS245的三態(tài)控制端 /1G和 /2G接 地,P2 口與驅(qū)動(dòng)器輸入線對應(yīng)相連。 8051的 /RD和 /PSEN相與后接 DIR,使得 /RD或 /PSEN有效時(shí), 74LS245輸入( ← Di),其它時(shí)間處于輸出( → Di)。所以一般都是通過三極管的放大作用來控制。三極管的作用是放大,圖中所示的是 PNP型三極管。因?yàn)?51單片機(jī)在上電的時(shí)候 IO引腳默認(rèn)是高電平,而在 IO 為高情況下,PNP 三極管 8550 的不導(dǎo)通的,也就是蜂鳴器不工作。 5)限流電阻 因?yàn)?89C51 芯片的 p0 口里面少個(gè)上拉電阻,所以要加一個(gè),因?yàn)?7 段數(shù)碼管的一般電流約 10ma 左右, vcc為 5V,段碼的所承受的電壓為 。 A1B2U1B U Z Z E RQ1D P Y _ 7 S E G _ D PR910kF E N Gv c c 圖 蜂鳴器 1 16R8A3301 16R7A3301 16R6A3301 16R5A3301 16R4A3301 16R3A3301 16R2A3301 16R1A330iiiiiiiiabcdefgh 圖 上拉電阻 《單片機(jī)應(yīng)用系統(tǒng)》項(xiàng)目設(shè)計(jì)報(bào)告 10 6)微動(dòng)開關(guān) 開關(guān)這里設(shè)計(jì)的要在程序中設(shè)計(jì)一個(gè)去抖的延時(shí)程序,已達(dá)到不要硬件 去抖的效果,如果要接硬件的話接一個(gè) RS 觸發(fā)器,它是由兩個(gè)與非門交叉耦合而成,S和 R是信號(hào)的輸入端,低電平有效, Q 和 Q既表示觸發(fā)器的狀態(tài),又是觸發(fā)器的輸出端。通過 R段的復(fù)位時(shí)也有類似的正反饋過程發(fā)生,從而完成按鍵開關(guān)的消抖功能。 函數(shù)共包含: 1.主函數(shù); 2.鬧鐘對比函數(shù); 3.秒、分、時(shí)加 1 函數(shù); 4.緩沖函數(shù); 5.顯示掃描函數(shù); 6.鬧鈴函數(shù); 7.時(shí)分秒刷新函數(shù); 8.時(shí)、分、秒緩沖函數(shù)。 重要點(diǎn): 1秒的產(chǎn)生,在數(shù)字鐘里面,主要功能是計(jì)時(shí),所以 1秒的產(chǎn)生是最重要的。所以在這個(gè)項(xiàng)目設(shè)計(jì)中采用定時(shí)器計(jì)時(shí),單片機(jī)中要利用定時(shí)器必須要對定時(shí)器進(jìn)行設(shè)置,其中 TMOD 寄存器就是用于對定時(shí)器設(shè)置的, TMOD 是 8 位特殊寄存器,單片機(jī)共有兩個(gè)定時(shí)器,分別是 T T0, TMOD TMOD(89H) T1 T0 GATE C/T M1 M0 GATE C/T M1 M0 方式 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 1 0 0 1 0 0 0 1 0 2 0 0 1 1 0 0 1 1 3 中高 4位是設(shè)置 T1,低 4位是設(shè)置 T0 用的,在這里使用 T0定時(shí)器,在 TMOD 低4位的低 2位是設(shè)置定時(shí)器工作方式的,定時(shí)器有 4 中計(jì)時(shí)方式,這里使用方式1,所以設(shè)置低兩位是【 0, 1】, 16 位計(jì)數(shù),最大計(jì)數(shù)值是 2的 16 次方 65536 個(gè)機(jī)器周期,在一個(gè)機(jī)器周期 1us即 12Mhz 晶振下對定時(shí)器設(shè)置初值為 15536,定時(shí)器產(chǎn)生一次中斷的計(jì)時(shí)時(shí)間是 6553615536=50000us=50ms,這樣要產(chǎn)生一秒就需要定時(shí)器中斷 20次,所以在程序中設(shè)置一個(gè)秒標(biāo)志位 cout, cout 在定時(shí)器《單片機(jī)應(yīng)用系統(tǒng)》項(xiàng)目設(shè)計(jì)報(bào)告 13 中斷中進(jìn)行自增 1 操作,最終對秒標(biāo)志 cout 判斷,達(dá)到 20即已達(dá)到 1 秒。 TL0=0xb0。 } 1)主函數(shù) 用單片機(jī)掃描鍵值。若有鍵值輸入則掃描到鍵值并取鍵值送往單片機(jī), 并復(fù)位鍵值。最 后 送往數(shù)碼管顯示。 流程: 當(dāng)?shù)?0 列處于低電平時(shí),逐行查找是否有行線變低,若有,則第 0 列與該行的交叉點(diǎn)按鍵按下;若無,則表示第 0 列無鍵按下,再讓下一列處在低電平,依此循環(huán),這種方式稱為鍵盤掃描。 P3=0XFF。 k=~k。 } unsigned char smiao(void)//鍵盤掃描 { unsigned char k,i。 while(i) display()。 return k。 } 鍵 盤 測 試有 鍵 按 下有 鍵 按 下顯 示 延 時(shí)取 鍵 值動(dòng) 態(tài) 顯 示YY返 回 0返 回 0NN 圖 《單片機(jī)應(yīng)用系統(tǒng)》項(xiàng)目設(shè)計(jì)報(bào)告 15 3)動(dòng)態(tài)顯示 工作原理:從 P0 口送段代碼 ,P1 口送位選 信號(hào) 。利用 “視覺暫留 ”,每送一個(gè)字符并選中相應(yīng)位線,延時(shí)一會(huì)兒 ,再送 /選下一個(gè) …… 循環(huán)掃描即可。 for(i=0。i++) { t=time[i]。 P1=b。 yanshi()。 } } 4)時(shí)分秒刷新 開 始初 始 化向 P 0 送 段 碼延 時(shí)向 平 送 位 碼位 碼 移 動(dòng) 圖 《單片機(jī)應(yīng)用系統(tǒng)》項(xiàng)目設(shè)計(jì)報(bào)告 16 時(shí)、分、秒刷新子函數(shù)功能:對于時(shí)間的累加,在計(jì)時(shí)過程中時(shí)間總是在不斷疊加的,所以在單片機(jī)上 電運(yùn)行,定時(shí)器開始計(jì)數(shù)后,就要對秒標(biāo)志定期的判斷,如果秒標(biāo)志 cout達(dá)到 20 了,那么就如在 , 節(jié)中描述的那樣, 1 秒的時(shí)間到了,必須對秒數(shù)據(jù)增加 1 了,秒數(shù)據(jù)增加后還要考慮到秒數(shù)據(jù)本身是否已到 60,如果達(dá)到 60 就是 1分了,秒必須清 0,分需要加 1,同樣分和時(shí)也要判斷。如果在上面判斷時(shí)不處于調(diào)時(shí)狀態(tài)那么秒清 0 后也是判斷是否有按鍵按下,如果有鍵按下那么長按標(biāo)志加 1,接著就是看秒是否已到 60,不到 60 就可以反回了,到 60 就把秒清