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

📄 sr.lst

📁 PTR8000无线通信模块的单片机控制程序
💻 LST
📖 第 1 页 / 共 2 页
字号:
    008B F091      BEQ	0x009E
    008C C011      RJMP	0x009E
(0194) 	{
(0195) 		//从机接收模式下的中断程序
(0196)     case 0x60: TWCR=0xc5;break;      	       // SLA+W已经接收,ACK已返回(从机被寻址,等待主机发送数据)
    008D EC85      LDI	R24,0xC5
    008E BF86      OUT	0x36,R24
    008F C00E      RJMP	0x009E
(0197)     case 0x80: receive_data = TWDR;TWCR=0xc5;break;  // 数据已接收,ACK已返回(接收数据)
    0090 B023      IN	R2,0x03
    0091 92200060  STS	0x60,R2
    0093 EC85      LDI	R24,0xC5
    0094 BF86      OUT	0x36,R24
    0095 C008      RJMP	0x009E
(0198)     case 0x88: TWCR=0xc5;break;			       // 数据已接收,NOT ACK已返回(下一步:退出总线)
    0096 EC85      LDI	R24,0xC5
    0097 BF86      OUT	0x36,R24
    0098 C005      RJMP	0x009E
(0199) 	case 0xA0: TWCR=0xc5;break;			       // 接收到STOP或重复的START信号(停止接收数据)
    0099 EC85      LDI	R24,0xC5
    009A BF86      OUT	0x36,R24
    009B C002      RJMP	0x009E
(0200) 		
(0201) 	/*	//主机接收模式下的中断程序
(0202)     case 0x38: error_state=4;TWCR=0xc5;break;  // SLA+R或NOT ACK仲裁失败(下一步:退出总线)
(0203) 	case 0x40: TWCR=0xc5; break;               // SLA+R已发送,接收到ACK(从机被寻址,主机等待接收数据)
(0204) 	case 0x48: error_state=5;TWCR=0xc5;break;  // SLA+R已发送,接收到NOT ACK(下一步:退出总线)
(0205)     case 0x50: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break;	// 接收到数据,ACK已返回(接收数据)
(0206) 	case 0x58: receive_data = TWDR;_NOP();_NOP();error_state=8;TWCR = 0xc4;break;   // 接收到数据,NOT ACK已返回(下一步:退出总线)
(0207) 		
(0208) 		//从机发送模式
(0209) 	case 0xA8: TWDR= send_data;_NOP();_NOP();TWCR= 0x85; break; // SLA+R已接收,ACK已返回(从机被寻址,开送发送数据)
(0210) 	case 0xB8: TWCR= 0xc5;break;              // TWDR里的数据已发送,接受到ACK(主机接收到数据,继续发送数据)
(0211) 	case 0xC0: TWCR= 0xc5;break;			  // TWDR里的数据已发送,接受到NOT ACK(下一步:退出总线)
(0212) 	case 0xC8: TWCR= 0xc5;break;              // TWEA=0,接收到ACK(停止发送数据,退出发送)
(0213) 		*/
(0214) 		//其他状态码
(0215) 	case 0xf8: break;						  // 等待或进行当前传输
(0216) 	case 0x00: TWCR= 0x95;break;              // 非法的START或STOP引起的总线错误(释放总线)
    009C E985      LDI	R24,0x95
    009D BF86      OUT	0x36,R24
(0217)     default:   break;
(0218) 	}
(0219) 	return receive_data;					  // 返回接收到的数据
    009E 91000060  LDS	R16,0x60
    00A0 9029      LD	R2,Y+
    00A1 BE2F      OUT	0x3F,R2
    00A2 91E9      LD	R30,Y+
    00A3 9199      LD	R25,Y+
    00A4 9189      LD	R24,Y+
    00A5 9119      LD	R17,Y+
    00A6 9109      LD	R16,Y+
    00A7 9029      LD	R2,Y+
    00A8 9518      RETI
