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

📄 smart.lst

📁 基于MEAG16的电机PID控制程序
💻 LST
📖 第 1 页 / 共 4 页
字号:
__start:
__text_start:
    0047 E5CF      LDI	R28,0x5F
    0048 E0D4      LDI	R29,4
    0049 BFCD      OUT	0x3D,R28
    004A BFDE      OUT	0x3E,R29
    004B 51C0      SUBI	R28,0x10
    004C 40D0      SBCI	R29,0
    004D EA0A      LDI	R16,0xAA
    004E 8308      STD	Y+0,R16
    004F 2400      CLR	R0
    0050 E7E6      LDI	R30,0x76
    0051 E0F0      LDI	R31,0
    0052 E010      LDI	R17,0
    0053 39E7      CPI	R30,0x97
    0054 07F1      CPC	R31,R17
    0055 F011      BEQ	0x0058
    0056 9201      ST	R0,Z+
    0057 CFFB      RJMP	0x0053
    0058 8300      STD	Z+0,R16
    0059 E7E7      LDI	R30,0x77
    005A E0F0      LDI	R31,0
    005B E6A0      LDI	R26,0x60
    005C E0B0      LDI	R27,0
    005D E010      LDI	R17,0
    005E 38ED      CPI	R30,0x8D
    005F 07F1      CPC	R31,R17
    0060 F021      BEQ	0x0065
    0061 95C8      LPM
    0062 9631      ADIW	R30,1
    0063 920D      ST	R0,X+
    0064 CFF9      RJMP	0x005E
    0065 940E0231  CALL	_main
_exit:
    0067 CFFF      RJMP	_exit
