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

📄 main.lis

📁 本软件实现了232到CAN的具体转换的代码,对232和CAN都进行了很好的说明,编程环境是IAR
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module main.c
                        .area vector(rom, abs)
                        .org 8
 0008 0C946401          jmp _INT1_17
                        .org 36
 0024 0C940402          jmp _Timer0
                        .org 44
 002C 0C94DC01          jmp _Usart_receive
                        .area data(ram, con, rel)
 0000           _can_boud::
 0000                   .blkb 1
                        .area idata
 0000 07                .byte 7
                        .area data(ram, con, rel)
 0001                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 0001                   .dbsym e can_boud _can_boud c
 0001           _bps::
 0001                   .blkb 2
                        .area idata
 0001 0096              .word 38400
                        .area data(ram, con, rel)
 0003                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 0003                   .dbsym e bps _bps i
 0003           _eflag::
 0003                   .blkb 1
                        .area idata
 0003 00                .byte 0
                        .area data(ram, con, rel)
 0004                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 0004                   .dbsym e eflag _eflag c
 0004           _Tdate::
 0004                   .blkb 1
                        .area idata
 0004 00                .byte 0
                        .area data(ram, con, rel)
 0005                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 0005                   .blkb 9
                        .area idata
 0005 000000000000000000        .byte 0,0,0,0,0,0,0,0,0
                        .area data(ram, con, rel)
 000E                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 000E                   .dbsym e Tdate _Tdate A[10:10]c
 000E           _TID::
 000E                   .blkb 2
                        .area idata
 000E 0000              .byte 0,0
                        .area data(ram, con, rel)
 0010                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 0010                   .dbsym e TID _TID A[2:2]c
 0010           _Rdate::
 0010                   .blkb 1
                        .area idata
 0010 00                .byte 0
                        .area data(ram, con, rel)
 0011                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 0011                   .blkb 7
                        .area idata
 0011 00000000000000    .byte 0,0,0,0,0,0,0
                        .area data(ram, con, rel)
 0018                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 0018                   .dbsym e Rdate _Rdate A[8:8]c
 0018           _usart_number::
 0018                   .blkb 2
                        .area idata
 0018 0000              .word 0
                        .area data(ram, con, rel)
 001A                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 001A                   .dbsym e usart_number _usart_number i
 001A           _DLC::
 001A                   .blkb 1
                        .area idata
 001A 08                .byte 8
                        .area data(ram, con, rel)
 001B                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 001B                   .dbsym e DLC _DLC c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\小制作\can,usb,以太网学习板\232转CAN学习程序\main.c
 0000                   .dbfunc e delay _delay fV
 0000           ;              i -> R20,R21
 0000           ;              k -> R16
                        .even
 0000           _delay::
 0000 0E940000          xcall push_gset1
 0004                   .dbline -1
 0004                   .dbline 39
 0004           ; /*##############################################################################
 0004           ; 功能:CAN与232相互转换
 0004           ; 作者:LHF
 0004           ; 时间:2007-01
 0004           ; 版本:V1.0
 0004           ; ################################################################################
 0004           ; 资源分配:     PORTC.2~5:JTAG
 0004           ; ##############################################################################*/
 0004           ; //##############################################################################
 0004           ; #include <iom16v.h>            //寄存器定义;
 0004           ; #include <macros.h>            //宏定义;
 0004           ; #include "MCP2515.h"                           //2515寄存器定义
 0004           ; #define uchar unsigned char  //数据类型定义
 0004           ; #define uint unsigned int    //数据类型定义
 0004           ; 
 0004           ; #pragma interrupt_handler INT1_17:3 //定义INT1的中断服务程序
 0004           ; #pragma interrupt_handler Timer0:10 //定义定时计数器0的中断服务程序
 0004           ; #pragma interrupt_handler Usart_receive:12 //定义接收中断服务程序
 0004           ; #define fosc 7372800 //晶振7.3728MHZ
 0004           ; uchar can_boud=0x07;//MCP2515在16M晶振情况,can_boud=0x00总线波特率为1M,0x01=500K,0x03=250K,0x07=125K;公式:16M/(16*(1+X))
 0004           ; uint bps=38400;//定义串口波特率
 0004           ; 
 0004           ; uchar eflag=0;//是不是扩展帧,为1则表示接收到的是扩展帧,0表示标准帧
 0004           ; uchar Tdate[10]={0};//存放要发送标准帧的数据,最大10位,前2位是ID号,后8位是数据位
 0004           ; uchar TID[2]={0,0};//存放要发送标准帧的ID号
 0004           ; 
 0004           ; uchar Rdate[8]={0};//存放接收到的数据
 0004           ; uchar RESID[4];//存放接收到的数据帧的ID号,标准帧只用到RESID[0],RESID[1],扩展帧全部用到
 0004           ; 
 0004           ; uchar bytetime;//232与CAN透明转换时,根据不同的波特率确定所要延时的时间,
 0004           ; uint usart_number=0;//计数当前所接收的串行数据的那一组数据流的数据个数,串口传来的数据存放在Tdate中等待用CAN标准帧发送
 0004           ; 
 0004           ; uchar state;//2515状态(包括发送接收中断标志位和各请求发送位),具体见数据手册
 0004           ; uchar DLC=8;//接收到数据的长度
 0004           ; 
 0004           ; //****************************************************************************//
 0004           ; //********************************延时程序************************************//
 0004           ; void delay(uchar k)//
 0004           ; {uint i=0;
 0004                   .dbline 39
 0004 4427              clr R20
 0006 5527              clr R21
 0008 09C0              xjmp L3
 000A           L2:
 000A                   .dbline 40
 000A                   .dbline 40
 000A 4427              clr R20
 000C 5527              clr R21
 000E 02C0              xjmp L8
 0010           L5:
 0010                   .dbline 40
 0010           L6:
 0010                   .dbline 40
 0010 4F5F              subi R20,255  ; offset = 1
 0012 5F4F              sbci R21,255
 0014           L8:
 0014                   .dbline 40
 0014 4034              cpi R20,64
 0016 EFE1              ldi R30,31
 0018 5E07              cpc R21,R30
 001A D0F3              brlo L5
 001C                   .dbline 40
 001C           L3:
 001C                   .dbline 40
 001C           ;  while(k--){for(i=0;i<8000;i++);}
 001C 202E              mov R2,R16
 001E 3324              clr R3
 0020 0150              subi R16,1
 0022 2220              tst R2
 0024 91F7              brne L2
 0026                   .dbline -2
 0026           L1:
 0026 0E940000          xcall pop_gset1
 002A                   .dbline 0 ; func end
 002A 0895              ret
 002C                   .dbsym r i 20 i
 002C                   .dbsym r k 16 c
 002C                   .dbend
 002C                   .dbfunc e Set_CS _Set_CS fV
 002C           ;          level -> R16
                        .even
 002C           _Set_CS::
 002C                   .dbline -1
 002C                   .dbline 44
 002C           ;  }
 002C           ; //##############################################################################
 002C           ; void Set_CS(uchar level)          //
 002C           ; {if(level)    PORTB|=0x10;        //
 002C                   .dbline 44
 002C 0023              tst R16
 002E 11F0              breq L10
 0030                   .dbline 44
 0030 C49A              sbi 0x18,4
 0032 03C0              xjmp L11
 0034           L10:
 0034                   .dbline 45
 0034 88B3              in R24,0x18
 0036 8F7E              andi R24,239
 0038 88BB              out 0x18,R24
 003A           L11:
 003A                   .dbline -2
 003A           L9:
 003A                   .dbline 0 ; func end
 003A 0895              ret
 003C                   .dbsym r level 16 c
 003C                   .dbend
 003C                   .dbfunc e WriteSPI _WriteSPI fV
 003C           ;          clear -> R20
 003C           ;          order -> R20
                        .even
 003C           _WriteSPI::
 003C 0E940000          xcall push_gset1
 0040 402F              mov R20,R16
 0042                   .dbline -1
 0042                   .dbline 51
 0042           ;  else         PORTB&=0xef;        //
 0042           ; }
 0042           ; //##############################################################################
 0042           ; //********************************SPI对2515访问*******************************//
 0042           ; //****************WriteSPI()*******************//
 0042           ; void WriteSPI(uchar order)
 0042           ; {     uchar clear;
 0042                   .dbline 52
 0042           ;       Set_CS(0);  //
 0042 0027              clr R16
 0044 F3DF              xcall _Set_CS
 0046                   .dbline 53
 0046           ;       SPDR=order;                      //2515读指令为0x03
 0046 4FB9              out 0xf,R20
 0048           L13:
 0048                   .dbline 54
 0048           L14:
 0048                   .dbline 54
 0048           ;     while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
 0048 779B              sbis 0xe,7
 004A FECF              rjmp L13
 004C                   .dbline 55
 004C           ;     clear=SPSR;
 004C 4EB1              in R20,0xe
 004E                   .dbline 56
 004E           ;     clear=SPDR;//
 004E 4FB1              in R20,0xf
 0050                   .dbline 57
 0050           ;     Set_CS(1);  //
 0050 01E0              ldi R16,1
 0052 ECDF              xcall _Set_CS
 0054                   .dbline -2
 0054           L12:
 0054 0E940000          xcall pop_gset1
 0058                   .dbline 0 ; func end
 0058 0895              ret
 005A                   .dbsym r clear 20 c
 005A                   .dbsym r order 20 c
 005A                   .dbend
 005A                   .dbfunc e Read_state _Read_state fc
 005A           ;          clear -> R20
 005A           ;          order -> R20
                        .even
 005A           _Read_state::
 005A 0E940000          xcall push_gset1
 005E 402F              mov R20,R16
 0060                   .dbline -1
 0060                   .dbline 62
 0060           ; }
 0060           ; 
 0060           ; //****************Read_state()*******************//
 0060           ; uchar Read_state(uchar order)//读状态命令,order=0xa0,0xa1,
 0060           ; {     uchar clear;
 0060                   .dbline 63
 0060           ;       Set_CS(0);  //
 0060 0027              clr R16
 0062 E4DF              xcall _Set_CS
 0064                   .dbline 64
 0064           ;       SPDR=order;                      //
 0064 4FB9              out 0xf,R20
 0066           L17:
 0066                   .dbline 65
 0066           L18:
 0066                   .dbline 65
 0066           ;     while(!(SPSR&0x80)); //等待SPIF置位,等数据发送完毕
 0066 779B              sbis 0xe,7
 0068 FECF              rjmp L17
 006A                   .dbline 66
 006A           ;     clear=SPSR;
 006A 4EB1              in R20,0xe
 006C                   .dbline 67
 006C           ;     clear=SPDR;//
 006C 4FB1              in R20,0xf
 006E                   .dbline 69
 006E           ;     
 006E           ;       SPDR=0;                 //空数据
 006E 2224              clr R2
 0070 2FB8              out 0xf,R2
 0072           L20:
 0072                   .dbline 70
 0072           L21:
 0072                   .dbline 70
 0072           ;     while(!(SPSR&0x80));//等待SPIF置位,等数据发送完毕
 0072 779B              sbis 0xe,7
 0074 FECF              rjmp L20
 0076                   .dbline 71
 0076           ;     clear=SPSR;
 0076 4EB1              in R20,0xe
 0078                   .dbline 72
 0078           ;     clear=SPDR;                //通过先读SPSR,紧接着访问SPDR来对SPIF清零
 0078 4FB1              in R20,0xf
 007A                   .dbline 74
 007A           ;       
 007A           ;       Set_CS(1);  //
 007A 01E0              ldi R16,1
 007C D7DF              xcall _Set_CS
 007E                   .dbline 75
 007E           ;       return clear;
 007E 042F              mov R16,R20
 0080                   .dbline -2
 0080           L16:
 0080 0E940000          xcall pop_gset1
 0084                   .dbline 0 ; func end
 0084 0895              ret
 0086                   .dbsym r clear 20 c
 0086                   .dbsym r order 20 c
 0086                   .dbend
 0086                   .dbfunc e Read_Byte _Read_Byte fc
 0086           ;           date -> R20
 0086           ;          clear -> R22
 0086           ;        Address -> R10
                        .even
 0086           _Read_Byte::
 0086 0E940000          xcall push_gset3
 008A A02E              mov R10,R16
 008C                   .dbline -1
 008C                   .dbline 79
 008C           ; }
 008C           ; //**从2515指定地址Address读取一个字节数据Data**//
 008C           ; uchar Read_Byte(uchar Address)
 008C           ; {uchar clear;
 008C                   .dbline 81
 008C           ;  uchar date;
 008C           ;  Set_CS(0);            //使能SPI器件
 008C 0027              clr R16
 008E CEDF              xcall _Set_CS
 0090                   .dbline 83
 0090           ;  
 0090           ;  SPDR=0x03;                    //送2515读指令为0x03
 0090 83E0              ldi R24,3
 0092 8FB9              out 0xf,R24
 0094           L24:
 0094                   .dbline 84

⌨️ 快捷键说明

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