FILE: E:\iccavr\无线+I2C\test1--sr\twimain.c
(0001) 
(0002) /*函数的使用说明:
(0003) 1.该twi模块包含四种工作模式,主发,主收,从收,从发,其中主发由
(0004)   twiWriteByte(从机地址,要发送的数据)实现,主收由twiReadByte(从机地址)实现,从机
(0005)   的发送与接收均通过中断实现
(0006) 2.在从机模式下,需调用twi_init()来使能并初始化twi总线
(0007) 3.在主机模式下,调用twiWriteByte(从机地址,要发送的数据)向指定的从机写入数据,
(0008)   调用twiReadByte(从机地址)从指定的从机读取数据,然后可通过查询错误状态error_state
(0009)   的值决定下一步如何操作。
(0010) */
(0011) 
(0012) #include "twi.h"
(0013) 
(0014) //TWI同程序的接口参数
(0015) //receive_data,error_state不用设置
(0016) char receive_data=0;  		  // 接收到的数据
(0017) char error_state=0;   		  // twi错误状态
(0018) //以下三个参数根据需求进行设置
(0019) char slave_address=0xC0;      // 设置从机地址,Bits 7..1:存放从机地址,Bit 0:最低位为广播识别使能位
(0020) char bit_race=0x20;           // 设置主机模式的比特率,SCL=CPU频率/(16+2*(TWBR)*4TWPS),TWPS在4的指数位置
(0021) char send_data=0x02;     	  // 从机发送模式下从机向主机发送的数据
(0022) //要发送的数据
(0023) char trandata[num] = {0x00,0x01,0x02,0x03};
(0024) //*************************** twi错误状态说明*********************************
(0025) // 0:twi传送无错误
(0026) // 1:在主发模式下,SLA+W已发送,返回NOT ACK
(0027) // 2:在主发模式下,DATA已发送,返回NOT ACK
(0028) // 3:在主发模式下,SLA+W或者数据的仲裁失败
(0029) // 4:在主收模式下,SLA+R或者数据的仲裁失败
(0030) // 5:在主收模式下,SLA+R已发送,返回NOT ACK
(0031) // 6:在主发模式下,START信号发送不成功
(0032) // 7:在主收模式下,START信号发送不成功
(0033) // 8:在主收模式下,数据接受完成
(0034) // 9:在主收模式下,数据接受不成功
(0035) //*****************************************************************************
(0036) //*************************** 延时1ms 程序 *************************************
(0037) //******************************************************************************
(0038) void Delay_1ms(void)
(0039) {
(0040) 	unsigned int i;
(0041) 	for(i = 0;i < (unsigned int)11 * 143 - 2;i ++);
_Delay_1ms:
  i                    --> R16
    00A9 2700      CLR	R16
    00AA 2711      CLR	R17
    00AB C002      RJMP	0x00AE
    00AC 5F0F      SUBI	R16,0xFF
    00AD 4F1F      SBCI	R17,0xFF
    00AE 3203      CPI	R16,0x23
    00AF E0E6      LDI	R30,6
    00B0 071E      CPC	R17,R30
    00B1 F3D0      BCS	0x00AC
(0042) }
    00B2 9508      RET
_Delay_Nms:
  j                    --> R20
  i                    --> R22
    00B3 D05F      RCALL	push_gset2
    00B4 01B8      MOVW	R22,R16
(0043) //*************************** 延时1s 程序 **************************************
(0044) //******************************************************************************
(0045) void Delay_Nms(unsigned int i)
(0046) {
(0047) 	unsigned int j;
(0048) 	for(j = 0;j < i;j ++)
    00B5 2744      CLR	R20
    00B6 2755      CLR	R21
    00B7 C003      RJMP	0x00BB
(0049) 		Delay_1ms();
    00B8 DFF0      RCALL	_Delay_1ms
    00B9 5F4F      SUBI	R20,0xFF
    00BA 4F5F      SBCI	R21,0xFF
    00BB 1746      CP	R20,R22
    00BC 0757      CPC	R21,R23
    00BD F3D0      BCS	0x00B8
(0050) }
    00BE D03B      RCALL	pop_gset2
    00BF 9508      RET
