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

📄 905receive.lst

📁 嵌入式单片机控制温度传感的无线收发方案!
💻 LST
📖 第 1 页 / 共 5 页
字号:
__start:
__text_start:
    00D2 E5CF      LDI	R28,0x5F
    00D3 E0D4      LDI	R29,4
    00D4 BFCD      OUT	0x3D,R28
    00D5 BFDE      OUT	0x3E,R29
    00D6 51C0      SUBI	R28,0x10
    00D7 40D0      SBCI	R29,0
    00D8 EA0A      LDI	R16,0xAA
    00D9 8308      STD	Y+0,R16
    00DA 2400      CLR	R0
    00DB EDEB      LDI	R30,0xDB
    00DC E0F0      LDI	R31,0
    00DD E011      LDI	R17,1
    00DE 33E6      CPI	R30,0x36
    00DF 07F1      CPC	R31,R17
    00E0 F011      BEQ	0x00E3
    00E1 9201      ST	R0,Z+
    00E2 CFFB      RJMP	0x00DE
    00E3 8300      STD	Z+0,R16
    00E4 E2E9      LDI	R30,0x29
    00E5 E0F1      LDI	R31,1
    00E6 E6A0      LDI	R26,0x60
    00E7 E0B0      LDI	R27,0
    00E8 E011      LDI	R17,1
    00E9 3AE4      CPI	R30,0xA4
    00EA 07F1      CPC	R31,R17
    00EB F021      BEQ	0x00F0
    00EC 95C8      LPM
    00ED 9631      ADIW	R30,1
    00EE 920D      ST	R0,X+
    00EF CFF9      RJMP	0x00E9
    00F0 D05C      RCALL	_main
_exit:
    00F1 CFFF      RJMP	_exit
_Get_CRC16:
  low                  --> R20
  high                 --> R22
  i                    --> R10
  check                --> R6
  j                    --> R14
  crc                  --> R12
  len                  --> R18
  buf                  --> R4
    00F2 D487      RCALL	push_gset5
    00F3 0128      MOVW	R4,R16
