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

📄 uart.lst

📁 这是关于AVR单片机学习的初步开发
💻 LST
📖 第 1 页 / 共 3 页
字号:
__start:
__text_start:
    0001 E5CF      LDI	R28,0x5F
    0002 E0D2      LDI	R29,2
    0003 BFCD      OUT	0x3D,R28
    0004 BFDE      OUT	0x3E,R29
    0005 51C0      SUBI	R28,0x10
    0006 40D0      SBCI	R29,0
    0007 EA0A      LDI	R16,0xAA
    0008 8308      STD	Y+0,R16
    0009 C05B      RJMP	_timer0_ovf_isr
    000A E6E1      LDI	R30,0x61
    000B E0F0      LDI	R31,0
    000C E010      LDI	R17,0
    000D 37E6      CPI	R30,0x76
    000E C07E      RJMP	_adc_isr
    000F F011      BEQ	0x0012
    0010 9201      ST	R0,Z+
    0011 CFFB      RJMP	0x000D
    0012 8300      STD	Z+0,R16
    0013 E0E0      LDI	R30,0
    0014 E0F0      LDI	R31,0
    0015 E6A0      LDI	R26,0x60
    0016 E0B0      LDI	R27,0
    0017 E010      LDI	R17,0
    0018 30E1      CPI	R30,1
    0019 07F1      CPC	R31,R17
    001A F021      BEQ	0x001F
    001B 95C8      LPM
    001C 9631      ADIW	R30,1
    001D 920D      ST	R0,X+
    001E CFF9      RJMP	0x0018
    001F D0B1      RCALL	_main
_exit:
    0020 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\alf\桌面\新建文件夹\usart.c
(0001) // Target : 8535
(0002) // Crystal: 8.0000Mhz
(0003) 
(0004) #include <iom8535v.h>///?????????????????????????
(0005) #include <macros.h>
(0006) #include <stdio.h>
(0007) #define uchar unsigned char
(0008) #define uint unsigned int
(0009) 
(0010) #define BN 8  // 传送一次的字节数
(0011) #define SLAVE  0xf1 //?????????单片机地址
(0012) 
(0013) uchar rdata[9];
(0014) uchar tdata[9];
(0015) uchar addata;
(0016) uchar receive(uchar addrs);
(0017) uchar send();
(0018) uchar j=3;
(0019) char cData[2];//SPI发送数据
(0020) //char b[2];//接受从机来的数据
(0021) 
(0022) 
(0023) 
(0024) //延时函数
(0025) void delay_1ms(void)
(0026) {
(0027) uint i;
(0028) for(i=1;i<(uint)(8*143-2);i++)
_delay_1ms:
  i                    --> R16
    0021 E001      LDI	R16,1
    0022 E010      LDI	R17,0
    0023 C002      RJMP	0x0026
    0024 5F0F      SUBI	R16,0xFF
    0025 4F1F      SBCI	R17,0xFF
    0026 3706      CPI	R16,0x76
    0027 E0E4      LDI	R30,4
    0028 071E      CPC	R17,R30
    0029 F3D0      BCS	0x0024
(0029) ;
(0030) }//XTAL为晶振频率,单位为MHZ,,,,,,本例用4Mhz
    002A 9508      RET
_delay1:
  i                    --> R20
  n                    --> R22
    002B D208      RCALL	push_gset2
    002C 2F60      MOV	R22,R16
    002D 2F71      MOV	R23,R17
(0031) 
(0032) //获得1ms延时
(0033) void delay1(uint n)
(0034) {
(0035) uint i=0;
    002E 2744      CLR	R20
    002F 2755      CLR	R21
    0030 C003      RJMP	0x0034
(0036) while(i<n)
(0037) {
(0038) delay_1ms();
    0031 DFEF      RCALL	_delay_1ms
(0039) i++;
    0032 5F4F      SUBI	R20,0xFF
    0033 4F5F      SBCI	R21,0xFF
    0034 1746      CP	R20,R22
    0035 0757      CPC	R21,R23
    0036 F3D0      BCS	0x0031
(0040) }
(0041) }
    0037 D1E3      RCALL	pop_gset2
    0038 9508      RET
_EnableInterrupt:
  whichInterrupt       --> R16
    0039 D1E3      RCALL	push_gset1