(0051) //*************************** I/O 初始化****************************************
(0052) //******************************************************************************
(0053) void port_init(void)
(0054) {
(0055) 	PORTB = 0x2f;	//置PB0,PB1,PB2,PB3,PB5为1,PB4,PB6,PB7为0
_port_init:
    00C0 E28F      LDI	R24,0x2F
    00C1 BB88      OUT	0x18,R24
(0056) 	DDRB = 0x2f;	//置PB0,PB1,PB2--SS,PB3--MOSI,PB5--SCK为输出,PB4--MISO为输入
    00C2 BB87      OUT	0x17,R24
(0057) 	PORTC = 0x0f;   
    00C3 E08F      LDI	R24,0xF
    00C4 BB85      OUT	0x15,R24
(0058) 	DDRC  = 0x0f;	//PC4--SDA,PC5--SCL为输入,PC0--PC3全为输出以便测试
    00C5 BB84      OUT	0x14,R24
(0059) 	PORTD = 0x05;	//置PWR,TXEN为1,  TRXCE为0
    00C6 E085      LDI	R24,5
    00C7 BB82      OUT	0x12,R24
(0060) 	DDRD  = 0x07;	//置PD3,PD4,PD5输入;PD2--PWR,PD0--TXEN,PD1--TRXCE输出
    00C8 E087      LDI	R24,7
    00C9 BB81      OUT	0x11,R24
(0061) }
    00CA 9508      RET
(0062) //******************************串口程序****************************************
(0063) //******************************************************************************
(0064) //UART0 initialize
(0065) // desired baud rate: 9600
(0066) // actual: baud rate:9600 (0.0%)
(0067) // char size: 8 bit
(0068) // parity: Disabled
(0069) void uart0_init(void)
(0070) {
(0071)  UCSRB = 0x00; //disable while setting baud rate
_uart0_init:
    00CB 2422      CLR	R2
    00CC B82A      OUT	0x0A,R2
(0072)  UCSRA = 0x00;
    00CD B82B      OUT	0x0B,R2
(0073)  UCSRC = BIT(URSEL) | 0x0E;
    00CE E88E      LDI	R24,0x8E
    00CF BD80      OUT	0x20,R24
(0074)  UBRRL = 0x47; //set baud rate lo
    00D0 E487      LDI	R24,0x47
    00D1 B989      OUT	0x09,R24
(0075)  UBRRH = 0x00; //set baud rate hi
    00D2 BC20      OUT	0x20,R2
(0076)  UCSRB = 0x98;
    00D3 E988      LDI	R24,0x98
    00D4 B98A      OUT	0x0A,R24
(0077) }
    00D5 9508      RET
(0078) //********************串口程序函数实现部分**************************************
(0079) //******************************************************************************
(0080) void USART_Transmit( unsigned char data )
(0081) {
(0082) 	while ( !( UCSRA & (1<<UDRE)));   // 等待发送缓冲器为空
_USART_Transmit:
  data                 --> R16
    00D6 9B5D      SBIS	0x0B,5
    00D7 CFFE      RJMP	_USART_Transmit
(0083) 	UDR = data; 	  // 将数据放入缓冲器,发送数据
    00D8 B90C      OUT	0x0C,R16
(0084) }
    00D9 9508      RET
(0085) 
(0086) #pragma interrupt_handler uart0_rx_isr:12
(0087) void uart0_rx_isr(void)
(0088) {
(0089) 	//uart has received a character in UDR
(0090) }
_uart0_rx_isr:
    00DA 9518      RETI