FILE: E:\公司用\atmega8l\final\new\nrf905_receive\main.c
(0001) /************************************
(0002) 功能:nrf905接受函数主函数
(0003) 时间:2008年8月30日
(0004) 编写:陈锐
(0005) 版本:1.2
(0006) ************************************/
(0007) 
(0008) #include "confg.h"
(0009) 
(0010) //buf[0]:子机地址;buf[1]:命令参数0x03;
(0011) //buf[2]:数据长度,长度为7;buf[3]和buf[4]:温度数据
(0012) //buf[5]和buf[6]:子机电压数据;buf[7]和buf[8]:crc校检
(0013) unsigned char buf[9]={0};//向主机发送的数据
(0014) 
(0015) //crc校检函数
(0016) //*buf数据缓冲区,len数据缓冲区长度,CRC 返回的16位校检码
(0017) unsigned int Get_CRC16(unsigned char *buf,unsigned char len)
(0018) {
(0019)    unsigned char high,low;
(0020)    unsigned char i,j;
(0021)    unsigned char check;
(0022)    unsigned int crc;
(0023)    crc=0xffff;
    00F4 EF8F      LDI	R24,0xFF
    00F5 EF9F      LDI	R25,0xFF
    00F6 016C      MOVW	R12,R24
(0024)    for(i=0;i<len;i++)
    00F7 24AA      CLR	R10
    00F8 C01F      RJMP	0x0118
(0025)    {
(0026) 	  crc=crc^buf[i];
    00F9 2DEA      MOV	R30,R10
    00FA 27FF      CLR	R31
    00FB 0DE4      ADD	R30,R4
    00FC 1DF5      ADC	R31,R5
    00FD 8020      LDD	R2,Z+0
    00FE 2433      CLR	R3
    00FF 24C2      EOR	R12,R2
    0100 24D3      EOR	R13,R3
(0027) 	  for(j=0;j<8;j++)
    0101 24EE      CLR	R14
    0102 C011      RJMP	0x0114
(0028) 	  {
(0029) 	     check=crc&1;
    0103 01C6      MOVW	R24,R12
    0104 7081      ANDI	R24,1
    0105 7090      ANDI	R25,0
    0106 2E68      MOV	R6,R24
(0030) 		 crc=crc>>1;
    0107 94D6      LSR	R13
    0108 94C7      ROR	R12
(0031) 		 crc=crc&0x7fff;
    0109 01C6      MOVW	R24,R12
    010A 779F      ANDI	R25,0x7F
    010B 016C      MOVW	R12,R24
(0032) 		 if(check==1)
    010C 2D86      MOV	R24,R6
    010D 3081      CPI	R24,1
    010E F421      BNE	0x0113
(0033) 		 {
(0034) 		   crc=crc^0xa001;
    010F E081      LDI	R24,1
    0110 EA90      LDI	R25,0xA0
    0111 26C8      EOR	R12,R24
    0112 26D9      EOR	R13,R25
    0113 94E3      INC	R14
    0114 2D8E      MOV	R24,R14
    0115 3088      CPI	R24,0x8
    0116 F360      BCS	0x0103
    0117 94A3      INC	R10
    0118 16A2      CP	R10,R18
    0119 F2F8      BCS	0x00F9
(0035) 		 }
(0036) 	  }   
(0037)    } 
(0038)    	  high=crc&0x00ff;
    011A 2D6C      MOV	R22,R12
    011B 7070      ANDI	R23,0
(0039) 	  low=crc>>8;
    011C 01A6      MOVW	R20,R12
    011D 2F45      MOV	R20,R21
    011E 2755      CLR	R21
(0040) 	  crc=(high<<8)|low;
    011F 2ED6      MOV	R13,R22
    0120 2EC4      MOV	R12,R20
(0041) 	  return crc; 
    0121 0186      MOVW	R16,R12
    0122 D435      RCALL	pop_gset5
    0123 9508      RET
(0042) }
(0043) 
(0044) //串口初始化
(0045) void port_init(void)
(0046) {
(0047) 
(0048)   PORTB = 0xD7;
_port_init:
    0124 ED87      LDI	R24,0xD7
    0125 BB88      OUT	0x18,R24
(0049)  DDRB  = 0x2C;
    0126 E28C      LDI	R24,0x2C
    0127 BB87      OUT	0x17,R24
(0050)  PORTC = 0x00; //m103 output only
    0128 2422      CLR	R2
    0129 BA25      OUT	0x15,R2
(0051)  DDRC  = 0x00;
    012A BA24      OUT	0x14,R2
(0052)  PORTD = 0x1f;
    012B E18F      LDI	R24,0x1F
    012C BB82      OUT	0x12,R24
(0053)  DDRD  = 0xe0;
    012D EE80      LDI	R24,0xE0
    012E BB81      OUT	0x11,R24
(0054) }
    012F 9508      RET
(0055) 
(0056) 
(0057) //SPI initialize
(0058) void spi_init(void)
(0059) {uchar temp;
(0060) 
(0061)  //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
(0062)  SPCR = 0x51; //不使用SPI中断,其它同上
_spi_init:
  temp                 --> R16
    0130 E581      LDI	R24,0x51
    0131 B98D      OUT	0x0D,R24
(0063)  SPSR = 0x00; //setup SPI
    0132 2422      CLR	R2
    0133 B82E      OUT	0x0E,R2
(0064)  
(0065)  temp = SPSR; //!!!
    0134 B10E      IN	R16,0x0E
(0066)  temp = SPDR; //清空SPI,和中断标志,使SPI空闲    
    0135 B10F      IN	R16,0x0F
(0067) }
    0136 9508      RET
(0068) 
(0069) //call this routine to initialize all peripherals
(0070) void init_devices(void)
(0071) {
(0072)  //stop errant interrupts until set up
(0073)  CLI(); //disable all interrupts
_init_devices:
    0137 94F8      BCLR	7
(0074)  port_init();
    0138 DFEB      RCALL	_port_init
(0075)  spi_init();
    0139 DFF6      RCALL	_spi_init
(0076)  uart_init();
    013A D256      RCALL	_uart_init
(0077) 
(0078)  MCUCR = 0x0c;
    013B E08C      LDI	R24,0xC
    013C BF85      OUT	0x35,R24
(0079)  GICR|= 0x80;//enable INT1 interrupt
    013D B78B      IN	R24,0x3B
    013E 6880      ORI	R24,0x80
    013F BF8B      OUT	0x3B,R24
(0080)  GIFR   = 0xc0;// 清除INT0、INT1 中断标志位
    0140 EC80      LDI	R24,0xC0
    0141 BF8A      OUT	0x3A,R24
(0081)  SEI(); //re-enable interrupts
    0142 9478      BSET	7
(0082)  //all peripherals are now initialized
(0083) }
    0143 9508      RET
(0084) 
(0085) void rs485_send(void)//打开rs485发送,DE位为1
(0086) {
(0087)   DDRC=0x01;
_rs485_send:
    0144 E081      LDI	R24,1
    0145 BB84      OUT	0x14,R24
(0088)   PORTC=0x01;
    0146 BB85      OUT	0x15,R24
(0089) }
    0147 9508      RET
(0090) 
(0091) void rs485_rec(void)//打开rs485接收
(0092) {
(0093)   DDRC=0x01;
_rs485_rec:
    0148 E081      LDI	R24,1
    0149 BB84      OUT	0x14,R24
(0094)   PORTC=0x00;
    014A 2422      CLR	R2
    014B BA25      OUT	0x15,R2
(0095) }
    014C 9508      RET
(0096) 
(0097) 
(0098) void main(void)
(0099) {
(0100)    uchar string;
(0101)    int i=0;
_main:
  string               --> Y+1
  i                    --> R20
    014D 2744      CLR	R20
    014E 2755      CLR	R21
(0102)    init_devices();
    014F DFE7      RCALL	_init_devices
(0103)    delay_10ms(20);
    0150 E104      LDI	R16,0x14
    0151 E010      LDI	R17,0
    0152 D20A      RCALL	_delay_10ms
(0104)   
(0105)    Read_nrf905Add();//读取nrf905的接受发送地址
    0153 D067      RCALL	_Read_nrf905Add
(0106)  
(0107)    nrf905_Init(); //初始化nrf905
    0154 D14C      RCALL	_nrf905_Init
(0108)    
(0109)    //delay_10ms(50);
(0110) 	 //puts_hh("receive start!");//用来演示
(0111) 	 //  delay_10ms(2);
(0112)    nrf905_RxOn();//enable nrf905接收
    0155 D13D      RCALL	_nrf905_RxOn
(0113) 	
(0114)    while(1)	  {	   
    0156 CFFF      RJMP	0x0156
(0115) 	
(0116)   }
(0117) }
    0157 9508      RET
_int1_isr:
  crc                  --> R20
    0158 D42D      RCALL	push_lset
    0159 D400      RCALL	push_gset1
