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

📄 s51.lis

📁 笔者的《用M8L制作的89S51单片机 USB下载线》在无线电2007年第9期已刊登过
💻 LIS
📖 第 1 页 / 共 2 页
字号:
                        .module s51.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\学习专区\AVR专区\个人创作区\ICC\s51.c
 0000                   .dbfunc e SendInstrc _SendInstrc fV
 0000           ;              n -> R20
 0000           ;          nByte -> R16
                        .even
 0000           _SendInstrc::
 0000 00D0              rcall push_gset1
 0002                   .dbline -1
 0002                   .dbline 13
 0002           ; ///////////////////////////////////////////////////////////////////////////////////////////////////
 0002           ; //FID=02:AT89S51系列编程器 
 0002           ; //实现编程的读,写,擦等细节
 0002           ; ///////////////////////////////////////////////////////////////////////////////////////////////////
 0002           ; #include <iom8v.h>
 0002           ; #include <macros.h>
 0002           ; #include<signal.h>
 0002           ; #include<e51pro.h>
 0002           ; #define uchar unsigned char 
 0002           ; BYTE OutBuf[4];//发送命令缓冲
 0002           ; BYTE InBuf[4];//接收缓冲
 0002           ; void SendInstrc(uchar nByte)//用MOSI串行发送命令的同时用MISO接收相关数据
 0002           ; {
 0002                   .dbline 14
 0002           ; uchar n=0;
 0002 4427              clr R20
 0004                   .dbline 15
 0004           ; DDRB=(1<<PB5)|(1<<PB3)|(1<<PB2);
 0004 8CE2              ldi R24,44
 0006 87BB              out 0x17,R24
 0008                   .dbline 16
 0008           ; SPCR=(1<<SPE)|(1<<MSTR)|(1<<SPR0);//SCK时钟为fosc/16
 0008 81E5              ldi R24,81
 000A 8DB9              out 0xd,R24
 000C                   .dbline 17
 000C           ; for (n=0;n<nByte;n++)
 000C 13C0              rjmp L5
 000E           L2:
 000E                   .dbline 18
 000E           ; {
 000E                   .dbline 19
 000E           ; SPDR=OutBuf[n];
 000E 80E0              ldi R24,<_OutBuf
 0010 90E0              ldi R25,>_OutBuf
 0012 E42F              mov R30,R20
 0014 FF27              clr R31
 0016 E80F              add R30,R24
 0018 F91F              adc R31,R25
 001A 2080              ldd R2,z+0
 001C 2FB8              out 0xf,R2
 001E           L6:
 001E                   .dbline 21
 001E           L7:
 001E                   .dbline 20
 001E 779B              sbis 0xe,7
 0020 FECF              rjmp L6
 0022                   .dbline 22
 0022 80E0              ldi R24,<_InBuf
 0024 90E0              ldi R25,>_InBuf
 0026 E42F              mov R30,R20
 0028 FF27              clr R31
 002A E80F              add R30,R24
 002C F91F              adc R31,R25
 002E 2FB0              in R2,0xf
 0030 2082              std z+0,R2
 0032                   .dbline 23
 0032           L3:
 0032                   .dbline 17
 0032 4395              inc R20
 0034           L5:
 0034                   .dbline 17
 0034 4017              cp R20,R16
 0036 58F3              brlo L2
 0038                   .dbline -2
 0038           L1:
 0038 00D0              rcall pop_gset1
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbsym r n 20 c
 003C                   .dbsym r nByte 16 c
 003C                   .dbend
 003C                   .dbfunc e InitPro02 _InitPro02 fV
                        .even
 003C           _InitPro02::
 003C                   .dbline -1
 003C                   .dbline 26
 003C           ; while (!(SPSR&(1<<SPIF)))
 003C           ; ;
 003C           ; InBuf[n]=SPDR;
 003C           ; }
 003C           ; }
 003C           ; void InitPro02()//编程前的准备工作
 003C           ; {
 003C                   .dbline 27
 003C           ; DDRB=0xff;
 003C 8FEF              ldi R24,255
 003E 87BB              out 0x17,R24
 0040                   .dbline 28
 0040           ; PORTB&=~BIT(PB2);
 0040 C298              cbi 0x18,2
 0042                   .dbline 29
 0042           ; Delay_ms(10);
 0042 0AE0              ldi R16,10
 0044 10E0              ldi R17,0
 0046 00D0              rcall _Delay_ms
 0048                   .dbline 30
 0048           ; PORTB|=BIT(PB2);
 0048 C29A              sbi 0x18,2
 004A                   .dbline 31
 004A           ; PORTC|=BIT(PB1);
 004A A99A              sbi 0x15,1
 004C                   .dbline 32
 004C           ; PORTC&=~BIT(PB0);
 004C A898              cbi 0x15,0
 004E                   .dbline 33
 004E           ; Delay_ms(10);
 004E 0AE0              ldi R16,10
 0050 10E0              ldi R17,0
 0052 00D0              rcall _Delay_ms
 0054                   .dbline 34
 0054           ; nAddress=0x0000;
 0054 2224              clr R2
 0056 3324              clr R3
 0058 30920100          sts _nAddress+1,R3
 005C 20920000          sts _nAddress,R2
 0060                   .dbline 35
 0060           ; OutBuf[0]=0xac;//正好在这里可以安排DataSheet上所规定的
 0060 8CEA              ldi R24,172
 0062 80930400          sts _OutBuf,R24
 0066                   .dbline 36
 0066           ; OutBuf[1]=0x53;//Eanable Programming命令
 0066 83E5              ldi R24,83
 0068 80930500          sts _OutBuf+1,R24
 006C                   .dbline 37
 006C           ; OutBuf[2]=0;
 006C 20920600          sts _OutBuf+2,R2
 0070                   .dbline 38
 0070           ; OutBuf[3]=0;
 0070 20920700          sts _OutBuf+3,R2
 0074                   .dbline 39
 0074           ; SendInstrc(4);
 0074 04E0              ldi R16,4
 0076 C4DF              rcall _SendInstrc
 0078                   .dbline -2
 0078           L9:
 0078                   .dbline 0 ; func end
 0078 0895              ret
 007A                   .dbend
 007A                   .dbfunc e ProOver02 _ProOver02 fV
                        .even
 007A           _ProOver02::
 007A                   .dbline -1
 007A                   .dbline 43
 007A           ; }
 007A           ; 
 007A           ; void ProOver02()//编程结束后的工作,设置合适的引脚电平
 007A           ; {
 007A                   .dbline 44
 007A           ; PORTC|=BIT(PB0);
 007A A89A              sbi 0x15,0
 007C                   .dbline 45
 007C           ; PORTC&=~BIT(PB1);
 007C A998              cbi 0x15,1
 007E                   .dbline 46
 007E           ; DDRB=0x00;
 007E 2224              clr R2
 0080 27BA              out 0x17,R2
 0082                   .dbline -2
 0082           L13:
 0082                   .dbline 0 ; func end
 0082 0895              ret
 0084                   .dbend
 0084                   .dbfunc e Read02 _Read02 fc
                        .even
 0084           _Read02::
 0084                   .dbline -1
 0084                   .dbline 50
 0084           ; }
 0084           ; uchar ComBuf[18];
 0084           ; uchar Read02()
 0084           ; {
 0084                   .dbline 51
 0084           ; OutBuf[0]=0x20;
 0084 80E2              ldi R24,32
 0086 80930400          sts _OutBuf,R24
 008A                   .dbline 52
 008A           ; OutBuf[1]=((uchar*)&nAddress)[1];
 008A 20900100          lds R2,_nAddress+1
 008E 20920500          sts _OutBuf+1,R2
 0092                   .dbline 53
 0092           ; OutBuf[2]=((uchar*)&nAddress)[0];
 0092 E0E0              ldi R30,<_nAddress
 0094 F0E0              ldi R31,>_nAddress
 0096 2080              ldd R2,z+0
 0098 20920600          sts _OutBuf+2,R2
 009C                   .dbline 54
 009C           ; SendInstrc(4);
 009C 04E0              ldi R16,4
 009E B0DF              rcall _SendInstrc
 00A0                   .dbline 55
 00A0           ; return InBuf[3];
 00A0 00910300          lds R16,_InBuf+3
 00A4                   .dbline -2
 00A4           L14:
 00A4                   .dbline 0 ; func end
 00A4 0895              ret
 00A6                   .dbend
 00A6                   .dbfunc e ReadSign02 _ReadSign02 fV
                        .even
 00A6           _ReadSign02::
 00A6                   .dbline -1
 00A6                   .dbline 59
 00A6           ; }
 00A6           ; 
 00A6           ; void ReadSign02()//读特征字
 00A6           ; {
 00A6                   .dbline 60
 00A6           ;       InitPro02();//先设置成编程状态
 00A6 CADF              rcall _InitPro02
 00A8                   .dbline 63
 00A8           ; //-----------------------------------------------------------------------------
 00A8           ;       //根据器件的DataSheet,设置相应的编程控制信号
 00A8           ;       OutBuf[0]=0x28;
 00A8 88E2              ldi R24,40
 00AA 80930400          sts _OutBuf,R24
 00AE                   .dbline 64
 00AE           ;       OutBuf[1]=0x00;
 00AE 2224              clr R2
 00B0 20920500          sts _OutBuf+1,R2
 00B4                   .dbline 65
 00B4           ;       OutBuf[2]=0x00;
 00B4 20920600          sts _OutBuf+2,R2
 00B8                   .dbline 66
 00B8           ;       OutBuf[3]=0x00;
 00B8 20920700          sts _OutBuf+3,R2
 00BC                   .dbline 67
 00BC           ;       SendInstrc(4);
 00BC 04E0              ldi R16,4
 00BE A0DF              rcall _SendInstrc
 00C0                   .dbline 68
 00C0           ;       ComBuf[2]=InBuf[3];
 00C0 20900300          lds R2,_InBuf+3
 00C4 20920A00          sts _ComBuf+2,R2
 00C8                   .dbline 69
 00C8           ;       OutBuf[1]=0x01;
 00C8 81E0              ldi R24,1
 00CA 80930500          sts _OutBuf+1,R24
 00CE                   .dbline 70
 00CE           ;       SendInstrc(4);
 00CE 04E0              ldi R16,4
 00D0 97DF              rcall _SendInstrc
 00D2                   .dbline 71
 00D2           ;       ComBuf[3]=InBuf[3];
 00D2 20900300          lds R2,_InBuf+3
 00D6 20920B00          sts _ComBuf+3,R2
 00DA                   .dbline 72
 00DA           ;       OutBuf[1]=0x02;
 00DA 82E0              ldi R24,2
 00DC 80930500          sts _OutBuf+1,R24
 00E0                   .dbline 73
 00E0           ;       SendInstrc(4);
 00E0 04E0              ldi R16,4
 00E2 8EDF              rcall _SendInstrc
 00E4                   .dbline 74
 00E4           ;       ComBuf[4]=InBuf[3];
 00E4 20900300          lds R2,_InBuf+3
 00E8 20920C00          sts _ComBuf+4,R2
 00EC                   .dbline 76
 00EC           ; //-----------------------------------------------------------------------------
 00EC           ;       ProOver02();
 00EC C6DF              rcall _ProOver02
 00EE                   .dbline -2
 00EE           L19:
 00EE                   .dbline 0 ; func end
 00EE 0895              ret
 00F0                   .dbend
 00F0                   .dbfunc e Erase02 _Erase02 fV
                        .even
 00F0           _Erase02::
 00F0                   .dbline -1
 00F0                   .dbline 80
 00F0           ; }
 00F0           ; 
 00F0           ; void Erase02()//擦除器件
 00F0           ; {
 00F0                   .dbline 81
 00F0           ;       InitPro02();
 00F0 A5DF              rcall _InitPro02
 00F2                   .dbline 84
 00F2           ; //-----------------------------------------------------------------------------
 00F2           ;       //根据器件的DataSheet,设置相应的编程控制信号
 00F2           ;       OutBuf[0]=0xac;
 00F2 8CEA              ldi R24,172
 00F4 80930400          sts _OutBuf,R24
 00F8                   .dbline 85

⌨️ 快捷键说明

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