📄 fjv14.s
字号:
.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 + -