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

📄 fjv14.lst

📁 一本关于控制系统仿真的书的程序 1、文件夹1中的程序是书中的一些仿真。 2、文件2中的是最近做的预测控制、PID控制及逻辑控制的对比综合研究。 3、文件夹3中是与maltab通信的数据采集板的设
💻 LST
📖 第 1 页 / 共 3 页
字号:
__text_start:
__start:
    0013 E5CF      LDI	R28,0x5F
    0014 E0D4      LDI	R29,4
    0015 BFCD      OUT	0x3D,R28
    0016 BFDE      OUT	0x3E,R29
    0017 51C0      SUBI	R28,0x10
    0018 40D0      SBCI	R29,0
    0019 EA0A      LDI	R16,0xAA
    001A 8308      STD	Y+0,R16
    001B 2400      CLR	R0
    001C E6E0      LDI	R30,0x60
    001D E0F0      LDI	R31,0
    001E E010      LDI	R17,0
    001F 36E2      CPI	R30,0x62
    0020 07F1      CPC	R31,R17
    0021 F011      BEQ	0x0024
    0022 9201      ST	R0,Z+
    0023 CFFB      RJMP	0x001F
    0024 8300      STD	Z+0,R16
    0025 E2E6      LDI	R30,0x26
    0026 E0F0      LDI	R31,0
    0027 E6A0      LDI	R26,0x60
    0028 E0B0      LDI	R27,0
    0029 E010      LDI	R17,0
    002A 32E6      CPI	R30,0x26
    002B 07F1      CPC	R31,R17
    002C F021      BEQ	0x0031
    002D 95C8      LPM
    002E 9631      ADIW	R30,1
    002F 920D      ST	R0,X+
    0030 CFF9      RJMP	0x002A
    0031 D05E      RCALL	_main
_exit:
    0032 CFFF      RJMP	_exit
