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

📄 main.s

📁 嵌入式单片机控制温度传感的无线收发方案!
💻 S
字号:
	.module main.c
	.area data(ram, con, rel)
_buf::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.blkb 8
	.area idata
	.byte 0,0,0,0,0,0,0,0
	.area data(ram, con, rel)
	.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
	.dbsym e buf _buf A[9:9]c
	.area text(rom, con, rel)
	.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
	.dbfunc e Get_CRC16 _Get_CRC16 fi
;            low -> R20
;           high -> R22
;              i -> R10
;          check -> R6
;              j -> R14
;            crc -> R12,R13
;            len -> R18
;            buf -> R4,R5
	.even
_Get_CRC16::
	rcall push_gset5
	movw R4,R16
	.dbline -1
	.dbline 18
; /************************************
; 功能:nrf905接受函数主函数
; 时间:2008年8月30日
; 编写:陈锐
; 版本:1.2
; ************************************/
; 
; #include "confg.h"
; 
; //buf[0]:子机地址;buf[1]:命令参数0x03;
; //buf[2]:数据长度,长度为7;buf[3]和buf[4]:温度数据
; //buf[5]和buf[6]:子机电压数据;buf[7]和buf[8]:crc校检
; unsigned char buf[9]={0};//向主机发送的数据
; 
; //crc校检函数
; //*buf数据缓冲区,len数据缓冲区长度,CRC 返回的16位校检码
; unsigned int Get_CRC16(unsigned char *buf,unsigned char len)
; {
	.dbline 23
;    unsigned char high,low;
;    unsigned char i,j;
;    unsigned char check;
;    unsigned int crc;
;    crc=0xffff;
	ldi R24,65535
	ldi R25,255
	movw R12,R24
	.dbline 24
;    for(i=0;i<len;i++)
	clr R10
	rjmp L5
L2:
	.dbline 25
;    {
	.dbline 26
; 	  crc=crc^buf[i];
	mov R30,R10
	clr R31
	add R30,R4
	adc R31,R5
	ldd R2,z+0
	clr R3
	eor R12,R2
	eor R13,R3
	.dbline 27
; 	  for(j=0;j<8;j++)
	clr R14
	rjmp L9
L6:
	.dbline 28
; 	  {
	.dbline 29
; 	     check=crc&1;
	movw R24,R12
	andi R24,1
	andi R25,0
	mov R6,R24
	.dbline 30
; 		 crc=crc>>1;
	lsr R13
	ror R12
	.dbline 31
; 		 crc=crc&0x7fff;
	movw R24,R12
	andi R25,127
	movw R12,R24
	.dbline 32
; 		 if(check==1)
	mov R24,R6
	cpi R24,1
	brne L10
	.dbline 33
; 		 {
	.dbline 34
; 		   crc=crc^0xa001;
	ldi R24,40961
	ldi R25,160
	eor R12,R24
	eor R13,R25
	.dbline 35
; 		 }
L10:
	.dbline 36
L7:
	.dbline 27
	inc R14
L9:
	.dbline 27
	mov R24,R14
	cpi R24,8
	brlo L6
	.dbline 37
L3:
	.dbline 24
	inc R10
L5:
	.dbline 24
	cp R10,R18
	brlo L2
	.dbline 38
; 	  }   
;    } 
;    	  high=crc&0x00ff;
	mov R22,R12
	andi R23,0
	.dbline 39
; 	  low=crc>>8;
	movw R20,R12
	mov R20,R21
	clr R21
	.dbline 40
; 	  crc=(high<<8)|low;
	mov R13,R22
	mov R12,R20
	.dbline 41
; 	  return crc; 
	movw R16,R12
	.dbline -2
L1:
	rcall pop_gset5
	.dbline 0 ; func end
	ret
	.dbsym r low 20 c
	.dbsym r high 22 c
	.dbsym r i 10 c
	.dbsym r check 6 c
	.dbsym r j 14 c
	.dbsym r crc 12 i
	.dbsym r len 18 c
	.dbsym r buf 4 pc
	.dbend
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 46
; }
; 
; //串口初始化
; void port_init(void)
; {
	.dbline 48
; 
;   PORTB = 0xD7;
	ldi R24,215
	out 0x18,R24
	.dbline 49
;  DDRB  = 0x2C;
	ldi R24,44
	out 0x17,R24
	.dbline 50
;  PORTC = 0x00; //m103 output only
	clr R2
	out 0x15,R2
	.dbline 51
;  DDRC  = 0x00;
	out 0x14,R2
	.dbline 52
;  PORTD = 0x1f;
	ldi R24,31
	out 0x12,R24
	.dbline 53
;  DDRD  = 0xe0;
	ldi R24,224
	out 0x11,R24
	.dbline -2
	.dbline 54
; }
L12:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e spi_init _spi_init fV
;           temp -> R16
	.even
