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

📄 51pro.lis

📁 笔者的《用M8L制作的89S51单片机 USB下载线》在无线电2007年第9期已刊登过
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module _51pro.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\学习专区\AVR专区\个人创作区\ICC\51pro.c
 0000                   .dbfunc e Delay_us _Delay_us fV
 0000           ;              a -> R20
 0000           ;              b -> R22
 0000           ;             us -> R16
                        .even
 0000           _Delay_us::
 0000 00D0              rcall push_gset2
 0002                   .dbline -1
 0002                   .dbline 16
 0002           ; //////////////////////////////////////////////////////////////////////////////////////////////////
 0002           ; //E51Pro.c
 0002           ; //Easy 51Pro编程器主程序,负责通讯,管理编程操作
 0002           ; ///////////////////////////////////////////////////////////////////////////////////////////////////
 0002           ; 
 0002           ; #include <iom8v.h>
 0002           ; #include <macros.h>
 0002           ; #include <e51pro.h>
 0002           ; #include <signal.h>
 0002           ; #define uchar unsigned char 
 0002           ; //BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用
 0002           ; UINT nAddress;//ROM中地址计数
 0002           ; UINT nTimeOut;//超时计数
 0002           ; ProWork pw;//编程器一般操作
 0002           ; void Delay_us(BYTE  us)//微秒级延时<255us
 0002           ; {
 0002                   .dbline 17
 0002           ; char a=0;
 0002 4427              clr R20
 0004                   .dbline 18
 0004           ; char b=0;
 0004 6627              clr R22
 0006                   .dbline 19
 0006           ; for (a=0;a<7;a++)
 0006 06C0              rjmp L5
 0008           L2:
 0008                   .dbline 20
 0008           ; for (b=0;b<us;b++)
 0008 6627              clr R22
 000A 01C0              rjmp L9
 000C           L6:
 000C                   .dbline 21
 000C           L7:
 000C                   .dbline 20
 000C 6395              inc R22
 000E           L9:
 000E                   .dbline 20
 000E 6017              cp R22,R16
 0010 E8F3              brlo L6
 0012           L3:
 0012                   .dbline 19
 0012 4395              inc R20
 0014           L5:
 0014                   .dbline 19
 0014 4730              cpi R20,7
 0016 C0F3              brlo L2
 0018                   .dbline -2
 0018           L1:
 0018 00D0              rcall pop_gset2
 001A                   .dbline 0 ; func end
 001A 0895              ret
 001C                   .dbsym r a 20 c
 001C                   .dbsym r b 22 c
 001C                   .dbsym r us 16 c
 001C                   .dbend
 001C                   .dbfunc e Delay_ms _Delay_ms fV
 001C           ;              a -> R20,R21
 001C           ;              b -> R22,R23
 001C           ;             ms -> R16,R17
                        .even
 001C           _Delay_ms::
 001C 00D0              rcall push_gset2
 001E                   .dbline -1
 001E                   .dbline 24
 001E           ; ;
 001E           ; }
 001E           ; void Delay_ms(UINT ms)//豪秒级的延时<65535ms
 001E           ; {
 001E                   .dbline 25
 001E           ; int a=0;
 001E 4427              clr R20
 0020 5527              clr R21
 0022                   .dbline 26
 0022           ; int b=0;
 0022 6627              clr R22
 0024 7727              clr R23
 0026                   .dbline 27
 0026           ; for (a=0;a<4000;a++)
 0026           L11:
 0026                   .dbline 28
 0026           ; for (b=0;b<ms;b++)
 0026 6627              clr R22
 0028 7727              clr R23
 002A 02C0              rjmp L18
 002C           L15:
 002C                   .dbline 29
 002C           L16:
 002C                   .dbline 28
 002C 6F5F              subi R22,255  ; offset = 1
 002E 7F4F              sbci R23,255
 0030           L18:
 0030                   .dbline 28
 0030 6017              cp R22,R16
 0032 7107              cpc R23,R17
 0034 D8F3              brlo L15
 0036           L12:
 0036                   .dbline 27
 0036 4F5F              subi R20,255  ; offset = 1
 0038 5F4F              sbci R21,255
 003A                   .dbline 27
 003A 403A              cpi R20,160
 003C EFE0              ldi R30,15
 003E 5E07              cpc R21,R30
 0040 94F3              brlt L11
 0042                   .dbline -2
 0042           L10:
 0042 00D0              rcall pop_gset2
 0044                   .dbline 0 ; func end
 0044 0895              ret
 0046                   .dbsym r a 20 I
 0046                   .dbsym r b 22 I
 0046                   .dbsym r ms 16 i
 0046                   .dbend
 0046                   .dbfunc e uart_init _uart_init fV
                        .even
 0046           _uart_init::
 0046                   .dbline -1
 0046                   .dbline 34
 0046           ; ;
 0046           ; }
 0046           ; 
 0046           ; 
 0046           ; void uart_init(void)  //串口通信
 0046           ; {
 0046                   .dbline 35
 0046           ; UCSRB|=(TXEN)|(1<<RXEN);
 0046 8AB1              in R24,0xa
 0048 8361              ori R24,19
 004A 8AB9              out 0xa,R24
 004C                   .dbline 36
 004C           ; UBRRL=7;  //设置波特率  57600
 004C 87E0              ldi R24,7
 004E 89B9              out 0x9,R24
 0050                   .dbline 37
 0050           ; UBRRH=0x00;
 0050 2224              clr R2
 0052 20BC              out 0x20,R2
 0054                   .dbline 38
 0054           ; UCSRC|=(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
 0054 80B5              in R24,0x20
 0056 8668              ori R24,134
 0058 80BD              out 0x20,R24
 005A                   .dbline -2
 005A           L19:
 005A                   .dbline 0 ; func end
 005A 0895              ret
 005C                   .dbend
 005C                   .dbfunc e uart_putchar _uart_putchar fV
 005C           ;              x -> R16
                        .even
 005C           _uart_putchar::
 005C                   .dbline -1
 005C                   .dbline 41
 005C           ; }
 005C           ; void uart_putchar(char x)//发送数据
 005C           ; {
 005C           L21:
 005C                   .dbline 43
 005C           L22:
 005C                   .dbline 42
 005C           ; while (!(UCSRA&0x20))
 005C 5D9B              sbis 0xb,5
 005E FECF              rjmp L21
 0060                   .dbline 44
 0060           ; ;
 0060           ; UDR=x; 
 0060 0CB9              out 0xc,R16
 0062                   .dbline -2
 0062           L20:
 0062                   .dbline 0 ; func end
 0062 0895              ret
 0064                   .dbsym r x 16 c
 0064                   .dbend
 0064                   .dbfunc e WaitComm _WaitComm fc
 0064           ;              n -> R16
                        .even
 0064           _WaitComm::
 0064                   .dbline -1
 0064                   .dbline 48
 0064           ; }
 0064           ; 
 0064           ; BOOL WaitComm()//等待上位机的命令,18字节
 0064           ; {
 0064                   .dbline 49
 0064           ;       BYTE n=0;
 0064 0027              clr R16
 0066           L25:
 0066                   .dbline 50
 0066                   .dbline 50
 0066           L26:
 0066                   .dbline 50
 0066           ;       while(!(UCSRA&0x80)){}//等待第一个字节
 0066 5F9B              sbis 0xb,7
 0068 FECF              rjmp L25
 006A                   .dbline 51
 006A           ;       ComBuf[n]=UDR;
 006A 80E0              ldi R24,<_ComBuf
 006C 90E0              ldi R25,>_ComBuf
 006E E02F              mov R30,R16
 0070 FF27              clr R31
 0072 E80F              add R30,R24
 0074 F91F              adc R31,R25
 0076 2CB0              in R2,0xc
 0078 2082              std z+0,R2
 007A                   .dbline 52
 007A           ;       n++;
 007A 0395              inc R16
 007C                   .dbline 53
 007C           ;       for(n;n<=17;n++)
 007C 26C0              rjmp L31
 007E           L28:
 007E                   .dbline 54
 007E           ;       {
 007E                   .dbline 55
 007E           ;               nTimeOut=0;
 007E 2224              clr R2
 0080 3324              clr R3
 0082 30920F00          sts _nTimeOut+1,R3
 0086 20920E00          sts _nTimeOut,R2
 008A 14C0              rjmp L33
 008C           L32:
 008C                   .dbline 57
 008C           ;               while(!(UCSRA&0x80))
 008C           ;               {
 008C                   .dbline 58
 008C           ;                       nTimeOut++;
 008C 80910E00          lds R24,_nTimeOut
 0090 90910F00          lds R25,_nTimeOut+1
 0094 0196              adiw R24,1
 0096 90930F00          sts _nTimeOut+1,R25
 009A 80930E00          sts _nTimeOut,R24
 009E                   .dbline 59
 009E           ;                       if(nTimeOut>10000)//后17个字节都有超时限制 
 009E 80E1              ldi R24,10000
 00A0 97E2              ldi R25,39
 00A2 20900E00          lds R2,_nTimeOut
 00A6 30900F00          lds R3,_nTimeOut+1
 00AA 8215              cp R24,R2
 00AC 9305              cpc R25,R3
 00AE 10F4              brsh L35
 00B0                   .dbline 60
 00B0           ;                               return 0;
 00B0 0027              clr R16
 00B2 0FC0              rjmp L24
 00B4           L35:
 00B4                   .dbline 61
 00B4           L33:
 00B4                   .dbline 56
 00B4 5F9B              sbis 0xb,7
 00B6 EACF              rjmp L32
 00B8                   .dbline 62
 00B8 80E0              ldi R24,<_ComBuf
 00BA 90E0              ldi R25,>_ComBuf
 00BC E02F              mov R30,R16
 00BE FF27              clr R31
 00C0 E80F              add R30,R24
 00C2 F91F              adc R31,R25
 00C4 2CB0              in R2,0xc
 00C6 2082              std z+0,R2
 00C8                   .dbline 64
 00C8           L29:
 00C8                   .dbline 53
 00C8 0395              inc R16
 00CA           L31:
 00CA                   .dbline 53
 00CA 81E1              ldi R24,17
 00CC 8017              cp R24,R16
 00CE B8F6              brsh L28
 00D0                   .dbline 65
 00D0           ;               }
 00D0           ;               ComBuf[n]=UDR;
 00D0           ;       
 00D0           ;       }
 00D0           ;       return 1;
 00D0 01E0              ldi R16,1
 00D2                   .dbline -2
 00D2           L24:
 00D2                   .dbline 0 ; func end
 00D2 0895              ret
 00D4                   .dbsym r n 16 c
 00D4                   .dbend
 00D4                   .dbfunc e WaitResp _WaitResp fc
                        .even
 00D4           _WaitResp::
 00D4                   .dbline -1
 00D4                   .dbline 68
 00D4           ; }
 00D4           ; BOOL WaitResp()//等待上位机回应,1字节,有超时限制 
 00D4           ; {
 00D4                   .dbline 69
 00D4           ;       nTimeOut=0;
 00D4 2224              clr R2
 00D6 3324              clr R3
 00D8 30920F00          sts _nTimeOut+1,R3
 00DC 20920E00          sts _nTimeOut,R2
 00E0 14C0              rjmp L39
 00E2           L38:
 00E2                   .dbline 71
 00E2           ;       while(!(UCSRA&0x80))
 00E2           ;       {
 00E2                   .dbline 72
 00E2           ;               nTimeOut++;
 00E2 80910E00          lds R24,_nTimeOut
 00E6 90910F00          lds R25,_nTimeOut+1
 00EA 0196              adiw R24,1
 00EC 90930F00          sts _nTimeOut+1,R25
 00F0 80930E00          sts _nTimeOut,R24
 00F4                   .dbline 73
 00F4           ;               if(nTimeOut>50000) 
 00F4 80E5              ldi R24,50000
 00F6 93EC              ldi R25,195
 00F8 20900E00          lds R2,_nTimeOut
 00FC 30900F00          lds R3,_nTimeOut+1
 0100 8215              cp R24,R2
 0102 9305              cpc R25,R3
 0104 10F4              brsh L41
 0106                   .dbline 74
 0106           ;               {
 0106                   .dbline 75
 0106           ;                       return 0;
 0106 0027              clr R16
 0108 06C0              rjmp L37
 010A           L41:
 010A                   .dbline 77
 010A           L39:
 010A                   .dbline 70
 010A 5F9B              sbis 0xb,7
 010C EACF              rjmp L38
 010E                   .dbline 79
 010E           ;               }
 010E           ;       }
 010E           ;       
 010E           ;       ComBuf[0]=UDR;
 010E 2CB0              in R2,0xc
 0110 20920000          sts _ComBuf,R2
 0114                   .dbline 80
 0114           ;       return 1;
 0114 01E0              ldi R16,1
 0116                   .dbline -2
 0116           L37:
 0116                   .dbline 0 ; func end
 0116 0895              ret
 0118                   .dbend
 0118                   .dbfunc e WaitData _WaitData fc
 0118           ;              n -> R16
                        .even
 0118           _WaitData::
 0118                   .dbline -1
 0118                   .dbline 84
 0118           ; }
 0118           ; 
 0118           ; BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制 
 0118           ; {
 0118                   .dbline 86
 0118           ;       BYTE n;
 0118           ;       for(n=0;n<=17;n++)
 0118 0027              clr R16
 011A 26C0              rjmp L47
 011C           L44:
 011C                   .dbline 87
 011C           ;       {
 011C                   .dbline 88
 011C           ;               nTimeOut=0;
 011C 2224              clr R2
 011E 3324              clr R3
 0120 30920F00          sts _nTimeOut+1,R3
 0124 20920E00          sts _nTimeOut,R2
 0128 14C0              rjmp L49
 012A           L48:
 012A                   .dbline 90
 012A           ;               while(!(UCSRA&0x80))
 012A           ;               {
 012A                   .dbline 91

⌨️ 快捷键说明

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