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