找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4213|回復: 0
打印 上一主題 下一主題
收起左側(cè)

單片機電子琴播放音樂帶倒計時功能的proteus仿真(匯編)

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:137190 發(fā)表于 2016-9-4 21:16 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

電子琴與倒計時播放音樂全部資料下載: 電子琴和倒計時播放音樂.rar (30.5 KB, 下載次數(shù): 47)
功能:
一、能通過按鍵,自行彈奏電子琴類的音樂;
二、能寫好音樂代碼后,自動播放音樂。 已通過測試。

帶有proteus仿真,用匯編語言編寫,內(nèi)有詳細注解
電子琴的基本原理是產(chǎn)生各個音符對應的頻率,將頻率放大后驅(qū)動喇叭發(fā)出音響。該電子琴包括手動彈奏與自動演奏兩種功能,其中手動彈奏時還可錄音回放


匯編源碼如下:
  1. ORG 0000H
  2. SL      EQU   30H              ; SL存放秒的個位數(shù)
  3. SH  EQU   31H              ; SH存放秒的十位數(shù)
  4. ML      EQU   32H              ; ML存放分的個位數(shù)
  5. MH      EQU   33H              ; MH存放分的十位數(shù)
  6. HL      EQU   34H              ; HL存放時的個位數(shù)
  7. HH  EQU   35H             ; HH存放時的十位數(shù)
  8. ;
  9. L0      EQU   36H              ; L0~L3:顯示數(shù)據(jù)存儲器
  10. L1  EQU   37H
  11. L2      EQU   38H
  12. L3  EQU   39H
  13. DSPLYP  EQU   3AH              ; 顯示數(shù)據(jù)指針(DISPLAY-POINT)
  14. PLYTS   EQU   3BH              ; 顯示次數(shù)計數(shù)器(DISPLAY-TIMES)
  15. ;
  16. LPLMOD  BIT   39H              ; 低兩位顯示方式(LOW-PLAY-MOD)
  17. HPLMOD  BIT   3AH              ; 高兩位顯示方式(HIGH-PLAY-MOD)
  18. BRIGHT  BIT   3BH              ; DISPLAY子程序參數(shù):亮滅指示位
  19. ;
  20. TCOUNT  EQU   3CH              ; 時間計數(shù)器(TIME-COUNT)
  21. ;
  22. ADDRES  EQU   3DH              ; 加1子程序參數(shù)
  23. MAX     EQU   3EH              ; 加1子程序參數(shù)
  24. IFDEC   BIT   20H              ; BCD加法子程序參數(shù)
  25. ;
  26. R_MOD   EQU   3FH              ; 響鈴方式參數(shù)
  27. ;
  28. LED4    BIT   30H              ; 發(fā)光管狀態(tài)位
  29. BELL    BIT   P1.7             ; 蜂鳴器
  30. SWITCH  BIT   P3.7             ; 繼電器
  31. FKEY    BIT   P3.0             ; 功能鍵 (S1)
  32. MKEY    BIT   P3.1             ; 修改鍵 (S2)
  33. ;
  34. WORKIN  BIT   38H              ; 工作狀態(tài)指示位
  35. ;

  36.                          SJMP START
  37.                          ORG 000BH

  38.                          LJMP LOOP1
  39.                          ;ORG 001BH
  40.     ;LJMP INT_1

  41. ORG 001BH

  42. JNB P0.6,YINYUE1  ;低音樂
  43. LJMP DIANZIQIN1

  44. ORG 0030H

  45.               DIANZIQIN1:
  46.                ;JB P0.1,ZIJIDE
  47.                JnB P3.6,HUAN   ;高主
  48.                 ;YINYUE1:ljmp YINYUE11
  49.               ZIJIDE:;CLR P2.0
  50.               LJMP INT_1
  51.               HUAN:LJMP DIANZIQIN
  52.                YINYUE1:INC 20H ;中斷服務,中斷計數(shù)器加1
  53.                        MOV TH1,#0D8H
  54.                       MOV TL1,#0EFH ;12M晶振,形成10毫秒中斷
  55.                         RETI

  56.                         START: LJMP  MAIN             ; 0000H  引向主程序
  57.     LJMP  ERR              ; 0003H
  58.     NOP
  59.     NOP
  60.     LJMP  ERR              ; 引向出錯處理程序
  61.    LOOP1: LJMP  PGT0             ; 000BH  引向中斷處理程序PGT0
  62.     NOP
  63.     NOP
  64.     LJMP  ERR              ; 引向出錯處理程序
  65.    LOOP2: LJMP  ERR              ; 0013H  INT1
  66.     NOP
  67.     NOP
  68.     LJMP  ERR
  69.    LOOP3:LJMP  ERR              ; 001BH  T1
  70.     NOP
  71.     NOP
  72.     LJMP  ERR
  73.    LOOP4:LJMP  ERR              ; 0023H
  74.     NOP
  75.     NOP
  76.     LJMP  ERR
  77.     LJMP  ERR              ; 002BH
  78.     NOP
  79.     NOP
  80. ;
  81. ;************
  82. ;   主程序  ;
  83. ;************
  84. MAIN: JNB P0.6,CCC
  85.   LJMP DIANZIQIN
  86. ;CCC:LJMP YINYUE

  87. CCC:MOV   IE,#00H          ; 關中斷
  88.     MOV   SP,#57H          ; 設置堆棧指針
  89.     MOV   PSW,#00H         ; 選用寄存器組0
  90.     MOV   TMOD,#11H        ; 設定中斷工作方式為T0和T1
  91.     ;
  92.     MOV   A,56H
  93.     CJNE  A,#0AAH,CSTART   ; 判上電復位標志,無標志轉(zhuǎn)冷啟動
  94.     MOV   A,57H
  95.     CJNE  A,#55H,CSTART    ; 無標志轉(zhuǎn)冷啟動
  96.     AJMP  HSTART           ; 有上電復位標志轉(zhuǎn)熱啟動
  97.     NOP
  98.     NOP
  99.     LJMP  ERR              ; 軟件陷阱,引向出錯處理程序
  100. CSTART: MOV   P1,#0FFH         ; 冷啟動,全面初始化
  101.     MOV   P3,#0FFH
  102.     MOV   TCON,#00H        ; 計時停止
  103.     MOV   TL0,#0B0H        ; 賦中斷T0初值
  104.     MOV   TH0,#3CH
  105.     MOV   TCOUNT,#0AH      ; 賦定時器初值
  106.     MOV   R5,#00H          ; R5為一空單元(備用)
  107.     MOV   R4,#00H          ; R4 為工作模式選擇寄存器
  108.     MOV   SL,#00H          ; 定時單元清零
  109.     MOV   SH,#00H          ; 秒
  110.     MOV   ML,#00H          ;
  111.     MOV   MH,#00H          ; 分
  112.     MOV   HL,#00H          ;
  113.     MOV   HH,#00H          ; 時
  114.     MOV   PLYTS,#64H       ; 賦顯示次數(shù)初值為100次
  115.     MOV   DSPLYP,#L0       ; 顯示指針指向顯存單元
  116.     MOV   L0,#0AH          ; 送顯示數(shù)據(jù)"-----"
  117.     MOV   L1,#0AH
  118.     MOV   L2,#0AH
  119.     MOV   L3,#04H
  120.     SETB  LED4             ; LED4為數(shù)碼管之間的發(fā)光二極管
  121.     SETB  LPLMOD           ; 設定顯示方式為閃爍
  122.     SETB  HPLMOD           ;
  123.     SETB  BRIGHT           ; 允許顯示
  124.     CLR   WORKIN          ; 清工作標志 , 待命
  125.     AJMP  SETUP            ; 轉(zhuǎn)開始工作
  126.     NOP
  127.     NOP
  128.     LJMP  ERR              ; 軟件陷阱
  129. HSTART: MOV   SCON,#00H        ; 有上電標志,熱啟動,清串行口控制寄存器
  130.     MOV   IP,#00H          ; 清中斷優(yōu)先控制寄存器
  131.     SETB  FKEY             ; 重設按鍵
  132.     SETB  MKEY
  133.     SETB  EA               ; 開中斷
  134.     AJMP  BEGIN            ; 轉(zhuǎn)向繼續(xù)工作
  135.     NOP
  136.     NOP
  137.     LJMP  ERR              ; 軟件陷阱
  138. SETUP:  SETB  EA               ; 開中斷
  139. ;
  140. MAIN1:  ACALL DISPLY           ; 調(diào)用顯示
  141.     JB    FKEY,JUDGE       ; 按鍵掃描
  142.     ACALL KEYDLY           ; 延時消抖動
  143.     JB    FKEY,JUDGE       ; 無鍵按下轉(zhuǎn)向判斷是否到點
  144.     CLR   ET0              ; 功能鍵被按下,則
  145.     CLR   TR0          ; 暫停計時
  146.     ACALL MENU             ; 調(diào)用菜單設置程序
  147. BEGIN:  SETB  WORKIN           ; 置工作標志位,開始工作
  148.     SETB  ET0              ; 開中斷
  149.     SETB  TR0              ; 開始計時
  150.     MOV   A,R4             ; 移入工作模式選擇
  151.     RL    A         ; 指針放大
  152.     MOV   DPTR,#M_TAB
  153.     JMP   @A+DPTR          ; 根據(jù)工作模式跳轉(zhuǎn)到相應程序段
  154. M_TAB:  AJMP  WORK1
  155.     AJMP  WORK2
  156.     AJMP  WORK3
  157.     AJMP  WORK4
  158.     NOP
  159.     NOP
  160.     LJMP  ERR              ; 軟件陷阱
  161. WORK1:  ;
  162. WORK2:  CLR   SWITCH           ; 工作方式1和2:開繼電器
  163.     AJMP  MAIN2
  164.     NOP
  165.     NOP
  166.     LJMP  ERR              ; 軟件陷阱
  167. WORK3:  ;
  168. WORK4:  SETB  SWITCH           ; 工作方式3和4:不開繼電器
  169. MAIN2:  CLR   BELL             ; 蜂鳴器短鳴一聲,以示開始工作
  170.     ACALL DL05S
  171.     SETB  BELL
  172. JUDGE:  JNB   WORKIN,MAIN1     ; 判斷是否在定時之中
  173.     MOV   A,SL             ; 判斷秒是否為零
  174.     JNZ   MAIN1
  175.     MOV   A,SH             ; 判斷秒是否為零
  176.     JNZ   MAIN1
  177.     MOV   A,ML             ; 判斷分是否為零
  178.     JNZ   MAIN1
  179.     MOV   A,MH             ; 判斷分是否為零
  180.     JNZ   MAIN1
  181.     MOV   A,HL             ; 判斷時是否為零
  182.     JNZ   MAIN1
  183.     MOV   A,HH             ; 判斷時是否為零
  184.     JNZ   MAIN1            ; 若時分秒全為零則
  185.     CLR   ET0              ; 停止計時
  186.     CLR   TR0              ;


  187.     ACALL ACTION          ; 調(diào)用到點工作子程序

  188.     AJMP  MAIN             ; 返回
  189.     NOP
  190.     NOP
  191.     LJMP  ERR              ; 軟件陷阱
  192.     ;
  193. ;******************
  194. ;    倒計時程序   ;
  195. ;******************
  196. PGT0:   CLR   EA               ; 關中斷
  197.     PUSH  ACC          ; 保護現(xiàn)場
  198.     PUSH  PSW
  199.     PUSH  DPL
  200.     PUSH  DPH
  201.     MOV   PSW,#08H        ; 選用寄存器組1
  202.     CLR   TR0              ; 暫停計時
  203.     MOV   A,#0B7H          ; 中斷同步修正
  204.     ADD   A,TL0
  205.     MOV   TL0,A
  206.     MOV   A,#3CH
  207.     ADD   A,TH0
  208.     MOV   TH0,A
  209.     SETB  TR0              ; 恢復計時
  210.     DEC   TCOUNT           ; 定時器T0每50 000毫秒溢出一次,則
  211.     MOV   A,TCOUNT         ; 溢出10次為0.5秒
  212.     JNZ   OUTT0        ; 判斷是否到半秒
  213.     MOV   TCOUNT,#0AH      ;
  214.     CPL   LED4         ; 若到半秒LED取反
  215.     JNB   LED4,OUTT0       ; LED每閃爍一次是一秒
  216.     MOV   R0,#SH           ; 移入秒位的地址
  217.     SETB  IFDEC            ; BCD子程序參數(shù),使其做減法
  218.     ACALL ADDBCD           ; 調(diào)用BCD子程序, 秒減1
  219.     CJNE  R3,#99H,OUTT0    ; 判斷秒要否借位
  220.     MOV   SH,#05H          ; 要借位則
  221.     MOV   SL,#09H          ; 送數(shù)據(jù)59(否則顯示99)
  222.     MOV   R0,#MH           ; 移入分位的地址
  223.     ACALL ADDBCD          ; 分減1
  224.     CJNE  R3,#99H,OUTT0    ; 判斷分要否借位
  225.     MOV   MH,#05H
  226.     MOV   ML,#09H
  227.     MOV   R0,#HH
  228.     ACALL ADDBCD
  229. OUTT0:  POP   DPH         ; 恢復現(xiàn)場
  230.     POP   DPL
  231.     POP   PSW
  232.     POP   ACC
  233.     SETB  EA

  234.     RETI                   ; 中斷返回
  235.     NOP
  236.     NOP
  237.     LJMP ERR               ; 軟件陷阱
  238.     ;
  239. ;
  240. ;**************************
  241. ;   BCD子程序(加1或減1 )  ;
  242. ;**************************
  243. ADDBCD: MOV   A,@R0            ; 移入被操作數(shù)的高位
  244.     DEC   R0               ; 指針減一
  245.     SWAP  A
  246.     ORL   A,@R0            ; 移入被操作數(shù)的低位
  247.     MOV   B,#01H           ; B寄存器送立即數(shù)#01H
  248.     MOV   C,IFDEC          ; 若減法標志位為1,則
  249.     MOV   B.3,C            ;
  250.     MOV   B.4,C            ; B寄存器的值被改為#99H
  251.     MOV   B.7,C            ;
  252.     ADD   A,B              ; 對一個壓縮的BCD碼加#99H等于對其減一
  253.     DA    A                ; BCD碼調(diào)整
  254.     MOV   R3,A             ; 暫存結(jié)果
  255.     ANL   A,#0FH           ; 取低位碼
  256.     MOV   @R0,A            ; 存數(shù)
  257.     MOV   A,R3             ; 取回結(jié)果
  258.     INC   R0               ; 指針加一
  259.     SWAP  A                ; 交換
  260.     ANL   A,#0FH           ; 取結(jié)果數(shù)的高位
  261.     MOV   @R0,A            ; 存數(shù)
  262.     RET
  263.     NOP
  264.     NOP
  265.     LJMP  ERR              ; 軟件陷阱
  266. ;
  267. ;**************
  268. ;   加1程序   ;
  269. ;**************
  270. ADDONE: MOV   R0,ADDRES        ; 移入被加數(shù)單元的地址
  271.     CLR   IFDEC            ; 設定BCD子程序做加法
  272.     ACALL ADDBCD           ; 調(diào)用BCD子程序
  273.     CLR   C                ; 判斷被加數(shù)是否大于
  274.     MOV   A,R3             ; 最大值"MAX"
  275.     CJNE  A,MAX,JGOVER
  276. JGOVER: JC    ENDADO
  277.     CLR   A                ; 若大于"MAX",則清零
  278.     MOV   @R0,A
  279.     DEC   R0
  280.     MOV   @R0,A
  281. ENDADO: RET
  282.     NOP
  283.     NOP
  284.     LJMP  ERR              ; 軟件陷阱
  285. ;
  286. ;******************
  287. ;   調(diào)時快進程序  ;
  288. ;******************
  289. QUICK:  CLR   LPLMOD         ; 設定顯示方式不閃爍
  290.     CLR   HPLMOD
  291.     ACALL ADDONE           ; 調(diào)用加1子程序
  292.     MOV   L0,R4            ; 將工作模式選擇數(shù)移入顯存
  293.     INC   L0               ; 加1轉(zhuǎn)化成顯示值
  294.     ACALL KEYDLY           ; 延時
  295.     ACALL DL100
  296.     JNB   MKEY,QUICK       ; 判斷鍵是否松開
  297.     SETB  LPLMOD           ; 若松開則恢復閃爍顯示方式
  298.     CJNE  R6,#02H,ENDQUK
  299.     SETB  HPLMOD
  300.     CLR   LPLMOD
  301. ENDQUK: RET
  302.     NOP
  303.     NOP
  304.     LJMP  ERR              ; 軟件陷阱
  305. ;
  306. ;
  307. ;******************
  308. ;   功能菜單程序  ;
  309. ;******************
  310. MENU:   MOV   R6,#00H        ; 初始化;  R6 計功能鍵按鍵次數(shù)
  311.     MOV   ADDRES,#05H      ; 將 R5 的地址送入,以便于改變 R4 的值
  312.     MOV   MAX, #04H        ; 定義工作模式選擇寄存器R4 的最大值
  313.     MOV   DSPLYP,#L0       ; 定義顯示指針指向顯存
  314.     SETB  LPLMOD          ; 設定低兩位數(shù)閃爍
  315.     CLR   HPLMOD
  316.     MOV   L0,R4            ; 送顯示數(shù)據(jù)"F-0X"
  317.     INC   L0
  318.     MOV   L1,#00H
  319.     MOV   L2,#0BH
  320.     MOV   L3,#00H
  321.     SETB  LED4
  322. ;
  323. WAITFK: ACALL DISPLY           ; 等待F鍵釋放
  324.         JNB   FKEY,WAITFK
  325. MENU1:  ACALL DISPLY
  326.     JB    MKEY,JGFKEY      ; M鍵掃描
  327.     ACALL KEYDLY           ; 延時消抖動
  328.     JB    MKEY,JGFKEY      ; 未按下則轉(zhuǎn)F鍵掃描
  329.     CJNE  R6,#00H,NEXT1    ;
  330.     MOV   SL,#00H          ; 若中途改變定時方式,則清除原計時數(shù)據(jù)
  331.     MOV   SH,#00H
  332.     MOV   ML,#00H
  333.     MOV   MH,#00H
  334.     MOV   HL,#00H
  335.     MOV   HH,#00H
  336. NEXT1:  MOV   R2,#00H          ; R2用于判斷按鍵時間是否超過0.5秒
  337. NEXT2:  ACALL ADDONE           ; 調(diào)用加1程序
  338.     MOV   L0,R4            ; 移入工作方式選擇數(shù)
  339.     INC    L0
  340.     ;
  341. WAITMK: ACALL DISPLY         ; 等待M鍵釋放
  342.     INC   R2               ; R2自增一
  343.     CLR   C
  344.     CJNE  R2,#0C8H,JGQUIC  ; 若R2大于等于200則調(diào)用快進子程序
  345. JGQUIC: JC    WATMK1
  346.         ACALL QUICK
  347. WATMK1: JNB   MKEY,WAITMK      ; R2小于200則等待M鍵釋放
  348. ;
  349. JGFKEY: JB    FKEY,MENU1       ; 功能(F)鍵掃描
  350.     ACALL KEYDLY           ; 延時消抖動
  351.     JB    FKEY,MENU1       ; 鍵未按下則轉(zhuǎn)修改(M)鍵掃描
  352.     INC   R6               ; F鍵按鍵次數(shù)加1
  353.     MOV   A,R6             ; 移入按鍵次數(shù)
  354.     RL    A            ; 指針放大
  355.     MOV   DPTR,#FUNTAB
  356.     JMP   @A+DPTR          ; 根據(jù)按鍵次數(shù)跳轉(zhuǎn)到相應的程序段
  357. FUNTAB: AJMP  WAITFK
  358.     AJMP  SETLOW
  359.     AJMP  SETHI
  360.     AJMP  ENDMEN
  361.     NOP
  362.     NOP
  363.     AJMP  ENDMEN
  364. ;STWKMD:                       ; 工作模式設定,不需另外改變菜單
  365. ;
  366. SETLOW: MOV   MAX,#60H         ; 設置低位(秒位或分位)
  367.     MOV   A,R4             ; 移入工作模式選擇數(shù)
  368.     RL    A            ; 指針放大
  369.     MOV   DPTR,#FTAB1
  370.     JMP   @A+DPTR          ; 根據(jù)工作模式選擇數(shù)跳轉(zhuǎn)到相應的程序段
  371. FTAB1:  AJMP  SETSS
  372.     AJMP  SETM60
  373.     AJMP  SETSS
  374.     AJMP  SETM60
  375.     NOP
  376.     NOP
  377.     AJMP  WAITFK
  378. SETSS:    MOV   DSPLYP,#SL       ; 設定顯示區(qū)域為MM:SS
  379.     MOV   ADDRES,#SH
  380.     AJMP  WAITFK
  381. SETM60:   MOV   DSPLYP,#ML       ; 設定顯示區(qū)域為HH:MM
  382.     MOV   ADDRES,#MH
  383.     AJMP  WAITFK
  384. ;
  385. SETHI:    CLR   LPLMOD           ; 設置高位(分位或時位)
  386.     SETB  HPLMOD           ; 高兩位數(shù)碼管閃爍
  387.     MOV   MAX,#31H         ; 最大數(shù)為30
  388.     MOV   A,R4             ; 移入工作模式選擇數(shù)
  389.     RL    A                ; 指針放大
  390.     MOV   DPTR,#FTAB2      ; 移入表首地址
  391.     JMP   @A+DPTR          ; 根據(jù)工作模式選擇數(shù)跳轉(zhuǎn)到相應的程序段
  392. FTAB2:  AJMP  SETM30
  393.     AJMP  SETHH
  394.     AJMP  SETM30
  395.     AJMP  SETHH
  396.     NOP
  397.     NOP
  398.     AJMP  WAITFK           ; 返回等待鍵釋放
  399. SETM30: MOV   ADDRES,#MH       ; 移入分位的地址
  400.         AJMP  WAITFK           ; 轉(zhuǎn)向等待鍵釋放
  401. SETHH:  MOV   ADDRES,#HH       ; 移入時位的地址
  402.     AJMP  WAITFK           ; 轉(zhuǎn)向等待鍵釋放
  403. ;
  404. ENDMEN: CLR   HPLMOD           ; 恢復不閃爍顯示方式
  405.     RET
  406.     NOP
  407.     NOP
  408.     LJMP  ERR              ; 軟件陷阱
  409. ;
  410. ;****************
  411. ;  到點工作程序 ;
  412. ;****************
  413. ACTION: MOV   L0,R4            ; 移入工作模式選擇數(shù)
  414.     INC   L0               ; 送顯示數(shù)"F-0X"
  415.     MOV   L1,#00H
  416.     MOV   L2,#0BH
  417.     MOV   L3,#00H
  418.     SETB  LED4
  419.     MOV   DSPLYP,#L0       ; 指針指向顯存
  420.     SETB  LPLMOD           ; 設定顯示方式不閃爍
  421.     SETB  HPLMOD
  422.     MOV   A,R4             ; 移入工作模式選擇數(shù)
  423.     RL    A                ;
  424.     MOV   DPTR,#A_TAB
  425.     JMP   @A+DPTR          ; 根據(jù)工作模式選擇數(shù)跳轉(zhuǎn)
  426. A_TAB:  AJMP  ACTF1            ; 工作模式一
  427.     AJMP  ACTF1            ; 工作模式二
  428.     AJMP  ACTF3            ; 工作模式三
  429.     AJMP  ACTF3            ; 工作模式四
  430.     NOP
  431.     NOP
  432.     LJMP  ERR              ; 軟件陷阱
  433. ACTF1:  SETB  SWITCH           ; 工作模式一(或二): 開繼電器
  434. LJMP AAA
  435.     BBB: MOV   R_MOD,#82H       ; 響鈴模式參數(shù)#82H
  436.     MOV   R2,#96H          ; 響鈴次數(shù)參數(shù)#96H
  437. ACTF11: ACALL RING           ; 調(diào)用響鈴子程序
  438.     JNB   MKEY,ENDACT      ; 等待鍵按下
  439.     JNB   FKEY,ENDACT      ; 有鍵按下則結(jié)束響鈴
  440.     DJNZ  R2, ACTF11       ; 次數(shù)未滿繼續(xù)響鈴
  441.     MOV   R_MOD,#0FFH      ; 參數(shù)#0FF使響鈴無效
  442.     AJMP  ACTF11           ; 無鍵按下返回
  443.     NOP
  444.     NOP
  445.     LJMP  ERR              ; 軟件陷阱
  446. ACTF3:  CLR   SWITCH           ; 工作模式三(或四): 開繼電器
  447.     CLR   BELL             ; 蜂鳴器短鳴一聲
  448.     ACALL DL1S
  449.     SETB  BELL
  450.     MOV   R_MOD,#0FFH      ; 響鈴模式參數(shù)#0FFH
  451.     MOV   R2,#96H          ; 響鈴時間參數(shù)#96H
  452. ACTF31: ACALL RING        ; 調(diào)用響鈴子程序
  453.     JNB   MKEY,ENDACT      ; 等待鍵按下
  454.     JNB   FKEY,ENDACT      ; 有鍵按下則結(jié)束
  455.     DJNZ  R2,ACTF31        ; 次數(shù)未滿繼續(xù)
  456.     MOV   R2,#96H          ; 重新賦值
  457.     CLR   BELL             ; 短鳴一聲(說明: 響鈴模式參數(shù)#0FFH使
  458.     ACALL DL100            ; 響鈴程序無效,僅起延時作用,
  459.     SETB  BELL             ; 每延時一段時間短鳴一聲,以
  460.     AJMP  ACTF31           ; 提醒使用者繼電器仍在工作)
  461.     NOP
  462.     NOP
  463.     LJMP  ERR              ; 軟件陷阱
  464. ENDACT: SETB  SWITCH           ; 關繼電器
  465. AWAITF: ACALL DISPLY           ; 調(diào)用顯示
  466.         JNB   FKEY,AWAITF      ; 等待鍵釋放
  467. AWAITM: ACALL DISPLY           ; 調(diào)用顯示
  468.     JNB   MKEY,AWAITM      ; 等待鍵釋放
  469.     RET
  470.     NOP
  471.     NOP
  472.     LJMP  ERR              ; 軟件陷阱
  473.     ;
  474. ;**************
  475. ;   響鈴程序  ;
  476. ;**************
  477. RING:   MOV   R5,#18H          ; R5為循環(huán)控制變量
  478. RING1:  JNB   MKEY,R_EXIT      ; 鍵掃描
  479.     JNB   FKEY,R_EXIT      ; 有鍵按下則退出
  480.     MOV   A,R_MOD          ; 移入響鈴模式參數(shù)
  481.     MOV   C,ACC.7          ; 根據(jù)響鈴模式參數(shù)改變響鈴
  482.     MOV   BELL,C
  483.     RL    A
  484.     MOV   R_MOD,A
  485.     ACALL DL100            ; 延時
  486.     DJNZ  R5,RING1         ; 循環(huán)次數(shù)控制
  487. R_EXIT: SETB  BELL             ; 關閉響鈴
  488.     RET
  489.     NOP
  490.     NOP
  491.     LJMP ERR               ; 軟件陷阱
  492. ;
  493. ;**************
  494. ;   顯示程序  ;
  495. ;**************
  496. DISPLY: PUSH  ACC              ; 數(shù)據(jù)壓棧保護
  497.     PUSH  PSW
  498.     MOV   PSW,#10H         ; 選用寄存器組2
  499.     MOV   R0,DSPLYP        ; 移入顯示指針
  500.     MOV   R2,#0FDH         ; R2寄存的是數(shù)碼管選通數(shù)
  501.     MOV   A,PLYTS          ; 移入顯示循環(huán)控制量
  502.     JNZ   PLAY             ; 不為0則轉(zhuǎn)PLAY
  503.     MOV   PLYTS,#64H       ; 否則從新賦值
  504.     CPL   BRIGHT           ; 亮滅指示位取反
  505. PLAY:   DEC   PLYTS            ; 顯示循環(huán)控制量減1
  506.     JNB   LPLMOD,PLAYL     ; 低兩位數(shù)碼管不閃則"PLAYL"
  507.     JB    BRIGHT,PLAYL     ; 亮滅指示為1也"PLAYL"
  508.     ACALL NOPLAY           ; 否則滅燈延時
  509.     AJMP  PLAY1            ; 轉(zhuǎn)顯示高位數(shù)碼管
  510.     NOP
  511.     NOP
  512.     LJMP ERR               ; 軟件陷阱
  513. ;用來顯示低位
  514. PLAYL:  ORL   P1,#7FH          ; 清原顯示數(shù)據(jù)
  515.     ORL   P3,#3CH          ; 清原選通數(shù)據(jù)
  516.     MOV   A,R2             ; 移入數(shù)碼管位選數(shù)
  517.     RL    A                ; 換一位
  518.     ANL   P3,A             ; 選通低位的個位數(shù)碼管
  519.     MOV   R2,A             ; 暫存位選數(shù)
  520.     MOV   A,@R0            ; 移入顯示數(shù)值
  521.     MOV   DPTR,#TABLE1     ; 移入表首地址
  522.     MOVC  A,@A+DPTR        ; 查表
  523.     ANL   P1,A             ; 送顯示數(shù)據(jù)
  524.     ACALL DL1MS            ; 延時
  525.     INC   R0               ; 指向低位的十位數(shù)
  526.     JB    P3.3,PLAYL       ; 顯示低位的十位數(shù)
  527. ;
  528. PLAY1:  JNB   HPLMOD,PLAYH     ; 高兩位數(shù)碼管不閃則"PLAYH"
  529.     JB    BRIGHT,PLAYH     ; 亮滅指示為1也"PLAYH"
  530.     ACALL NOPLAY           ; 否則滅燈延時
  531.     AJMP  OUTPLY           ; 轉(zhuǎn)結(jié)束
  532.     NOP
  533.     NOP
  534.     LJMP ERR               ; 軟件陷阱
  535. ;
  536. ;用來顯示高位
  537. PLAYH:  ORL   P1,#7FH          ; 清原顯示數(shù)據(jù)
  538.     ORL   P3,#3CH          ; 清原選通數(shù)據(jù)
  539.     ANL   P3,#0EFH         ; 選通高位的個位數(shù)數(shù)碼管
  540.     MOV   A,@R0            ; 移入顯示數(shù)值
  541.     MOV   DPTR,#TABLE1     ; 移入表首地址
  542.     MOVC  A,@A+DPTR        ; 查表
  543.     ANL   P1,A             ; 送顯示數(shù)據(jù)
  544.     ACALL DL1MS            ; 延時
  545.     INC   R0               ; 指向高位的十位數(shù)
  546.     ;                      ; 顯示高位的十位數(shù)
  547.     ORL   P1,#7FH          ; 清原顯示數(shù)據(jù)
  548.     ORL   P3,#3CH          ; 清原選通數(shù)據(jù)
  549.     ANL   P3,#0DFH         ; 選通高位的十位數(shù)
  550.     MOV   A,@R0            ; 移入顯示數(shù)值
  551.     MOV   C,LED4          ; 指針放大+小燈狀態(tài)
  552.     RLC   A                ;
  553.     MOV   DPTR,#TABLE2     ; 移入表首地址
  554.     MOVC  A,@A+DPTR        ; 查表
  555.     ANL   P1,A             ; 送顯示數(shù)據(jù)
  556.     ACALL DL1MS            ; 延時
  557. ;
  558. OUTPLY: POP   PSW              ; 恢復數(shù)據(jù)
  559.     POP   ACC
  560.     RET
  561.     NOP
  562.     NOP
  563.     LJMP ERR               ; 軟件陷阱
  564. ;
  565. TABLE1: DB  0C0H,0F9H,0A4H,0B0H, 99H, 92H, 82H,0F8H, 80H, 90H,0BFH, 8EH,0FFH
  566. ;           "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "-", "F", " "
  567. ;
  568. TABLE2: DB  0FFH, 0DFH, 0F9H, 0D9H, 0A4H,  84H, 0B0H,  90H, 0BFH, 09FH
  569. ;    "  ",  " :",   "1 ",  "1:",  "2 ",    "2:",  "3 ",  "3:",  "- ",  "-:"
  570. ;
  571. ;
  572. ;
  573. ;**********************
  574. ;    無顯示(滅燈)程序   ;
  575. ;**********************
  576. NOPLAY: ORL   P1,#7FH          ; 清顯示數(shù)據(jù)
  577.     ORL   P3,#3CH          ; 清選通數(shù)據(jù)
  578.     INC   R0               ; 指針自增2
  579.     INC   R0
  580.     ACALL DL1MS            ; 延時
  581.     RET
  582.     NOP
  583.     NOP
  584.     LJMP  ERR              ; 軟件陷阱
  585.     ;
  586. ;******************
  587. ;     延時程序    ;
  588. ;******************
  589. DL1MS:  MOV   R3,#0F9H         ; 延時 1250US  只為DISPLY所調(diào)用
  590. DL1MS1: NOP
  591.     NOP
  592.     NOP
  593.     DJNZ  R3,DL1MS1
  594.     RET
  595.     NOP
  596.     NOP
  597.     LJMP  ERR              ; 軟件陷阱
  598.     ;
  599. KEYDLY: CLR   BELL        ; 按鍵消抖動專用延時程序,
  600.     ACALL DISPLY           ; 在消除抖動的同時發(fā)出按鍵提示音
  601.     SETB  BELL
  602.     RET
  603.     NOP
  604.     NOP
  605.     LJMP ERR               ; 軟件陷阱
  606. ;
  607. DL50MS: MOV   R7,#0AH          ; 50毫秒延時程序
  608. DL50M1: ACALL DISPLY         ; 每調(diào)用一次顯示程序5MS
  609.     DJNZ  R7,DL50M1        ; 調(diào)用10次
  610.     RET
  611.     NOP
  612.     NOP
  613.     LJMP  ERR              ; 軟件陷阱
  614. ;
  615. DL100:  ACALL DL50MS           ; 延時100毫秒
  616.     ACALL DL50MS
  617.     RET
  618.     NOP
  619.     NOP
  620.     LJMP  ERR              ; 軟件陷阱
  621. ;
  622. DL05S:  ACALL DL100            ; 延時0.5秒
  623.     ACALL DL100
  624.     ACALL DL100
  625.     ACALL DL100
  626.     ACALL DL100
  627.     RET
  628.     NOP
  629.     NOP
  630.     LJMP  ERR              ; 軟件陷阱
  631.     ;
  632. DL1S:   ACALL DL05S            ; 延時1秒
  633.     ACALL DL05S
  634.     RET
  635.     NOP
  636.     NOP
  637.     LJMP  ERR              ; 軟件陷阱
  638.     ;
  639. ;****************************
  640. ;     ERR(出錯處理) 程序    ;
  641. ;****************************
  642. ERR:    CLR   EA               ; 關中斷
  643.     MOV   DPTR,#ERR1       ; 準備返回地址
  644.     PUSH  DPL              ; 壓棧
  645.     PUSH  DPH              ;
  646.     RETI                   ; 中斷返回
  647. ERR1:   MOV   56H,#0AAH        ; 建立上電標志(出錯標志)
  648.     MOV   57H,#55H
  649.     MOV   A,#00H           ; 準備返回地址
  650.     PUSH  ACC              ; 壓棧
  651.     PUSH  ACC
  652.     RETI                   ; 中斷返回
  653.     NOP
  654.     NOP
  655.     LJMP  ERR              ; 軟件陷阱
  656. ;
  657.     ORG   07FAH
  658.     NOP
  659.     NOP
  660.     NOP
  661.     LJMP  ERR              ; 軟件陷阱
  662.     ;AAA:JNB P0.6,CCC
  663.     ;CCC:LJMP YINYUE

  664.                           ;LJMP DIANZIQIN
  665.                   DIANZIQIN:;MOV P0,#00H
  666.                          ;clr p3.6
  667.                         ;setb P0.1
  668.                          SETB EA
  669.                          SETB ET1                       ;計數(shù)器0
  670.                          MOV TMOD,#20H
  671.                          MOV TH1,#09CH
  672.                          MOV TL1,#09CH                 ;定時器初植
  673.                          CLR TR1                        ;定時器不允許
  674.                   SCAN:                                 ;鍵盤掃描
  675.                          MOV A,P2                   ;判斷鍵盤按下,跳到SCAN_1,若未按,繼續(xù)掃描
  676.                          CJNE A,#0FFH,SCAN_1
  677.                          NOP

  678.                          SJMP SCAN
  679.                   SCAN_1:
  680.                          ACALL DELAY ;是不是真的要按下?如果是,則跳轉(zhuǎn)SU_KEY查詢是哪個按下?
  681.                          MOV A,P2
  682.                          CJNE A,#0FFH,SU_KEY
  683.                          NOP
  684.                          SJMP SCAN
  685.                   SU_KEY:JNB P0.6,LOOP11
  686.                          ;SJMP LOOP2
  687.                    ;LOOP11:LJMP AAA
  688.                          JNB P2.1,MU_1                  ;判斷是哪個鍵按下?
  689.                          JNB P2.2,MU_2
  690.                          JNB P2.3,MU_3
  691.                          JNB P2.4,MU_4
  692.                          JNB P2.5,MU_5
  693.                          JNB P2.6,MU_6
  694.                          JNB P2.7,MU_7
  695.                          SJMP SCAN
  696.                   LOOP11:LJMP AAA
  697.                                                            ;R1信號周期
  698.                   MU_1:  MOV R1,#19                ;如果第一個按鍵按下,則R1=19,同時程序轉(zhuǎn)NEXT
  699.                          SJMP NEXT
  700.                   MU_2:  MOV R1,#17
  701.                          SJMP NEXT
  702.                   MU_3:  MOV R1,#15
  703.                          SJMP NEXT
  704.                   MU_4:  MOV R1,#14
  705.                          SJMP NEXT
  706.                   MU_5:  MOV R1,#13
  707.                          SJMP NEXT
  708.                   MU_6:  MOV R1,#11
  709.                          SJMP NEXT
  710.                   MU_7:  MOV R1,#10
  711.                          SJMP NEXT
  712.                   NEXT:  MOV A,R1
  713.                          MOV R0,A
  714.                          SETB TR1                      ;啟動定時器0

  715.                   NEXT_1:MOV A,P2                     ; 沒鍵按下繼續(xù)執(zhí)行,有鍵按下,返回讀引腳
  716.                          CJNE A,#0FFH,NEXT_1
  717.                          ACALL DELAY
  718.                          MOV A,P2                       ;真的沒鍵按下?
  719.                          CJNE A,#0FFH,NEXT_1
  720.                          CLR TR1                        ;不響
  721.                          AJMP SCAN                     ;掃描鍵盤去
  722.                   INT_1:                                 ;中斷程序
  723.                         DJNZ R0,RE                      ;R0不等于0時,返回
  724.                         CPL P0.0
  725.                         MOV A,R1
  726.                         MOV R0,A
  727.                   RE:   RETI
  728.                   DELAY:MOV R7,#100                    ;延長時間等待,鍵盤消抖
  729.                   D1:   MOV R6,#10
  730.                   D2:   DJNZ R6,D2
  731.                         DJNZ R7,D1
  732.                         ;LJMP BBB
  733.                         RET


  734.      AAA:
  735.      SETB P3.6
  736. ;CLR P0.6
  737. MOV SP,#50H
  738. MOV TH1,#0D8H
  739. MOV TL1,#0EFH
  740. MOV TMOD,#10H
  741. MOV IE,#88H
  742. LJMP TIAO
  743. MUSIC0:;JB P0.6,QIN


  744. ;LJMP BBB
  745. TIAO:
  746. NOP
  747. MOV DPTR,#DAT ;表頭地址送DPTR
  748. MOV 20H,#00H ;中斷計數(shù)器清0
  749. MOV B,#00H ;表序號清0
  750. MUSIC1:
  751. ;JnB P0.1,duan
  752. NOP
  753. CLR A
  754. MOVC A,@A+DPTR ;查表取代碼
  755. JZ END0 ;是00H,則結(jié)束
  756. CJNE A,#0FFH,MUSIC5
  757. LJMP MUSIC3
  758. duan:ljmp BBB
  759. MUSIC5:
  760. NOP
  761. MOV R6,A
  762. INC DPTR
  763. MOV A,B
  764. MOVC A,@A+DPTR ;取節(jié)拍代碼送R7
  765. MOV R7,A
  766. SETB TR1 ;啟動計數(shù)
  767. MUSIC2:

  768. ;clr P3.6
  769. NOP
  770. CPL P0.0
  771. MOV A,R6
  772. MOV R3,A
  773. LCALL DEL
  774. MOV A,R7
  775. CJNE A,20H,MUSIC2 ;中斷計數(shù)器(20H)=R7否?
  776. ;不等,則繼續(xù)循環(huán)
  777. ;JB P0.6,QIN
  778. ;jb p0.6,QIN
  779. ;jnb p0.4,ting
  780. MOV 20H,#00H ;等于,則取下一代碼
  781. INC DPTR
  782.   ;JB P0.6,QIN
  783. ; INC B
  784. LJMP MUSIC1
  785. ;ting:ljmp BBB
  786. ;QIN:CLR TR1
  787. ;QIN:LJMP DIANZIQIN
  788. ;DIANZIQIN
  789. MUSIC3:
  790. NOP
  791. CLR TR1 ;休止100毫秒
  792. MOV R2,#0DH
  793. MUSIC4:
  794. NOP
  795. MOV R3,#0FFH
  796. LCALL DEL
  797. DJNZ R2,MUSIC4
  798. INC DPTR
  799. LJMP MUSIC1
  800. END0:
  801. NOP
  802. MOV R2,#64H ;歌曲結(jié)束,延時1秒后繼續(xù)
  803. MUSIC6:
  804. MOV R3,#00H
  805. LCALL DEL
  806. DJNZ R2,MUSIC6
  807. LJMP MUSIC0
  808. DEL:
  809. NOP
  810. DEL3:
  811. MOV R4,#02H
  812. DEL4:
  813. NOP
  814. DJNZ R4,DEL4
  815. NOP
  816. DJNZ R3,DEL3
  817. RET
  818. NOP
  819. DAT:
  820. db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
  821. db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
  822. db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
  823. db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
  824. db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
  825. db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
  826. db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
  827. db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
  828. db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
  829. db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
  830. db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
  831. db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
  832. db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
  833. db 20h,10h,2bh,10h,26h,30h,30h,80h,00H

  834. END
復制代碼





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復 返回頂部 返回列表