(0042) 
(0043) 
(0044) 
(0045)  //中断使能
(0046) void EnableInterrupt(uchar whichInterrupt)
(0047) {
(0048)  	 switch(whichInterrupt)
    003A 2F40      MOV	R20,R16
    003B 2755      CLR	R21
    003C 3040      CPI	R20,0
    003D 0745      CPC	R20,R21
    003E F049      BEQ	0x0048
    003F 3040      CPI	R20,0
    0040 E0E0      LDI	R30,0
    0041 075E      CPC	R21,R30
    0042 F054      BLT	0x004D
    0043 304A      CPI	R20,0xA
    0044 E0E0      LDI	R30,0
    0045 075E      CPC	R21,R30
    0046 F019      BEQ	0x004A
    0047 C005      RJMP	0x004D
(0049) 	 {
(0050) 	 case 0://全局中断
(0051) 	 	  asm("SEI");
    0048 9478      BSET	7
(0052) 		  break;
    0049 C003      RJMP	0x004D
(0053) 	 case iv_TIMER0_OVF://T/C0溢出中断
(0054) 	 	TIMSK |= BIT(TOIE0);
    004A B789      IN	R24,0x39
    004B 6081      ORI	R24,1
    004C BF89      OUT	0x39,R24
(0055) 		break; 
(0056) 	 }
(0057) }
    004D D1D2      RCALL	pop_gset1
    004E 9508      RET
_DisableInterrupt:
  whichInterrupt       --> R16
    004F D1CD      RCALL	push_gset1
(0058) //中断未使能
(0059) void DisableInterrupt(uchar whichInterrupt)
(0060) {
(0061)  	 switch(whichInterrupt)
    0050 2F40      MOV	R20,R16
    0051 2755      CLR	R21
    0052 3040      CPI	R20,0
    0053 0745      CPC	R20,R21
    0054 F049      BEQ	0x005E
    0055 3040      CPI	R20,0
    0056 E0E0      LDI	R30,0
    0057 075E      CPC	R21,R30
    0058 F054      BLT	0x0063
    0059 304A      CPI	R20,0xA
    005A E0E0      LDI	R30,0
    005B 075E      CPC	R21,R30
    005C F019      BEQ	0x0060
    005D C005      RJMP	0x0063
(0062) 	 {
(0063) 	 case 0://全局中断
(0064) 	 	  asm("CLI");
    005E 94F8      BCLR	7
(0065) 		  break;
    005F C003      RJMP	0x0063
(0066) 	 case iv_TIMER0_OVF://T/C0溢出中断
(0067) 	 	TIMSK &= ~BIT(TOIE0);
    0060 B789      IN	R24,0x39
    0061 7F8E      ANDI	R24,0xFE
    0062 BF89      OUT	0x39,R24
(0068) 		break;
(0069) 	 }
(0070) }
    0063 D1BC      RCALL	pop_gset1
    0064 9508      RET
_timer0_ovf_isr:
    0065 938A      ST	R24,-Y
    0066 B78F      IN	R24,0x3F
    0067 938A      ST	R24,-Y
(0071) 
(0072) //定时器/计数器溢出中断
(0073) #pragma interrupt_handler timer0_ovf_isr:10
(0074) void timer0_ovf_isr(void)
(0075) {
(0076)  TCNT0 = 0x83; //reload counter value
    0068 E883      LDI	R24,0x83
    0069 BF82      OUT	0x32,R24
(0077) }
    006A 9189      LD	R24,Y+
    006B BF8F      OUT	0x3F,R24
    006C 9189      LD	R24,Y+
    006D 9518      RETI
(0078) 
(0079) 
(0080) 
(0081) ////********************USART异步串口通讯部分******************************////
(0082) // USART initialisation
(0083) /*
(0084) //void USART_Init(void)
(0085) void uart0_init(uint baud)
(0086) {
(0087) 
(0088) UBRRH = (unsigned char)(baud>>8);
(0089) UBRRL = (unsigned char)baud;
(0090) 	
(0091) //设置帧格式: 8 个数据位, 1 个停止位  
(0092) UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //选择默认的无奇偶校验位 
(0093)   
(0094) // 接收器与发送器使能
(0095) UCSRB = (1<<RXEN)|(1<<TXEN);
(0096) 
(0097) }
(0098) */
(0099) 
(0100) void USART_Init(void)
(0101) {
(0102) //波特率设置
(0103) // desired baud rate: 19200
(0104) // actual: baud rate:19231 (0.2%)
(0105) 	//UCR  = 0x00; //disable while setting baud rate
(0106)     UBRR = 0x19; //set baud rate 19200,溢出时间为2.1s
_USART_Init:
    006E E189      LDI	R24,0x19
    006F B989      OUT	0x09,R24
(0107)    // UCR  = 0xFC; //enable
(0108) 	
(0109) //设置帧格式: 8 个数据位, 1 个停止位  
(0110) UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); //选择默认的无奇偶校验位 
    0070 E886      LDI	R24,0x86
    0071 BD80      OUT	0x20,R24
