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

📄 发射.s

📁 使用MEGA8控制RF01芯片,用射频915MHz发送四路AD采样的信号
💻 S
字号:
	.module _发射.c
	.area text(rom, con, rel)
	.dbfile F:\915M\发射\发射.c
	.area vector(rom, abs)
	.org 18
	rjmp _TIM0_ovf
	.area text(rom, con, rel)
	.dbfile F:\915M\发射\发射.c
	.area data(ram, con, rel)
	.dbfile F:\915M\发射\发射.c
_n::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile F:\915M\发射\发射.c
	.dbsym e n _n i
	.area text(rom, con, rel)
	.dbfile F:\915M\发射\发射.c
	.dbfunc e Delay_ms _Delay_ms fV
;              i -> R10
;              p -> R20
;            amS -> R16
	.even
_Delay_ms::
	st -y,R10
	st -y,R20
	.dbline -1
	.dbline 61
; #include <iom8v.h>
; #include <macros.h>
; #include <stdio.h>
; 
; #define DDR_IN  0
; #define DDR_OUT 1
; 
; #define PORT_SEL  PORTB
; #define PIN_SEL   PINB
; #define DDR_SEL   DDRB
; 
; #define PORT_SDI  PORTB
; #define PIN_SDI   PINB
; #define DDR_SDI   DDRB
; 
; #define PORT_SCK  PORTB
; #define PIN_SCK   PINB
; #define DDR_SCK   DDRB
; 
; #define PORT_SDO  PORTB
; #define PIN_SDO   PINB
; #define DDR_SDO   DDRB
; 
; #define PB7        7
; #define PB6        6
; #define RFXX_SCK   5
; #define RFXX_SDO   4
; #define RFXX_SDI   3
; #define RFXX_SEL   2
; #define RFXX_DATA  1
; #define PB0	   0
; 
; #define SEL_OUTPUT()   DDR_SEL|=(1<<RFXX_SEL)
; #define HI_SEL()       PORT_SEL|=(1<<RFXX_SEL)	
; #define LOW_SEL()      PORT_SEL&=~(1<<RFXX_SEL)
; 
; #define SDI_OUTPUT()   DDR_SDI|=(1<<RFXX_SDI)
; #define HI_SDI()       PORT_SDI|=(1<<RFXX_SDI)	
; #define LOW_SDI()      PORT_SDI&=~(1<<RFXX_SDI)
; 
; #define SDO_INPUT()   DDR_SDO&=~(1<<RFXX_SDO)
; #define SDO_HI()       PIN_SDO&=(1<<RFXX_SDO)	
; #define SCK_OUTPUT()   DDR_SCK|=(1<<RFXX_SCK)
; #define HI_SCK()       PORT_SCK|=(1<<RFXX_SCK)
; #define LOW_SCK()      PORT_SCK&=~(1<<RFXX_SCK)
; 
; #pragma interrupt_handler TIM0_ovf:10
; 
; #define baud 19200
; #define fosc 8000000
; 
; #define uchar	unsigned char
; #define uint	unsigned int
; 
; uint n=0;
; uchar ch0,ch1,ch2,ch3; //j,k,l,m;
; uchar adc_mux;  //AD通道
; 
; /*延时*/
; void Delay_ms(unsigned char amS)
; {
	.dbline 63
;   uchar i,p;
;   for(i=0;i<amS;i++)
	clr R10
	rjmp L5
L2:
	.dbline 64
;     for(p=0;p<200;p++)
	clr R20
	rjmp L9
L6:
	.dbline 65
; 	  ;
L7:
	.dbline 64
	inc R20
L9:
	.dbline 64
	cpi R20,200
	brlo L6
X0:
L3:
	.dbline 63
	inc R10
L5:
	.dbline 63
	cp R10,R16
	brlo L2
X1:
	.dbline -2
L1:
	.dbline 0 ; func end
	ld R20,y+
	ld R10,y+
	ret
	.dbsym r i 10 c
	.dbsym r p 20 c
	.dbsym r amS 16 c
	.dbend
	.dbfunc e get_ad _get_ad fc
;       ad_value -> R16
	.even
_get_ad::
	.dbline -1
	.dbline 70
; }
; 
; /*获取AD值*/
; uchar get_ad(void)
; {
L11:
	.dbline 72
;  uchar ad_value;
;  while(!(ADCSRA & (1 << ADIF)));	//等待
L12:
	.dbline 72
	sbis 0x6,4
	rjmp L11
X2:
	.dbline 73
;   ad_value = ADCH;
	in R16,0x5
	.dbline 74
;   ADCSRA &= ~(1 << ADIF);	//清标志
	cbi 0x6,4
	.dbline 75
;   return ad_value;
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbsym r ad_value 16 c
	.dbend
	.dbfunc e start_AD _start_AD fV
	.even
_start_AD::
	st -y,R10
	.dbline -1
	.dbline 80
; }
; 
; /*AD变换开始*/
; void start_AD(void)
; {
	.dbline 81
;   adc_mux=0; //AD通道0
	clr R2
	sts _adc_mux,R2
	.dbline 82
;   ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);   //取VCC为参考值,AD0模拟变量输入 
	mov R24,R2
	andi R24,15
	ori R24,96
	out 0x7,R24
	.dbline 83