_spi_init::
	.dbline -1
	.dbline 59
; 
; 
; //SPI initialize
; void spi_init(void)
; {uchar temp;
	.dbline 62
; 
;  //SPCR = 0xD1; //SPI中断允许,SPI允许,主机模式,MSB,极性方式00,1/16系统时钟速率
;  SPCR = 0x51; //不使用SPI中断,其它同上
	ldi R24,81
	out 0xd,R24
	.dbline 63
;  SPSR = 0x00; //setup SPI
	clr R2
	out 0xe,R2
	.dbline 65
;  
;  temp = SPSR; //!!!
	in R16,0xe
	.dbline 66
;  temp = SPDR; //清空SPI,和中断标志,使SPI空闲    
	in R16,0xf
	.dbline -2
	.dbline 67
; }
L13:
	.dbline 0 ; func end
	ret
	.dbsym r temp 16 c
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 71
; 
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
	.dbline 73
;  //stop errant interrupts until set up
;  CLI(); //disable all interrupts
	cli
	.dbline 74
;  port_init();
	rcall _port_init
	.dbline 75
;  spi_init();
	rcall _spi_init
	.dbline 76
;  uart_init();
	rcall _uart_init
	.dbline 78
; 
;  MCUCR = 0x0c;
	ldi R24,12
	out 0x35,R24
	.dbline 79
;  GICR|= 0x80;//enable INT1 interrupt
	in R24,0x3b
	ori R24,128
	out 0x3b,R24
	.dbline 80
;  GIFR   = 0xc0;// 清除INT0、INT1 中断标志位
	ldi R24,192
	out 0x3a,R24
	.dbline 81
;  SEI(); //re-enable interrupts
	sei
	.dbline -2
	.dbline 83
;  //all peripherals are now initialized
; }
L14:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e rs485_send _rs485_send fV
	.even
_rs485_send::
	.dbline -1
	.dbline 86
; 
; void rs485_send(void)//打开rs485发送,DE位为1
; {
	.dbline 87
;   DDRC=0x01;
	ldi R24,1
	out 0x14,R24
	.dbline 88
;   PORTC=0x01;
	out 0x15,R24
	.dbline -2
	.dbline 89
; }
L15:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e rs485_rec _rs485_rec fV
	.even
_rs485_rec::
	.dbline -1
	.dbline 92
; 
; void rs485_rec(void)//打开rs485接收
; {
	.dbline 93
;   DDRC=0x01;
	ldi R24,1
	out 0x14,R24
	.dbline 94
;   PORTC=0x00;
	clr R2
	out 0x15,R2
	.dbline -2
	.dbline 95
; }
L16:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;         string -> <dead>
;              i -> R20,R21
	.even
_main::
	.dbline -1
	.dbline 99
; 
; 
; void main(void)
; {
	.dbline 101
;    uchar string;
;    int i=0;
	clr R20
	clr R21
	.dbline 102
;    init_devices();
	rcall _init_devices
	.dbline 103
;    delay_10ms(20);
	ldi R16,20
	ldi R17,0
	rcall _delay_10ms
	.dbline 105
;   
;    Read_nrf905Add();//读取nrf905的接受发送地址
	rcall _Read_nrf905Add
	.dbline 107
;  
;    nrf905_Init(); //初始化nrf905
	rcall _nrf905_Init
	.dbline 112
;    
;    //delay_10ms(50);
; 	 //puts_hh("receive start!");//用来演示
; 	 //  delay_10ms(2);
;    nrf905_RxOn();//enable nrf905接收
	rcall _nrf905_RxOn
L18:
	.dbline 114
	.dbline 116
L19:
	.dbline 114
	rjmp L18
X0:
	.dbline -2
	.dbline 117
; 	
;    while(1)	  {	   
; 	
;   }
; }
L17:
	.dbline 0 ; func end
	ret
	.dbsym l string 1 c
	.dbsym r i 20 I
	.dbend
	.area vector(rom, abs)
	.org 4
	rjmp _int1_isr
	.area text(rom, con, rel)
	.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
	.dbfunc e int1_isr _int1_isr fV
