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

📄 fjv14.lst

📁 一本关于控制系统仿真的书的程序 1、文件夹1中的程序是书中的一些仿真。 2、文件2中的是最近做的预测控制、PID控制及逻辑控制的对比综合研究。 3、文件夹3中是与maltab通信的数据采集板的设
💻 LST
📖 第 1 页 / 共 3 页
字号:
    010E 9508      RET
_USART_Recive:
  y                    --> R20
    010F D1D9      RCALL	push_gset1
(0186)                       break;
(0187) 			  default:break;
(0188) 		        }	 
(0189) 	       }
(0190)           
(0191)      } 	  
(0192) }
(0193) /**************************************************************************/
(0194) //串口接收数据
(0195) unsigned char USART_Recive(void)
(0196)     { 
(0197) 	unsigned char y;	
(0198) 	//等待接收数据
(0199) 	while(!(UCSRA&(1<<RXC)));
    0110 9B5F      SBIS	0x0B,7
    0111 CFFE      RJMP	0x0110
(0200) 		y=getchar();  //接收数据
    0112 D1ED      RCALL	_getchar
    0113 2F40      MOV	R20,R16
(0201) 		
(0202)    return y;
    0114 D1D7      RCALL	pop_gset1
    0115 9508      RET
(0203)    }
(0204) /*******************************************************************/
(0205) //串口发送数据
(0206) void USART_Transmit(unsigned char tdata)
(0207) {
(0208) //等待数据寄存器空
(0209) 	UDR=tdata;
_USART_Transmit:
  tdata                --> R16
    0116 B90C      OUT	0x0C,R16
(0210) 	while(!(UCSRA&(1<<UDRE)))
    0117 9B5D      SBIS	0x0B,5
    0118 CFFE      RJMP	0x0117
    0119 9508      RET
_ADC_Value:
  temp                 --> R20
  adc_channel          --> R22
    011A D1CC      RCALL	push_gset2
    011B 2F60      MOV	R22,R16
(0211) 	 ;
(0212) 	
(0213) 	
(0214) }
(0215) /******************************************************************/
(0216) /*******************************************************************
(0217)  函数功能:AD数据、通道采集,10位精度。
(0218)  入口参数:adc_channel通道选择。
(0219)  出口参数:AD采集的数据
(0220)  说明:此处可以加入中值滤波程序。使用ADC降噪中断方式
(0221) *******************************************************/
(0222) unsigned int ADC_Value (unsigned char adc_channel)
(0223) {
(0224)   unsigned int temp;
(0225)   temp=0;
    011C 2744      CLR	R20
    011D 2755      CLR	R21
(0226)   switch (adc_channel)
    011E 2777      CLR	R23
    011F 3061      CPI	R22,1
    0120 E0E0      LDI	R30,0
    0121 077E      CPC	R23,R30
    0122 F069      BEQ	0x0130
    0123 3062      CPI	R22,2
    0124 E0E0      LDI	R30,0
    0125 077E      CPC	R23,R30
    0126 F071      BEQ	0x0135
    0127 3063      CPI	R22,3
    0128 E0E0      LDI	R30,0
    0129 077E      CPC	R23,R30
    012A F079      BEQ	0x013A
    012B 3064      CPI	R22,4
    012C E0E0      LDI	R30,0
    012D 077E      CPC	R23,R30
    012E F081      BEQ	0x013F
    012F C013      RJMP	0x0143
(0227)        {
(0228)            case 0x01: //如果为00则启动CH1通道
(0229)                ADMUX=0x00;//寄存器后4位对应通道。0代表CH1通道。
    0130 2422      CLR	R2
    0131 B827      OUT	0x07,R2
(0230)                temp=ADC_filter();
    0132 D013      RCALL	_ADC_filter
    0133 01A8      MOVW	R20,R16
(0231)                break;   
    0134 C00E      RJMP	0x0143
(0232)           case 0x02:  //如果为01则启动CH2通道
(0233)                ADMUX=0x01;//寄存器后4位对应通道。1代表CH2通道。
    0135 E081      LDI	R24,1
    0136 B987      OUT	0x07,R24
(0234)                temp=ADC_filter();  
    0137 D00E      RCALL	_ADC_filter
    0138 01A8      MOVW	R20,R16
(0235) 		       break; 
    0139 C009      RJMP	0x0143
(0236)           case 0x03:  //如果为10则启动CH2通道
(0237)                ADMUX=0x02;//寄存器后4位对应通道。2代表CH3通道。
    013A E082      LDI	R24,2
    013B B987      OUT	0x07,R24
(0238)                temp=ADC_filter();  
    013C D009      RCALL	_ADC_filter
    013D 01A8      MOVW	R20,R16
(0239) 		       break;  
    013E C004      RJMP	0x0143
(0240)           case 0x04:  //如果为00则启动CH1通道
(0241)                ADMUX=0x03;//寄存器后4位对应通道。3代表CH4通道。
    013F E083      LDI	R24,3
    0140 B987      OUT	0x07,R24
(0242)                temp=ADC_filter(); 
    0141 D004      RCALL	_ADC_filter
    0142 01A8      MOVW	R20,R16
(0243) 		       break;         	
(0244)        	   default:break;
(0245)        	}
(0246)   return temp;
    0143 018A      MOVW	R16,R20
    0144 D198      RCALL	pop_gset2
    0145 9508      RET
_ADC_filter:
  outdata              --> R20
  a                    --> R20
  temp                 --> Y+0
    0146 D1A2      RCALL	push_gset1
    0147 9724      SBIW	R28,4
(0247) }  
(0248) /*******************************************************************
(0249)  函数功能:首先采集数据,然后三点中值滤波。同时解决第一次采集不准问题。
(0250)  入口参数:无
(0251)  出口参数:outdata,滤波后的结果
(0252)  说明:
(0253) *******************************************************/
(0254) unsigned int  ADC_filter(void)
(0255)       {
(0256)             unsigned int a;
(0257)             unsigned int outdata;
(0258)             unsigned int temp[2];
(0259)             temp[0]=0;
    0148 2422      CLR	R2
    0149 2433      CLR	R3
    014A 8239      STD	Y+1,R3
    014B 8228      STD	Y+0,R2
(0260) 	    temp[1]=0;
    014C 823B      STD	Y+3,R3
    014D 822A      STD	Y+2,R2
(0261) 	    temp[2]=0;
    014E 823D      STD	Y+5,R3
    014F 822C      STD	Y+4,R2
(0262)             ADC_Start();//丢弃第一次结果。
    0150 D048      RCALL	_ADC_Start
(0263)             AD_value10=0;//采集数据前先将变量清零。避免上一次的干扰。
    0151 2422      CLR	R2
    0152 2433      CLR	R3
    0153 92300061  STS	AD_value10+1,R3
    0155 92200060  STS	AD_value10,R2
(0264)             ADC_Start();
    0157 D041      RCALL	_ADC_Start
(0265)             temp[0]=AD_value10;//AD转换结果
    0158 90200060  LDS	R2,AD_value10
    015A 90300061  LDS	R3,AD_value10+1
    015C 8239      STD	Y+1,R3
    015D 8228      STD	Y+0,R2
(0266)             ADC_Start();
    015E D03A      RCALL	_ADC_Start
(0267)             temp[1]=AD_value10;//AD转换结果
    015F 90200060  LDS	R2,AD_value10
    0161 90300061  LDS	R3,AD_value10+1
    0163 823B      STD	Y+3,R3
    0164 822A      STD	Y+2,R2
(0268)             ADC_Start();
    0165 D033      RCALL	_ADC_Start
(0269)             temp[2]=AD_value10;//AD转换结果
    0166 90200060  LDS	R2,AD_value10
    0168 90300061  LDS	R3,AD_value10+1
    016A 823D      STD	Y+5,R3
    016B 822C      STD	Y+4,R2
(0270)             //下面的程序让数组从小到大排列
(0271)             if (temp[0]>temp[1])
    016C 802A      LDD	R2,Y+2
    016D 803B      LDD	R3,Y+3
    016E 8048      LDD	R4,Y+0
    016F 8059      LDD	R5,Y+1
    0170 1424      CP	R2,R4
    0171 0435      CPC	R3,R5
    0172 F430      BCC	0x0179
(0272)                {
(0273)                	  a=temp[1];
    0173 01A1      MOVW	R20,R2
(0274)                   temp[1]=temp[0];
    0174 0112      MOVW	R2,R4
    0175 823B      STD	Y+3,R3
    0176 822A      STD	Y+2,R2
(0275)                   temp[0]=a;
    0177 8359      STD	Y+1,R21
    0178 8348      STD	Y+0,R20
(0276)                 }
(0277)              if (temp[0]>temp[2])
    0179 802C      LDD	R2,Y+4
    017A 803D      LDD	R3,Y+5
    017B 8048      LDD	R4,Y+0
    017C 8059      LDD	R5,Y+1
    017D 1424      CP	R2,R4
    017E 0435      CPC	R3,R5
    017F F430      BCC	0x0186
(0278)                 {
(0279)                   a=temp[2];
    0180 01A1      MOVW	R20,R2
(0280)                   temp[2]=temp[0];
    0181 0112      MOVW	R2,R4
    0182 823D      STD	Y+5,R3
    0183 822C      STD	Y+4,R2
(0281)                   temp[0]=a;                  
    0184 8359      STD	Y+1,R21
    0185 8348      STD	Y+0,R20
(0282)                 }
(0283)              if (temp[1]>temp[2])
    0186 802C      LDD	R2,Y+4
    0187 803D      LDD	R3,Y+5
    0188 804A      LDD	R4,Y+2
    0189 805B      LDD	R5,Y+3
    018A 1424      CP	R2,R4
    018B 0435      CPC	R3,R5
    018C F430      BCC	0x0193
(0284)                  {
(0285)                    a=temp[2];
    018D 01A1      MOVW	R20,R2
(0286)                    temp[2]=temp[1];
    018E 0112      MOVW	R2,R4
    018F 823D      STD	Y+5,R3
    0190 822C      STD	Y+4,R2
(0287)                    temp[1]=a;
    0191 835B      STD	Y+3,R21
    0192 834A      STD	Y+2,R20
(0288)                  }  
(0289)              outdata=temp[1];
    0193 814A      LDD	R20,Y+2
    0194 815B      LDD	R21,Y+3
(0290)              return outdata;   
    0195 018A      MOVW	R16,R20
    0196 9624      ADIW	R28,4
    0197 D154      RCALL	pop_gset1
    0198 9508      RET
(0291)          }         
(0292) /*******************************************************************
(0293)  函数功能:AD采集,10位精度。
(0294)  入口参数:无
(0295)  出口参数:无
(0296)  说明:
(0297) *******************************************************/
(0298)  void ADC_Start(void)
(0299)      {
(0300)      	asm("NOP");//给通道切换留一点时间。
_ADC_Start:
    0199 0000      NOP
(0301)      	asm("NOP");
    019A 0000      NOP
(0302)      	MCUCR =(1<<SE);//开启ADC休眠模式
    019B E880      LDI	R24,0x80
    019C BF85      OUT	0x35,R24
(0303)         asm("SLEEP");
    019D 9588      SLEEP
(0304)         MCUCR =(0<<SE);//关闭ADC休眠模式,关闭SE位
    019E 2422      CLR	R2
    019F BE25      OUT	0x35,R2
    01A0 9508      RET
_DAC_5617_10:
  TempH                --> R22
  TempL                --> R20
  dac_channel          --> Y+8
  dac_dataL            --> R10
  dac_dataH            --> R12
    01A1 D141      RCALL	push_gset4
    01A2 2EA2      MOV	R10,R18
    01A3 2EC0      MOV	R12,R16
(0305)            	
(0306)      }
(0307)    
(0308) /*******************************************************************
(0309)  函数功能:DA传送数据,10位精度。固定通道A。
(0310)  入口参数:dac_data8位数据。
(0311)  出口参数:无
(0312)  说明:
(0313) *******************************************************/
(0314) 
(0315) void DAC_5617_10(unsigned char dac_dataH,unsigned char dac_dataL,unsigned char dac_channel)
(0316) {     
(0317)      unsigned char TempL,TempH;
(0318) 	 if(dac_channel==0x01)   //使用通道A。(即out1)
    01A4 8588      LDD	R24,Y+8
    01A5 3081      CPI	R24,1
    01A6 F4E1      BNE	0x01C3
(0319) 	    {
(0320) 	     set_cs;
    01A7 9AC2      SBI	0x18,2
(0321) 	     TempH=0xc0;
    01A8 EC60      LDI	R22,0xC0
(0322) 	     TempL=0x00;
    01A9 2744      CLR	R20
(0323) 	     TempH|=(dac_dataH<<2)|(dac_dataL>>6);
    01AA 2C2A      MOV	R2,R10
    01AB 9426      LSR	R2
    01AC 9426      LSR	R2
    01AD 9426      LSR	R2
    01AE 9426      LSR	R2
    01AF 9426      LSR	R2
    01B0 9426      LSR	R2
    01B1 2C3C      MOV	R3,R12
    01B2 0C33      LSL	R3
    01B3 0C33      LSL	R3
    01B4 2832      OR	R3,R2
    01B5 2963      OR	R22,R3
(0324) 	     TempL|=(dac_dataL<<2);
    01B6 2C2A      MOV	R2,R10
    01B7 0C22      LSL	R2
    01B8 0C22      LSL	R2
    01B9 2942      OR	R20,R2
(0325) 	     clr_cs;
    01BA B388      IN	R24,0x18
    01BB 7F8B      ANDI	R24,0xFB
    01BC BB88      OUT	0x18,R24
(0326) 	     SPI_Transmit(TempH);
    01BD 2F06      MOV	R16,R22
    01BE D026      RCALL	_SPI_Transmit
(0327) 	     SPI_Transmit(TempL);
    01BF 2F04      MOV	R16,R20
    01C0 D024      RCALL	_SPI_Transmit
(0328) 	     set_cs;
    01C1 9AC2      SBI	0x18,2
(0329) 		}
    01C2 C020      RJMP	0x01E3
(0330) 	 else if (dac_channel==0x02) //使用通道B。(即out2)
    01C3 8588      LDD	R24,Y+8
    01C4 3082      CPI	R24,2
    01C5 F4E1      BNE	0x01E2
(0331) 	   {
(0332) 	     set_cs;
    01C6 9AC2      SBI	0x18,2
(0333) 	     TempH=0x40;
    01C7 E460      LDI	R22,0x40
(0334) 	     TempL=0x00;
    01C8 2744      CLR	R20
(0335) 	     TempH|=(dac_dataH<<2)|(dac_dataL>>6);
    01C9 2C2A      MOV	R2,R10
    01CA 9426      LSR	R2
    01CB 9426      LSR	R2
    01CC 9426      LSR	R2
    01CD 9426      LSR	R2
    01CE 9426      LSR	R2
    01CF 9426      LSR	R2
    01D0 2C3C      MOV	R3,R12
    01D1 0C33      LSL	R3
    01D2 0C33      LSL	R3
    01D3 2832      OR	R3,R2
    01D4 2963      OR	R22,R3
(0336) 	     TempL|=(dac_dataL<<2);
    01D5 2C2A      MOV	R2,R10
    01D6 0C22      LSL	R2
    01D7 0C22      LSL	R2
    01D8 2942      OR	R20,R2
(0337) 	     clr_cs;
    01D9 B388      IN	R24,0x18
    01DA 7F8B      ANDI	R24,0xFB
    01DB BB88      OUT	0x18,R24
(0338) 	     SPI_Transmit(TempH);
    01DC 2F06      MOV	R16,R22
    01DD D007      RCALL	_SPI_Transmit
(0339) 	     SPI_Transmit(TempL);
    01DE 2F04      MOV	R16,R20
    01DF D005      RCALL	_SPI_Transmit
(0340) 	     set_cs;
    01E0 9AC2      SBI	0x18,2
(0341) 	   }
    01E1 C001      RJMP	0x01E3
(0342) 	 
(0343) 	else  
(0344) 	 { 
(0345) 	    asm("NOP");
    01E2 0000      NOP
(0346) 	  }
    01E3 D0FB      RCALL	pop_gset4
    01E4 9508      RET
_SPI_Transmit:
  i                    --> R20
  dac_data             --> R16
    01E5 D101      RCALL	push_gset2
(0347) }
(0348) /*****************************************************************/
(0349) //初始化spi
(0350) void SPI_Transmit(unsigned char dac_data)
(0351) {	 
(0352)     unsigned char i;
(0353) 	SPCR=0x58; //SPI使能?此句是不是必须的?
    01E6 E588      LDI	R24,0x58
    01E7 B98D      OUT	0x0D,R24
(0354)  	SPDR=dac_data; //送值到SPDR
    01E8 B90F      OUT	0x0F,R16
(0355) 	while(!SPSR&(1<<SPIF))
    01E9 B02E      IN	R2,0x0E
    01EA 2022      TST	R2
    01EB F419      BNE	0x01EF
    01EC E061      LDI	R22,1
    01ED E070      LDI	R23,0
    01EE C002      RJMP	0x01F1
    01EF 2766      CLR	R22
    01F0 2777      CLR	R23
    01F1 FD67      SBRC	R22,7
    01F2 CFF6      RJMP	0x01E9
(0356) 		;		
(0357) 	 for (i=0;i<3;i++)//保留足够的发送时间!!!
    01F3 2744      CLR	R20
    01F4 C001      RJMP	0x01F6
    01F5 9543      INC	R20
    01F6 3043      CPI	R20,3
    01F7 F3E8      BCS	0x01F5
    01F8 D0E4      RCALL	pop_gset2
    01F9 9508      RET
_IO_out:
  IO_channel           --> R18
  IO_data              --> R16
    01FA D0EE      RCALL	push_gset1
(0358)        {;} 
(0359) }   
(0360) /******************************************************************
(0361)  函数功能:IO输出数据。首先确定输出数据。然后给定输出通道。
(0362)  入口参数:IO_data输出数据。IO_channel输出通道。
(0363)  出口参数:无
(0364)  说明:
(0365) *******************************************************/
(0366) 
(0367) void IO_out(unsigned char IO_data,unsigned char IO_channel)
(0368) {     
(0369)     
(0370)      switch (IO_channel)
    01FB 2F42      MOV	R20,R18
    01FC 2755      CLR	R21
    01FD 3040      CPI	R20,0
    01FE 0745      CPC	R20,R21
    01FF F0C1      BEQ	0x0218
    0200 3041      CPI	R20,1
    0201 E0E0      LDI	R30,0
    0202 075E      CPC	R21,R30
    0203 F111      BEQ	0x0226
    0204 3044      CPI	R20,4
    0205 E0E0      LDI	R30,0

⌨️ 快捷键说明

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