;   ADCSRA|=0xC0;           //AD转换启动
	in R24,0x6
	ori R24,192
	out 0x6,R24
	.dbline 84
;   ch0=get_ad();
	rcall _get_ad
	sts _ch0,R16
	.dbline 86
;  
;  adc_mux=1; //AD通道1
	ldi R24,1
	sts _adc_mux,R24
	.dbline 87
;  ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);
	andi R24,15
	ori R24,96
	out 0x7,R24
	.dbline 88
;  ADCSRA|=0xC0;           //AD转换启动
	in R24,0x6
	ori R24,192
	out 0x6,R24
	.dbline 89
;  ch1=get_ad();
	rcall _get_ad
	sts _ch1,R16
	.dbline 91
;  
;  adc_mux=2; //AD通道2
	ldi R24,2
	sts _adc_mux,R24
	.dbline 92
;  ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);
	andi R24,15
	ori R24,96
	out 0x7,R24
	.dbline 93
;  ADCSRA|=0xC0;           //AD转换启动
	in R24,0x6
	ori R24,192
	out 0x6,R24
	.dbline 94
;  ch2=get_ad();
	rcall _get_ad
	mov R10,R16
	sts _ch2,R10
	.dbline 96
;  
;  adc_mux=3; //AD通道3
	ldi R24,3
	sts _adc_mux,R24
	.dbline 97
;  ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);
	andi R24,15
	ori R24,96
	out 0x7,R24
	.dbline 98
;  ADCSRA|=0xC0;           //AD转换启动
	in R24,0x6
	ori R24,192
	out 0x6,R24
	.dbline 99
;  ch3=get_ad();
	rcall _get_ad
	mov R10,R16
	sts _ch3,R10
	.dbline -2
L14:
	.dbline 0 ; func end
	ld R10,y+
	ret
	.dbend
	.dbfunc e RFXX_WRT_CMD _RFXX_WRT_CMD fV
;           temp -> R20,R21
;              i -> R22
;           aCmd -> R16,R17
	.even
_RFXX_WRT_CMD::
	rcall push_xgsetF000
	.dbline -1
	.dbline 104
