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

📄 tx.lst

📁 atmega128单片机上实现的nrf905无线收发程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
(0008) *当前版本:1.1
(0009) *作    者:王微
(0010) *完成日期:2008.5.
(0011) ****************************************/
(0012) #include<iom128v.h>
(0013) #include<macros.h>
(0014) #include"INT.h"
(0015) 
(0016) 
(0017) void init_INT()
(0018) {
(0019)    EIMSK=0;                                  //屏蔽所有外部中断
_init_INT:
    00D0 2422      CLR	R2
    00D1 BE29      OUT	0x39,R2
(0020)    EICRB|=(BIT(ISC51)|BIT(ISC50));          //修改外部中断5(DR)的触发方式为上升沿触发
    00D2 B78A      IN	R24,0x3A
    00D3 608C      ORI	R24,0xC
    00D4 BF8A      OUT	0x3A,R24
(0021)    EIFR=0XFF;                              //清除外部中断的标志位
    00D5 EF8F      LDI	R24,0xFF
    00D6 BF88      OUT	0x38,R24
(0022)   // EIMSK|=BIT(5);                           //不屏蔽外部中断5
(0023)    _SEI();                                  //全局中断使能,相当于语句SREG|=(1<7)
    00D7 9478      BSET	7
    00D8 9508      RET
_Int_DR:
    00D9 D12A      RCALL	push_lset
    00DA 0000      NOP
FILE: E:\心电监护系统\测试程序\第一阶段\无线测试\发送端\main.c
(0001) /*
(0002) *2008,浙江工业大学信息与控制研究所
(0003) *All rights reserved
(0004) *
(0005) *文件名称:ECG_NRF905.C
(0006) *摘    要:主函数,实现心电数据的采集,发送
(0007) *
(0008) *当前版本:1.0
(0009) *作    者:董齐芬
(0010) *完成日期:2008.5.17
(0011) *
(0012) *取代版本:
(0013) *原 作 者:
(0014) *完成日期:
(0015) */
(0016) 
(0017) //#include "time.h"
(0018) //#include "mcp42010.h"
(0019) //#include "adc.h"
(0020) #include "nrf.h"
(0021) #include "common.h"
(0022) #include "spi.h"
(0023) #include "int.h"
(0024) 
(0025) unsigned char receive_addr[4]={0x56,0x31,0x56,0x31};                 //4字节的接收地址a513d36a
(0026) unsigned char send_addr[4]={0x13,0x65,0x13,0x65};                   //4字节的发送地址
(0027) unsigned char ECG_data[ECG_LENGTH];  //存放心电数据1024个
(0028) unsigned char *w_ptr=ECG_data;       //将采集到的数据存放到存储区的地址指针
(0029) unsigned char *r_ptr=ECG_data;       //无线发送时数据存储区的地址指针
(0030) unsigned char nrf_data[PACKAGE_LENGTH];          //正要发送的无线数据包    0x5f+心电数据+序列号
(0031) unsigned char receive_data[PACKAGE_LENGTH];          //接收到的无线数据包    0x5f+心电数据+序列号
(0032) unsigned char second=0x80;           //秒的次序,8秒一次循环
(0033) unsigned char led_flag=0;
(0034) 
(0035) void mcu_init(void);   //声明处理器初始化函数
(0036) 
(0037) #pragma interrupt_handler Int_DR: 7		
(0038) void Int_DR(void)                            //外部中断INT5,中断向量号为7,接收数无线据
(0039) {
(0040)     LED_YELLOW;
    00DB 9AD8      SBI	0x1B,0
    00DC 98D9      CBI	0x1B,1
(0041) 	RxPacket(receive_data);
    00DD E102      LDI	R16,0x12
    00DE E011      LDI	R17,1
    00DF D0E6      RCALL	_RxPacket
    00E0 0000      NOP
    00E1 D139      RCALL	pop_lset
    00E2 0000      NOP
    00E3 9518      RETI
(0042) 	//////////////////////还应改变一下缓冲区的指针(接收多个包时)
(0043)  
(0044) }
(0045) 
(0046) /*
(0047) *函数功能:主函数
(0048) *输入参数:无
(0049) *输出参数:无
(0050) *返 回 值:无
(0051) */
(0052) void main(void)
(0053) {  
(0054)    unsigned char i,j,s;
(0055)    s=0;
_main:
  j                    --> Y+1
  s                    --> R20
  i                    --> R22
    00E4 2744      CLR	R20
(0056)    
(0057)    CLI();             //disable all interrupts
    00E5 94F8      BCLR	7
(0058)    mcu_init();        //处理器各模块初始化 
    00E6 D03D      RCALL	_mcu_init
(0059)    
(0060)    for (i=0;i<PACKAGE_LENGTH-1;i++)
    00E7 2766      CLR	R22
    00E8 C008      RJMP	0x00F1
(0061)    {
(0062)      nrf_data[i]=i;   //测试数据,每个数据包的前PACKAGE_LENGTH-1个数据都一致,最后一个字节为数据包的序列号
    00E9 E287      LDI	R24,0x27
    00EA E091      LDI	R25,1
    00EB 2FE6      MOV	R30,R22
    00EC 27FF      CLR	R31
    00ED 0FE8      ADD	R30,R24
    00EE 1FF9      ADC	R31,R25
    00EF 8360      STD	Z+0,R22
    00F0 9563      INC	R22
    00F1 3164      CPI	R22,0x14
    00F2 F3B0      BCS	0x00E9
    00F3 C02E      RJMP	0x0122
(0063)    }
(0064)    
(0065)    while (1)
(0066)    {
(0067) 	  
(0068) 	  nrf_data[PACKAGE_LENGTH-1]=s;   //代表数据包的序列号
    00F4 9340013B  STS	0x13B,R20
(0069) 	  set_Tmode();              //把905设置成发送模式
    00F6 D085      RCALL	_set_Tmode
    00F7 0000      NOP
(0070) 	  EIMSK&=~BIT(5);           //发送时将屏蔽外部中断5
    00F8 B789      IN	R24,0x39
    00F9 7D8F      ANDI	R24,0xDF
    00FA BF89      OUT	0x39,R24
(0071) 	  LED_RED;
    00FB 98D8      CBI	0x1B,0
    00FC 9AD9      SBI	0x1B,1
(0072) 	  set_Taddr(send_addr);
    00FD E004      LDI	R16,4
    00FE E011      LDI	R17,1
    00FF D091      RCALL	_set_Taddr
    0100 0000      NOP
(0073)       TxPacket(nrf_data);
    0101 E207      LDI	R16,0x27
    0102 E011      LDI	R17,1
    0103 D0A7      RCALL	_TxPacket
    0104 0000      NOP
(0074) 	
(0075)       if (led_flag)
    0105 9020010D  LDS	R2,led_flag
    0107 2022      TST	R2
    0108 F031      BEQ	0x010F
(0076) 	  {
(0077) 		LED_RED;
    0109 98D8      CBI	0x1B,0
    010A 9AD9      SBI	0x1B,1
(0078) 		led_flag=0;
    010B 2422      CLR	R2
    010C 9220010D  STS	led_flag,R2
(0079) 	  }
    010E C005      RJMP	0x0114
(0080) 	  else
(0081) 	  {
(0082) 		LED_YELLOW;
    010F 9AD8      SBI	0x1B,0
    0110 98D9      CBI	0x1B,1
(0083) 		led_flag=1;
    0111 E081      LDI	R24,1
    0112 9380010D  STS	led_flag,R24
(0084) 	  }
(0085) 	  
(0086) 	  EIFR|=0XFF;           //清除外部中断的标志位
    0114 B788      IN	R24,0x38
    0115 6F8F      ORI	R24,0xFF
    0116 BF88      OUT	0x38,R24
(0087) 	  set_Rmode();           //nRF设置成接收模式 必须有下一句的开启外部中断5和上一句的清除外部中断的标志位
    0117 D06A      RCALL	_set_Rmode
    0118 0000      NOP
(0088) 	  EIMSK|=BIT(5);         //开启外部中断5,以监测是无线模块是否收到数据
    0119 B789      IN	R24,0x39
    011A 6280      ORI	R24,0x20
    011B BF89      OUT	0x39,R24
(0089) 	  
(0090)       Delays();              //延时一段时间继续发送
    011C DF8B      RCALL	_Delays
    011D 0000      NOP
(0091) 	  s++;
    011E 9543      INC	R20
(0092) 	  if (s==250)
    011F 3F4A      CPI	R20,0xFA
    0120 F409      BNE	0x0122
(0093) 	  {
(0094) 	    s=0;
    0121 2744      CLR	R20
    0122 CFD1      RJMP	0x00F4
    0123 9508      RET
(0095) 	  }
(0096)     }
(0097) }
(0098) 	   
(0099)    
(0100) /*
(0101) *函数功能:处理器初始化函数,将要用到的各个模块的初始化函数放在一起
(0102) *输入参数:无
(0103) *输出参数:无
(0104) *返 回 值:无
(0105) */
(0106) void mcu_init(void)
(0107) {
(0108)   initled();     //led灯初始化
_mcu_init:
    0124 DFA2      RCALL	_initled
    0125 0000      NOP
(0109)   initbuzzer();  //蜂鸣器初始化
    0126 DFA6      RCALL	_initbuzzer
    0127 0000      NOP
(0110)   init_spi();
    0128 DF47      RCALL	_init_spi
    0129 0000      NOP
(0111)   init_905();    //nrf905上电初始化
    012A D00A      RCALL	_init_905
    012B 0000      NOP
(0112)   set_confword(receive_addr);//设置905配置寄存器
    012C E000      LDI	R16,0
    012D E011      LDI	R17,1
    012E D014      RCALL	_set_confword
    012F 0000      NOP
(0113)   send_conf();   //配置寄存器内容
    0130 D033      RCALL	_send_conf
    0131 0000      NOP
(0114)   init_INT();        //DR引脚中断初始化
    0132 DF9D      RCALL	_init_INT
    0133 0000      NOP
    0134 9508      RET
FILE: E:\心电监护系统\测试程序\第一阶段\无线测试\发送端\nrf.c
(0001) 
(0002) #include "spi.h"
(0003) #include "common.h"
(0004) #include "nrf.h"
(0005) 
(0006) unsigned char  broad_addr[4]={0xff,0xff,0xff,0xff};                   //4字节的广播地址
(0007) unsigned char  data_conf[10];
(0008) /**************************************************
(0009) 函数功能:初始化nRF905,
(0010) 输入参数:无
(0011) 输出参数:无
(0012) **************************************************/
(0013) void init_905(void)
(0014) {
(0015) 	DDRE|=(1<<CSN)|(1<<PWR_UP)|(1<<TX_EN);//设置端口E的1,2,3引脚为输出引脚
_init_905:
    0135 B182      IN	R24,0x02
    0136 608E      ORI	R24,0xE
    0137 B982      OUT	0x02,R24
(0016) 	DDRB|=(1<<MOSI)|(1<<SCK)|(1<<TRX_CE);//设置MOSI、SCK和SS 为输出,其他为输入 
    0138 B387      IN	R24,0x17
    0139 6087      ORI	R24,7
    013A BB87      OUT	0x17,R24
(0017) 	
(0018) 	PORTE |=(1<<PWR_UP);              //905上电
    013B 9A1A      SBI	0x03,2
(0019) 	PORTE |=(1<<CSN);                //CSN引脚置位,停止SPI操作,
    013C 9A19      SBI	0x03,1
(0020) 	
(0021) 	PORTB |=1<<SCK;                    // Spi clock line init high	
    013D 9AC1      SBI	0x18,1
(0022) 	   
(0023) 	PORTE &=~(1<<TX_EN);                 
    013E 981B      CBI	0x03,3
(0024) 	PORTB &=~(1<<TRX_CE);               // Set nRF905 in standby mode
    013F 98C0      CBI	0x18,0
(0025) 
(0026) 	Delay3ms();
    0140 DF5D      RCALL	_Delay3ms
    0141 0000      NOP
    0142 9508      RET
(0027) }
(0028) 
(0029) /**************************************************
(0030) 函数功能:设置配置字
(0031) 输入参数:905的接收地址
(0032) 输出参数:无
(0033) **************************************************/
(0034) void set_confword(unsigned char*r_addr)
(0035) { 
(0036)  
(0037)   data_conf[0]=0x01;                  //
_set_confword:
  r_addr               --> R16
    0143 E081      LDI	R24,1
    0144 9380053C  STS	data_conf,R24
(0038)   data_conf[1]=0x0c;                  //不重发数据,接收模式为正常模式,输出功率为10dB("11"),工作在433MHz
    0146 E08C      LDI	R24,0xC
    0147 9380053D  STS	data_conf+1,R24
(0039)   data_conf[2]=0x44;                  //4字节的接收地址和发送地址
    0149 E484      LDI	R24,0x44
    014A 9380053E  STS	data_conf+2,R24
(0040)                
(0041)   data_conf[3]=PACKAGE_LENGTH;         //RX有效数据长度
    014C E185      LDI	R24,0x15
    014D 9380053F  STS	data_conf+3,R24
(0042)   data_conf[4]=PACKAGE_LENGTH;         //TX有效数据长度
    014F 93800540  STS	0x540,R24
(0043) 
(0044)   data_conf[5]=r_addr[0];                //5~8为RX地址
    0151 01F8      MOVW	R30,R16
    0152 8020      LDD	R2,Z+0
    0153 92200541  STS	0x541,R2
(0045)   data_conf[6]=r_addr[1];                                   
    0155 8021      LDD	R2,Z+1
    0156 92200542  STS	0x542,R2
(0046)   data_conf[7]=r_addr[2];
    0158 01F8      MOVW	R30,R16
    0159 8022      LDD	R2,Z+2
    015A 92200543  STS	0x543,R2
(0047)   data_conf[8]=r_addr[3];
    015C 01F8      MOVW	R30,R16
    015D 8023      LDD	R2,Z+3
    015E 92200544  STS	0x544,R2
(0048)   
(0049)   data_conf[9]=0xd8;
    0160 ED88      LDI	R24,0xD8
    0161 93800545  STS	0x545,R24
    0163 9508      RET
_send_conf:
  i                    --> R20
    0164 D088      RCALL	push_gset1
    0165 0000      NOP
(0050)  
(0051) }
(0052) 
(0053) /************************************************************
(0054) 函数功能:发送配置字 ,通过SPI口把设定的配置寄存器的值写入到905
(0055) 输入参数:无
(0056) 输出参数:无
(0057) *************************************************************/
(0058) void send_conf(void)
(0059) {
(0060)   unsigned char  i;		
(0061)   			
(0062)   PORTE &=~(1<<CSN);			// Spi enable for write a spi command
    0166 9819      CBI	0x03,1
(0063)   SpiWrite(WC);				// Write config command写放配置命令
    0167 2700      CLR	R16
    0168 DF14      RCALL	_SpiWrite
    0169 0000      NOP
(0064)   

⌨️ 快捷键说明

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