(0091) //****************************** 初始化外围 ************************************
(0092) //******************************************************************************
(0093) void init_devices(void)
(0094) {
(0095)  //stop errant interrupts until set up
(0096)  CLI(); //disable all interrupts
_init_devices:
    00DB 94F8      BCLR	7
(0097)  port_init();
    00DC DFE3      RCALL	_port_init
(0098)  uart0_init();
    00DD DFED      RCALL	_uart0_init
(0099)  MCUCR = 0x00;
    00DE 2422      CLR	R2
    00DF BE25      OUT	0x35,R2
(0100)  GICR  = 0x00;
    00E0 BE2B      OUT	0x3B,R2
(0101)  TIMSK = 0x00; //timer interrupt sources
    00E1 BE29      OUT	0x39,R2
(0102)  SEI(); //re-enable interrupts
    00E2 9478      BSET	7
(0103)  //all peripherals are now initialized
(0104) }
    00E3 9508      RET
(0105) //****************************** 主函数  ***************************************
(0106) /*该程序工作于从收模式下,在基于中断的该模式下,cpu顺序接收来自主机的字符,并根
(0107) 据字符的值去置位PC0--PC3为低,PC0--PC3可以外接LED以显示操作的结果
(0108) */
(0109) //******************************************************************************
(0110) void main(void)
(0111) {
(0112)  	int i;
(0113) 	init_devices();
_main:
  i                    --> Y+1
    00E4 DFF6      RCALL	_init_devices
(0114) 	Delay_Nms(2000);
    00E5 ED00      LDI	R16,0xD0
    00E6 E017      LDI	R17,7
    00E7 DFCB      RCALL	_Delay_Nms
    00E8 C00F      RJMP	0x00F8
(0115) 	while(1)
(0116) 	{
(0117) 	 	if(receive_data == 0x00)
    00E9 90200060  LDS	R2,0x60
    00EB 2022      TST	R2
    00EC F411      BNE	0x00EF
(0118) 		{
(0119) 		 	PORTC &= ~BIT(PC0);
    00ED 98A8      CBI	0x15,0
(0120) 		}
    00EE C009      RJMP	0x00F8
(0121) 		else if(receive_data == 0x01)
    00EF 91800060  LDS	R24,0x60
    00F1 3081      CPI	R24,1
    00F2 F411      BNE	0x00F5
(0122) 		{
(0123) 		 	PORTC &= ~BIT(PC1);
    00F3 98A9      CBI	0x15,1
(0124) 		}
    00F4 C003      RJMP	0x00F8
(0125) 		else
(0126) 		PORTC |= 0X0f;
    00F5 B385      IN	R24,0x15
    00F6 608F      ORI	R24,0xF
    00F7 BB85      OUT	0x15,R24
    00F8 CFF0      RJMP	0x00E9
(0127) 		
(0128) 		
(0129) 		/* for(i = 0 ; i < num ; i ++)
(0130) 		 {
(0131) 			USART_Transmit( receive_data )	//给下位机发送接收到的数据,
(0132) 			Delay_1ms();
(0133) 		 }*/
(0134) 	}
(0135) }
FILE: <library>
    00F9 9508      RET
pop_gset2:
    00FA E0E2      LDI	R30,2
    00FB C004      RJMP	pop
push_gset1:
    00FC 935A      ST	R21,-Y
    00FD 934A      ST	R20,-Y
    00FE 9508      RET
pop_gset1:
    00FF E0E1      LDI	R30,1
pop:
    0100 9149      LD	R20,Y+
    0101 9159      LD	R21,Y+
    0102 FDE0      SBRC	R30,0
    0103 9508      RET
    0104 9169      LD	R22,Y+
    0105 9179      LD	R23,Y+
    0106 FDE1      SBRC	R30,1
    0107 9508      RET
    0108 90A9      LD	R10,Y+
    0109 90B9      LD	R11,Y+
    010A FDE2      SBRC	R30,2
    010B 9508      RET
    010C 90C9      LD	R12,Y+
    010D 90D9      LD	R13,Y+
    010E FDE3      SBRC	R30,3
    010F 9508      RET
    0110 90E9      LD	R14,Y+
    0111 90F9      LD	R15,Y+
    0112 9508      RET
push_gset2:
    0113 937A      ST	R23,-Y
    0114 936A      ST	R22,-Y
    0115 CFE6      RJMP	push_gset1

⌨️ 快捷键说明

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