;  }
; 
; /*发射数据写入*/
; void RFXX_WRT_CMD(uint aCmd)
; {
	.dbline 107
;   uchar i;
;   uint temp;
;   LOW_SCK();
	cbi 0x18,5
	.dbline 108
;   LOW_SEL();
	cbi 0x18,2
	.dbline 109
;   for(i=0;i<16;i++)
	clr R22
	rjmp L19
L16:
	.dbline 110
;  {
	.dbline 111
;    temp<<=1;
	lsl R20
	rol R21
	.dbline 112
;    if(SDO_HI())
	in R24,0x16
	andi R24,16
	out 0x16,R24
	tst R24
	breq L20
X3:
	.dbline 113
;      { temp|=0x0001; }
	.dbline 113
	ori R20,1
	.dbline 113
L20:
	.dbline 114
;    LOW_SCK();
	cbi 0x18,5
	.dbline 115
;    if(aCmd&0x8000) HI_SDI();
	sbrs R17,7
	rjmp L22
X4:
	.dbline 115
	sbi 0x18,3
	rjmp L23
L22:
	.dbline 116
;    else  LOW_SDI();
	cbi 0x18,3
L23:
	.dbline 117
;     HI_SCK();
	sbi 0x18,5
	.dbline 118
;     aCmd<<=1;
	lsl R16
	rol R17
	.dbline 119
;   }
L17:
	.dbline 109
	inc R22
L19:
	.dbline 109
	cpi R22,16
	brlo L16
X5:
	.dbline 120
;    LOW_SCK();
	cbi 0x18,5
	.dbline 121
;    HI_SEL();
	sbi 0x18,2
	.dbline -2
L15:
	.dbline 0 ; func end
	rjmp pop_xgsetF000
	.dbsym r temp 20 i
	.dbsym r i 22 c
	.dbsym r aCmd 16 i
	.dbend
	.dbfunc e RF02_SEND _RF02_SEND fV
;              i -> R20
;          aByte -> R16
	.even
_RF02_SEND::
	st -y,R20
	.dbline -1
	.dbline 126
;  }
;   
; /*发射数据*/
; void RF02_SEND(uchar aByte)
; { 
	.dbline 128
;   uchar i;
;   for(i=0;i<8;i++)
	clr R20
	rjmp L28
L29:
	.dbline 130
;   {
;     while(PINB&(1<<RFXX_SDO));
L30:
	.dbline 130
	sbic 0x16,4
	rjmp L29
X6:
L32:
	.dbline 131
;     while(!(PINB&(1<<RFXX_SDO)));
L33:
	.dbline 131
	sbis 0x16,4
	rjmp L32
X7:
	.dbline 132
;     if(aByte&0x80) PORTB|=(1<<RFXX_DATA);
	sbrs R16,7
	rjmp L35
X8:
	.dbline 132
	sbi 0x18,1
	rjmp L36
L35:
	.dbline 133
;     else  PORTB&=~(1<<RFXX_DATA);
	cbi 0x18,1
L36:
	.dbline 134
;     aByte<<=1;
	lsl R16
	.dbline 135
;   }
L26:
	.dbline 128
	inc R20
L28:
	.dbline 128
	cpi R20,8
	brlo L30
X9:
	.dbline -2
L24:
	.dbline 0 ; func end
	ld R20,y+
	ret
	.dbsym r i 20 c
	.dbsym r aByte 16 c
	.dbend
	.dbfunc e Transmit _Transmit fV
;      Send_Data -> R16
	.even
_Transmit::
	.dbline -1
	.dbline 140
; }
; 
; /*字符输出函数*/
; void Transmit(uchar Send_Data)
; {
L38:
	.dbline 141
;   while (!(UCSRA & (1<<UDRE)));//判断是否发送完成
L39:
	.dbline 141
	sbis 0xb,5
	rjmp L38
X10:
	.dbline 142
;     UDR=Send_Data;//发送数据
	out 0xc,R16
	.dbline -2
L37:
	.dbline 0 ; func end
	ret
	.dbsym r Send_Data 16 c
	.dbend
	.dbfunc e TIM0_init _TIM0_init fV
	.even
_TIM0_init::
	.dbline -1
	.dbline 147
; }
; 
; /*T0初始化*/
; void TIM0_init(void)
; {
	.dbline 148
;  _CLI();//关全局中断
	cli
	.dbline 149
;  TCCR0=0x00;
	clr R2
	out 0x33,R2
	.dbline 150
;  TCNT0=0xE0; //4us定时
	ldi R24,224
	out 0x32,R24
	.dbline 151
;  TCCR0|=0x01;//开定时器,无预分频
	in R24,0x33
	ori R24,1
	out 0x33,R24
	.dbline 152
;  TIMSK|=0x01;//T0中断
	in R24,0x39
	ori R24,1
	out 0x39,R24
	.dbline 153
;  SREG|=0x80;//开全局中断
	bset 7
	.dbline -2
L41:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e TIM0_ovf _TIM0_ovf fV
	.even
_TIM0_ovf::
	st -y,R0
	st -y,R1
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R8
	st -y,R9
	st -y,R16
	st -y,R17
	st -y,R18
	st -y,R19
	st -y,R24
	st -y,R25
	st -y,R26
	st -y,R27
	st -y,R30
	st -y,R31
	in R0,0x3f
	st -y,R0
	.dbline -1
	.dbline 158
; }
; 
; /*T020ms中断程序*/
; void TIM0_ovf(void)
; {
	.dbline 159
;  TCCR0=0x00;//关定时器
	clr R2
	out 0x33,R2
	.dbline 160
;  TCNT0=0xE0;
	ldi R24,224
	out 0x32,R24
	.dbline 161
;  if(++n==5000)
	lds R24,_n
	lds R25,_n+1
	adiw R24,1
	movw R2,R24
	sts _n+1,R3
	sts _n,R2
	cpi R24,136
	ldi R30,19
	cpc R25,R30
	breq X12
	rjmp L43
X12:
X11:
	.dbline 162
;    {
	.dbline 163
;     n=0;
	clr R2
	clr R3
	sts _n+1,R3
	sts _n,R2
	.dbline 164
;     RFXX_WRT_CMD(0xC039);//启动发射
	ldi R16,49209
	ldi R17,192
	rcall _RFXX_WRT_CMD
	.dbline 166
;     
;     RF02_SEND(0xAA);//PREAMBLE
	ldi R16,170
	rcall _RF02_SEND
	.dbline 167
;     RF02_SEND(0xAA);//PREAMBLE
	ldi R16,170
	rcall _RF02_SEND
	.dbline 168
;     RF02_SEND(0xAA);//PREAMBLE
	ldi R16,170
	rcall _RF02_SEND
	.dbline 169
;     RF02_SEND(0x2D);//SYNC HI BYTE
	ldi R16,45
	rcall _RF02_SEND
	.dbline 170
;     RF02_SEND(0xD4);//SYNC LOW BYTE
	ldi R16,212
	rcall _RF02_SEND
	.dbline 172
; 	
;     RF02_SEND(ch0);//DATA BYTE 0
	lds R16,_ch0
	rcall _RF02_SEND
	.dbline 173
;     RF02_SEND(ch1);//DATA BYTE 1
	lds R16,_ch1
	rcall _RF02_SEND
	.dbline 174
;     RF02_SEND(ch2);//DATA BYTE 2
	lds R16,_ch2
	rcall _RF02_SEND
	.dbline 175
;     RF02_SEND(ch3);//DATA BYTE 3
	lds R16,_ch3
	rcall _RF02_SEND
	.dbline 177
;     
;     RF02_SEND(0xAA);//Dummpy byte
	ldi R16,170
	rcall _RF02_SEND
	.dbline 179
;     
;     RFXX_WRT_CMD(0xC001);
	ldi R16,49153
	ldi R17,192
	rcall _RFXX_WRT_CMD
	.dbline 181
; 	
; 	Transmit(ch0);
	lds R16,_ch0
	rcall _Transmit
	.dbline 182
; 	Transmit(ch1);
	lds R16,_ch1
	rcall _Transmit
	.dbline 183
; 	Transmit(ch2);
	lds R16,_ch2
	rcall _Transmit
	.dbline 184
; 	Transmit(ch3);
	lds R16,_ch3
	rcall _Transmit
	.dbline 186
;     
;     start_AD();
	rcall _start_AD
	.dbline 187
;    }
L43:
	.dbline 188
;  TCCR0|=0x01;//开定时器
	in R24,0x33
	ori R24,1
	out 0x33,R24
	.dbline -2
L42:
	.dbline 0 ; func end
	ld R0,y+
	out 0x3f,R0
	ld R31,y+
	ld R30,y+
	ld R27,y+
	ld R26,y+
	ld R25,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R9,y+
	ld R8,y+
	ld R7,y+
	ld R6,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	reti
	.dbend
	.dbfunc e uart_init _uart_init fV
	.even
_uart_init::
	.dbline -1
	.dbline 193
; }
;  
; /*USART初始化*/
; void uart_init(void)
; {
	.dbline 194
;  UCSRA=0x00;
	clr R2
	out 0xb,R2
	.dbline 195
;  UCSRB=(1<<RXEN)|(1<<TXEN);  // 允许发送和接收
	ldi R24,24
	out 0xa,R24
	.dbline 196
;  UCSRC=(1<<URSEL)|0x06;      // 8bit,1stop
	ldi R24,134
	out 0x20,R24
	.dbline 197
;  UBRRL=(fosc/baud/16-1)%256; // 设置波特率寄存器低位字节
	ldi R24,25
	out 0x9,R24
	.dbline 198
;  UBRRH=(fosc/baud/16-1)/256; // 设置波特率寄存器高位字节
	out 0x20,R2
	.dbline -2
L45:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 203
; }
; 
; /*AD变换初始化*/
; void adc_init(void)           
; { 
	.dbline 204
;   DDRC=0x00;//PORTC INPUT
	clr R2
	out 0x14,R2
	.dbline 205
;   adc_mux=0;
	sts _adc_mux,R2
	.dbline 206
;   ADCSRA=0x00;      //关ad
	out 0x6,R2
	.dbline 207
;   ACSR = (1<<ACD);  //关模拟比较器
	ldi R24,128
	out 0x8,R24
	.dbline 208
;   ADCSRA|=0x06;    //预分频1
	in R24,0x6
	ori R24,6
	out 0x6,R24
	.dbline 210
;   
;   ADMUX = (1<<REFS0)|(1<<ADLAR)|(adc_mux&0x0f);   //取VCC为参考值,AD0模拟变量输入 
	mov R24,R2
	andi R24,15
	ori R24,96
	out 0x7,R24
	.dbline 211
;   ADCSRA|=0xC0;           //AD转换启动
	in R24,0x6
	ori R24,192
	out 0x6,R24
	.dbline 212
;   ch0=get_ad();
	rcall _get_ad
	sts _ch0,R16
	.dbline -2
L46:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_main _init_main fV
	.even
_init_main::
	.dbline -1
	.dbline 217
; }
; 
; /*系统初始化*/
; void init_main(void)
; {
	.dbline 218
;  uart_init();
	rcall _uart_init
	.dbline 219
;  adc_init();
	rcall _adc_init
	.dbline 220
;  start_AD();
	rcall _start_AD
	.dbline 222
;   
;  MCUCR=0x00;
	clr R2
	out 0x35,R2
	.dbline 223
;  GICR=0x00;
	out 0x3b,R2
	.dbline -2
L47:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e RFXX_PORT_INIT _RFXX_PORT_INIT fV
	.even
_RFXX_PORT_INIT::
	.dbline -1
	.dbline 228
; }
; 
; /*发射芯片端口初始化*/
; void RFXX_PORT_INIT(void)
; {
	.dbline 229
;   HI_SEL();
	sbi 0x18,2
	.dbline 230
;   HI_SDI();
	sbi 0x18,3
	.dbline 231
;   LOW_SCK();
	cbi 0x18,5
	.dbline 232
;   SEL_OUTPUT();
	sbi 0x17,2
	.dbline 233
;   SDI_OUTPUT();
	sbi 0x17,3
	.dbline 234
;   SDO_INPUT();
	cbi 0x17,4
	.dbline 235
;   SCK_OUTPUT();
	sbi 0x17,5
	.dbline -2
L48:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 240
; }
; 
; /*主程序*/
; void main(void)
; {
	.dbline 241
;   init_main();
	rcall _init_main
	.dbline 242
;   RFXX_PORT_INIT();
	rcall _RFXX_PORT_INIT
	.dbline 244
;   
;   RFXX_WRT_CMD(0xCC00); //执行状态寄存器命令
	ldi R16,52224
	ldi R17,204
	rcall _RFXX_WRT_CMD
	.dbline 245
;   RFXX_WRT_CMD(0x9B61); //915频段
	ldi R16,39777
	ldi R17,155
	rcall _RFXX_WRT_CMD
	.dbline 246
;   RFXX_WRT_CMD(0xA7D0); //A640=434MHz
	ldi R16,42960
	ldi R17,167
	rcall _RFXX_WRT_CMD
	.dbline 247
;   RFXX_WRT_CMD(0xD040); //RATE/2
	ldi R16,53312
	ldi R17,208
	rcall _RFXX_WRT_CMD
	.dbline 248
;   RFXX_WRT_CMD(0xC823); //9.6kbps 23
	ldi R16,51235
	ldi R17,200
	rcall _RFXX_WRT_CMD
	.dbline 249
;   RFXX_WRT_CMD(0xC220); //使用位同步时钟
	ldi R16,49696
	ldi R17,194
	rcall _RFXX_WRT_CMD
	.dbline 250
;   RFXX_WRT_CMD(0xC001); //初始化完毕,关闭所有功能模块
	ldi R16,49153
	ldi R17,192
	rcall _RFXX_WRT_CMD
	.dbline 251
;   PORTB|=(1<<RFXX_DATA);
	sbi 0x18,1
	.dbline 252
;   DDRB|=(1<<RFXX_DATA);//将PB1置为输出
	sbi 0x17,1
	.dbline 254
;   
;   TIM0_init();
	rcall _TIM0_init
L50:
	.dbline 256
;   
;   while(1);
L51:
	.dbline 256
	rjmp L50
X13:
	.dbline -2
L49:
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile F:\915M\发射\发射.c
_adc_mux::
	.blkb 1
	.dbsym e adc_mux _adc_mux c
_ch3::
	.blkb 1
	.dbsym e ch3 _ch3 c
_ch2::
	.blkb 1
	.dbsym e ch2 _ch2 c
_ch1::
	.blkb 1
	.dbsym e ch1 _ch1 c
_ch0::
	.blkb 1
	.dbsym e ch0 _ch0 c
;  }
;     
;     
;     
;     

⌨️ 快捷键说明

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