FILE: C:\DOCUME~1\haolxy\桌面\smartcar\smartcar\main.c
(0001) //ICC-AVR application builder : 2009-2-18 11:55:58
(0002) // Target : M16
(0003) // Crystal: 8.0000Mhz
(0004) 
(0005) #include <iom16v.h>
(0006) #include <macros.h>
(0007) #define  mclk   8000000
(0008) 
(0009) 
(0010) 
(0011) 
(0012) 
(0013) //============================================================= 
(0014) // 函数名: void port_init(void)
(0015) // 功能: 端口初始化,所有端口都变为高阻态
(0016) // 参数: none
(0017) // 返回值: none
(0018) // 使用方法:port_init();
(0019) //=============================================================
(0020) void port_init(void)
(0021) {
(0022)     DDRA = 0x00;
_port_init:
    0068 2422      CLR	R2
    0069 BA2A      OUT	0x1A,R2
(0023) 	PORTA = 0x00;
    006A BA2B      OUT	0x1B,R2
(0024) 	DDRB = 0x00;
    006B BA27      OUT	0x17,R2
(0025) 	PORTB = 0x00;
    006C BA28      OUT	0x18,R2
(0026) 	DDRC = 0x00;
    006D BA24      OUT	0x14,R2
(0027) 	PORTC = 0x00;
    006E BA25      OUT	0x15,R2
(0028) 	DDRD = 0x00;
    006F BA21      OUT	0x11,R2
(0029) 	PORTD = 0x00;
    0070 BA22      OUT	0x12,R2
    0071 9508      RET
(0030) }
(0031) 
(0032) 
(0033) //////////////////////////////////////////////////////////////////////////////////////////////////////
(0034) 
(0035) 
(0036) //============================================================= 
(0037) // 函数名: void motor_a(unsigned char fx,int speed)
(0038) // 功能: 控制电机A的旋转方向以及转速
(0039) // 参数: unsigned char fx,int speed  fx为0或者1,speed为0-1023
(0040) // 返回值: none
(0041) // 使用方法:motor_a(0,1000);
(0042) //=============================================================
(0043) void motor_a(unsigned char fx,int speed)
(0044) {
(0045)     if(fx)
_motor_a:
  speed                --> R18
  fx                   --> R16
    0072 2300      TST	R16
    0073 F019      BEQ	0x0077
(0046) 	{
(0047) 	    PORTB |= BIT(2);
    0074 9AC2      SBI	0x18,2
(0048) 		PORTB &= ~BIT(0);
    0075 98C0      CBI	0x18,0
(0049) 	}  
    0076 C002      RJMP	0x0079
(0050) 	else
(0051) 	{
(0052) 	    PORTB |= BIT(0);
    0077 9AC0      SBI	0x18,0
(0053) 		PORTB &= ~BIT(2);
    0078 98C2      CBI	0x18,2
(0054) 	}
(0055) 	OCR1A = speed;  
    0079 BD3B      OUT	0x2B,R19
    007A BD2A      OUT	0x2A,R18
    007B 9508      RET
(0056) }
(0057) 
(0058) //============================================================= 
(0059) // 函数名: void motor_b(unsigned char fx,int speed)
(0060) // 功能: 控制电机A的旋转方向以及转速
(0061) // 参数: unsigned char fx,int speed  fx为0或者1,speed为0-1023
(0062) // 返回值: none
(0063) // 使用方法:motor_b(0,1000);
(0064) //=============================================================
(0065) void motor_b(unsigned char fx,int speed)
(0066) {
(0067)     if(fx)
_motor_b:
  speed                --> R18
  fx                   --> R16
    007C 2300      TST	R16
    007D F019      BEQ	0x0081
(0068) 	{
(0069) 	    PORTB |= BIT(4);
    007E 9AC4      SBI	0x18,4
(0070) 		PORTB &= ~BIT(1);
    007F 98C1      CBI	0x18,1
(0071) 	}  
    0080 C002      RJMP	0x0083
(0072) 	else
(0073) 	{
(0074) 	    PORTB |= BIT(1);
    0081 9AC1      SBI	0x18,1
(0075) 		PORTB &= ~BIT(4);
    0082 98C4      CBI	0x18,4
(0076) 	}
(0077) 	OCR1B = speed;  
    0083 BD39      OUT	0x29,R19
    0084 BD28      OUT	0x28,R18
    0085 9508      RET
(0078) }
(0079) //============================================================= 
(0080) // 函数名: void motor_init(void)
(0081) // 功能: 电机控制初始化
(0082) // 参数: none
(0083) // 返回值: none
(0084) // 使用方法:motor_init();
(0085) //=============================================================
(0086) void motor_init(void)
(0087) {
(0088)     DDRB |= 0x17;
_motor_init:
    0086 B387      IN	R24,0x17
    0087 6187      ORI	R24,0x17
    0088 BB87      OUT	0x17,R24
(0089) 	PORTB &= ~0x03;
    0089 B388      IN	R24,0x18
    008A 7F8C      ANDI	R24,0xFC
    008B BB88      OUT	0x18,R24
(0090) 	PORTB |= 0x14;
    008C B388      IN	R24,0x18
    008D 6184      ORI	R24,0x14
    008E BB88      OUT	0x18,R24
(0091) 	DDRD |= 0x30;
    008F B381      IN	R24,0x11
    0090 6380      ORI	R24,0x30
    0091 BB81      OUT	0x11,R24
(0092) 	PORTD |= 0x30;
    0092 B382      IN	R24,0x12
    0093 6380      ORI	R24,0x30
    0094 BB82      OUT	0x12,R24
(0093) 	TCCR1A = 0xA3;
    0095 EA83      LDI	R24,0xA3
    0096 BD8F      OUT	0x2F,R24
(0094) 	TCCR1B = 0x0A;
    0097 E08A      LDI	R24,0xA
    0098 BD8E      OUT	0x2E,R24
(0095) 	OCR1A = 0;
    0099 2422      CLR	R2
    009A 2433      CLR	R3
    009B BC3B      OUT	0x2B,R3
    009C BC2A      OUT	0x2A,R2
(0096) 	OCR1B = 0;
    009D BC39      OUT	0x29,R3
    009E BC28      OUT	0x28,R2
    009F 9508      RET
_uart_init:
  baud                 --> R10
    00A0 940E03F8  CALL	push_gset3
    00A2 0158      MOVW	R10,R16
(0097) }
(0098) 
(0099) 
(0100) ////////////////////////////////////////////////////////////////////////////////////////////////////////////////
(0101) 
(0102) 
(0103) //============================================================= 
(0104) // 函数名:void uart_init(unsigned int baud)
(0105) // 功能: 异步串行通信初始化
(0106) // 参数: unsigned int baud  设置通信波特率
(0107) // 返回值: none
(0108) // 使用方法:uart_init(19200);
(0109) //=============================================================
(0110) void uart_init(unsigned int baud)
(0111) {
(0112)    UCSRB=0x00; 
    00A3 2422      CLR	R2
    00A4 B82A      OUT	0x0A,R2
(0113)    UCSRA=0x00; 		    //控制寄存器清零
    00A5 B82B      OUT	0x0B,R2
(0114)    UCSRC=(1<<URSEL)|(0<<UPM0)|(3<<UCSZ0);      //选择UCSRC,异步模式,禁止校验,1位停止位,8位数据位
    00A6 E886      LDI	R24,0x86
    00A7 BD80      OUT	0x20,R24
(0115)    baud=mclk/16/baud-1	;   //波特率最大为65K
    00A8 0115      MOVW	R2,R10
    00A9 2444      CLR	R4
    00AA 2455      CLR	R5
    00AB E240      LDI	R20,0x20
    00AC EA51      LDI	R21,0xA1
    00AD E067      LDI	R22,7
    00AE E070      LDI	R23,0
    00AF 925A      ST	R5,-Y
    00B0 924A      ST	R4,-Y
    00B1 923A      ST	R3,-Y
    00B2 922A      ST	R2,-Y
    00B3 018A      MOVW	R16,R20
    00B4 019B      MOVW	R18,R22
    00B5 940E0373  CALL	div32s
    00B7 E041      LDI	R20,1
    00B8 E050      LDI	R21,0
    00B9 E060      LDI	R22,0
    00BA E070      LDI	R23,0
    00BB 0118      MOVW	R2,R16
    00BC 0129      MOVW	R4,R18
    00BD 1A24      SUB	R2,R20
    00BE 0A35      SBC	R3,R21
    00BF 0A46      SBC	R4,R22
    00C0 0A57      SBC	R5,R23
    00C1 0151      MOVW	R10,R2
(0116)    UBRRL=baud; 					     	  
    00C2 B829      OUT	0x09,R2
(0117)    UBRRH=baud>>8; 		   //设置波特率
    00C3 2C23      MOV	R2,R3
    00C4 2433      CLR	R3
    00C5 BC20      OUT	0x20,R2
(0118)    UCSRB=(1<<TXEN)|(1<<RXEN)|(1<<RXCIE);   //接收、发送使能,接收中断使能
    00C6 E988      LDI	R24,0x98
    00C7 B98A      OUT	0x0A,R24
(0119)    DDRD|=0X02;	                //配置TX为输出(很重要)
    00C8 9A89      SBI	0x11,1
    00C9 940E03F1  CALL	pop_gset3
    00CB 9508      RET
(0120) }
(0121) //============================================================= 
(0122) // 函数名:void uart_sendB(unsigned char data)
(0123) // 功能: 串口发送一个字节
(0124) // 参数: unsigned char data  写入要发送的数据
(0125) // 返回值: none
(0126) // 使用方法:uart_sendB('a');
(0127) //=============================================================
(0128) void uart_sendB(unsigned char data)
(0129) {
(0130)    while(!(UCSRA&(BIT(UDRE)))) ;
_uart_sendB:
  data                 --> R16
    00CC 9B5D      SBIS	0x0B,5
    00CD CFFE      RJMP	_uart_sendB
(0131)    UDR=data;
    00CE B90C      OUT	0x0C,R16
(0132)    while(!(UCSRA&(BIT(TXC))));
    00CF 9B5E      SBIS	0x0B,6
    00D0 CFFE      RJMP	0x00CF
(0133)    UCSRA|=BIT(TXC);
    00D1 9A5E      SBI	0x0B,6
    00D2 9508      RET
_uart_send:
  d                    --> Y+0
  data                 --> R20
    00D3 940E03FC  CALL	push_gset1
    00D5 01A8      MOVW	R20,R16
    00D6 9724      SBIW	R28,4
(0134) }
(0135) //============================================================= 
(0136) // 函数名:void uart_send(int data)
(0137) // 功能: 串口发送一个4位10进制数
(0138) // 参数: int data  写入要发送的数据
(0139) // 返回值: none
(0140) // 使用方法:uart_sendB(1234);
(0141) //=============================================================
(0142) void uart_send(int data)
(0143) {
(0144)     	unsigned char d[4];
(0145) 	d[3]=data/1000;
    00D7 EE28      LDI	R18,0xE8
    00D8 E033      LDI	R19,3
    00D9 018A      MOVW	R16,R20
    00DA 940E0337  CALL	div16s
    00DC 830B      STD	Y+3,R16
(0146) 	data=data%1000;
    00DD EE28      LDI	R18,0xE8
    00DE E033      LDI	R19,3
    00DF 018A      MOVW	R16,R20
    00E0 940E0333  CALL	mod16s
    00E2 01A8      MOVW	R20,R16
(0147) 	d[2]=data/100;
    00E3 E624      LDI	R18,0x64
    00E4 E030      LDI	R19,0
    00E5 940E0337  CALL	div16s
    00E7 830A      STD	Y+2,R16
(0148) 	data=data%100;
    00E8 E624      LDI	R18,0x64
    00E9 E030      LDI	R19,0
    00EA 018A      MOVW	R16,R20
    00EB 940E0333  CALL	mod16s
    00ED 01A8      MOVW	R20,R16
(0149) 	d[1]=data/10;
    00EE E02A      LDI	R18,0xA
    00EF E030      LDI	R19,0
    00F0 940E0337  CALL	div16s
    00F2 8309      STD	Y+1,R16
(0150) 	d[0]=data%10;
    00F3 E02A      LDI	R18,0xA
    00F4 E030      LDI	R19,0
    00F5 018A      MOVW	R16,R20
    00F6 940E0333  CALL	mod16s
    00F8 8308      STD	Y+0,R16
(0151) 	uart_sendB(d[3]+'0');
    00F9 810B      LDD	R16,Y+3
    00FA 5D00      SUBI	R16,0xD0
    00FB DFD0      RCALL	_uart_sendB
(0152) 	uart_sendB(d[2]+'0');
    00FC 810A      LDD	R16,Y+2
    00FD 5D00      SUBI	R16,0xD0
    00FE DFCD      RCALL	_uart_sendB
(0153) 	uart_sendB(d[1]+'0');
    00FF 8109      LDD	R16,Y+1
    0100 5D00      SUBI	R16,0xD0
    0101 DFCA      RCALL	_uart_sendB
(0154) 	uart_sendB(d[0]+'0');
    0102 8108      LDD	R16,Y+0
    0103 5D00      SUBI	R16,0xD0
    0104 DFC7      RCALL	_uart_sendB
(0155) 	uart_sendB(';');
    0105 E30B      LDI	R16,0x3B
    0106 DFC5      RCALL	_uart_sendB
    0107 9624      ADIW	R28,4
    0108 940E03FF  CALL	pop_gset1
    010A 9508      RET
_uart_senddata:
  ptr                  --> R20
  data                 --> R22
    010B 940E03FA  CALL	push_gset2
    010D 01B8      MOVW	R22,R16
(0156) }
(0157) //============================================================= 
(0158) // 函数名:void uart_senddata(unsigned char *data)
(0159) // 功能: 通过串口发送字符串
(0160) // 参数: unsigned char *data  指针指向要发送的字符串
(0161) // 返回值: none
(0162) // 使用方法:uart_senddata(abc);
(0163) //=============================================================
(0164) void uart_senddata(unsigned char *data)
(0165) {
(0166) 	unsigned char *ptr;
(0167) 	ptr = data;
    010E 01AB      MOVW	R20,R22
    010F C005      RJMP	0x0115
(0168) 	while(*ptr)
(0169) 	{
(0170) 	    uart_sendB(*ptr);
    0110 01FA      MOVW	R30,R20
    0111 8100      LDD	R16,Z+0
    0112 DFB9      RCALL	_uart_sendB
(0171) 		ptr++;
    0113 5F4F      SUBI	R20,0xFF
    0114 4F5F      SBCI	R21,0xFF
    0115 01FA      MOVW	R30,R20
    0116 8020      LDD	R2,Z+0
    0117 2022      TST	R2
    0118 F7B9      BNE	0x0110
    0119 940E03EE  CALL	pop_gset2
    011B 9508      RET
(0172) 	}
(0173) }
(0174) 
(0175) 
(0176) /////////////////////////////////////////////////////////////////////////////////////////////////////////
(0177) 
(0178) 
(0179) //============================================================= 
(0180) // 函数名:void adc_init(void)
(0181) // 功能: Adc0 初始化 内部2.56v比较电压
(0182) // 参数: none
(0183) // 返回值: none
(0184) // 使用方法:adc_init();
(0185) //=============================================================
(0186) void adc_init(void)
(0187) {
(0188)      DDRA&=~BIT(PA0);
_adc_init:
    011C 98D0      CBI	0x1A,0
(0189) 	 PORTA&=~BIT(PA0);
    011D 98D8      CBI	0x1B,0
(0190) 	 ADMUX=0xc0;
    011E EC80      LDI	R24,0xC0
    011F B987      OUT	0x07,R24
(0191) 	 ADCSRA=0X80;
    0120 E880      LDI	R24,0x80
    0121 B986      OUT	0x06,R24
    0122 9508      RET
_mega16_ad:
  addata               --> R20
    0123 940E03FC  CALL	push_gset1
(0192) }
(0193) //============================================================= 
(0194) // 函数名:unsigned int mega16_ad(void)
(0195) // 功能: 读取一次ADC0的值
(0196) // 参数: none
(0197) // 返回值: addata
(0198) // 使用方法:add = mega16_ad();
(0199) //=============================================================
(0200) unsigned int mega16_ad(void)
(0201) {

⌨️ 快捷键说明

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