;            crc -> R20,R21
	.even
_int1_isr::
	rcall push_lset
	rcall push_gset1
	.dbline -1
	.dbline 123
; 
; 
; 
; #pragma interrupt_handler int1_isr:3
; void int1_isr(void)
; {     
	.dbline 126
;      unsigned int crc;
;      
;        RfRecvProc();//接收处理
	rcall _RfRecvProc
	.dbline 130
; 	   //读出的数据Rx_Buf[0]是子机地址,Rx_Buf[2]和Rx_Buf[3]是温度数据,
; 	   //Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据,Rx_Buf[1]是命令字
; 	 
; 	   buf[0]=Rx_Buf[0];//子机地址
	lds R2,_Rx_Buf
	sts _buf,R2
	.dbline 131
; 	   buf[1]=Rx_Buf[1];//命令字
	lds R2,_Rx_Buf+1
	sts _buf+1,R2
	.dbline 132
; 	   buf[2]=0x07;//数据长度,包括子机地址、命令字和数据
	ldi R24,7
	sts _buf+2,R24
	.dbline 133
; 	   buf[3]=Rx_Buf[2];//Rx_Buf[2]和Rx_Buf[3]是温度数据
	lds R2,_Rx_Buf+2
	sts _buf+3,R2
	.dbline 134
; 	   buf[4]=Rx_Buf[3];
	lds R2,_Rx_Buf+3
	sts _buf+4,R2
	.dbline 135
; 	   buf[5]=Rx_Buf[4];//Rx_Buf[4]和Rx_Buf[5]是子机电源电压数据
	lds R2,_Rx_Buf+4
	sts _buf+5,R2
	.dbline 136
; 	   buf[6]=Rx_Buf[5];
	lds R2,_Rx_Buf+5
	sts _buf+6,R2
	.dbline 137
; 	   crc=Get_CRC16(buf,7);//获得CRC校检
	ldi R18,7
	ldi R16,<_buf
	ldi R17,>_buf
	rcall _Get_CRC16
	movw R20,R16
	.dbline 138
; 	   buf[7]=crc;
	sts _buf+7,R20
	.dbline 139
; 	   buf[8]=(crc<<8); 
	movw R2,R20
	mov R3,R2
	clr R2
	sts _buf+8,R2
	.dbline 140
; 	   rs485_send();//置rs485为发送状态
	rcall _rs485_send
	.dbline 143
; 	   //printf("%s",buf);//向485发送数据
; 	   
; 	   printf("slave add is %d\r\n",Tx_Buf[0]);
	lds R18,_Tx_Buf
	clr R19
	ldi R16,<L35
	ldi R17,>L35
	rcall _printf
	.dbline 144
; 	   printf("command is %x\r\n",Tx_Buf[1]);
	lds R18,_Tx_Buf+1
	clr R19
	ldi R16,<L36
	ldi R17,>L36
	rcall _printf
	.dbline 147
; 	  
; 	   //改变nrf905的发送地址
;        Change_TX_ADD(Rx_Buf[0]);
	lds R16,_Rx_Buf
	rcall _Change_TX_ADD
	.dbline 148
; 	   Tx_Buf[0]=0xFF;//发出确认收到命令
	ldi R24,255
	sts _Tx_Buf,R24
	.dbline 150
; 	   //发送测试
; 	   RfSendProc();
	rcall _RfSendProc
	.dbline 151
; 	   rs485_rec();//置rs485为接收状态
	rcall _rs485_rec
	.dbline 152
; 	   CLR(PORTB,AM);//清除中断标志
	cbi 0x18,3
	.dbline -2
	.dbline 153
; }
L21:
	rcall pop_gset1
	rcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r crc 20 i
	.dbend
	.area data(ram, con, rel)
	.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
L36:
	.blkb 16
	.area idata
	.byte 'c,'o,'m,'m,'a,'n,'d,32,'i,'s,32,37,'x,13,10,0
	.area data(ram, con, rel)
	.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c
L35:
	.blkb 18
	.area idata
	.byte 's,'l,'a,'v,'e,32,'a,'d,'d,32,'i,'s,32,37,'d,13
	.byte 10,0
	.area data(ram, con, rel)
	.dbfile E:\公司用\atmega8l\final\new\nrf905_receive\main.c

⌨️ 快捷键说明

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