⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ir_yinyue.ls1

📁 Keil C51单片机基础实验源程序
💻 LS1
📖 第 1 页 / 共 5 页
字号:
000E F582            880             MOV     DPL,A
0010 E4              881             CLR     A
0011 3400     F      882             ADDC    A,#HIGH (yin)
0013 F583            883             MOV     DPH,A
0015 E4              884             CLR     A
0016 93              885             MOVC    A,@A+DPTR
0017 F58C            886             MOV     TH0,A
                     887     ;      TL0=yin[2*l+1];
                     888                             ; SOURCE LINE # 210
0019 E500     F      889             MOV     A,l
001B 25E0            890             ADD     A,ACC
001D 2400     F      891             ADD     A,#LOW (yin+01H)
001F F582            892             MOV     DPL,A
0021 E4              893             CLR     A
0022 3400     F      894             ADDC    A,#HIGH (yin+01H)
0024 F583            895             MOV     DPH,A
0026 E4              896             CLR     A
0027 93              897             MOVC    A,@A+DPTR
0028 F58A            898             MOV     TL0,A
                     899     ;      SPK = !SPK; 
                     900                             ; SOURCE LINE # 211
002A B2B7            901             CPL     SPK
                     902     ;      
                     903     ; }
                     904                             ; SOURCE LINE # 213
002C D0D0            905             POP     PSW
002E D082            906             POP     DPL
0030 D083            907             POP     DPH
0032 D0E0            908             POP     ACC
0034 32              909             RETI    
                     910     ; END OF timer0
A51 MACRO ASSEMBLER  IR_YINYUE                                                            10/24/2006 16:41:18 PAGE    15

                     911     
                     912     ; 
                     913     ; 
                     914     ; 
                     915     ; 
                     916     ; void sing_song()
                     917     
----                 918             RSEG  ?PR?sing_song?IR_YINYUE
0000                 919     sing_song:
                     920             USING   0
                     921                             ; SOURCE LINE # 218
                     922     ;  {  
                     923                             ; SOURCE LINE # 219
                     924     ;    
                     925     ;    unsigned int data j;    //取码指针
                     926     ;    unsigned char data i;   //用于循环
                     927     ;    unsigned char data k;   //几个1/4拍
                     928     ;    IR_OK=0;                //不能少掉!!!!
                     929                             ; SOURCE LINE # 224
0000 C200     F      930             CLR     IR_OK
                     931     ;    song=songs[song_number];
                     932                             ; SOURCE LINE # 225
0002 E500     F      933             MOV     A,song_number
0004 25E0            934             ADD     A,ACC
0006 2400     F      935             ADD     A,#LOW (songs)
0008 F582            936             MOV     DPL,A
000A E4              937             CLR     A
000B 3400     F      938             ADDC    A,#HIGH (songs)
000D F583            939             MOV     DPH,A
000F E4              940             CLR     A
0010 93              941             MOVC    A,@A+DPTR
0011 FE              942             MOV     R6,A
0012 7401            943             MOV     A,#01H
0014 93              944             MOVC    A,@A+DPTR
0015 AA06            945             MOV     R2,AR6
0017 7500FF   F      946             MOV     song,#0FFH
001A 8A00     F      947             MOV     song+01H,R2
001C F500     F      948             MOV     song+02H,A
                     949     ;    j=0;
                     950                             ; SOURCE LINE # 226
001E E4              951             CLR     A
001F F500     F      952             MOV     j?755,A
0021 F500     F      953             MOV     j?755+01H,A
0023                 954     ?C0074:
                     955     ;     while(*(song+j)!=0xFF)                     //是否取到结束码
                     956                             ; SOURCE LINE # 227
0023 AB00     F      957             MOV     R3,song
0025 AA00     F      958             MOV     R2,song+01H
0027 A900     F      959             MOV     R1,song+02H
0029 850082   F      960             MOV     DPL,j?755+01H
002C 850083   F      961             MOV     DPH,j?755
002F 120000   F      962             LCALL   ?C?CLDOPTR
0032 FF              963             MOV     R7,A
0033 F4              964             CPL     A
0034 6057            965             JZ      ?C0081
                     966     ;     {  
                     967                             ; SOURCE LINE # 228
                     968     ;          if(IR_OK==1){break;}                     //这一句很重要的!!!!!
                     969                             ; SOURCE LINE # 229
0036 200054   F      970             JB      IR_OK,?C0081
0039                 971     ?C0076:
                     972     ;        k=*(song+j)&0x0F;                       //后4位为多少个1/4拍
                     973                             ; SOURCE LINE # 230
0039 EF              974             MOV     A,R7
003A 540F            975             ANL     A,#0FH
003C FE              976             MOV     R6,A
A51 MACRO ASSEMBLER  IR_YINYUE                                                            10/24/2006 16:41:18 PAGE    16

                     977     ;---- Variable 'k?757' assigned to Register 'R6' ----
                     978     ;        l=*(song+j)>>4;                         //song(song+j)[]中所放的每个字节
                     979                             ; SOURCE LINE # 231
003D EF              980             MOV     A,R7
003E C4              981             SWAP    A
003F 540F            982             ANL     A,#0FH
0041 F500     F      983             MOV     l,A
                     984     ;                                                //前4位乘2表示为音符频率在数组yin[]中的位置
                     985     ;       
                     986     ;        TH0=yin[2*l];                           //置初值
                     987                             ; SOURCE LINE # 234
0043 25E0            988             ADD     A,ACC
0045 2400     F      989             ADD     A,#LOW (yin)
0047 F582            990             MOV     DPL,A
0049 E4              991             CLR     A
004A 3400     F      992             ADDC    A,#HIGH (yin)
004C F583            993             MOV     DPH,A
004E E4              994             CLR     A
004F 93              995             MOVC    A,@A+DPTR
0050 FF              996             MOV     R7,A
0051 F58C            997             MOV     TH0,A
                     998     ;        TL0=yin[2*l+1];
                     999                             ; SOURCE LINE # 235
0053 E500     F     1000             MOV     A,l
0055 25E0           1001             ADD     A,ACC
0057 2400     F     1002             ADD     A,#LOW (yin+01H)
0059 F582           1003             MOV     DPL,A
005B E4             1004             CLR     A
005C 3400     F     1005             ADDC    A,#HIGH (yin+01H)
005E F583           1006             MOV     DPH,A
0060 E4             1007             CLR     A
0061 93             1008             MOVC    A,@A+DPTR
0062 FD             1009             MOV     R5,A
0063 F58A           1010             MOV     TL0,A
                    1011     ;        TR0=1;                                  //起动定时器0
                    1012                             ; SOURCE LINE # 236
0065 D28C           1013             SETB    TR0
                    1014     ;        if ((yin[2*l]==0xff)&&(yin[2*l+1]==0xff)) //如果取到的都是休止符,则不输出音频
                    1015                             ; SOURCE LINE # 237
0067 EF             1016             MOV     A,R7
0068 B4FF08         1017             CJNE    A,#0FFH,?C0077
006B ED             1018             MOV     A,R5
006C B4FF04         1019             CJNE    A,#0FFH,?C0077
                    1020     ;            {
                    1021                             ; SOURCE LINE # 238
                    1022     ;                TR0=0;SPK=1;
                    1023                             ; SOURCE LINE # 239
006F C28C           1024             CLR     TR0
0071 D2B7           1025             SETB    SPK
                    1026     ;               }
                    1027                             ; SOURCE LINE # 240
0073                1028     ?C0077:
                    1029     ;        for(i=k;i>0;--i)     //节拍K为多少就执行多少个1/4拍
                    1030                             ; SOURCE LINE # 241
                    1031     ;---- Variable 'i?756' assigned to Register 'R4' ----
0073 AC06           1032             MOV     R4,AR6
0075                1033     ?C0078:
0075 EC             1034             MOV     A,R4
0076 D3             1035             SETB    C
0077 9400           1036             SUBB    A,#00H
0079 4006           1037             JC      ?C0079
                    1038     ;            {  delay187ms();  } 
                    1039                             ; SOURCE LINE # 242
007B 120000   F     1040             LCALL   delay187ms
007E 1C             1041             DEC     R4
007F 80F4           1042             SJMP    ?C0078
A51 MACRO ASSEMBLER  IR_YINYUE                                                            10/24/2006 16:41:18 PAGE    17

0081                1043     ?C0079:
                    1044     ;        TR0=0;
                    1045                             ; SOURCE LINE # 243
0081 C28C           1046             CLR     TR0
                    1047     ;        j++;
                    1048                             ; SOURCE LINE # 244
0083 0500     F     1049             INC     j?755+01H
0085 E500     F     1050             MOV     A,j?755+01H
0087 709A           1051             JNZ     ?C0074
0089 0500     F     1052             INC     j?755
008B                1053     ?C0109:
                    1054     ;     }                                            //回22222
                    1055                             ; SOURCE LINE # 245
008B 8096           1056             SJMP    ?C0074
                    1057     ;  }                                               //回xxxxxx
                    1058                             ; SOURCE LINE # 246