FILE: D:\采集卡项目\单片机程序\fjv14\fjv14.c
(0001) //m8L,4M晶振,波特率2400
(0002)  #include "iom8v.h"
(0003)  #include"macros.h"
(0004)  #include"stdio.h"
(0005) //控制DA的cs位
(0006)  #define set_cs  PORTB |= (1<<PB2)     
(0007)  #define clr_cs  PORTB &= 0b11111011   
(0008) 
(0009)  #define IO_PB0  0x00
(0010)  #define IO_PB1  0x01
(0011)  #define IO_PB4  0x04
(0012)  #define IO_PD5  0x05
(0013)  #define IO_PD6  0x06
(0014)  #define IO_PD7  0x07
(0015)         
(0016) //定义全局变量-------------------------------
(0017)  unsigned int AD_value10;//ad采集值10位。
(0018)  
(0019)  
(0020)  //------------------------------------------
(0021)  unsigned int  ADC_filter(void);
(0022)  void init_devices(void);
(0023)  unsigned char USART_Recive(void);
(0024) void USART_Transmit(unsigned char tdata);
(0025) void ADC_Start(void);
(0026) unsigned int ADC_Value (unsigned char adc_channel);
(0027) void DAC_5617_10(unsigned char dac_dataH,unsigned char dac_dataL,unsigned char dac_channel);
(0028) void SPI_Transmit(unsigned char dac_data);
(0029) unsigned char  SPI_Compare(unsigned char data,unsigned char mark);
(0030) void delay_1ms(void);
(0031) unsigned char Strcat(unsigned char s1,unsigned char s2);
(0032) void IO_out(unsigned char IO_data,unsigned char IO_channel);
(0033) unsigned char IO_in (unsigned char IO_channel);
(0034) 
(0035) /**************************************************************************/
(0036) void port_init(void)
(0037) {
(0038)       PORTB = 0xFF;//确保复位电平是确定的,输入、上拉
_port_init:
    0033 EF8F      LDI	R24,0xFF
    0034 BB88      OUT	0x18,R24
(0039)       DDRB  = 0x00;
    0035 2422      CLR	R2
    0036 BA27      OUT	0x17,R2
(0040)       PORTC = 0xFF;
    0037 BB85      OUT	0x15,R24
(0041)       DDRC  = 0x00;
    0038 BA24      OUT	0x14,R2
(0042)       PORTD = 0xFF;
    0039 BB82      OUT	0x12,R24
(0043)       DDRD=0x00;
    003A BA21      OUT	0x11,R2
    003B 9508      RET
(0044) }
(0045) /********************************************************************/
(0046) //Watchdog initialize
(0047) // prescale: 512K 0.52s
(0048) void watchdog_init(void)
(0049) {
(0050)  WDR(); //this prevents a timout on enabling
_watchdog_init:
    003C 95A8      WDR
(0051)  WDTCR = 0x0D; //WATCHDOG ENABLED - dont forget to issue WDRs
    003D E08D      LDI	R24,0xD
    003E BD81      OUT	0x21,R24
    003F 9508      RET
(0052) }
(0053) /*********************************************************************/
(0054) //关闭看门狗
(0055) void WDT_off(void)
(0056) {
(0057)     _WDR();
_WDT_off:
    0040 95A8      WDR
(0058) 	WDTCR |= (1<<WDCE)|(1<<WDE);
    0041 B581      IN	R24,0x21
    0042 6188      ORI	R24,0x18
    0043 BD81      OUT	0x21,R24
(0059) 	WDTCR = 0x00;
    0044 2422      CLR	R2
    0045 BC21      OUT	0x21,R2
    0046 9508      RET
(0060) }
(0061) /**************************************************************************/
(0062) void uart0_init(void)
(0063) {
(0064)  	 UCSRB=(1<<RXEN)|(1<<TXEN);//发送接收使能
_uart0_init:
    0047 E188      LDI	R24,0x18
    0048 B98A      OUT	0x0A,R24
(0065)  	 UCSRC=(1<<UMSEL);//选择异步发送模式
    0049 E480      LDI	R24,0x40
    004A BD80      OUT	0x20,R24
(0066)  	 UBRRL = 0x33;//设置波特率低位4m4800
    004B E383      LDI	R24,0x33
    004C B989      OUT	0x09,R24
(0067) 	 UBRRH = 0x00; //设置波特率高位
    004D 2422      CLR	R2
    004E BC20      OUT	0x20,R2
(0068)  	 UCSRA = 0x18;  //接收、发送数据
    004F E188      LDI	R24,0x18
    0050 B98B      OUT	0x0B,R24
(0069)  	 UCSRC =(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
    0051 E886      LDI	R24,0x86
    0052 BD80      OUT	0x20,R24
    0053 9508      RET
(0070) }
(0071) 
(0072) /************************************************************************/
(0073) void  spi_init(void)
(0074) {	
(0075)        //PB2为CS端。PB3为MOSI端。PB5为SCK端。
(0076) 	 // PORTB=(1<<PB2)|(1<<PB3)|(1<<PB5);//SPI端口初始化.慎用<<置1。将会影响其他位。
(0077)  	  DDRB= (1<<DDB2)|(1<<DDB3)|(1<<DDB5);//SPI端口初始化
_spi_init:
    0054 E28C      LDI	R24,0x2C
    0055 BB87      OUT	0x17,R24
(0078) 	  SPSR=0x01;//SPI状态寄存器初始化
    0056 E081      LDI	R24,1
    0057 B98E      OUT	0x0E,R24
(0079)    	  SPCR=0x58; //SPI使能 
    0058 E588      LDI	R24,0x58
    0059 B98D      OUT	0x0D,R24
    005A 9508      RET
(0080) }
(0081) /*************************************************************************/
(0082) //ADC initialize
(0083) // Conversion time: 52uS
(0084) 
(0085) void adc_init(void)
(0086) {
(0087)    PORTC =(0<<PC0)|(0<<PC1)|(0<<PC2)|(0<<PC3) ;//关闭上拉电阻
_adc_init:
    005B 2422      CLR	R2
    005C BA25      OUT	0x15,R2
(0088)    ACSR  = 0x00;//与模拟比较器控制
    005D B828      OUT	0x08,R2
(0089) 	//ACSR =(1<<ACD);//关闭模拟比较器
(0090)    ADMUX=0x00;//设定AD选择寄存器,片外基准。ch1通道(对应芯片ADC0)。数据右对齐。	
    005E B827      OUT	0x07,R2
(0091)    ADCSRA = 0x00;  //disable adc
    005F B826      OUT	0x06,R2
(0092)    ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(0<<ADPS1) ;//16分频,使能AD,开启中断。还没开始转换。
    0060 E88C      LDI	R24,0x8C
    0061 B986      OUT	0x06,R24
    0062 9508      RET
_adc_isr:
    0063 922A      ST	R2,-Y
    0064 923A      ST	R3,-Y
    0065 924A      ST	R4,-Y
    0066 925A      ST	R5,-Y
    0067 B62F      IN	R2,0x3F
    0068 922A      ST	R2,-Y
(0093)    
(0094)  
(0095)  }
(0096) /*************************************************************************/
(0097) #pragma interrupt_handler adc_isr:15
(0098) void adc_isr(void)
(0099) {
(0100)  //conversion complete, read value (int) using...
(0101)      AD_value10 = ADCL;            //Read 8 low bits first (important)
    0069 B024      IN	R2,0x04
    006A 2433      CLR	R3
    006B 92300061  STS	AD_value10+1,R3
    006D 92200060  STS	AD_value10,R2
(0102)      AD_value10|=(unsigned int)ADCH << 8; //read 2 high bits and shift into top byte
    006F B025      IN	R2,0x05
    0070 2433      CLR	R3
    0071 2C32      MOV	R3,R2
    0072 2422      CLR	R2
    0073 90400060  LDS	R4,AD_value10
    0075 90500061  LDS	R5,AD_value10+1
    0077 2842      OR	R4,R2
    0078 2853      OR	R5,R3
    0079 92500061  STS	AD_value10+1,R5
    007B 92400060  STS	AD_value10,R4
    007D 9029      LD	R2,Y+
    007E BE2F      OUT	0x3F,R2
    007F 9059      LD	R5,Y+
    0080 9049      LD	R4,Y+
    0081 9039      LD	R3,Y+
    0082 9029      LD	R2,Y+
    0083 9518      RETI
(0103) 	
(0104) }
(0105) /*************************************************************************/
(0106) void init_devices(void)
(0107) {
(0108)    CLI(); //关闭所有中断
_init_devices:
    0084 94F8      BCLR	7
(0109)    port_init();//端口初始化
    0085 DFAD      RCALL	_port_init
(0110)    watchdog_init();
    0086 DFB5      RCALL	_watchdog_init
(0111)    uart0_init();//串行通信初始化
    0087 DFBF      RCALL	_uart0_init
(0112)    adc_init();//AD初始化
    0088 DFD2      RCALL	_adc_init
(0113)    spi_init();//SPI初始化
    0089 DFCA      RCALL	_spi_init
(0114)    MCUCR = 0x10;//ADC噪声抑制模式。
    008A E180      LDI	R24,0x10
    008B BF85      OUT	0x35,R24
(0115)    GICR  = 0x00;//关外部中断
    008C 2422      CLR	R2
    008D BE2B      OUT	0x3B,R2
(0116)    SEI();
    008E 9478      BSET	7
    008F 9508      RET
_main:
  m                    --> R22
  temp10               --> Y+6
  temp8                --> R12
  charry               --> Y+1
  y                    --> R14
  i                    --> R10
    0090 9728      SBIW	R28,0x8
(0117) }
(0118) /**************************************************************************/
(0119) /**************************************************************************/
(0120) void main( )
(0121) {
(0122)   
(0123)   unsigned char charry[5];
(0124)   unsigned char y;
(0125)   unsigned char temp8;
(0126)   unsigned int temp10;//接收10位的数据,如AD等。
(0127)   unsigned int i;
(0128)   unsigned int m;
(0129)   init_devices();//初始化
    0091 DFF2      RCALL	_init_devices
    0092 C079      RJMP	0x010C
(0130)   while(1)
(0131) 	{
(0132) 	 charry[0]=0;//初始化
    0093 2422      CLR	R2
    0094 8229      STD	Y+1,R2
(0133) 	 charry[1]=0;
    0095 822A      STD	Y+2,R2
(0134) 	 charry[2]=0;
    0096 822B      STD	Y+3,R2
(0135) 	 charry[3]=0;
    0097 822C      STD	Y+4,R2
(0136) 	 charry[4]=0;
    0098 822D      STD	Y+5,R2
(0137) 	 y=0;
    0099 24EE      CLR	R14
(0138) 	 temp8=0;
    009A 24CC      CLR	R12
(0139) 	 temp10=0;
    009B 2400      CLR	R0
    009C 2411      CLR	R1
    009D 821F      STD	Y+7,R1
    009E 820E      STD	Y+6,R0
(0140) 	 m=0;
    009F 2766      CLR	R22
    00A0 2777      CLR	R23
(0141) 	 
(0142) 	 WDT_off();//等待第一个接收数据。
    00A1 DF9E      RCALL	_WDT_off
(0143) 	 y=USART_Recive();
    00A2 D06C      RCALL	_USART_Recive
    00A3 2EE0      MOV	R14,R16
(0144) 	 charry[0]=y;//接收数据
    00A4 82E9      STD	Y+1,R14
(0145) 	 watchdog_init();//打开看门狗,防止串行数据中断而无限等待。
    00A5 DF96      RCALL	_watchdog_init
(0146) 	 for(i=1;i<5;i++)
    00A6 E081      LDI	R24,1
    00A7 E090      LDI	R25,0
    00A8 015C      MOVW	R10,R24
    00A9 C00B      RJMP	0x00B5
(0147) 	      { 
(0148) 		    y=USART_Recive();
    00AA D064      RCALL	_USART_Recive
    00AB 2EE0      MOV	R14,R16
(0149) 			charry[i]=y;//接收数据
    00AC 01CE      MOVW	R24,R28
    00AD 9601      ADIW	R24,1
    00AE 01F5      MOVW	R30,R10
    00AF 0FE8      ADD	R30,R24
    00B0 1FF9      ADC	R31,R25
    00B1 82E0      STD	Z+0,R14
    00B2 01C5      MOVW	R24,R10
    00B3 9601      ADIW	R24,1
    00B4 015C      MOVW	R10,R24
    00B5 01C5      MOVW	R24,R10
    00B6 3085      CPI	R24,5
    00B7 E0E0      LDI	R30,0
    00B8 079E      CPC	R25,R30
    00B9 F380      BCS	0x00AA
(0150) 		  }
(0151)      
(0152) 	  if (charry[0]==0x55)
    00BA 8189      LDD	R24,Y+1
    00BB 3585      CPI	R24,0x55
    00BC F009      BEQ	0x00BE
    00BD C04E      RJMP	0x010C
(0153) 		 {
(0154) 	  	
(0155) 		    //功能选择判断
(0156) 		      switch (charry[1])
    00BE 814A      LDD	R20,Y+2
    00BF 2755      CLR	R21
    00C0 3041      CPI	R20,1
    00C1 E0E0      LDI	R30,0
    00C2 075E      CPC	R21,R30
    00C3 F0F9      BEQ	0x00E3
    00C4 3042      CPI	R20,2
    00C5 E0E0      LDI	R30,0
    00C6 075E      CPC	R21,R30
    00C7 F0B1      BEQ	0x00DE
    00C8 3043      CPI	R20,3
    00C9 E0E0      LDI	R30,0
    00CA 075E      CPC	R21,R30
    00CB F071      BEQ	0x00DA
    00CC 3041      CPI	R20,1
    00CD E0E0      LDI	R30,0
    00CE 075E      CPC	R21,R30
    00CF F40C      BGE	0x00D1
    00D0 C03B      RJMP	0x010C
    00D1 3140      CPI	R20,0x10
    00D2 E0E0      LDI	R30,0
    00D3 075E      CPC	R21,R30
    00D4 F0E9      BEQ	0x00F2
    00D5 3141      CPI	R20,0x11
    00D6 E0E0      LDI	R30,0
    00D7 075E      CPC	R21,R30
    00D8 F0F9      BEQ	0x00F8
    00D9 C032      RJMP	0x010C
(0157) 		        {
(0158) 		           case 0x03:  //如果为00则启动IO输出
(0159) 				IO_out(charry[3],charry[2]);	//确定输出数据和端口
    00DA 812B      LDD	R18,Y+3
    00DB 810C      LDD	R16,Y+4
    00DC D11D      RCALL	_IO_out
(0160) 		                break;
    00DD C02E      RJMP	0x010C
(0161) 		           case 0x02:  //如果为00则启动IO输入
(0162) 				temp8=IO_in(charry[2]);//启动IO转换,确定通道数。
    00DE 810B      LDD	R16,Y+3
    00DF D18D      RCALL	_IO_in
    00E0 2EC0      MOV	R12,R16
(0163)                       		USART_Transmit(temp8);//启动串口发送IO数据(第四位)
    00E1 D034      RCALL	_USART_Transmit
(0164)                       		//USART_Transmit(0x00);//启动串口发送IO数据(第五位) 
(0165) 		                break;
    00E2 C029      RJMP	0x010C
(0166) 		           case 0x01://如果为01则启动AD转换
(0167) 				 temp10=ADC_Value(charry[2]);//启动AD转换,确定通道数。
    00E3 810B      LDD	R16,Y+3
    00E4 D035      RCALL	_ADC_Value
    00E5 831F      STD	Y+7,R17
    00E6 830E      STD	Y+6,R16
(0168) 				 m=temp10;
    00E7 01B8      MOVW	R22,R16
(0169)                                  temp8=(unsigned char)(m>>8);
    00E8 016B      MOVW	R12,R22
    00E9 2CCD      MOV	R12,R13
    00EA 24DD      CLR	R13
(0170)                     		 USART_Transmit(temp8);//启动串口发送数据(高8位)
    00EB 2D0C      MOV	R16,R12
    00EC D029      RCALL	_USART_Transmit
(0171)                     		 temp8=(unsigned char)temp10;
    00ED 80CE      LDD	R12,Y+6
    00EE 80DF      LDD	R13,Y+7
(0172) 				 USART_Transmit(temp8);//启动串口发送数据(低8位)
    00EF 2D0C      MOV	R16,R12
    00F0 D025      RCALL	_USART_Transmit
(0173) 			         break;
    00F1 C01A      RJMP	0x010C
(0174) 		           case  0x10://如果为10则启动DA转换
(0175)                                  DAC_5617_10(charry[3],charry[4],charry[2]);	//启动DA5716		
    00F2 802B      LDD	R2,Y+3
    00F3 8228      STD	Y+0,R2
    00F4 812D      LDD	R18,Y+5
    00F5 810C      LDD	R16,Y+4
    00F6 D0AA      RCALL	_DAC_5617_10
(0176) 				 break;
    00F7 C014      RJMP	0x010C
(0177) 			   case 0x11://如果为11则先启动DA再启动AD转换
(0178) 				     DAC_5617_10(charry[3],charry[4],0x01);	//启动DA5716	
    00F8 E081      LDI	R24,1
    00F9 8388      STD	Y+0,R24
    00FA 812D      LDD	R18,Y+5
    00FB 810C      LDD	R16,Y+4
    00FC D0A4      RCALL	_DAC_5617_10
(0179) 					 asm("NOP");
    00FD 0000      NOP
(0180) 				     temp10=ADC_Value(0x01);      //启动AD转换,AD/DA使用相同通道1。
    00FE E001      LDI	R16,1
    00FF D01A      RCALL	_ADC_Value
    0100 831F      STD	Y+7,R17
    0101 830E      STD	Y+6,R16
(0181) 		             m=temp10;
    0102 01B8      MOVW	R22,R16
(0182)                      temp8=(unsigned char)(m>>8);
    0103 016B      MOVW	R12,R22
    0104 2CCD      MOV	R12,R13
    0105 24DD      CLR	R13
(0183)                      USART_Transmit(temp8);//启动串口发送数据(高8位)
    0106 2D0C      MOV	R16,R12
    0107 D00E      RCALL	_USART_Transmit
(0184)                      temp8=(unsigned char)temp10;
    0108 80CE      LDD	R12,Y+6
    0109 80DF      LDD	R13,Y+7
(0185) 				 	 USART_Transmit(temp8);//启动串口发送数据(低8位)
    010A 2D0C      MOV	R16,R12
    010B D00A      RCALL	_USART_Transmit
    010C CF86      RJMP	0x0093
    010D 9628      ADIW	R28,0x8

⌨️ 快捷键说明

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