(0118) 
(0119) 
(0120) 
(0121) #pragma interrupt_handler int1_isr:3
(0122) void int1_isr(void)
(0123) {     
(0124)      unsigned int crc;
(0125)      
(0126)        RfRecvProc();//接收处理
    015A D1F6      RCALL	_RfRecvProc
(0127) 	   //读出的数据Rx_Buf[0]是子机地址,Rx_Buf[2]和Rx_Buf[3]是温度数据,
(0128) 	   //Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据,Rx_Buf[1]是命令字
(0129) 	 
(0130) 	   buf[0]=Rx_Buf[0];//子机地址
    015B 902000DB  LDS	R2,_Rx_Buf
    015D 92200060  STS	0x60,R2
(0131) 	   buf[1]=Rx_Buf[1];//命令字
    015F 902000DC  LDS	R2,_Rx_Buf+1
    0161 92200061  STS	0x61,R2
(0132) 	   buf[2]=0x07;//数据长度,包括子机地址、命令字和数据
    0163 E087      LDI	R24,7
    0164 93800062  STS	0x62,R24
(0133) 	   buf[3]=Rx_Buf[2];//Rx_Buf[2]和Rx_Buf[3]是温度数据
    0166 902000DD  LDS	R2,_Rx_Buf+2
    0168 92200063  STS	0x63,R2
(0134) 	   buf[4]=Rx_Buf[3];
    016A 902000DE  LDS	R2,_Rx_Buf+3
    016C 92200064  STS	0x64,R2
(0135) 	   buf[5]=Rx_Buf[4];//Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据
    016E 902000DF  LDS	R2,0xDF
    0170 92200065  STS	0x65,R2
(0136) 	   buf[6]=Rx_Buf[5];
    0172 902000E0  LDS	R2,0xE0
    0174 92200066  STS	0x66,R2
(0137) 	   crc=Get_CRC16(buf,7);//获得CRC校检
    0176 E027      LDI	R18,7
    0177 E600      LDI	R16,0x60
    0178 E010      LDI	R17,0
    0179 DF78      RCALL	_Get_CRC16
    017A 01A8      MOVW	R20,R16
(0138) 	   buf[7]=crc;
    017B 93400067  STS	0x67,R20
(0139) 	   buf[8]=(crc<<8); 
    017D 011A      MOVW	R2,R20
    017E 2C32      MOV	R3,R2
    017F 2422      CLR	R2
    0180 92200068  STS	0x68,R2
(0140) 	   rs485_send();//置rs485为发送状态
    0182 DFC1      RCALL	_rs485_send
(0141) 	   //printf("%s",buf);//向485发送数据
(0142) 	   
(0143) 	   printf("slave add is %d\r\n",Tx_Buf[0]);
    0183 912000FB  LDS	R18,_Tx_Buf
    0185 2733      CLR	R19
    0186 E709      LDI	R16,0x79
    0187 E010      LDI	R17,0
    0188 D4D2      RCALL	_printf
(0144) 	   printf("command is %x\r\n",Tx_Buf[1]);
    0189 912000FC  LDS	R18,_Tx_Buf+1
    018B 2733      CLR	R19
    018C E609      LDI	R16,0x69
    018D E010      LDI	R17,0
    018E D4CC      RCALL	_printf
(0145) 	  
(0146) 	   //改变nrf905的发送地址
(0147)        Change_TX_ADD(Rx_Buf[0]);
    018F 910000DB  LDS	R16,_Rx_Buf
    0191 D05D      RCALL	_Change_TX_ADD
(0148) 	   Tx_Buf[0]=0xFF;//发出确认收到命令
    0192 EF8F      LDI	R24,0xFF
    0193 938000FB  STS	_Tx_Buf,R24
(0149) 	   //发送测试
(0150) 	   RfSendProc();
    0195 D19E      RCALL	_RfSendProc
(0151) 	   rs485_rec();//置rs485为接收状态
    0196 DFB1      RCALL	_rs485_rec
(0152) 	   CLR(PORTB,AM);//清除中断标志
    0197 98C3      CBI	0x18,3
(0153) }
    0198 D3C4      RCALL	pop_gset1
    0199 D403      RCALL	pop_lset
    019A 9518      RETI
FILE: E:\公司用\atmega8l\final\new\nrf905_receive\nrf905.c
(0001) /*****************************
(0002) 功能:nrf905接收函数
(0003) 时间:2008年8月30日
(0004) 编写:陈锐
(0005) 版本:1.2
(0006) *****************************/
(0007) 
(0008) #include "confg.h"
(0009)  uchar Tx_Buf[SIZE];
(0010)  uchar Rx_Buf[SIZE];
(0011) 
(0012)  
(0013) //extern void delay_us(uint us);
(0014) uchar nrf905_SpiRW(uchar val);
(0015) void nrf905_SpiTest(void);
(0016) 
(0017) #define SIZE 32
(0018) 
(0019) 
(0020) unsigned long  RX_ADDRESS=0xAAAAAAAA,TX_ADDRESS=0x11111101;
(0021) 
(0022) /*-------------------------------------------------------------------------------------------
(0023) nrf905配置寄存器宏定义 author:HotPower
(0024)         nrf905配置寄存器(10Byte)
(0025) 工作频率f=(422.4+CH_NO/10)*(1+HFREQ_PLL)MHz
(0026) -------------------------------------------------------------------------------------------*/
(0027) 
(0028) //#define RX_ADDRESS           0xAAAAAAAA               //接收有效地址(本方)
(0029) //#define TX_ADDRESS           0x111111f0               //发送有效地址(对方)

⌨️ 快捷键说明

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