008D                1059     ?C0081:
008D 22             1060             RET     
                    1061     ; END OF sing_song
                    1062     
                    1063     ;                                           
                    1064     ; 
                    1065     ; 
                    1066     ;  void main()
                    1067     
----                1068             RSEG  ?PR?main?IR_YINYUE
0000                1069     main:
                    1070             USING   0
                    1071                             ; SOURCE LINE # 250
                    1072     ; {
                    1073                             ; SOURCE LINE # 251
                    1074     ;     IT0=1;           //设中断0为边沿触发方式 
                    1075                             ; SOURCE LINE # 252
0000 D288           1076             SETB    IT0
                    1077     ;     TMOD=0x11;       //timer0,timer1工作在方式1
                    1078                             ; SOURCE LINE # 253
0002 758911         1079             MOV     TMOD,#011H
                    1080     ;     IE=0x83;         //EA=1;ETO=1;EX0=1;
                    1081                             ; SOURCE LINE # 254
0005 75A883         1082             MOV     IE,#083H
                    1083     ;       IP=0x01;
                    1084                             ; SOURCE LINE # 255
0008 75B801         1085             MOV     IP,#01H
                    1086     ; /*   TMOD=0x01;       //timer0工作在方式1
                    1087     ;     IE=0x82;         //EA=1;ETO=1;
                    1088     ;        IT0=1;           //外部中断0触发方式控制位,下降沿触发
                    1089     ;        EX0=1;           //外部中断0(INT0)中断允许位
                    1090     ;        EA=1;            //总中断
                    1091     ; */
                    1092     ;        dm=0;
                    1093                             ; SOURCE LINE # 262
000B E4             1094             CLR     A
000C F500     F     1095             MOV     dm,A
                    1096     ;        P2=0xc0;
                    1097                             ; SOURCE LINE # 263
000E 75A0C0         1098             MOV     P2,#0C0H
                    1099     ;        P1=0x00;
                    1100                             ; SOURCE LINE # 264
0011 F590           1101             MOV     P1,A
0013                1102     ?C0082:
                  

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -