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

📄 send_485.lis

📁 基于ATmega8开发的关于医疗康复的机器人
💻 LIS
📖 第 1 页 / 共 3 页
字号:
                        .module Send_485.c
                        .area text(rom, con, rel)
 0000                   .dbfile F:\Work\Data\程序\修订版~1.1\Send_485.c
 0000                   .dbfunc e RS485_init _RS485_init fV
                        .even
 0000           _RS485_init::
 0000                   .dbline -1
 0000                   .dbline 15
 0000           ; /*****************************************************
 0000           ; * File name      : Send_485.C
 0000           ; * Description    : Header file of  main_H.H
 0000           ; * Platform       : ICCAVR 
 0000           ; * Author         : xiao xue      
 0000           ; * Email          : ay1509@yahoo.com
 0000           ; * Date           : 2008-03-13
 0000           ; * Description    :485 Communications
 0000           ; /********************头文件*************************/
 0000           ; #include"main_H.h"
 0000           ; #define fosc 8000000
 0000           ; #define baud 9600
 0000           ; /***************************485初始化***************************/
 0000           ; void RS485_init(void)  
 0000           ;  {
 0000                   .dbline 16
 0000           ;     UCSRB=(1<<RXCIE)|(1<<RXEN)|(1<<TXEN);     //接收完成中断使能
 0000 88E9              ldi R24,152
 0002 8AB9              out 0xa,R24
 0004                   .dbline 18
 0004           ;                                                                                       //充许发送、充许接收 
 0004           ;     UBRRL=(fosc/16/(baud+1))%256;                     //波特率为9600
 0004 84E3              ldi R24,52
 0006 89B9              out 0x9,R24
 0008                   .dbline 19
 0008           ;     UBRRH=(fosc/16/(baud+1))/256;
 0008 2224              clr R2
 000A 20BC              out 0x20,R2
 000C                   .dbline 20
 000C           ;     UCSRC=(1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);   
 000C 86E8              ldi R24,134
 000E 80BD              out 0x20,R24
 0010                   .dbline 21
 0010           ;     PORTD&=~0x04;                                                     //允许接收数据
 0010 9298              cbi 0x12,2
 0012                   .dbline 22
 0012           ;     DDRD|=0x04;                                                       //数据方向
 0012 8A9A              sbi 0x11,2
 0014                   .dbline -2
 0014           L1:
 0014                   .dbline 0 ; func end
 0014 0895              ret
 0016                   .dbend
 0016                   .dbfunc e RS485_out_byte _RS485_out_byte fV
 0016           ;           data -> R16
                        .even
 0016           _RS485_out_byte::
 0016                   .dbline -1
 0016                   .dbline 26
 0016           ; } 
 0016           ; /******************485发送一个字节子程序************************/   
 0016           ; void  RS485_out_byte(uchar data )  
 0016           ; {
 0016           L3:
 0016                   .dbline 28
 0016           ; 
 0016           ;   while(!(UCSRA & (1<<UDRE)) );                               //等待数据寄存器不为空
 0016           L4:
 0016                   .dbline 28
 0016 5D9B              sbis 0xb,5
 0018 FECF              rjmp L3
 001A           X0:
 001A                   .dbline 29
 001A           ;      UDR=data;
 001A 0CB9              out 0xc,R16
 001C           L6:
 001C                   .dbline 30
 001C           ;   while(!(UCSRA & (BIT(TXC))));                       //等待USART发送完成
 001C           L7:
 001C                   .dbline 30
 001C 5E9B              sbis 0xb,6
 001E FECF              rjmp L6
 0020           X1:
 0020                   .dbline 31
 0020           ;      UCSRA|=BIT(TXC);                  
 0020 5E9A              sbi 0xb,6
 0022                   .dbline -2
 0022           L2:
 0022                   .dbline 0 ; func end
 0022 0895              ret
 0024                   .dbsym r data 16 c
 0024                   .dbend
 0024                   .dbfunc e RS485_out_6byte _RS485_out_6byte fV
 0024           ;              i -> R20,R21
 0024           ;          datas -> R10,R11
                        .even
 0024           _RS485_out_6byte::
 0024 00D0              rcall push_xgset300C
 0026 5801              movw R10,R16
 0028                   .dbline -1
 0028                   .dbline 37
 0028           ; }
 0028           ; 
 0028           ; /**************************一次发送6个字节*********************/
 0028           ; 
 0028           ; void  RS485_out_6byte(uchar *datas )  
 0028           ; {  
 0028                   .dbline 38
 0028           ;       uint i=0;
 0028 4427              clr R20
 002A 5527              clr R21
 002C                   .dbline 39
 002C           ;       CLI();                                                  //关中断
 002C F894              cli
 002E                   .dbline 40
 002E           ;       PORTD|=0x04;                                    //允许发送
 002E 929A              sbi 0x12,2
 0030 07C0              rjmp L11
 0032           L10:
 0032                   .dbline 41
 0032           ;       while(i<6 ){
 0032                   .dbline 42
 0032           ;               RS485_out_byte(*(datas+i));     //发送1个字节
 0032 FA01              movw R30,R20
 0034 EA0D              add R30,R10
 0036 FB1D              adc R31,R11
 0038 0081              ldd R16,z+0
 003A EDDF              rcall _RS485_out_byte
 003C                   .dbline 43
 003C           ;               i++;
 003C 4F5F              subi R20,255  ; offset = 1
 003E 5F4F              sbci R21,255
 0040                   .dbline 44
 0040           ;       } 
 0040           L11:
 0040                   .dbline 41
 0040 4630              cpi R20,6
 0042 E0E0              ldi R30,0
 0044 5E07              cpc R21,R30
 0046 A8F3              brlo L10
 0048           X2:
 0048                   .dbline 45
 0048           ;       delay_nms(5);                                   //延时
 0048 05E0              ldi R16,5
 004A 10E0              ldi R17,0
 004C 00D0              rcall _delay_nms
 004E                   .dbline 46
 004E           ;       PORTD&=~0x04;                                   //允许接收
 004E 9298              cbi 0x12,2
 0050                   .dbline 47
 0050           ;       SEI();
 0050 7894              sei
 0052                   .dbline -2
 0052           L9:
 0052                   .dbline 0 ; func end
 0052 00C0              rjmp pop_xgset300C
 0054                   .dbsym r i 20 i
 0054                   .dbsym r datas 10 pc
 0054                   .dbend
 0054                   .dbfunc e Send_485 _Send_485 fV
                        .even
 0054           _Send_485::
 0054                   .dbline -1
 0054                   .dbline 51
 0054           ; } 
 0054           ; /**************************485发送数据函数*****************/
 0054           ; void Send_485(void)
 0054           ; {     
 0054                   .dbline 52
 0054           ;       RS485_out_6byte(moto1);                 //给节点1发送数据
 0054 00E0              ldi R16,<_moto1
 0056 10E0              ldi R17,>_moto1
 0058 E5DF              rcall _RS485_out_6byte
 005A                   .dbline 53
 005A           ;       RS485_out_6byte(moto2);                 //给节点2发送数据
 005A 00E0              ldi R16,<_moto2
 005C 10E0              ldi R17,>_moto2
 005E E2DF              rcall _RS485_out_6byte
 0060                   .dbline 54
 0060           ;     RS485_out_6byte(moto3);
 0060 00E0              ldi R16,<_moto3
 0062 10E0              ldi R17,>_moto3
 0064 DFDF              rcall _RS485_out_6byte
 0066                   .dbline 55
 0066           ;       RS485_out_6byte(moto4);
 0066 00E0              ldi R16,<_moto4
 0068 10E0              ldi R17,>_moto4
 006A DCDF              rcall _RS485_out_6byte
 006C                   .dbline -2
 006C           L13:
 006C                   .dbline 0 ; func end
 006C 0895              ret
 006E                   .dbend
                        .area vector(rom, abs)
                        .org 22
 0016 37C0              rjmp _RS485_ISR
                        .area text(rom, con, rel)
 006E                   .dbfile F:\Work\Data\程序\修订版~1.1\Send_485.c
 006E                   .dbfunc e RS485_ISR _RS485_ISR fV
                        .even
 006E           _RS485_ISR::
 006E 2A92              st -y,R2
 0070 8A93              st -y,R24
 0072 9A93              st -y,R25
 0074 EA93              st -y,R30
 0076 FA93              st -y,R31
 0078 2FB6              in R2,0x3f
 007A 2A92              st -y,R2
 007C                   .dbline -1
 007C                   .dbline 60
 007C           ; }
 007C           ; /***************************中断接收服务子程序*******************/
 007C           ; #pragma interrupt_handler RS485_ISR:iv_USART_RX
 007C           ; void RS485_ISR(void)
 007C           ;  {
 007C                   .dbline 61
 007C           ;  CLI();                                                       //关中断
 007C F894              cli
 007E                   .dbline 62
 007E           ;  PORTD&=~0x04;                                                //允许接收
 007E 9298              cbi 0x12,2
 0080                   .dbline 63
 0080           ;  getchar[RS_i]=UDR;                           //存储数据寄存器的值
 0080 80E0              ldi R24,<_getchar
 0082 90E0              ldi R25,>_getchar
 0084 E0910000          lds R30,_RS_i
 0088 FF27              clr R31
 008A E80F              add R30,R24
 008C F91F              adc R31,R25
 008E 2CB0              in R2,0xc
 0090 2082              std z+0,R2
 0092                   .dbline 64
 0092           ;  RS_i++;                                                      //预备存储下一个
 0092 80910000          lds R24,_RS_i
 0096 8F5F              subi R24,255    ; addi 1
 0098 80930000          sts _RS_i,R24
 009C                   .dbline 65
 009C           ;  if(RS_i==6)                                          //接收6个后清零
 009C 8630              cpi R24,6
 009E 31F4              brne L15
 00A0           X3:
 00A0                   .dbline 66
 00A0           ;       {RS_i=0;flag=3;}                
 00A0                   .dbline 66
 00A0 2224              clr R2
 00A2 20920000          sts _RS_i,R2
 00A6                   .dbline 66
 00A6 83E0              ldi R24,3
 00A8 80930000          sts _flag,R24
 00AC                   .dbline 66
 00AC           L15:
 00AC                   .dbline 67
 00AC           ;  SEI();                                                               //开中断
 00AC 7894              sei
 00AE                   .dbline -2
 00AE           L14:
 00AE                   .dbline 0 ; func end
 00AE 2990              ld R2,y+
 00B0 2FBE              out 0x3f,R2
 00B2 F991              ld R31,y+
 00B4 E991              ld R30,y+
 00B6 9991              ld R25,y+
 00B8 8991              ld R24,y+
 00BA 2990              ld R2,y+
 00BC 1895              reti
 00BE                   .dbend
 00BE                   .dbfunc e data_decide _data_decide fV
 00BE           ;           RS_j -> R16
                        .even
 00BE           _data_decide::
 00BE                   .dbline -1
 00BE                   .dbline 72
 00BE           ;  }
 00BE           ;  
 00BE           ;  /**********************接收数组判断存储子程序************************/
 00BE           ; void data_decide(void)
 00BE           ; {
 00BE                   .dbline 73
 00BE           ;       uchar RS_j=0;
 00BE 0027              clr R16
 00C0                   .dbline 74
 00C0           ;       if(getchar[0]==0xaa){
 00C0 80910000          lds R24,_getchar
 00C4 8A3A              cpi R24,170
 00C6 09F0              breq X15
 00C8 69C0              rjmp L18
 00CA           X15:
 00CA           X4:
 00CA                   .dbline 74
 00CA                   .dbline 75
 00CA           ;               switch(getchar[1]){
 00CA 20910100          lds R18,_getchar+1
 00CE 3327              clr R19
 00D0 2D32              cpi R18,45
 00D2 E0E0              ldi R30,0
 00D4 3E07              cpc R19,R30
 00D6 09F4              brne X16
 00D8 3BC0              rjmp L30
 00DA           X16:
 00DA           X5:
 00DA 8DE2              ldi R24,45
 00DC 90E0              ldi R25,0
 00DE 8217              cp R24,R18
 00E0 9307              cpc R25,R19
 00E2 2CF0              brlt L44
 00E4           X6:
 00E4           L43:
 00E4 2E31              cpi R18,30
 00E6 E0E0              ldi R30,0
 00E8 3E07              cpc R19,R30
 00EA 01F1              breq L26
 00EC           X7:
 00EC 57C0              rjmp L20
 00EE           L44:
 00EE 2C33              cpi R18,60
 00F0 E0E0              ldi R30,0
 00F2 3E07              cpc R19,R30
 00F4 09F4              brne X17
 00F6 3EC0              rjmp L35
 00F8           X17:
 00F8           X8:
 00F8 2C33              cpi R18,60
 00FA E0E0              ldi R30,0
 00FC 3E07              cpc R19,R30
 00FE 0CF4              brge X18
 0100 4DC0              rjmp L20
 0102           X18:
 0102           X9:
 0102           L45:
 0102 2B34              cpi R18,75
 0104 E0E0              ldi R30,0
 0106 3E07              cpc R19,R30
 0108 09F4              brne X19
 010A 46C0              rjmp L40
 010C           X19:
 010C           X10:
 010C 47C0              rjmp L20
 010E           L25:
 010E                   .dbline 77

⌨️ 快捷键说明

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