📄 ir_yinyue.src
字号:
; unsigned char i,j,k;
; EA=0; //暂时关闭CPU的所有中断请求
; SOURCE LINE # 132
CLR EA
;
; for(k=0;k<10;k++) //重复10次,目的是检测在9毫秒内如果出现高电平就退出解码程序
; SOURCE LINE # 134
;---- Variable 'k?554' assigned to Register 'R3' ----
CLR A
MOV R3,A
?C0042:
; { //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
; SOURCE LINE # 135
;
; delay0_9ms(); //延时0.9毫秒
; SOURCE LINE # 137
LCALL delay0_9ms
; if (IR==1) {k=10;break;} //延时0.9毫秒后判断P3.2脚是否出现高电平如果有就退出解码程序
; SOURCE LINE # 138
JNB IR,?C0045
MOV R3,#0AH
LJMP ?C0043
?C0045:
; else if(k==9) //重复10次?
; SOURCE LINE # 139
MOV A,R3
XRL A,#09H
JZ $ + 5H
LJMP ?C0044
; { //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
; SOURCE LINE # 140
?C0048:
; while(IR==0); //等待高电平避开9毫秒低电平引导脉冲
; SOURCE LINE # 141
JNB IR,?C0048
?C0049:
; delay4_5ms(); //延时4.5毫秒避开4.5毫秒的结果码
; SOURCE LINE # 142
LCALL delay4_5ms
;
;
; /********************************************
; //26位的用户码,前13位数据码,后13位数据反码
; *********************************************/
; for(j=1;j<=26;j++)//每组数据为26位
; SOURCE LINE # 148
;---- Variable 'j?553' assigned to Register 'R2' ----
MOV R2,#01H
?C0050:
; {
; SOURCE LINE # 149
?C0053:
; while(IR==0); //
; SOURCE LINE # 150
JNB IR,?C0053
?C0054:
; delay0_9ms();
; SOURCE LINE # 151
LCALL delay0_9ms
; if(IR==1)
; SOURCE LINE # 152
JNB IR,?C0055
; {
; SOURCE LINE # 153
; delay1ms();
; SOURCE LINE # 154
LCALL delay1ms
; dm=dm|0x2000000; //因为是26位,一个"1",后面25个"0",转化二进制即为"1000000"
; SOURCE LINE # 155
MOV dm,dm
; if(j<26) dm=dm>>1; //数据"1",右移一个"1",一共25次
; SOURCE LINE # 156
MOV A,R2
CLR C
SUBB A,#01AH
JNC ?C0052
; }
; SOURCE LINE # 157
SJMP ?C0110
?C0055:
; else if(j<26) dm=dm>>1; //数据"0",一共25次
; SOURCE LINE # 158
MOV A,R2
CLR C
SUBB A,#01AH
JNC ?C0052
?C0110:
MOV A,dm
CLR C
RRC A
MOV dm,A
; }
; SOURCE LINE # 159
?C0052:
INC R2
CJNE R2,#01BH,?C0050
?C0051:
; bb=dm;
; SOURCE LINE # 160
CLR A
MOV bb+03H,dm
MOV bb+02H,A
MOV bb+01H,A
MOV bb,A
; dm=0;
; SOURCE LINE # 161
MOV dm,A
;
;
;
; /***************************************************
; //16位的用户码,前8位数据码,后8位数据反码
; ****************************************************/
;
; for(i=0;i<2;i++)
; SOURCE LINE # 169
;---- Variable 'i?552' assigned to Register 'R5' ----
MOV R5,A
?C0059:
; {
; SOURCE LINE # 170
; for(j=1;j<=8;j++)//每组数据为26位
; SOURCE LINE # 171
MOV R2,#01H
?C0062:
; {
; SOURCE LINE # 172
?C0065:
; while(IR==0); //
; SOURCE LINE # 173
JNB IR,?C0065
?C0066:
; delay0_9ms();
; SOURCE LINE # 174
LCALL delay0_9ms
; if(IR==1)
; SOURCE LINE # 175
JNB IR,?C0067
; {
; SOURCE LINE # 176
; delay1ms();
; SOURCE LINE # 177
LCALL delay1ms
; dm=dm|0x80;
; SOURCE LINE # 178
ORL dm,#080H
; if(j<8) dm=dm>>1; //数据"1",右移一个"1",一共7次
; SOURCE LINE # 179
MOV A,R2
CLR C
SUBB A,#08H
JNC ?C0064
; }
; SOURCE LINE # 180
SJMP ?C0111
?C0067:
; else if(j<8) dm=dm>>1; //数据"0",一共7次
; SOURCE LINE # 181
MOV A,R2
CLR C
SUBB A,#08H
JNC ?C0064
?C0111:
MOV A,dm
CLR C
RRC A
MOV dm,A
; }
; SOURCE LINE # 182
?C0064:
INC R2
CJNE R2,#09H,?C0062
?C0063:
; aa[i]=dm;
; SOURCE LINE # 183
MOV A,#LOW (aa)
ADD A,R5
MOV R0,A
MOV @R0,dm
; dm=0;
; SOURCE LINE # 184
MOV dm,#00H
; }
; SOURCE LINE # 185
INC R5
CJNE R5,#02H,?C0059
?C0060:
;
; /***************************************************
; //显示部分
; ****************************************************/
; if(aa[0]==~aa[1]) //验证成功
; SOURCE LINE # 190
MOV A,aa+01H
CPL A
CJNE A,aa,?C0044
; {
; SOURCE LINE # 191
; IR_OK=1;
; SOURCE LINE # 192
SETB IR_OK
; sound=0;
; SOURCE LINE # 193
CLR sound
; delay100ms();
; SOURCE LINE # 194
LCALL delay100ms
; // P1=0x00;
; // P2=aa[0];
; sound=1;
; SOURCE LINE # 197
SETB sound
; }
; SOURCE LINE # 198
;
; } //bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
; SOURCE LINE # 200
; } //aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
; SOURCE LINE # 201
?C0044:
INC R3
MOV A,R3
CLR C
SUBB A,#0AH
JNC $ + 5H
LJMP ?C0042
?C0043:
; EA=1;
; SOURCE LINE # 202
SETB EA
; }
; SOURCE LINE # 203
POP PSW
POP ACC
RETI
; END OF t0
CSEG AT 0000BH
LJMP timer0
;
;
; /*每个音符的发声*/
; void timer0() interrupt 1 using 1 //定时器T0
RSEG ?PR?timer0?IR_YINYUE
USING 1
timer0:
PUSH ACC
PUSH DPH
PUSH DPL
PUSH PSW
; SOURCE LINE # 207
; {
; TH0=yin[2*l];
; SOURCE LINE # 209
MOV A,l
ADD A,ACC
ADD A,#LOW (yin)
MOV DPL,A
CLR A
ADDC A,#HIGH (yin)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV TH0,A
; TL0=yin[2*l+1];
; SOURCE LINE # 210
MOV A,l
ADD A,ACC
ADD A,#LOW (yin+01H)
MOV DPL,A
CLR A
ADDC A,#HIGH (yin+01H)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV TL0,A
; SPK = !SPK;
; SOURCE LINE # 211
CPL SPK
;
; }
; SOURCE LINE # 213
POP PSW
POP DPL
POP DPH
POP ACC
RETI
; END OF timer0
;
;
;
;
; void sing_song()
RSEG ?PR?sing_song?IR_YINYUE
sing_song:
USING 0
; SOURCE LINE # 218
; {
; SOURCE LINE # 219
;
; unsigned int data j; //取码指针
; unsigned char data i; //用于循环
; unsigned char data k; //几个1/4拍
; IR_OK=0; //不能少掉!!!!
; SOURCE LINE # 224
CLR IR_OK
; song=songs[song_number];
; SOURCE LINE # 225
MOV A,song_number
ADD A,ACC
ADD A,#LOW (songs)
MOV DPL,A
CLR A
ADDC A,#HIGH (songs)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R6,A
MOV A,#01H
MOVC A,@A+DPTR
MOV R2,AR6
MOV song,#0FFH
MOV song+01H,R2
MOV song+02H,A
; j=0;
; SOURCE LINE # 226
CLR A
MOV j?755,A
MOV j?755+01H,A
?C0074:
; while(*(song+j)!=0xFF) //是否取到结束码
; SOURCE LINE # 227
MOV R3,song
MOV R2,song+01H
MOV R1,song+02H
MOV DPL,j?755+01H
MOV DPH,j?755
LCALL ?C?CLDOPTR
MOV R7,A
CPL A
JZ ?C0081
; {
; SOURCE LINE # 228
; if(IR_OK==1){break;} //这一句很重要的!!!!!
; SOURCE LINE # 229
JB IR_OK,?C0081
?C0076:
; k=*(song+j)&0x0F; //后4位为多少个1/4拍
; SOURCE LINE # 230
MOV A,R7
ANL A,#0FH
MOV R6,A
;---- Variable 'k?757' assigned to Register 'R6' ----
; l=*(song+j)>>4; //song(song+j)[]中所放的每个字节
; SOURCE LINE # 231
MOV A,R7
SWAP A
ANL A,#0FH
MOV l,A
; //前4位乘2表示为音符频率在数组yin[]中的位置
;
; TH0=yin[2*l]; //置初值
; SOURCE LINE # 234
ADD A,ACC
ADD A,#LOW (yin)
MOV DPL,A
CLR A
ADDC A,#HIGH (yin)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R7,A
MOV TH0,A
; TL0=yin[2*l+1];
; SOURCE LINE # 235
MOV A,l
ADD A,ACC
ADD A,#LOW (yin+01H)
MOV DPL,A
CLR A
ADDC A,#HIGH (yin+01H)
MOV DPH,A
CLR A
MOVC A,@A+DPTR
MOV R5,A
MOV TL0,A
; TR0=1; //起动定时器0
; SOURCE LINE # 236
SETB TR0
; if ((yin[2*l]==0xff)&&(yin[2*l+1]==0xff)) //如果取到的都是休止符,则不输出音频
; SOURCE LINE # 237
MOV A,R7
CJNE A,#0FFH,?C0077
MOV A,R5
CJNE A,#0FFH,?C0077
; {
; SOURCE LINE # 238
; TR0=0;SPK=1;
; SOURCE LINE # 239
CLR TR0
SETB SPK
; }
; SOURCE LINE # 240
?C0077:
; for(i=k;i>0;--i) //节拍K为多少就执行多少个1/4拍
; SOURCE LINE # 241
;---- Variable 'i?756' assigned to Register 'R4' ----
MOV R4,AR6
?C0078:
MOV A,R4
SETB C
SUBB A,#00H
JC ?C0079
; { delay187ms(); }
; SOURCE LINE # 242
LCALL delay187ms
DEC R4
SJMP ?C0078
?C0079:
; TR0=0;
; SOURCE LINE # 243
CLR TR0
; j++;
; SOURCE LINE # 244
INC j?755+01H
MOV A,j?755+01H
JNZ ?C0074
INC j?755
?C0109:
; } //回22222
; SOURCE LINE # 245
SJMP ?C0074
; } //回xxxxxx
; SOURCE LINE # 246
?C0081:
RET
; END OF sing_song
;
;
;
; void main()
RSEG ?PR?main?IR_YINYUE
main:
USING 0
; SOURCE LINE # 250
; {
; SOURCE LINE # 251
; IT0=1; //设中断0为边沿触发方式
; SOURCE LINE # 252
SETB IT0
; TMOD=0x11; //timer0,timer1工作在方式1
; SOURCE LINE # 253
MOV TMOD,#011H
; IE=0x83; //EA=1;ETO=1;EX0=1;
; SOURCE LINE # 254
MOV IE,#083H
; IP=0x01;
; SOURCE LINE # 255
MOV IP,#01H
; /* TMOD=0x01; //timer0工作在方式1
; IE=0x82; //EA=1;ETO=1;
; IT0=1; //外部中断0触发方式控制位,下降沿触发
; EX0=1; //外部中断0(INT0)中断允许位
; EA=1; //总中断
; */
; dm=0;
; SOURCE LINE # 262
CLR A
MOV dm,A
; P2=0xc0;
; SOURCE LINE # 263
MOV P2,#0C0H
; P1=0x00;
; SOURCE LINE # 264
MOV P1,A
?C0082:
;
; while(1)
; SOURCE LINE # 266
; {
; SOURCE LINE # 267
; if(IR_OK==1)
; SOURCE LINE # 268
JNB IR_OK,?C0082
; { if(aa[0]==0x11)
; SOURCE LINE # 269
MOV A,aa
CJNE A,#011H,?C0085
; {song_number=0;sing_song();}
; SOURCE LINE # 270
CLR A
MOV song_number,A
SJMP ?C0121
?C0085:
; else if(aa[0]==0x12)
; SOURCE LINE # 271
MOV A,aa
CJNE A,#012H,?C0087
; {song_number=1;sing_song();}
; SOURCE LINE # 272
MOV song_number,#01H
?C0112:
SJMP ?C0121
?C0087:
; else if(aa[0]==0x13)
; SOURCE LINE # 273
MOV A,aa
CJNE A,#013H,?C0089
; {song_number=2;sing_song();}
; SOURCE LINE # 274
MOV song_number,#02H
?C0113:
SJMP ?C0121
?C0089:
; else if(aa[0]==0x14)
; SOURCE LINE # 275
MOV A,aa
CJNE A,#014H,?C0091
; {song_number=3;sing_song();}
; SOURCE LINE # 276
MOV song_number,#03H
?C0114:
SJMP ?C0121
?C0091:
; else if(aa[0]==0x15)
; SOURCE LINE # 277
MOV A,aa
CJNE A,#015H,?C0093
; {song_number=4;sing_song();}
; SOURCE LINE # 278
MOV song_number,#04H
?C0115:
SJMP ?C0121
?C0093:
; else if(aa[0]==0x16)
; SOURCE LINE # 279
MOV A,aa
CJNE A,#016H,?C0095
; {song_number=5;sing_song();}
; SOURCE LINE # 280
MOV song_number,#05H
?C0116:
SJMP ?C0121
?C0095:
; else if(aa[0]==0x17)
; SOURCE LINE # 281
MOV A,aa
CJNE A,#017H,?C0097
; {song_number=6;sing_song();}
; SOURCE LINE # 282
MOV song_number,#06H
?C0117:
SJMP ?C0121
?C0097:
; else if(aa[0]==0x18)
; SOURCE LINE # 283
MOV A,aa
CJNE A,#018H,?C0099
; {song_number=7;sing_song();}
; SOURCE LINE # 284
MOV song_number,#07H
?C0118:
SJMP ?C0121
?C0099:
; else if(aa[0]==0x19)
; SOURCE LINE # 285
MOV A,aa
CJNE A,#019H,?C0101
; {song_number=8;sing_song();}
; SOURCE LINE # 286
MOV song_number,#08H
?C0119:
SJMP ?C0121
?C0101:
; else if(aa[0]==0x10)
; SOURCE LINE # 287
MOV A,aa
CJNE A,#010H,?C0103
; {song_number=9;sing_song();}
; SOURCE LINE # 288
MOV song_number,#09H
?C0120:
SJMP ?C0121
?C0103:
; else if(aa[0]==0x1a)
; SOURCE LINE # 289
MOV A,aa
CJNE A,#01AH,?C0105
; {song_number=10;sing_song();}
; SOURCE LINE # 290
MOV song_number,#0AH
?C0121:
LCALL sing_song
SJMP ?C0082
?C0105:
; else if(aa[0]==0x1b)
; SOURCE LINE # 291
MOV A,aa
XRL A,#01BH
JNZ ?C0082
; {song_number=11;sing_song();}
; SOURCE LINE # 292
MOV song_number,#0BH
LCALL sing_song
;
; }
; SOURCE LINE # 294
; }
; SOURCE LINE # 295
LJMP ?C0082
; END OF main
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -