找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4069|回复: 0
收起左侧

STC15W408单片机最小系统单LED显示MORSE码实时时钟程序

[复制链接]
ID:386288 发表于 2021-1-10 16:34 | 显示全部楼层 |阅读模式
本帖最后由 高高的白杨 于 2021-1-10 21:38 编辑

      退休在家自学51单片机,学到定时器部分时联想到无线电早期时使用的MORSE电报码,便产生了用自己焊接的洞洞板51最小系统的时钟控制MORSE码来验证自学成果的想法,在此与各位初学者共师兄习。
      第一次发贴,如有不当,请各位斧正。
      电路板图是用Sprint-Layout 6.0 绿色汉化版画的。
      图1:电路板图
STC15W408洞洞电路板.PNG
      洞洞板正面,左侧为STC15W408AS-DIP20 MPU及P5.5引脚所接红色LED组成的51最小系统,右侧为MAX232CPE组成的RS232电平转换电路。板上LED为几十年前的早期产品,其亮度明显不如现在的贴片LED。
      图2:洞洞板正面照片
洞洞板正面.jpg

      洞洞板背面,第一次焊洞洞板,水平有限,未能全部走锡。
      图3:洞洞板背面照片
洞洞板背面.jpg
      因系统功能简单,故程序用汇编书写,其长度不足200行,并有较详尽的语句注释。
      程序如下:
  1. ;===========莫尔斯电码单LED实时时钟,经洞洞板搭建最小系统验证无误====================================
  2. ;===========STC15W408AS-DIP20,fosc=12MHz=============================================================
  3. ;===========T0为模式0,16位自动重装,,用于基础时钟(中断优先级为高)
  4. ;===========T2为模式0,16位自动重装,用于MORSE电码的编码时长计时(中断优先级为低)
  5. ;===========P5.5端口单个LED输出莫尔斯电码============================================================
  6. ;===========LED负极接P5.5端口,LED正极接+5V==========================================================
  7. ;===========整分钟时LED依次以莫尔斯电码显示当前小时十位数、个位数,分钟十位数、个位数================
  8. ;===========莫尔斯电码时长:点1t=250ms,划3t=750ms,点或划间隔2t=500ms,数字之间间隔7t=1750ms=========   

  9. //I/O 口特殊功能寄存器                                        // 复位值   描述
  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        定时器2高8位寄存器       
  14.                 T2L                        EQU                        0D7H;        //0000,0000        定时器2低8位寄存器

  15. //define constants
  16.                 MIN_MARK        BIT                00H                        ;整分钟标志位
  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                        ;复位入口
  26.                         ORG                000BH
  27.                         AJMP        T0_ISR                        ;T0中断服务入口
  28.                         ORG                0063H
  29.                         AJMP        T2_ISR                        ;T2中断服务入口
  30.                         ORG                00B3H                        ;STC15W408AS中断向量区后面第一个可用地址
  31. MAIN:
  32.                         MOV                SP,#0DFH                ;堆栈指针初值,堆栈空间为32字节
  33.                         CLR                A                                ;Clera A
  34.                         MOV                R0,A                        ;小时清零
  35.                         MOV                R1,A                        ;分清零
  36.                         MOV                R2,A                        ;秒清零
  37.                         MOV                R3,#20                        ;T0每秒中断次数暂存地址
  38.                        
  39.                         ACALL        TIME_INIT                ;调用T0,T2初始化子程序
  40.                        
  41. LOOP:               
  42.                         JNB                MIN_MARK,$                ;非整分钟则原地等待
  43.                         CLR                MIN_MARK                ;整分钟标志位清零
  44.                         ACALL        TIME_NUM                ;调用分离当前时间十位及个位数字子程序

  45.                         SJMP        LOOP

  46. ;===========T0、T2初始化子程序====================================
  47. TIME_INIT:       
  48.                         ANL         AUXR,#00000000B        ;定时器T0及T2设置为时钟12T模式,不允许T2工作
  49.                                                                         ;允许使用扩展RAM,T1作为UART1波特率发生器(释放T2作为独立定时器)
  50.                         ANL         TMOD,#11110000B        ;设置定时器T0模式为模式0,STC15W为16位自动重装

  51.                         MOV         TL0,#0B0H                ;设置T0初值(低8位50ms@12MHz)
  52.                         MOV         TH0,#3CH                ;设置T0初值(高8位50ms@12MHz)
  53.                         CLR         TF0                                ;清除TF0标志
  54.                         SETB         TR0                                ;T0开始计时
  55.                         SETB        ET0                                ;允许T0中断
  56.                        
  57.                         MOV         T2L,#0B0H                ;设置T2初值(低8位50ms@12MHz)
  58.                         MOV         T2H,#03CH                ;设置T2初值(高8位50ms@12MHz)
  59.                        
  60.                         SETB        EA                                ;CPU检测中断源(开总中断)

  61.                         RET

  62. ;===========分离当前时间十位及个位数字子程序====================
  63. TIME_NUM:
  64.                         MOV                B,#10                        ;除数10
  65.                         MOV                A,HOUR                        ;当前小时数
  66.                         DIV                AB                                ;
  67.                         MOV                R4,A                        ;商(十位数)放在R4
  68.                         MOV                41H,B                        ;余数(个位数)放在41H
  69.                         ACALL        MORSE_CODE                ;调用莫尔斯字符取模子程序,传递参数在R4,显示小时的十位数
  70.                         MOV                R4,41H                        ;将个位数传给R4
  71.                         ACALL        MORSE_CODE                ;调用莫尔斯字符取模子程序,传递参数在R4,显示小时的个位数
  72.                        
  73.                         MOV                B,#10                        ;除数10
  74.                         MOV                A,MIN                        ;当前分钟数
  75.                         DIV                AB                                ;
  76.                         MOV                R4,A                        ;商(十位数)放在R4
  77.                         MOV                41H,B                        ;余数(个位数)放在41H
  78.                         ACALL        MORSE_CODE                ;调用莫尔斯字符取模子程序,传递参数在R4,显示分钟的十位数
  79.                         MOV                R4,41H                        ;将个位数传给R4
  80.                         ACALL        MORSE_CODE                ;调用莫尔斯字符取模子程序,传递参数在R4,显示分钟的个位数
  81.                        
  82.                         RET

  83. ;===========莫尔斯字符取模子程序=================================
  84. MORSE_CODE:       
  85.                         MOV                DPTR,#MORSE_TABLE        ;莫尔斯电码数字转换表首地址
  86.                         MOV                R7,#05H                        ;莫尔斯电码单个数字的信号个数
  87.                         MOV                A,R4                        ;将需取模的单位数字(存于R4)送入累加器A
  88.                         MOV                B,#05H                        ;莫尔斯电码单个数字的信号个数
  89.                         MUL                AB                                ;要显示的莫尔斯电码数字查表地址偏移量
  90.                         MOV                40H,A                        ;地址偏移量暂存40H
  91. CATCH:
  92.                         MOVC        A,@A+DPTR                ;要显示的莫尔斯电码数字的第i(i=1~5)个点或划的单位长度
  93.                         MOV                B,#05H                        ;单位长度1t对应T2中断信号的倍数5
  94.                         MUL                AB                                ;要显示的莫尔斯电码数字的第i个点或划对应T2中断响应的次数
  95.                         MOV                R6,A                        ;将电码间隔时长对应的中断次数送入R6
  96.                         ACALL        DISPLAY                        ;调用LED莫尔斯电码点或划显示子程序
  97.                         INC                40H                                ;下一个莫尔斯电码点或划的地址偏移量
  98.                         MOV                A,40H                        ;送地址偏移量至变址寄存器A
  99.                         DJNZ        R7,CATCH                ;一个莫尔斯电码数字5个点或划是否完整取模,不满5次则继续
  100.                         ACALL        SEVEN_DOT                ;调用数字之间间隔7t,在DISPLAY最后有1t,实际发6t
  101.                        
  102.                         RET               
  103.                        
  104. ;===========LED莫尔斯电码显示子程序============================
  105. DISPLAY:       
  106.                         CLR                MORSE_LED                ;P5.5为低电平,LED导通点亮
  107.                        
  108.                         ORL                IE2,#00000100B        ;T2开中断
  109.                         ORL                AUXR,#00010000B        ;T2开始工作
  110.                        
  111.                         CJNE        R6,#00H,$                ;T2中断数不足对应的电码要求时,原地等待
  112.                                
  113.                         ANL                IE2,#11111011B        ;T2关中断
  114.                         ANL                AUXR,#11101111B        ;T2停止工作
  115.                        
  116.                         SETB        MORSE_LED                ;LED关断熄灭
  117.                         MOV                R6,#10H                        ;将电码点或划之间间隔时长2t(2*250ms=10*50ms)对应的中断次数10送入R6
  118.                        
  119.                         ORL                IE2,#04H                ;T2开中断
  120.                         ORL                AUXR,#00010000B        ;T2开始工作
  121.                        
  122.                         CJNE        R6,#00H,$                ;T2中断数不足对应的电码要求时,原地等待
  123.                                
  124.                         ANL                IE2,#0FBH                ;T2关中断
  125.                         ANL                AUXR,#11101111B        ;T2停止工作                               
  126.        
  127.                         RET

  128. ;===========LED熄灭6t时长子程序=================================
  129. SEVEN_DOT:       
  130.                         SETB        MORSE_LED                ;LED关断熄灭
  131.                         MOV                R6,#30                        ;将数字之间间隔7t-1t(6*250ms=30*50ms)对应的中断次数30送入R6
  132.                        
  133.                         ORL                IE2,#04H                ;T2开中断
  134.                         ORL                AUXR,#00010000B        ;T2开始工作
  135.                        
  136.                         CJNE        R6,#00H,$                ;T2中断数不足对应的电码要求时,原地等待
  137.                                
  138.                         ANL                IE2,#0FBH                ;T2关中断
  139.                         ANL                AUXR,#11101111B        ;T2停止工作                       
  140.        
  141.                         RET
  142.                        
  143. ;===========T0中断服务程序(基础时钟)============================
  144. T0_ISR:               
  145.                         PUSH        PSW                                ;保护现场
  146.                         PUSH          ACC                                ;
  147.                        
  148.                         DJNZ        R3,RETURN                ;T0中断计数是否到20次,未到则返回
  149.                         MOV                R3,#20                        ;重新装入T0计数基值(每秒T0中断次数)
  150.                        
  151.                         INC                SEC                                ;“second”单元增1
  152.                         CJNE        SEC,#60,RETURN        ;是否到60秒,未到则返回
  153.                         SETB        MIN_MARK                ;整分钟标志置1
  154.                         MOV                SEC,#00H                ;计满60“秒”,“秒”单元清零
  155.                        
  156.                         INC                MIN                                ;“minute”单元增1
  157.                         CJNE        MIN,#60,RETURN        ;是否到60分,未到则返回
  158.                         MOV                MIN,#00H                ;计满60“分”,“分”单元清零
  159.                        
  160.                         INC                HOUR                        ;“hour”单元增1
  161.                         CJNE        HOUR,#24,RETURN        ;是否到24hour,未到则返回
  162.                         MOV                HOUR,#00H                ;计满24hour,“hour”单元清零

  163. RETURN:               
  164.                         POP                ACC                                ;恢复现场
  165.                         POP                PSW
  166.                        
  167.                         RETI

  168. ;===========T2中断服务程序(莫尔斯码时长控制)=========================
  169. T2_ISR:               
  170.                         PUSH        PSW                                ;保护现场
  171.                         PUSH          ACC                                ;
  172.                        
  173.                         DEC                R6                                ;T2中断数减一
  174.                        
  175.                         POP                ACC                                ;恢复现场
  176.                         POP                PSW
  177.                         RETI
  178.                        
  179. ;===========莫尔斯电码/数字0~9转换表==================================
  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
复制代码

用Keil 5编辑、编译、链接程序;用STC-ISP下载程序至洞洞板,并上电运行验证,程序运行无误。   
    LED显示的MORSE码与时钟对应的数字无误,即MORSE_TABLE取码正确。
    系统电源由一节18650锂电池提供,LED熄灭实测电流为8.3mA,LED点亮实测电流为10.5mA。

    MORSE码表的数字部分:
       数字        MORSE码
        1          . _ _ _ _
        2          . . _ _ _
        3          . . . _ _
        4          . . . . _
        5          . . . . .
        6          _ . . . .
        7          _ _ . . .
        8          _ _ _ . .
        9          _ _ _ _ .
        0          _ _ _ _ _
    其中:
        .      点,一个时长基本单位t=250ms。
        _      划,3t=750ms。

        一个数字内部的点或划之间的时间间隔2t=500ms。
        数字与数字之间的时间间隔为7t=1750ms。  

评分

参与人数 1黑币 +100 收起 理由
admin + 100 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表