www.pudn.com > xunjijiqiren.rar > Motor.s


	.module Motor.c 
	.area data(ram, con, rel) 
_Ek:: 
	.blkb 2 
	.area idata 
	.word 0 
	.area data(ram, con, rel) 
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c 
	.dbsym e Ek _Ek I 
_Ek_1:: 
	.blkb 2 
	.area idata 
	.word 0 
	.area data(ram, con, rel) 
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c 
	.dbsym e Ek_1 _Ek_1 I 
_Ek_2:: 
	.blkb 2 
	.area idata 
	.word 0 
	.area data(ram, con, rel) 
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c 
	.dbsym e Ek_2 _Ek_2 I 
_flage:: 
	.blkb 1 
	.area idata 
	.byte 0 
	.area data(ram, con, rel) 
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c 
	.dbsym e flage _flage c 
	.area text(rom, con, rel) 
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c 
	.dbfunc e Putdata _Putdata fV 
;              i -> R20,R21 
;           data -> R16,R17 
	.even 
_Putdata:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 30 
; //***************************FileName:Motor.C************************ 
; //***************************ICCAVR6.30编译************************** 
; #include  
; #include  
; #include  
;  
; //***************************全局变量定义**************************// 
; #define U1 5  
; char Data[10];               //接收数据数组 
; int adress;                  //数据地址 
; int a;                       //采样时间次数 
; float t;                     //采样时间.s 
; int itime;                   //给定采样时间的次数 
; int Ek=0;                    //本次偏差 
; int Ek_1=0;                  //上次偏差 
; int Ek_2=0;                  //上上次偏差 
; char flage=0;                //监控标志 
; union chang1                 //float数据与char数据转换 
; {char c[4];     
;  float x; 
; }floatxin; 
; union chang2                 //int数据与char数据转换            
; {char c[2]; 
;  int x; 
; }intxin;  
;  
; //**************************串口数据发送函数***********************// 
; //说明:串口数据发送采用查询方式,每一帧发送10个字节 
; void Putdata(char data[10]) 
; {int i; 
	.dbline 31 
;  for(i=0;i<=9;i++) 
	clr R20 
	clr R21 
	.dbline 32 
L6: 
	.dbline 32 
L7: 
	.dbline 32 
	sbis 0xb,5 
	rjmp L6 
	.dbline 33 
	mov R30,R20 
	mov R31,R21 
	add R30,R16 
	adc R31,R17 
	ldd R2,z+0 
	out 0xc,R2 
	.dbline 33 
L3: 
	.dbline 31 
	subi R20,255  ; offset = 1 
	sbci R21,255 
	.dbline 31 
	ldi R24,9 
	ldi R25,0 
	cp R24,R20 
	cpc R25,R21 
	brge L7 
	.dbline -2 
	.dbline 34 
;  {while(!(USR&(1< R16,R17 
	.even 
_GetOutputADC:: 
	.dbline -1 
	.dbline 38 
;  
; //**************************读AD转换结果***************************// 
; int GetOutputADC() 
; {int temp; 
	.dbline 39 
;  temp=ADCH; 
	in R16,0x5 
	clr R17 
	.dbline 40 
;  temp=temp<<8; 
	mov R17,R16 
	clr R16 
	.dbline 41 
;  return(temp+ADCL); 
	in R2,0x4 
	clr R3 
	add R16,R2 
	adc R17,R3 
	.dbline -2 
L9: 
	.dbline 0 ; func end 
	ret 
	.dbsym r temp 16 I 
	.dbend 
	.dbfunc e Upspeed _Upspeed fV 
	.even 
_Upspeed:: 
	sbiw R28,2 
	.dbline -1 
	.dbline 46 
; } 
;  
; //***************************电机加速函数**************************// 
; void Upspeed() 
; {EEPROMReadBytes(0x0010,intxin.c,2); 
	.dbline 46 
	ldi R24,2 
	ldi R25,0 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_intxin 
	ldi R19,>_intxin 
	ldi R16,16 
	ldi R17,0 
	rcall _EEPROMReadBytes 
	.dbline 47 
;  intxin.c[0]+=Data[6]; 
	lds R2,_Data+6 
	lds R3,_intxin 
	add R3,R2 
	sts _intxin,R3 
	.dbline 48 
;  intxin.c[1]+=Data[7]; 
	lds R2,_Data+7 
	lds R3,_intxin+1 
	add R3,R2 
	sts _intxin+1,R3 
	.dbline 49 
;  EEPROMWriteBytes(0x0010,intxin.c,2); 
	ldi R24,2 
	ldi R25,0 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_intxin 
	ldi R19,>_intxin 
	ldi R16,16 
	ldi R17,0 
	rcall _EEPROMWriteBytes 
	.dbline -2 
	.dbline 50 
; } 
L10: 
	adiw R28,2 
	.dbline 0 ; func end 
	ret 
	.dbend 
	.dbfunc e Downspeed _Downspeed fV 
	.even 
_Downspeed:: 
	sbiw R28,2 
	.dbline -1 
	.dbline 54 
;  
; //***************************电机减速函数**************************// 
; void Downspeed() 
; { 
	.dbline 55 
;   EEPROMReadBytes(0x0010,intxin.c,2); 
	ldi R24,2 
	ldi R25,0 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_intxin 
	ldi R19,>_intxin 
	ldi R16,16 
	ldi R17,0 
	rcall _EEPROMReadBytes 
	.dbline 56 
;   intxin.c[0]-=Data[6]; 
	lds R2,_Data+6 
	lds R3,_intxin 
	sub R3,R2 
	sts _intxin,R3 
	.dbline 57 
;   intxin.c[1]-=Data[7]; 
	lds R2,_Data+7 
	lds R3,_intxin+1 
	sub R3,R2 
	sts _intxin+1,R3 
	.dbline 58 
;   EEPROMWriteBytes(0x0010,intxin.c,2); 
	ldi R24,2 
	ldi R25,0 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_intxin 
	ldi R19,>_intxin 
	ldi R16,16 
	ldi R17,0 
	rcall _EEPROMWriteBytes 
	.dbline -2 
	.dbline 59 
; } 
L14: 
	adiw R28,2 
	.dbline 0 ; func end 
	ret 
	.dbend 
	.dbfunc e PIDB _PIDB fV 
;          speed -> R14,R15 
;              z -> y+20 
;              u -> y+14 
;              t -> R10,R11 
;              y -> R12,R13 
;          temp1 -> R20 
;              k -> y+2 
;              i -> y+18 
	.even 
_PIDB:: 
	rcall push_gset5 
	sbiw R28,22 
	.dbline -1 
	.dbline 63 
;  
; //***************************PID调节函数***************************// 
; void PIDB() 
; {int y;           //本次速度值  
	.dbline 71 
;  float u;         //电压差值 
;  int z;           //输出增量 
;  int t;           //采样时间 
;  char temp1;      //暂存 
;  int i; 
;  int speed;       //速度设定 
;  float k[3];      //PID参数记录 
;  for (i=0;i<=2;i++) 
	clr R0 
	clr R1 
	std y+19,R1 
	std y+18,R0 
L19: 
	.dbline 72 
	.dbline 72 
	ldi R24,4 
	ldi R25,0 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_floatxin 
	ldi R19,>_floatxin 
	ldd R16,y+18 
	ldd R17,y+19 
	lsl R16 
	rol R17 
	lsl R16 
	rol R17 
	rcall _EEPROMReadBytes 
	.dbline 73 
	mov R24,R28 
	mov R25,R29 
	adiw R24,2 
	ldd R30,y+18 
	ldd R31,y+19 
	lsl R30 
	rol R31 
	lsl R30 
	rol R31 
	add R30,R24 
	adc R31,R25 
	lds R4,_floatxin+2 
	lds R5,_floatxin+2+1 
	lds R2,_floatxin 
	lds R3,_floatxin+1 
	std z+0,R2 
	std z+1,R3 
	std z+2,R4 
	std z+3,R5 
	.dbline 73 
L20: 
	.dbline 71 
	ldd R24,y+18 
	ldd R25,y+19 
	adiw R24,1 
	std y+19,R25 
	std y+18,R24 
	.dbline 71 
	ldi R24,2 
	ldi R25,0 
	ldd R0,y+18 
	ldd R1,y+19 
	cp R24,R0 
	cpc R25,R1 
	brge L19 
	.dbline 74 
;   {EEPROMReadBytes(i*4,floatxin.c,4); 
;    k[i]=floatxin.x;} 
;   EEPROMReadBytes(0x0010,intxin.c,1);   //读EEPROM 
	ldi R24,1 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_intxin 
	ldi R19,>_intxin 
	ldi R16,16 
	ldi R17,0 
	rcall _EEPROMReadBytes 
	.dbline 75 
;   speed=intxin.x; 
	lds R14,_intxin 
	lds R15,_intxin+1 
	.dbline 76 
;   t=itime*0.0001275; 
	ldi R16,L23 
	rcall lpm32 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	lds R16,_itime 
	lds R17,_itime+1 
	rcall int2fp 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	rcall mpy32f 
	rcall fp2int 
	mov R10,R16 
	mov R11,R17 
	.dbline 77 
;   y = TCNT1;  
	in R12,0x2c 
	in R13,0x2d 
	.dbline 78 
;   Ek=y-speed; 
	mov R2,R12 
	mov R3,R13 
	sub R2,R14 
	sbc R3,R15 
	sts _Ek+1,R3 
	sts _Ek,R2 
	.dbline 79 
;   u=k[0]*((Ek-Ek_1)+(t/k[1])*Ek+(k[2]/t)*(Ek-2*Ek_1+Ek_2)); 
	mov R30,R28 
	mov R31,R29 
	ldd R2,z+2 
	ldd R3,z+3 
	ldd R4,z+4 
	ldd R5,z+5 
	st -y,R5 
	st -y,R4 
	st -y,R3 
	st -y,R2 
	lds R2,_Ek_1 
	lds R3,_Ek_1+1 
	lds R16,_Ek 
	lds R17,_Ek+1 
	sub R16,R2 
	sbc R17,R3 
	rcall int2fp 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	mov R16,R10 
	mov R17,R11 
	rcall int2fp 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	mov R30,R28 
	mov R31,R29 
 ; stack offset 12 
	ldd R2,z+18 
	ldd R3,z+19 
	ldd R4,z+20 
	ldd R5,z+21 
	st -y,R5 
	st -y,R4 
	st -y,R3 
	st -y,R2 
	rcall div32fs 
	lds R16,_Ek 
	lds R17,_Ek+1 
	rcall int2fp 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	rcall mpy32fs 
	rcall add32fs 
	mov R30,R28 
	mov R31,R29 
 ; stack offset 8 
	ldd R2,z+18 
	ldd R3,z+19 
	ldd R4,z+20 
	ldd R5,z+21 
	st -y,R5 
	st -y,R4 
	st -y,R3 
	st -y,R2 
	mov R16,R10 
	mov R17,R11 
	rcall int2fp 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	rcall div32fs 
	lds R2,_Ek_1 
	lds R3,_Ek_1+1 
	lsl R2 
	rol R3 
	lds R16,_Ek 
	lds R17,_Ek+1 
	sub R16,R2 
	sbc R17,R3 
	lds R2,_Ek_2 
	lds R3,_Ek_2+1 
	add R16,R2 
	adc R17,R3 
	rcall int2fp 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	rcall mpy32fs 
	rcall add32fs 
	rcall mpy32f 
	mov R30,R28 
	mov R31,R29 
	std z+14,R16 
	std z+15,R17 
	std z+16,R18 
	std z+17,R19 
	.dbline 80 
;   z=u/U1*0xFF; 
	ldi R16,L26 
	rcall lpm32 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	mov R30,R28 
	mov R31,R29 
 ; stack offset 4 
	ldd R2,z+18 
	ldd R3,z+19 
	ldd R4,z+20 
	ldd R5,z+21 
	st -y,R5 
	st -y,R4 
	st -y,R3 
	st -y,R2 
	ldi R16,L27 
	rcall lpm32 
	st -y,R19 
	st -y,R18 
	st -y,R17 
	st -y,R16 
	rcall div32fs 
	rcall mpy32f 
	rcall fp2int 
	std y+21,R17 
	std y+20,R16 
	.dbline 81 
;   temp1=OCR2; 
	in R20,0x23 
	.dbline 82 
;   if(flage==1)                            //监控状态 
	lds R24,_flage 
	cpi R24,1 
	brne L28 
	.dbline 83 
;   {Data[4]=0xD0; 
	.dbline 83 
	ldi R24,208 
	sts _Data+4,R24 
	.dbline 84 
;    Data[5]=temp1; 
	sts _Data+5,R20 
	.dbline 85 
;    Data[6]=y>>8; 
	mov R2,R12 
	mov R3,R13 
	mov R2,R3 
	clr R3 
	sbrc R2,7 
	com R3 
	sts _Data+6,R2 
	.dbline 86 
;    Data[7]=y; 
	sts _Data+7,R12 
	.dbline 87 
;    Putdata(Data);}  
	ldi R16,<_Data 
	ldi R17,>_Data 
	rcall _Putdata 
	.dbline 87 
L28: 
	.dbline 88 
;   temp1=temp1+z; 
	mov R2,R20 
	clr R3 
	ldd R0,y+20 
	ldd R1,y+21 
	add R2,R0 
	adc R3,R1 
	mov R20,R2 
	.dbline 89 
;   if(temp1<=0)                           //结果小于0时输出0 
	clr R2 
	cp R2,R20 
	brlo L34 
	.dbline 90 
;    temp1 = 0x00; 
	clr R20 
L34: 
	.dbline 91 
;   if(temp1>=0xF0)                        //结果大于0xF0时输出0xF0  
	cpi R20,240 
	brlo L36 
	.dbline 92 
;    temp1 = 0xF0; 
	ldi R20,240 
L36: 
	.dbline 93 
;   OCR2=temp1; 
	out 0x23,R20 
	.dbline 94 
;   Ek_2 = Ek_1; 
	lds R2,_Ek_1 
	lds R3,_Ek_1+1 
	sts _Ek_2+1,R3 
	sts _Ek_2,R2 
	.dbline 95 
;   Ek_1 = Ek; 
	lds R2,_Ek 
	lds R3,_Ek+1 
	sts _Ek_1+1,R3 
	sts _Ek_1,R2 
	.dbline 96 
;   TCNT1 = 0x0000;                          //计数器清零 
	clr R2 
	clr R3 
	out 0x2d,R3 
	out 0x2c,R2 
	.dbline -2 
	.dbline 97 
; } 
L18: 
	adiw R28,22 
	rcall pop_gset5 
	.dbline 0 ; func end 
	ret 
	.dbsym r speed 14 I 
	.dbsym l z 20 I 
	.dbsym l u 14 D 
	.dbsym r t 10 I 
	.dbsym r y 12 I 
	.dbsym r temp1 20 c 
	.dbsym l k 2 A[12:3]D 
	.dbsym l i 18 I 
	.dbend 
	.dbfunc e USARTInit _USARTInit fV 
;       baudrate -> R16,R17 
	.even 
_USARTInit:: 
	.dbline -1 
	.dbline 101 
;  
; //***************************串口初始化函数************************//                    
; void USARTInit(int baudrate)     
; {UCR = (1<_Data+4 
	lds R16,_adress 
	lds R17,_adress+1 
	rcall _EEPROMReadBytes 
	rjmp L41 
L40: 
	.dbline 110 
;  else 
;  EEPROMReadBytes(adress,&Data[6],2); 
	ldi R24,2 
	ldi R25,0 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_Data+6 
	ldi R19,>_Data+6 
	lds R16,_adress 
	lds R17,_adress+1 
	rcall _EEPROMReadBytes 
L41: 
	.dbline 111 
;  switch(adress) 
	lds R24,_adress 
	lds R25,_adress+1 
	cpi R24,4 
	ldi R30,0 
	cpc R25,R30 
	breq L50 
	ldi R24,4 
	ldi R25,0 
	lds R2,_adress 
	lds R3,_adress+1 
	cp R24,R2 
	cpc R25,R3 
	brlt L61 
L60: 
	lds R2,_adress 
	lds R3,_adress+1 
	tst R2 
	brne X1 
	tst R3 
	breq L48 
X1: 
	rjmp L47 
L61: 
	lds R24,_adress 
	lds R25,_adress+1 
	cpi R24,8 
	ldi R30,0 
	cpc R25,R30 
	breq L52 
	cpi R24,8 
	ldi R30,0 
	cpc R25,R30 
	brlt L47 
L62: 
	lds R24,_adress 
	lds R25,_adress+1 
	cpi R24,12 
	ldi R30,0 
	cpc R25,R30 
	breq L54 
	cpi R24,14 
	ldi R30,0 
	cpc R25,R30 
	breq L56 
	cpi R24,16 
	ldi R30,0 
	cpc R25,R30 
	breq L58 
	rjmp L47 
X2: 
	.dbline 112 
L48: 
	.dbline 112 
;  {case 0x0000:Data[3]=0xE4;break; 
	ldi R24,228 
	sts _Data+3,R24 
	.dbline 112 
	rjmp L47 
L50: 
	.dbline 113 
;   case 0x0004:Data[3]=0xE5;break; 
	ldi R24,229 
	sts _Data+3,R24 
	.dbline 113 
	rjmp L47 
L52: 
	.dbline 114 
;   case 0x0008:Data[3]=0xE6;break; 
	ldi R24,230 
	sts _Data+3,R24 
	.dbline 114 
	rjmp L47 
L54: 
	.dbline 115 
;   case 0x000C:Data[3]=0xE7;break; 
	ldi R24,231 
	sts _Data+3,R24 
	.dbline 115 
	rjmp L47 
L56: 
	.dbline 116 
;   case 0x000E:Data[3]=0xE8;break; 
	ldi R24,232 
	sts _Data+3,R24 
	.dbline 116 
	rjmp L47 
L58: 
	.dbline 117 
	ldi R24,233 
	sts _Data+3,R24 
	.dbline 117 
	.dbline 118 
L47: 
	.dbline -2 
	.dbline 119 
;   case 0x0010:Data[3]=0xE9;break; 
;   default :break;} 
; } 
L39: 
	adiw R28,2 
	.dbline 0 ; func end 
	ret 
	.dbend 
	.dbfunc e readdata _readdata fV 
;       tempdata -> R22 
;       trandata -> R20,R21 
;           data -> R20 
	.even 
_readdata:: 
	rcall push_gset2 
	mov R20,R16 
	.dbline -1 
	.dbline 123 
;  
; //***************************读数据函数****************************// 
; void readdata(char data) 
; {int trandata; 
	.dbline 125 
;  char tempdata; 
;  if(data==0xE) 
	cpi R20,14 
	brne L64 
	.dbline 126 
;  Eepromdata(); 
	rcall _Eepromdata 
	rjmp L65 
L64: 
	.dbline 128 
;  else 
;  {switch(data) 
	.dbline 128 
	clr R21 
	cpi R20,1 
	ldi R30,0 
	cpc R21,R30 
	breq L69 
	cpi R20,2 
	ldi R30,0 
	cpc R21,R30 
	breq L70 
	cpi R20,3 
	ldi R30,0 
	cpc R21,R30 
	breq L71 
	rjmp L67 
X3: 
	.dbline 129 
L69: 
	.dbline 129 
;   {case 1:trandata=TCNT1;break; //读TCNT1 
	in R20,0x2c 
	in R21,0x2d 
	.dbline 129 
	rjmp L67 
L70: 
	.dbline 130 
;    case 2:trandata=(int)(tempdata=TCNT0);break;//读TCNT0 
	in R2,0x32 
	mov R22,R2 
	mov R20,R2 
	clr R21 
	.dbline 130 
	rjmp L67 
L71: 
	.dbline 131 
;    case 3:trandata=GetOutputADC();break;//读A/D转换结果 
	rcall _GetOutputADC 
	mov R20,R16 
	mov R21,R17 
	.dbline 131 
	.dbline 132 
;    default :break;} 
L67: 
	.dbline 133 
;  Data[6]=(char)trandata;//数据低八位 
	sts _Data+6,R20 
	.dbline 134 
;  Data[7]=(char)(trandata>>8);//数据高八位 
	mov R2,R20 
	mov R3,R21 
	mov R2,R3 
	clr R3 
	sbrc R2,7 
	com R3 
	sts _Data+7,R2 
	.dbline 135 
; } 
L65: 
	.dbline 136 
;  Putdata(Data); 
	ldi R16,<_Data 
	ldi R17,>_Data 
	rcall _Putdata 
	.dbline -2 
	.dbline 137 
; } 
L63: 
	rcall pop_gset2 
	.dbline 0 ; func end 
	ret 
	.dbsym r tempdata 22 c 
	.dbsym r trandata 20 I 
	.dbsym r data 20 c 
	.dbend 
	.dbfunc e order _order fV 
	.even 
_order:: 
	rcall push_gset1 
	.dbline -1 
	.dbline 141 
;  
; //***************************命令函数******************************// 
; void order(void) 
; {switch (Data[4]) 
	.dbline 141 
	lds R20,_Data+4 
	clr R21 
	cpi R20,192 
	ldi R30,0 
	cpc R21,R30 
	breq L79 
	cpi R20,193 
	ldi R30,0 
	cpc R21,R30 
	breq L80 
	cpi R20,194 
	ldi R30,0 
	cpc R21,R30 
	breq L81 
	cpi R20,195 
	ldi R30,0 
	cpc R21,R30 
	breq L82 
	cpi R20,196 
	ldi R30,0 
	cpc R21,R30 
	breq L83 
	cpi R20,197 
	ldi R30,0 
	cpc R21,R30 
	breq L84 
	cpi R20,198 
	ldi R30,0 
	cpc R21,R30 
	breq L85 
	cpi R20,200 
	ldi R30,0 
	cpc R21,R30 
	breq L86 
	cpi R20,201 
	ldi R30,0 
	cpc R21,R30 
	breq L87 
	rjmp L76 
X4: 
	.dbline 142 
L79: 
	.dbline 142 
;  {case 0xC0:PORTB=PORTB|0x04;break;    //停止 
	sbi 0x18,2 
	.dbline 142 
	rjmp L76 
L80: 
	.dbline 143 
;   case 0xC1:PORTB=PORTB&0xFB;break;    //启动 
	in R24,0x18 
	andi R24,251 
	out 0x18,R24 
	.dbline 143 
	rjmp L76 
L81: 
	.dbline 145 
;   case 0xC2:                           //正转 
;            {PORTB=PORTB&0xFC|0x02; 
	.dbline 145 
	in R24,0x18 
	andi R24,252 
	ori R24,2 
	out 0x18,R24 
	.dbline 146 
; 		    PORTD=PORTD&0x3F|0x40; 
	in R24,0x12 
	andi R24,63 
	ori R24,64 
	out 0x12,R24 
	.dbline 147 
; 			break;} 
	rjmp L76 
L82: 
	.dbline 149 
;   case 0xC3:                           //反转 
;            {PORTB=PORTB&0xFC|0x01; 
	.dbline 149 
	in R24,0x18 
	andi R24,252 
	ori R24,1 
	out 0x18,R24 
	.dbline 150 
; 		    PORTD=PORTD&0x3F|0x80; 
	in R24,0x12 
	andi R24,63 
	ori R24,128 
	out 0x12,R24 
	.dbline 151 
; 			break;} 
	rjmp L76 
L83: 
	.dbline 152 
;   case 0xC4:Upspeed();break;           //加速 
	rcall _Upspeed 
	.dbline 152 
	rjmp L76 
L84: 
	.dbline 153 
;   case 0xC5:Downspeed();break;         //减速 
	rcall _Downspeed 
	.dbline 153 
	rjmp L76 
L85: 
	.dbline 155 
;   case 0xC6:                           //制动 
;            {PORTB=PORTB|0x03; 
	.dbline 155 
	in R24,0x18 
	ori R24,3 
	out 0x18,R24 
	.dbline 156 
; 		    PORTD=PORTD&0x3F; 
	in R24,0x12 
	andi R24,63 
	out 0x12,R24 
	.dbline 157 
; 			break;} 
	rjmp L76 
L86: 
	.dbline 158 
;   case 0xC8:flage=1;break;             //监控 
	ldi R24,1 
	sts _flage,R24 
	.dbline 158 
	rjmp L76 
L87: 
	.dbline 159 
	clr R2 
	sts _flage,R2 
	.dbline 159 
	.dbline 160 
L76: 
	.dbline -2 
	.dbline 162 
;   case 0xC9:flage=0;break;             //退出监控 
;   default :break; 
;  } 
; } 
L74: 
	rcall pop_gset1 
	.dbline 0 ; func end 
	ret 
	.dbend 
	.dbfunc e Datadisposal _Datadisposal fV 
;      operation -> R20 
;           temp -> R22,R23 
	.even 
_Datadisposal:: 
	rcall push_gset2 
	sbiw R28,2 
	.dbline -1 
	.dbline 167 
;  
;  
; //***************************数据处理函数**************************// 
; void Datadisposal(void) 
; {char operation; 
	.dbline 169 
;  int temp; 
;  operation=Data[3]; 
	lds R20,_Data+3 
	.dbline 170 
;  temp=Data[4]; 
	lds R22,_Data+4 
	clr R23 
	.dbline 171 
;  temp=temp<<8; 
	mov R23,R22 
	clr R22 
	.dbline 172 
;  adress=temp+Data[5]; 
	lds R2,_Data+5 
	clr R3 
	mov R4,R22 
	mov R5,R23 
	add R4,R2 
	adc R5,R3 
	sts _adress+1,R5 
	sts _adress,R4 
	.dbline 173 
;  switch(operation&0x0F) 
	mov R22,R20 
	clr R23 
	andi R22,15 
	andi R23,0 
	cpi R22,0 
	cpc R22,R23 
	breq L95 
X5: 
	cpi R22,1 
	ldi R30,0 
	cpc R23,R30 
	breq L96 
	cpi R22,2 
	ldi R30,0 
	cpc R23,R30 
	breq L98 
	rjmp L93 
X6: 
	.dbline 174 
L95: 
	.dbline 174 
;  {case 0:readdata(operation>>4);break; 
	mov R16,R20 
	swap R16 
	andi R16,#0x0F 
	rcall _readdata 
	.dbline 174 
	rjmp L93 
L96: 
	.dbline 175 
;   case 1:EEPROMWriteBytes(adress,&Data[6],2);break; 
	ldi R24,2 
	ldi R25,0 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_Data+6 
	ldi R19,>_Data+6 
	lds R16,_adress 
	lds R17,_adress+1 
	rcall _EEPROMWriteBytes 
	.dbline 175 
	rjmp L93 
L98: 
	.dbline 176 
	rcall _order 
	.dbline 176 
	.dbline 177 
L93: 
	.dbline -2 
	.dbline 179 
;   case 2:order();break; 
;   default :break; 
;  } 
; } 
L88: 
	adiw R28,2 
	rcall pop_gset2 
	.dbline 0 ; func end 
	ret 
	.dbsym r operation 20 c 
	.dbsym r temp 22 I 
	.dbend 
	.dbfunc e main _main fV 
	.even 
_main:: 
	.dbline -1 
	.dbline 183 
;  
; //***************************主函数********************************// 
; void main() 
; {USARTInit(25);              //初始化串口              
	.dbline 183 
	ldi R16,25 
	ldi R17,0 
	rcall _USARTInit 
	.dbline 184 
;  TCNT1=00;                   //定时器1初始化  
	clr R2 
	clr R3 
	out 0x2d,R3 
	out 0x2c,R2 
	.dbline 185 
;  TCCR1B=0x06; 
	ldi R24,6 
	out 0x2e,R24 
	.dbline 186 
;  DDRB=0x0F;                  //I/O口初始化 
	ldi R24,15 
	out 0x17,R24 
	.dbline 187 
;  DDRD=0xC0;      
	ldi R24,192 
	out 0x11,R24 
	.dbline 188 
;  TIMSK=0x40;                 //中断初始化  
	ldi R24,64 
	out 0x39,R24 
	.dbline 189 
;  OCR2 = 0x0F;                //PWM初始化 
	ldi R24,15 
	out 0x23,R24 
	.dbline 190 
;  TCCR2=0x72; 
	ldi R24,114 
	out 0x25,R24 
	.dbline 191 
;  PORTB=PORTB&0xFC|0x01; 
	in R24,0x18 
	andi R24,252 
	ori R24,1 
	out 0x18,R24 
	.dbline 192 
;  PORTD=PORTD&0x3F|0x80; 
	in R24,0x12 
	andi R24,63 
	ori R24,128 
	out 0x12,R24 
	.dbline 193 
;  SEI(); 
	sei 
L100: 
	.dbline 194 
	.dbline 194 
L101: 
	.dbline 194 
	rjmp L100 
X7: 
	.dbline -2 
	.dbline 195 
;  do{} while(1);              //等待中断 
; } 
L99: 
	.dbline 0 ; func end 
	ret 
	.dbend 
	.area vector(rom, abs) 
	.org 22 
	rjmp _UART_RXC 
	.area text(rom, con, rel) 
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c 
	.dbfunc e UART_RXC _UART_RXC fV 
;              i -> R20 
	.even 
_UART_RXC:: 
	rcall push_lset 
	rcall push_gset1 
	.dbline -1 
	.dbline 200 
;  
; //***************************串行接收中断服务程序******************// 
; #pragma interrupt_handler UART_RXC:12 
; void UART_RXC(void) 
; {char i=0; 
	.dbline 200 
	clr R20 
	.dbline 201 
;  CLI(); 
	cli 
	.dbline 202 
;  Data[0]=UDR; 
	in R2,0xc 
	sts _Data,R2 
	.dbline 203 
;  if(Data[0]==0x55)           //起始位检测 
	mov R24,R2 
	cpi R24,85 
	brne L104 
	.dbline 204 
;  {do 
	.dbline 205 
L109: 
	.dbline 205 
L110: 
	.dbline 205 
;   {while(!(USR&(1<_Data 
	mov R30,R20 
	clr R31 
	add R30,R24 
	adc R31,R25 
	in R2,0xc 
	std z+0,R2 
	.dbline 208 
;    if(i==9) 
	cpi R20,9 
	brne L112 
	.dbline 209 
	rjmp L108 
L112: 
	.dbline 209 
L107: 
	.dbline 209 
;    break;} while(1); 
	rjmp L110 
L108: 
	.dbline 210 
;   if((Data[8]==0xFE)&&(Data[9]==0xFF))  //检测结束位 
	lds R24,_Data+8 
	cpi R24,254 
	brne L114 
	lds R24,_Data+9 
	cpi R24,255 
	brne L114 
	.dbline 211 
	rcall _Datadisposal 
L114: 
	.dbline 211 
;   Datadisposal();} 
L104: 
	.dbline 212 
;  SEI(); 
	sei 
	.dbline -2 
	.dbline 213 
; } 
L103: 
	rcall pop_gset1 
	rcall pop_lset 
	.dbline 0 ; func end 
	reti 
	.dbsym r i 20 c 
	.dbend 
	.area vector(rom, abs) 
	.org 8 
	rjmp _TIM2_OVF 
	.area text(rom, con, rel) 
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c 
	.dbfunc e TIM2_OVF _TIM2_OVF fV 
	.even 
_TIM2_OVF:: 
	rcall push_lset 
	sbiw R28,2 
	.dbline -1 
	.dbline 218 
;  
; //***************************定时器2中断服务程序*******************// 
; #pragma interrupt_handler TIM2_OVF:5 
; void TIM2_OVF(void)     
; {CLI(); 
	.dbline 218 
	cli 
	.dbline 219 
;  EEPROMReadBytes(0x000C,&itime,2);//读采样次数 
	ldi R24,2 
	ldi R25,0 
	std y+1,R25 
	std y+0,R24 
	ldi R18,<_itime 
	ldi R19,>_itime 
	ldi R16,12 
	ldi R17,0 
	rcall _EEPROMReadBytes 
	.dbline 220 
;  a++; 
	lds R24,_a 
	lds R25,_a+1 
	adiw R24,1 
	sts _a+1,R25 
	sts _a,R24 
	.dbline 221 
;  if(a==itime)                //时间窗口判断, 
	lds R2,_itime 
	lds R3,_itime+1 
	cp R24,R2 
	cpc R25,R3 
	brne L119 
	.dbline 222 
;   {a = 0; 
	.dbline 222 
	clr R2 
	clr R3 
	sts _a+1,R3 
	sts _a,R2 
	.dbline 223 
;    PIDB();}  
	rcall _PIDB 
	.dbline 223 
L119: 
	.dbline 224 
;   SEI(); 
	sei 
	.dbline -2 
	.dbline 225 
; } 
L118: 
	adiw R28,2 
	rcall pop_lset 
	.dbline 0 ; func end 
	reti 
	.dbend 
	.area bss(ram, con, rel) 
	.dbfile E:\张军\AVR\光盘内容\实例源文件\第九章工程\Motor.c 
_intxin:: 
	.blkb 2 
	.dbsym e intxin _intxin X 
_floatxin:: 
	.blkb 4 
	.dbsym e floatxin _floatxin X 
_itime:: 
	.blkb 2 
	.dbsym e itime _itime I 
_t:: 
	.blkb 4 
	.dbsym e t _t D 
_a:: 
	.blkb 2 
	.dbsym e a _a I 
_adress:: 
	.blkb 2 
	.dbsym e adress _adress I 
_Data:: 
	.blkb 10 
	.dbsym e Data _Data A[10:10]c 
	.area lit(rom, con, rel) 
L27: 
	.word 0x0,0x40a0 
L26: 
	.word 0x0,0x437f 
L23: 
	.word 0xb185,0x3905