|
本帖最后由 高高的白楊 于 2021-1-10 21:38 編輯
退休在家自學(xué)51單片機(jī),學(xué)到定時(shí)器部分時(shí)聯(lián)想到無(wú)線(xiàn)電早期時(shí)使用的MORSE電報(bào)碼,便產(chǎn)生了用自己焊接的洞洞板51最小系統(tǒng)的時(shí)鐘控制MORSE碼來(lái)驗(yàn)證自學(xué)成果的想法,在此與各位初學(xué)者共師兄習(xí)。
第一次發(fā)貼,如有不當(dāng),請(qǐng)各位斧正。
電路板圖是用Sprint-Layout 6.0 綠色漢化版畫(huà)的。
圖1:電路板圖
洞洞板正面,左側(cè)為STC15W408AS-DIP20 MPU及P5.5引腳所接紅色LED組成的51最小系統(tǒng),右側(cè)為MAX232CPE組成的RS232電平轉(zhuǎn)換電路。板上LED為幾十年前的早期產(chǎn)品,其亮度明顯不如現(xiàn)在的貼片LED。
圖2:洞洞板正面照片
洞洞板背面,第一次焊洞洞板,水平有限,未能全部走錫。
圖3:洞洞板背面照片
因系統(tǒng)功能簡(jiǎn)單,故程序用匯編書(shū)寫(xiě),其長(zhǎng)度不足200行,并有較詳盡的語(yǔ)句注釋。
程序如下:
- ;===========莫爾斯電碼單LED實(shí)時(shí)時(shí)鐘,經(jīng)洞洞板搭建最小系統(tǒng)驗(yàn)證無(wú)誤====================================
- ;===========STC15W408AS-DIP20,fosc=12MHz=============================================================
- ;===========T0為模式0,16位自動(dòng)重裝,,用于基礎(chǔ)時(shí)鐘(中斷優(yōu)先級(jí)為高)
- ;===========T2為模式0,16位自動(dòng)重裝,用于MORSE電碼的編碼時(shí)長(zhǎng)計(jì)時(shí)(中斷優(yōu)先級(jí)為低)
- ;===========P5.5端口單個(gè)LED輸出莫爾斯電碼============================================================
- ;===========LED負(fù)極接P5.5端口,LED正極接+5V==========================================================
- ;===========整分鐘時(shí)LED依次以莫爾斯電碼顯示當(dāng)前小時(shí)十位數(shù)、個(gè)位數(shù),分鐘十位數(shù)、個(gè)位數(shù)================
- ;===========莫爾斯電碼時(shí)長(zhǎng):點(diǎn)1t=250ms,劃3t=750ms,點(diǎn)或劃間隔2t=500ms,數(shù)字之間間隔7t=1750ms=========
- //I/O 口特殊功能寄存器 // 復(fù)位值 描述
- P5 EQU 0C8H; //xxxx,1111 端口5
- AUXR EQU 08EH; //0000,0001 輔助寄存器
- IE2 EQU 0AFH; //0000,0000 中斷允許就寄存器
- T2H EQU 0D6H; //0000,0000 定時(shí)器2高8位寄存器
- T2L EQU 0D7H; //0000,0000 定時(shí)器2低8位寄存器
- //define constants
- MIN_MARK BIT 00H ;整分鐘標(biāo)志位
- MORSE_LED BIT P5.5 ;LED輸出莫爾斯電碼
-
- HOUR EQU R0
- MIN EQU R1
- SEC EQU R2
- ;===========STC15W408AS-DIP20,fosc=12MHz=========================
- ORG 0000H
- RESET:
- AJMP MAIN ;復(fù)位入口
- ORG 000BH
- AJMP T0_ISR ;T0中斷服務(wù)入口
- ORG 0063H
- AJMP T2_ISR ;T2中斷服務(wù)入口
- ORG 00B3H ;STC15W408AS中斷向量區(qū)后面第一個(gè)可用地址
- MAIN:
- MOV SP,#0DFH ;堆棧指針初值,堆?臻g為32字節(jié)
- CLR A ;Clera A
- MOV R0,A ;小時(shí)清零
- MOV R1,A ;分清零
- MOV R2,A ;秒清零
- MOV R3,#20 ;T0每秒中斷次數(shù)暫存地址
-
- ACALL TIME_INIT ;調(diào)用T0,T2初始化子程序
-
- LOOP:
- JNB MIN_MARK,$ ;非整分鐘則原地等待
- CLR MIN_MARK ;整分鐘標(biāo)志位清零
- ACALL TIME_NUM ;調(diào)用分離當(dāng)前時(shí)間十位及個(gè)位數(shù)字子程序
- SJMP LOOP
- ;===========T0、T2初始化子程序====================================
- TIME_INIT:
- ANL AUXR,#00000000B ;定時(shí)器T0及T2設(shè)置為時(shí)鐘12T模式,不允許T2工作
- ;允許使用擴(kuò)展RAM,T1作為UART1波特率發(fā)生器(釋放T2作為獨(dú)立定時(shí)器)
- ANL TMOD,#11110000B ;設(shè)置定時(shí)器T0模式為模式0,STC15W為16位自動(dòng)重裝
- MOV TL0,#0B0H ;設(shè)置T0初值(低8位50ms@12MHz)
- MOV TH0,#3CH ;設(shè)置T0初值(高8位50ms@12MHz)
- CLR TF0 ;清除TF0標(biāo)志
- SETB TR0 ;T0開(kāi)始計(jì)時(shí)
- SETB ET0 ;允許T0中斷
-
- MOV T2L,#0B0H ;設(shè)置T2初值(低8位50ms@12MHz)
- MOV T2H,#03CH ;設(shè)置T2初值(高8位50ms@12MHz)
-
- SETB EA ;CPU檢測(cè)中斷源(開(kāi)總中斷)
- RET
- ;===========分離當(dāng)前時(shí)間十位及個(gè)位數(shù)字子程序====================
- TIME_NUM:
- MOV B,#10 ;除數(shù)10
- MOV A,HOUR ;當(dāng)前小時(shí)數(shù)
- DIV AB ;
- MOV R4,A ;商(十位數(shù))放在R4
- MOV 41H,B ;余數(shù)(個(gè)位數(shù))放在41H
- ACALL MORSE_CODE ;調(diào)用莫爾斯字符取模子程序,傳遞參數(shù)在R4,顯示小時(shí)的十位數(shù)
- MOV R4,41H ;將個(gè)位數(shù)傳給R4
- ACALL MORSE_CODE ;調(diào)用莫爾斯字符取模子程序,傳遞參數(shù)在R4,顯示小時(shí)的個(gè)位數(shù)
-
- MOV B,#10 ;除數(shù)10
- MOV A,MIN ;當(dāng)前分鐘數(shù)
- DIV AB ;
- MOV R4,A ;商(十位數(shù))放在R4
- MOV 41H,B ;余數(shù)(個(gè)位數(shù))放在41H
- ACALL MORSE_CODE ;調(diào)用莫爾斯字符取模子程序,傳遞參數(shù)在R4,顯示分鐘的十位數(shù)
- MOV R4,41H ;將個(gè)位數(shù)傳給R4
- ACALL MORSE_CODE ;調(diào)用莫爾斯字符取模子程序,傳遞參數(shù)在R4,顯示分鐘的個(gè)位數(shù)
-
- RET
- ;===========莫爾斯字符取模子程序=================================
- MORSE_CODE:
- MOV DPTR,#MORSE_TABLE ;莫爾斯電碼數(shù)字轉(zhuǎn)換表首地址
- MOV R7,#05H ;莫爾斯電碼單個(gè)數(shù)字的信號(hào)個(gè)數(shù)
- MOV A,R4 ;將需取模的單位數(shù)字(存于R4)送入累加器A
- MOV B,#05H ;莫爾斯電碼單個(gè)數(shù)字的信號(hào)個(gè)數(shù)
- MUL AB ;要顯示的莫爾斯電碼數(shù)字查表地址偏移量
- MOV 40H,A ;地址偏移量暫存40H
- CATCH:
- MOVC A,@A+DPTR ;要顯示的莫爾斯電碼數(shù)字的第i(i=1~5)個(gè)點(diǎn)或劃的單位長(zhǎng)度
- MOV B,#05H ;單位長(zhǎng)度1t對(duì)應(yīng)T2中斷信號(hào)的倍數(shù)5
- MUL AB ;要顯示的莫爾斯電碼數(shù)字的第i個(gè)點(diǎn)或劃對(duì)應(yīng)T2中斷響應(yīng)的次數(shù)
- MOV R6,A ;將電碼間隔時(shí)長(zhǎng)對(duì)應(yīng)的中斷次數(shù)送入R6
- ACALL DISPLAY ;調(diào)用LED莫爾斯電碼點(diǎn)或劃顯示子程序
- INC 40H ;下一個(gè)莫爾斯電碼點(diǎn)或劃的地址偏移量
- MOV A,40H ;送地址偏移量至變址寄存器A
- DJNZ R7,CATCH ;一個(gè)莫爾斯電碼數(shù)字5個(gè)點(diǎn)或劃是否完整取模,不滿(mǎn)5次則繼續(xù)
- ACALL SEVEN_DOT ;調(diào)用數(shù)字之間間隔7t,在DISPLAY最后有1t,實(shí)際發(fā)6t
-
- RET
-
- ;===========LED莫爾斯電碼顯示子程序============================
- DISPLAY:
- CLR MORSE_LED ;P5.5為低電平,LED導(dǎo)通點(diǎn)亮
-
- ORL IE2,#00000100B ;T2開(kāi)中斷
- ORL AUXR,#00010000B ;T2開(kāi)始工作
-
- CJNE R6,#00H,$ ;T2中斷數(shù)不足對(duì)應(yīng)的電碼要求時(shí),原地等待
-
- ANL IE2,#11111011B ;T2關(guān)中斷
- ANL AUXR,#11101111B ;T2停止工作
-
- SETB MORSE_LED ;LED關(guān)斷熄滅
- MOV R6,#10H ;將電碼點(diǎn)或劃之間間隔時(shí)長(zhǎng)2t(2*250ms=10*50ms)對(duì)應(yīng)的中斷次數(shù)10送入R6
-
- ORL IE2,#04H ;T2開(kāi)中斷
- ORL AUXR,#00010000B ;T2開(kāi)始工作
-
- CJNE R6,#00H,$ ;T2中斷數(shù)不足對(duì)應(yīng)的電碼要求時(shí),原地等待
-
- ANL IE2,#0FBH ;T2關(guān)中斷
- ANL AUXR,#11101111B ;T2停止工作
-
- RET
- ;===========LED熄滅6t時(shí)長(zhǎng)子程序=================================
- SEVEN_DOT:
- SETB MORSE_LED ;LED關(guān)斷熄滅
- MOV R6,#30 ;將數(shù)字之間間隔7t-1t(6*250ms=30*50ms)對(duì)應(yīng)的中斷次數(shù)30送入R6
-
- ORL IE2,#04H ;T2開(kāi)中斷
- ORL AUXR,#00010000B ;T2開(kāi)始工作
-
- CJNE R6,#00H,$ ;T2中斷數(shù)不足對(duì)應(yīng)的電碼要求時(shí),原地等待
-
- ANL IE2,#0FBH ;T2關(guān)中斷
- ANL AUXR,#11101111B ;T2停止工作
-
- RET
-
- ;===========T0中斷服務(wù)程序(基礎(chǔ)時(shí)鐘)============================
- T0_ISR:
- PUSH PSW ;保護(hù)現(xiàn)場(chǎng)
- PUSH ACC ;
-
- DJNZ R3,RETURN ;T0中斷計(jì)數(shù)是否到20次,未到則返回
- MOV R3,#20 ;重新裝入T0計(jì)數(shù)基值(每秒T0中斷次數(shù))
-
- INC SEC ;“second”單元增1
- CJNE SEC,#60,RETURN ;是否到60秒,未到則返回
- SETB MIN_MARK ;整分鐘標(biāo)志置1
- MOV SEC,#00H ;計(jì)滿(mǎn)60“秒”,“秒”單元清零
-
- INC MIN ;“minute”單元增1
- CJNE MIN,#60,RETURN ;是否到60分,未到則返回
- MOV MIN,#00H ;計(jì)滿(mǎn)60“分”,“分”單元清零
-
- INC HOUR ;“hour”單元增1
- CJNE HOUR,#24,RETURN ;是否到24hour,未到則返回
- MOV HOUR,#00H ;計(jì)滿(mǎn)24hour,“hour”單元清零
- RETURN:
- POP ACC ;恢復(fù)現(xiàn)場(chǎng)
- POP PSW
-
- RETI
- ;===========T2中斷服務(wù)程序(莫爾斯碼時(shí)長(zhǎng)控制)=========================
- T2_ISR:
- PUSH PSW ;保護(hù)現(xiàn)場(chǎng)
- PUSH ACC ;
-
- DEC R6 ;T2中斷數(shù)減一
-
- POP ACC ;恢復(fù)現(xiàn)場(chǎng)
- POP PSW
- RETI
-
- ;===========莫爾斯電碼/數(shù)字0~9轉(zhuǎn)換表==================================
- ORG 01A0H
- MORSE_TABLE:
- DB 3,3,3,3,3,1,3,3,3,3,1,1,3,3,3,1,1,1,3,3,1,1,1,1,3
- DB 1,1,1,1,1,3,1,1,1,1,3,3,1,1,1,3,3,3,1,1,3,3,3,3,1
- END
復(fù)制代碼
用Keil 5編輯、編譯、鏈接程序;用STC-ISP下載程序至洞洞板,并上電運(yùn)行驗(yàn)證,程序運(yùn)行無(wú)誤。
LED顯示的MORSE碼與時(shí)鐘對(duì)應(yīng)的數(shù)字無(wú)誤,即MORSE_TABLE取碼正確。
系統(tǒng)電源由一節(jié)18650鋰電池提供,LED熄滅實(shí)測(cè)電流為8.3mA,LED點(diǎn)亮實(shí)測(cè)電流為10.5mA。
MORSE碼表的數(shù)字部分:
數(shù)字 MORSE碼
1 . _ _ _ _
2 . . _ _ _
3 . . . _ _
4 . . . . _
5 . . . . .
6 _ . . . .
7 _ _ . . .
8 _ _ _ . .
9 _ _ _ _ .
0 _ _ _ _ _
其中:
. 點(diǎn),一個(gè)時(shí)長(zhǎng)基本單位t=250ms。
_ 劃,3t=750ms。
一個(gè)數(shù)字內(nèi)部的點(diǎn)或劃之間的時(shí)間間隔2t=500ms。
數(shù)字與數(shù)字之間的時(shí)間間隔為7t=1750ms。
|
評(píng)分
-
查看全部評(píng)分
|