(0111)                                                                                                                       /* UBRRH = (unsigned char)(baud>>8);UBRRL = (unsigned char)baud;*/
(0112) // ???UCSRC = (1<<URSEL)|(3<<UCSZ0);    //UCSZ2-0; UCSZ1-1; UCSZ0-1时字符为8位,,USBS为0时停止位为1,,UPM1-1;UPM0-0为偶校验 ,UPM1-1;UPM0-1为奇校验                                                                               
(0113) // 设置帧格式: 8 个数据位, 2 个停止位*/
(0114) //UCSRC = (1<<URSEL)|(1<<USBS)|(3<<UCSZ0);
(0115)   
(0116) /* 接收器与发送器使能*/
(0117) UCSRB = (1<<RXEN)|(1<<TXEN);
    0072 E188      LDI	R24,0x18
    0073 B98A      OUT	0x0A,R24
(0118) 
(0119) }
    0074 9508      RET
(0120) 
(0121) 
(0122) //串口发送数据查询方式
(0123) void USART_Transmit(uchar x)       
(0124) {
(0125)    
(0126)    //等待数据寄存器空
(0127)    while(!( UCSRA & (1<<UDRE)))
_USART_Transmit:
  x                    --> R16
    0075 9B5D      SBIS	0x0B,5
    0076 CFFE      RJMP	_USART_Transmit
(0128)    ;
(0129)    
(0130)    UDR=x;
    0077 B90C      OUT	0x0C,R16
(0131)    
(0132)    PORTB|=0x08;//PB4输出高电平,驱动LED灯,打开绿色灯
    0078 9AC3      SBI	0x18,3
(0133)    
(0134) }
    0079 9508      RET
(0135) 
(0136) //串口查询方式接受数据
(0137) uchar USART_Receive( void )
(0138) {
(0139) /* 等待接收数据*/
(0140) while ( !(UCSRA&(1<<RXC)) )
_USART_Receive:
    007A 9B5F      SBIS	0x0B,7
    007B CFFE      RJMP	_USART_Receive
(0141) ;
(0142) /* 从缓冲器中获取并返回数据*/
(0143) return UDR;
    007C B10C      IN	R16,0x0C
    007D 9508      RET
(0144) }	
(0145) 
(0146) 
(0147) /////***********************通过SPI接口与从机通信**********************************////
(0148) 
(0149) //SPI 主机模式
(0150) void SPI_MasterInit(void)
(0151) {
(0152) /* 设置MOSI 和SCK 为输出,其他为输入 */
(0153) DDRB= (1<<DDB5)|(1<<DDB7)|(1<<DDB4);//SS,sck,mosi为输出
_SPI_MasterInit:
    007E EB80      LDI	R24,0xB0
    007F BB87      OUT	0x17,R24
(0154) /* 使能SPI 主机模式,设置时钟速率为fck/16 */
(0155) SPCR = (1<<SPE)|(1<<MSTR)|(1<<SPR0);
    0080 E581      LDI	R24,0x51
    0081 B98D      OUT	0x0D,R24
(0156) 
(0157) // clock rate: 2Mhz	//SPI设置
(0158) //  SPCR = 0xF4; //setup SPI
(0159) }
    0082 9508      RET
(0160) 
(0161) //SPI发送数据给从机
(0162) void SPI_MasterTransmit(char cData )
(0163) {
(0164) //启动数据传输 
(0165)     //   b[i]=SPDR;//接受从机来的数据
(0166)     SPDR = cData;
_SPI_MasterTransmit:
  cData                --> R16
    0083 B90F      OUT	0x0F,R16
(0167) 	
(0168) /*
(0169)    PORTB|=0x08;//PB4输出高电平,驱动LED灯,打开绿色灯
(0170)    delay1(100);//延时500ms
(0171)    PORTB&=0x08;//关闭绿灯
(0172)  */
(0173)  
(0174) // 等待传输结束
(0175) while(!(SPSR & (1<<SPIF)))
    0084 9B77      SBIS	0x0E,7
    0085 CFFE      RJMP	0x0084
(0176) ;
(0177) }
    0086 9508      RET
(0178) 
(0179) /////****************************ADC转换********************************////
(0180) 
(0181) //ADC initialisation
(0182) // Conversion time: 6uS

⌨️ 快捷键说明

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