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

📄 fjv14.s

📁 一本关于控制系统仿真的书的程序 1、文件夹1中的程序是书中的一些仿真。 2、文件2中的是最近做的预测控制、PID控制及逻辑控制的对比综合研究。 3、文件夹3中是与maltab通信的数据采集板的设
💻 S
📖 第 1 页 / 共 3 页
字号:
	.module fjv14.c
	.area text(rom, con, rel)
	.dbfile D:\采集卡项目\单片机程序\fjv14\fjv14.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 37
; //m8L,4M晶振,波特率2400
;  #include "iom8v.h"
;  #include"macros.h"
;  #include"stdio.h"
; //控制DA的cs位
;  #define set_cs  PORTB |= (1<<PB2)     
;  #define clr_cs  PORTB &= 0b11111011   
; 
;  #define IO_PB0  0x00
;  #define IO_PB1  0x01
;  #define IO_PB4  0x04
;  #define IO_PD5  0x05
;  #define IO_PD6  0x06
;  #define IO_PD7  0x07
;         
; //定义全局变量-------------------------------
;  unsigned int AD_value10;//ad采集值10位。
;  
;  
;  //------------------------------------------
;  unsigned int  ADC_filter(void);
;  void init_devices(void);
;  unsigned char USART_Recive(void);
; void USART_Transmit(unsigned char tdata);
; void ADC_Start(void);
; unsigned int ADC_Value (unsigned char adc_channel);
; void DAC_5617_10(unsigned char dac_dataH,unsigned char dac_dataL,unsigned char dac_channel);
; void SPI_Transmit(unsigned char dac_data);
; unsigned char  SPI_Compare(unsigned char data,unsigned char mark);
; void delay_1ms(void);
; unsigned char Strcat(unsigned char s1,unsigned char s2);
; void IO_out(unsigned char IO_data,unsigned char IO_channel);
; unsigned char IO_in (unsigned char IO_channel);
; 
; /**************************************************************************/
; void port_init(void)
; {
	.dbline 38
;       PORTB = 0xFF;//确保复位电平是确定的,输入、上拉
	ldi R24,255
	out 0x18,R24
	.dbline 39
;       DDRB  = 0x00;
	clr R2
	out 0x17,R2
	.dbline 40
;       PORTC = 0xFF;
	out 0x15,R24
	.dbline 41
;       DDRC  = 0x00;
	out 0x14,R2
	.dbline 42
;       PORTD = 0xFF;
	out 0x12,R24
	.dbline 43
;       DDRD=0x00;
	out 0x11,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e watchdog_init _watchdog_init fV
	.even
_watchdog_init::
	.dbline -1
	.dbline 49
; }
; /********************************************************************/
; //Watchdog initialize
; // prescale: 512K 0.52s
; void watchdog_init(void)
; {
	.dbline 50
;  WDR(); //this prevents a timout on enabling
	wdr
	.dbline 51
;  WDTCR = 0x0D; //WATCHDOG ENABLED - dont forget to issue WDRs
	ldi R24,13
	out 0x21,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e WDT_off _WDT_off fV
	.even
_WDT_off::
	.dbline -1
	.dbline 56
; }
; /*********************************************************************/
; //关闭看门狗
; void WDT_off(void)
; {
	.dbline 57
;     _WDR();
	wdr
	.dbline 58
; 	WDTCR |= (1<<WDCE)|(1<<WDE);
	in R24,0x21
	ori R24,24
	out 0x21,R24
	.dbline 59
; 	WDTCR = 0x00;
	clr R2
	out 0x21,R2
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e uart0_init _uart0_init fV
	.even
_uart0_init::
	.dbline -1
	.dbline 63
; }
; /**************************************************************************/
; void uart0_init(void)
; {
	.dbline 64
;  	 UCSRB=(1<<RXEN)|(1<<TXEN);//发送接收使能
	ldi R24,24
	out 0xa,R24
	.dbline 65
;  	 UCSRC=(1<<UMSEL);//选择异步发送模式
	ldi R24,64
	out 0x20,R24
	.dbline 66
;  	 UBRRL = 0x33;//设置波特率低位4m4800
	ldi R24,51
	out 0x9,R24
	.dbline 67
; 	 UBRRH = 0x00; //设置波特率高位
	clr R2
	out 0x20,R2
	.dbline 68
;  	 UCSRA = 0x18;  //接收、发送数据
	ldi R24,24
	out 0xb,R24
	.dbline 69
;  	 UCSRC =(1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);//8位数据+1位STOP位
	ldi R24,134
	out 0x20,R24
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e spi_init _spi_init fV
	.even
_spi_init::
	.dbline -1
	.dbline 74
; }
; 
; /************************************************************************/
; void  spi_init(void)
; {	
	.dbline 77
;        //PB2为CS端。PB3为MOSI端。PB5为SCK端。
; 	 // PORTB=(1<<PB2)|(1<<PB3)|(1<<PB5);//SPI端口初始化.慎用<<置1。将会影响其他位。
;  	  DDRB= (1<<DDB2)|(1<<DDB3)|(1<<DDB5);//SPI端口初始化
	ldi R24,44
	out 0x17,R24
	.dbline 78
; 	  SPSR=0x01;//SPI状态寄存器初始化
	ldi R24,1
	out 0xe,R24
	.dbline 79
;    	  SPCR=0x58; //SPI使能 
	ldi R24,88
	out 0xd,R24
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 86
; }
; /*************************************************************************/
; //ADC initialize
; // Conversion time: 52uS
; 
; void adc_init(void)
; {
	.dbline 87
;    PORTC =(0<<PC0)|(0<<PC1)|(0<<PC2)|(0<<PC3) ;//关闭上拉电阻
	clr R2
	out 0x15,R2
	.dbline 88
;    ACSR  = 0x00;//与模拟比较器控制
	out 0x8,R2
	.dbline 90
; 	//ACSR =(1<<ACD);//关闭模拟比较器
;    ADMUX=0x00;//设定AD选择寄存器,片外基准。ch1通道(对应芯片ADC0)。数据右对齐。	
	out 0x7,R2
	.dbline 91
;    ADCSRA = 0x00;  //disable adc
	out 0x6,R2
	.dbline 92
;    ADCSRA=(1<<ADEN)|(1<<ADIE)|(1<<ADPS2)|(0<<ADPS1) ;//16分频,使能AD,开启中断。还没开始转换。
	ldi R24,140
	out 0x6,R24
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 28
	rjmp _adc_isr
	.area text(rom, con, rel)
	.dbfile D:\采集卡项目\单片机程序\fjv14\fjv14.c
	.dbfunc e adc_isr _adc_isr fV
	.even
_adc_isr::
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 99
;    
;  
;  }
; /*************************************************************************/
; #pragma interrupt_handler adc_isr:15
; void adc_isr(void)
; {
	.dbline 101
;  //conversion complete, read value (int) using...
;      AD_value10 = ADCL;            //Read 8 low bits first (important)
	in R2,0x4
	clr R3
	sts _AD_value10+1,R3
	sts _AD_value10,R2
	.dbline 102
;      AD_value10|=(unsigned int)ADCH << 8; //read 2 high bits and shift into top byte
	in R2,0x5
	clr R3
	mov R3,R2
	clr R2
	lds R4,_AD_value10
	lds R5,_AD_value10+1
	or R4,R2
	or R5,R3
	sts _AD_value10+1,R5
	sts _AD_value10,R4
	.dbline -2
L7:
	ld R2,y+
	out 0x3f,R2
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 107
; 	
; }
; /*************************************************************************/
; void init_devices(void)
; {
	.dbline 108
;    CLI(); //关闭所有中断
	cli
	.dbline 109
;    port_init();//端口初始化
	rcall _port_init
	.dbline 110
;    watchdog_init();
	rcall _watchdog_init
	.dbline 111
;    uart0_init();//串行通信初始化
	rcall _uart0_init
	.dbline 112
;    adc_init();//AD初始化
	rcall _adc_init
	.dbline 113
;    spi_init();//SPI初始化
	rcall _spi_init
	.dbline 114
;    MCUCR = 0x10;//ADC噪声抑制模式。
	ldi R24,16
	out 0x35,R24
	.dbline 115
;    GICR  = 0x00;//关外部中断
	clr R2
	out 0x3b,R2
	.dbline 116
;    SEI();
	sei
	.dbline -2
L8:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;              m -> R22,R23
;         temp10 -> y+6
;          temp8 -> R12
;         charry -> y+1
;              y -> R14
;              i -> R10,R11
	.even
_main::
	sbiw R28,8
	.dbline -1
	.dbline 121
; }
; /**************************************************************************/
; /**************************************************************************/
; void main( )
; {
	.dbline 129
;   
;   unsigned char charry[5];
;   unsigned char y;
;   unsigned char temp8;
;   unsigned int temp10;//接收10位的数据,如AD等。
;   unsigned int i;
;   unsigned int m;
;   init_devices();//初始化
	rcall _init_devices
	rjmp L11
L10:
	.dbline 131
;   while(1)
; 	{
	.dbline 132
; 	 charry[0]=0;//初始化
	clr R2
	std y+1,R2
	.dbline 133
; 	 charry[1]=0;
	std y+2,R2
	.dbline 134
; 	 charry[2]=0;
	std y+3,R2
	.dbline 135
; 	 charry[3]=0;
	std y+4,R2
	.dbline 136
; 	 charry[4]=0;
	std y+5,R2
	.dbline 137
; 	 y=0;
	clr R14
	.dbline 138
; 	 temp8=0;
	clr R12
	.dbline 139
; 	 temp10=0;
	clr R0
	clr R1
	std y+7,R1
	std y+6,R0
	.dbline 140
; 	 m=0;
	clr R22
	clr R23
	.dbline 142
; 	 
; 	 WDT_off();//等待第一个接收数据。
	rcall _WDT_off
	.dbline 143
; 	 y=USART_Recive();
	rcall _USART_Recive
	mov R14,R16
	.dbline 144
; 	 charry[0]=y;//接收数据
	std y+1,R14
	.dbline 145
; 	 watchdog_init();//打开看门狗,防止串行数据中断而无限等待。
	rcall _watchdog_init
	.dbline 146
; 	 for(i=1;i<5;i++)
	ldi R24,1
	ldi R25,0
	movw R10,R24
	rjmp L20
L17:
	.dbline 147
	.dbline 148
	rcall _USART_Recive
	mov R14,R16
	.dbline 149
	movw R24,R28
	adiw R24,1
	movw R30,R10
	add R30,R24
	adc R31,R25
	std z+0,R14
	.dbline 150
L18:
	.dbline 146
	movw R24,R10
	adiw R24,1
	movw R10,R24
L20:
	.dbline 146
	movw R24,R10
	cpi R24,5
	ldi R30,0
	cpc R25,R30
	brlo L17
	.dbline 152
; 	      { 
; 		    y=USART_Recive();
; 			charry[i]=y;//接收数据
; 		  }
;      
; 	  if (charry[0]==0x55)
	ldd R24,y+1
	cpi R24,85
	breq X2
	rjmp L21
X2:
	.dbline 153
; 		 {
	.dbline 156
; 	  	
; 		    //功能选择判断
; 		      switch (charry[1])
	ldd R20,y+2
	clr R21
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	breq L32
	cpi R20,2
	ldi R30,0
	cpc R21,R30
	breq L30
	cpi R20,3
	ldi R30,0
	cpc R21,R30
	breq L27
	cpi R20,1
	ldi R30,0
	cpc R21,R30
	brge X3
	rjmp L24
X3:
L41:
	cpi R20,16
	ldi R30,0
	cpc R21,R30
	breq L34
	cpi R20,17
	ldi R30,0
	cpc R21,R30
	breq L38
	rjmp L24
X0:
	.dbline 157
; 		        {
L27:
	.dbline 159
; 		           case 0x03:  //如果为00则启动IO输出
; 				IO_out(charry[3],charry[2]);	//确定输出数据和端口
	ldd R18,y+3
	ldd R16,y+4
	rcall _IO_out
	.dbline 160
; 		                break;
	rjmp L24
L30:
	.dbline 162
; 		           case 0x02:  //如果为00则启动IO输入
; 				temp8=IO_in(charry[2]);//启动IO转换,确定通道数。
	ldd R16,y+3
	rcall _IO_in
	mov R12,R16
	.dbline 163
;                       		USART_Transmit(temp8);//启动串口发送IO数据(第四位)
	rcall _USART_Transmit
	.dbline 165
;                       		//USART_Transmit(0x00);//启动串口发送IO数据(第五位) 
; 		                break;
	rjmp L24
L32:
	.dbline 167
; 		           case 0x01://如果为01则启动AD转换
; 				 temp10=ADC_Value(charry[2]);//启动AD转换,确定通道数。
	ldd R16,y+3
	rcall _ADC_Value
	std y+7,R17
	std y+6,R16
	.dbline 168
; 				 m=temp10;
	movw R22,R16
	.dbline 169
;                                  temp8=(unsigned char)(m>>8);
	movw R12,R22
	mov R12,R13
	clr R13
	.dbline 170
;                     		 USART_Transmit(temp8);//启动串口发送数据(高8位)
	mov R16,R12
	rcall _USART_Transmit
	.dbline 171
;                     		 temp8=(unsigned char)temp10;
	ldd R12,y+6
	ldd R13,y+7
	.dbline 172
; 				 USART_Transmit(temp8);//启动串口发送数据(低8位)
	mov R16,R12
	rcall _USART_Transmit
	.dbline 173
; 			         break;
	rjmp L24
L34:
	.dbline 175
; 		           case  0x10://如果为10则启动DA转换
;                                  DAC_5617_10(charry[3],charry[4],charry[2]);	//启动DA5716		
	ldd R2,y+3
	std y+0,R2
	ldd R18,y+5
	ldd R16,y+4
	rcall _DAC_5617_10
	.dbline 176
; 				 break;
	rjmp L24
L38:
	.dbline 178
; 			   case 0x11://如果为11则先启动DA再启动AD转换
; 				     DAC_5617_10(charry[3],charry[4],0x01);	//启动DA5716	
	ldi R24,1
	std y+0,R24
	ldd R18,y+5
	ldd R16,y+4
	rcall _DAC_5617_10
	.dbline 179
; 					 asm("NOP");
	NOP
	.dbline 180
; 				     temp10=ADC_Value(0x01);      //启动AD转换,AD/DA使用相同通道1。
	ldi R16,1
	rcall _ADC_Value
	std y+7,R17
	std y+6,R16
	.dbline 181
; 		             m=temp10;
	movw R22,R16
	.dbline 182
;                      temp8=(unsigned char)(m>>8);
	movw R12,R22
	mov R12,R13
	clr R13
	.dbline 183
;                      USART_Transmit(temp8);//启动串口发送数据(高8位)
	mov R16,R12
	rcall _USART_Transmit
	.dbline 184
;                      temp8=(unsigned char)temp10;
	ldd R12,y+6
	ldd R13,y+7
	.dbline 185
; 				 	 USART_Transmit(temp8);//启动串口发送数据(低8位)
	mov R16,R12
	rcall _USART_Transmit
	.dbline 186
;                       break;
	.dbline 187
; 			  default:break;
L24:
	.dbline 189
; 		        }	 
; 	       }
L21:
	.dbline 191
L11:
	.dbline 130
	rjmp L10
X1:
	.dbline -2
L9:
	adiw R28,8
	.dbline 0 ; func end
	ret
	.dbsym r m 22 i
	.dbsym l temp10 6 i
	.dbsym r temp8 12 c
	.dbsym l charry 1 A[5:5]c
	.dbsym r y 14 c
	.dbsym r i 10 i
	.dbend
	.dbfunc e USART_Recive _USART_Recive fc
;              y -> R20
	.even
_USART_Recive::
	rcall push_gset1
	.dbline -1
	.dbline 196
;           
;      } 	  
; }

⌨️ 快捷键说明

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