找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4943|回復(fù): 0
收起左側(cè)

STC15W408單片機(jī)最小系統(tǒng)單LED顯示MORSE碼實(shí)時(shí)時(shí)鐘程序

[復(fù)制鏈接]
ID:386288 發(fā)表于 2021-1-10 16:34 | 顯示全部樓層 |閱讀模式
本帖最后由 高高的白楊 于 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:電路板圖
STC15W408洞洞電路板.PNG
      洞洞板正面,左側(cè)為STC15W408AS-DIP20 MPU及P5.5引腳所接紅色LED組成的51最小系統(tǒng),右側(cè)為MAX232CPE組成的RS232電平轉(zhuǎn)換電路。板上LED為幾十年前的早期產(chǎn)品,其亮度明顯不如現(xiàn)在的貼片LED。
      圖2:洞洞板正面照片
洞洞板正面.jpg

      洞洞板背面,第一次焊洞洞板,水平有限,未能全部走錫。
      圖3:洞洞板背面照片
洞洞板背面.jpg
      因系統(tǒng)功能簡(jiǎn)單,故程序用匯編書(shū)寫(xiě),其長(zhǎng)度不足200行,并有較詳盡的語(yǔ)句注釋。
      程序如下:
  1. ;===========莫爾斯電碼單LED實(shí)時(shí)時(shí)鐘,經(jīng)洞洞板搭建最小系統(tǒng)驗(yàn)證無(wú)誤====================================
  2. ;===========STC15W408AS-DIP20,fosc=12MHz=============================================================
  3. ;===========T0為模式0,16位自動(dòng)重裝,,用于基礎(chǔ)時(shí)鐘(中斷優(yōu)先級(jí)為高)
  4. ;===========T2為模式0,16位自動(dòng)重裝,用于MORSE電碼的編碼時(shí)長(zhǎng)計(jì)時(shí)(中斷優(yōu)先級(jí)為低)
  5. ;===========P5.5端口單個(gè)LED輸出莫爾斯電碼============================================================
  6. ;===========LED負(fù)極接P5.5端口,LED正極接+5V==========================================================
  7. ;===========整分鐘時(shí)LED依次以莫爾斯電碼顯示當(dāng)前小時(shí)十位數(shù)、個(gè)位數(shù),分鐘十位數(shù)、個(gè)位數(shù)================
  8. ;===========莫爾斯電碼時(shí)長(zhǎng):點(diǎn)1t=250ms,劃3t=750ms,點(diǎn)或劃間隔2t=500ms,數(shù)字之間間隔7t=1750ms=========   

  9. //I/O 口特殊功能寄存器                                        // 復(fù)位值   描述
  10.                 P5                EQU                      0C8H;   //xxxx,1111 端口5
  11.                 AUXR                EQU                        08EH;        //0000,0001        輔助寄存器
  12.                 IE2                        EQU                        0AFH;        //0000,0000 中斷允許就寄存器               
  13.                 T2H                        EQU                        0D6H;        //0000,0000        定時(shí)器2高8位寄存器       
  14.                 T2L                        EQU                        0D7H;        //0000,0000        定時(shí)器2低8位寄存器

  15. //define constants
  16.                 MIN_MARK        BIT                00H                        ;整分鐘標(biāo)志位
  17.                 MORSE_LED        BIT                P5.5                ;LED輸出莫爾斯電碼
  18.                        
  19.                 HOUR                EQU                R0
  20.                 MIN                        EQU                R1
  21.                 SEC                        EQU                R2
  22. ;===========STC15W408AS-DIP20,fosc=12MHz=========================
  23.                         ORG                0000H
  24. RESET:
  25.                         AJMP        MAIN                        ;復(fù)位入口
  26.                         ORG                000BH
  27.                         AJMP        T0_ISR                        ;T0中斷服務(wù)入口
  28.                         ORG                0063H
  29.                         AJMP        T2_ISR                        ;T2中斷服務(wù)入口
  30.                         ORG                00B3H                        ;STC15W408AS中斷向量區(qū)后面第一個(gè)可用地址
  31. MAIN:
  32.                         MOV                SP,#0DFH                ;堆棧指針初值,堆?臻g為32字節(jié)
  33.                         CLR                A                                ;Clera A
  34.                         MOV                R0,A                        ;小時(shí)清零
  35.                         MOV                R1,A                        ;分清零
  36.                         MOV                R2,A                        ;秒清零
  37.                         MOV                R3,#20                        ;T0每秒中斷次數(shù)暫存地址
  38.                        
  39.                         ACALL        TIME_INIT                ;調(diào)用T0,T2初始化子程序
  40.                        
  41. LOOP:               
  42.                         JNB                MIN_MARK,$                ;非整分鐘則原地等待
  43.                         CLR                MIN_MARK                ;整分鐘標(biāo)志位清零
  44.                         ACALL        TIME_NUM                ;調(diào)用分離當(dāng)前時(shí)間十位及個(gè)位數(shù)字子程序

  45.                         SJMP        LOOP

  46. ;===========T0、T2初始化子程序====================================
  47. TIME_INIT:       
  48.                         ANL         AUXR,#00000000B        ;定時(shí)器T0及T2設(shè)置為時(shí)鐘12T模式,不允許T2工作
  49.                                                                         ;允許使用擴(kuò)展RAM,T1作為UART1波特率發(fā)生器(釋放T2作為獨(dú)立定時(shí)器)
  50.                         ANL         TMOD,#11110000B        ;設(shè)置定時(shí)器T0模式為模式0,STC15W為16位自動(dòng)重裝

  51.                         MOV         TL0,#0B0H                ;設(shè)置T0初值(低8位50ms@12MHz)
  52.                         MOV         TH0,#3CH                ;設(shè)置T0初值(高8位50ms@12MHz)
  53.                         CLR         TF0                                ;清除TF0標(biāo)志
  54.                         SETB         TR0                                ;T0開(kāi)始計(jì)時(shí)
  55.                         SETB        ET0                                ;允許T0中斷
  56.                        
  57.                         MOV         T2L,#0B0H                ;設(shè)置T2初值(低8位50ms@12MHz)
  58.                         MOV         T2H,#03CH                ;設(shè)置T2初值(高8位50ms@12MHz)
  59.                        
  60.                         SETB        EA                                ;CPU檢測(cè)中斷源(開(kāi)總中斷)

  61.                         RET

  62. ;===========分離當(dāng)前時(shí)間十位及個(gè)位數(shù)字子程序====================
  63. TIME_NUM:
  64.                         MOV                B,#10                        ;除數(shù)10
  65.                         MOV                A,HOUR                        ;當(dāng)前小時(shí)數(shù)
  66.                         DIV                AB                                ;
  67.                         MOV                R4,A                        ;商(十位數(shù))放在R4
  68.                         MOV                41H,B                        ;余數(shù)(個(gè)位數(shù))放在41H
  69.                         ACALL        MORSE_CODE                ;調(diào)用莫爾斯字符取模子程序,傳遞參數(shù)在R4,顯示小時(shí)的十位數(shù)
  70.                         MOV                R4,41H                        ;將個(gè)位數(shù)傳給R4
  71.                         ACALL        MORSE_CODE                ;調(diào)用莫爾斯字符取模子程序,傳遞參數(shù)在R4,顯示小時(shí)的個(gè)位數(shù)
  72.                        
  73.                         MOV                B,#10                        ;除數(shù)10
  74.                         MOV                A,MIN                        ;當(dāng)前分鐘數(shù)
  75.                         DIV                AB                                ;
  76.                         MOV                R4,A                        ;商(十位數(shù))放在R4
  77.                         MOV                41H,B                        ;余數(shù)(個(gè)位數(shù))放在41H
  78.                         ACALL        MORSE_CODE                ;調(diào)用莫爾斯字符取模子程序,傳遞參數(shù)在R4,顯示分鐘的十位數(shù)
  79.                         MOV                R4,41H                        ;將個(gè)位數(shù)傳給R4
  80.                         ACALL        MORSE_CODE                ;調(diào)用莫爾斯字符取模子程序,傳遞參數(shù)在R4,顯示分鐘的個(gè)位數(shù)
  81.                        
  82.                         RET

  83. ;===========莫爾斯字符取模子程序=================================
  84. MORSE_CODE:       
  85.                         MOV                DPTR,#MORSE_TABLE        ;莫爾斯電碼數(shù)字轉(zhuǎn)換表首地址
  86.                         MOV                R7,#05H                        ;莫爾斯電碼單個(gè)數(shù)字的信號(hào)個(gè)數(shù)
  87.                         MOV                A,R4                        ;將需取模的單位數(shù)字(存于R4)送入累加器A
  88.                         MOV                B,#05H                        ;莫爾斯電碼單個(gè)數(shù)字的信號(hào)個(gè)數(shù)
  89.                         MUL                AB                                ;要顯示的莫爾斯電碼數(shù)字查表地址偏移量
  90.                         MOV                40H,A                        ;地址偏移量暫存40H
  91. CATCH:
  92.                         MOVC        A,@A+DPTR                ;要顯示的莫爾斯電碼數(shù)字的第i(i=1~5)個(gè)點(diǎn)或劃的單位長(zhǎng)度
  93.                         MOV                B,#05H                        ;單位長(zhǎng)度1t對(duì)應(yīng)T2中斷信號(hào)的倍數(shù)5
  94.                         MUL                AB                                ;要顯示的莫爾斯電碼數(shù)字的第i個(gè)點(diǎn)或劃對(duì)應(yīng)T2中斷響應(yīng)的次數(shù)
  95.                         MOV                R6,A                        ;將電碼間隔時(shí)長(zhǎng)對(duì)應(yīng)的中斷次數(shù)送入R6
  96.                         ACALL        DISPLAY                        ;調(diào)用LED莫爾斯電碼點(diǎn)或劃顯示子程序
  97.                         INC                40H                                ;下一個(gè)莫爾斯電碼點(diǎn)或劃的地址偏移量
  98.                         MOV                A,40H                        ;送地址偏移量至變址寄存器A
  99.                         DJNZ        R7,CATCH                ;一個(gè)莫爾斯電碼數(shù)字5個(gè)點(diǎn)或劃是否完整取模,不滿(mǎn)5次則繼續(xù)
  100.                         ACALL        SEVEN_DOT                ;調(diào)用數(shù)字之間間隔7t,在DISPLAY最后有1t,實(shí)際發(fā)6t
  101.                        
  102.                         RET               
  103.                        
  104. ;===========LED莫爾斯電碼顯示子程序============================
  105. DISPLAY:       
  106.                         CLR                MORSE_LED                ;P5.5為低電平,LED導(dǎo)通點(diǎn)亮
  107.                        
  108.                         ORL                IE2,#00000100B        ;T2開(kāi)中斷
  109.                         ORL                AUXR,#00010000B        ;T2開(kāi)始工作
  110.                        
  111.                         CJNE        R6,#00H,$                ;T2中斷數(shù)不足對(duì)應(yīng)的電碼要求時(shí),原地等待
  112.                                
  113.                         ANL                IE2,#11111011B        ;T2關(guān)中斷
  114.                         ANL                AUXR,#11101111B        ;T2停止工作
  115.                        
  116.                         SETB        MORSE_LED                ;LED關(guān)斷熄滅
  117.                         MOV                R6,#10H                        ;將電碼點(diǎn)或劃之間間隔時(shí)長(zhǎng)2t(2*250ms=10*50ms)對(duì)應(yīng)的中斷次數(shù)10送入R6
  118.                        
  119.                         ORL                IE2,#04H                ;T2開(kāi)中斷
  120.                         ORL                AUXR,#00010000B        ;T2開(kāi)始工作
  121.                        
  122.                         CJNE        R6,#00H,$                ;T2中斷數(shù)不足對(duì)應(yīng)的電碼要求時(shí),原地等待
  123.                                
  124.                         ANL                IE2,#0FBH                ;T2關(guān)中斷
  125.                         ANL                AUXR,#11101111B        ;T2停止工作                               
  126.        
  127.                         RET

  128. ;===========LED熄滅6t時(shí)長(zhǎng)子程序=================================
  129. SEVEN_DOT:       
  130.                         SETB        MORSE_LED                ;LED關(guān)斷熄滅
  131.                         MOV                R6,#30                        ;將數(shù)字之間間隔7t-1t(6*250ms=30*50ms)對(duì)應(yīng)的中斷次數(shù)30送入R6
  132.                        
  133.                         ORL                IE2,#04H                ;T2開(kāi)中斷
  134.                         ORL                AUXR,#00010000B        ;T2開(kāi)始工作
  135.                        
  136.                         CJNE        R6,#00H,$                ;T2中斷數(shù)不足對(duì)應(yīng)的電碼要求時(shí),原地等待
  137.                                
  138.                         ANL                IE2,#0FBH                ;T2關(guān)中斷
  139.                         ANL                AUXR,#11101111B        ;T2停止工作                       
  140.        
  141.                         RET
  142.                        
  143. ;===========T0中斷服務(wù)程序(基礎(chǔ)時(shí)鐘)============================
  144. T0_ISR:               
  145.                         PUSH        PSW                                ;保護(hù)現(xiàn)場(chǎng)
  146.                         PUSH          ACC                                ;
  147.                        
  148.                         DJNZ        R3,RETURN                ;T0中斷計(jì)數(shù)是否到20次,未到則返回
  149.                         MOV                R3,#20                        ;重新裝入T0計(jì)數(shù)基值(每秒T0中斷次數(shù))
  150.                        
  151.                         INC                SEC                                ;“second”單元增1
  152.                         CJNE        SEC,#60,RETURN        ;是否到60秒,未到則返回
  153.                         SETB        MIN_MARK                ;整分鐘標(biāo)志置1
  154.                         MOV                SEC,#00H                ;計(jì)滿(mǎn)60“秒”,“秒”單元清零
  155.                        
  156.                         INC                MIN                                ;“minute”單元增1
  157.                         CJNE        MIN,#60,RETURN        ;是否到60分,未到則返回
  158.                         MOV                MIN,#00H                ;計(jì)滿(mǎn)60“分”,“分”單元清零
  159.                        
  160.                         INC                HOUR                        ;“hour”單元增1
  161.                         CJNE        HOUR,#24,RETURN        ;是否到24hour,未到則返回
  162.                         MOV                HOUR,#00H                ;計(jì)滿(mǎn)24hour,“hour”單元清零

  163. RETURN:               
  164.                         POP                ACC                                ;恢復(fù)現(xiàn)場(chǎng)
  165.                         POP                PSW
  166.                        
  167.                         RETI

  168. ;===========T2中斷服務(wù)程序(莫爾斯碼時(shí)長(zhǎng)控制)=========================
  169. T2_ISR:               
  170.                         PUSH        PSW                                ;保護(hù)現(xiàn)場(chǎng)
  171.                         PUSH          ACC                                ;
  172.                        
  173.                         DEC                R6                                ;T2中斷數(shù)減一
  174.                        
  175.                         POP                ACC                                ;恢復(fù)現(xiàn)場(chǎng)
  176.                         POP                PSW
  177.                         RETI
  178.                        
  179. ;===========莫爾斯電碼/數(shù)字0~9轉(zhuǎn)換表==================================
  180.                 ORG                01A0H
  181. MORSE_TABLE:
  182.                 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
  183.                 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

  184.                         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)分

參與人數(shù) 1黑幣 +100 收起 理由
admin + 100 共享資料的黑幣獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表