📄 sudu.lst
字号:
__start:
__text_start:
0017 E5CF LDI R28,0x5F
0018 E0D4 LDI R29,4
0019 BFCD OUT 0x3D,R28
001A BFDE OUT 0x3E,R29
001B 51C0 SUBI R28,0x10
001C 40D0 SBCI R29,0
001D EA0A LDI R16,0xAA
001E 8308 STD Y+0,R16
001F 2400 CLR R0
0020 E6E8 LDI R30,0x68
0021 E0F0 LDI R31,0
0022 E010 LDI R17,0
0023 38E2 CPI R30,0x82
0024 07F1 CPC R31,R17
0025 F011 BEQ 0x0028
0026 9201 ST R0,Z+
0027 CFFB RJMP 0x0023
0028 8300 STD Z+0,R16
0029 E2E6 LDI R30,0x26
002A E0F0 LDI R31,0
002B E6A0 LDI R26,0x60
002C E0B0 LDI R27,0
002D E010 LDI R17,0
002E 32EE CPI R30,0x2E
002F 07F1 CPC R31,R17
0030 F021 BEQ 0x0035
0031 95C8 LPM
0032 9631 ADIW R30,1
0033 920D ST R0,X+
0034 CFF9 RJMP 0x002E
0035 D1A9 RCALL _main
_exit:
0036 CFFF RJMP _exit
_delay:
j --> R20
x --> R16
0037 D1E4 RCALL push_gset1
FILE: sudu.c
(0001) /**********************************/
(0002) /* 汽车转速测量程序
(0003) /* 8.24,2004
(0004) /* Writed by Wuxw
(0005) /* Automation Depart. of WHUT
(0006) /* 芯片:ATMEGA8L
(0007) /* 晶振:2MHz
(0008) /*
(0009) /*
(0010) /***********************************/
(0011) /* 脉冲输入接在INT0端口
(0012) /*
(0013) /* 输出n,单位r/50ms,可用来计算车轮转速
(0014) /*
(0015) /* num----脉冲计数,可用来计算里程
(0016) /*
(0017) /* 485输出格式:FB-86-n-numLL-numLH-numHL-numHH
(0018) /*
(0019) /* numLL-numLH-numHL-numHH分别为num的四个字节(L为低字节,H为高字节)
(0020) /*
(0021) /* 串口485通讯波特率baud = 9600
(0022) /*
(0023) /* 在受到正确地址(0x32)和命令(0xc5)后,发送数据
(0024) /*
(0025) /***********************************/
(0026)
(0027)
(0028)
(0029) #include "iom8v.h"
(0030) #include "macros.h"
(0031) #define uchar unsigned char
(0032) #define uint unsigned int
(0033) #define ulong unsigned long
(0034)
(0035) #define E2ADDRLL 0x000 //脉冲计数存放地址
(0036) #define E2ADDRLH 0x001
(0037) #define E2ADDRHL 0x002
(0038) #define E2ADDRHH 0x003
(0039) //#define osccal 0x9d//内部RC 校正常数
(0040)
(0041) //#define osccal 0xa4 //内部RC校正常数
(0042) #define fosc 8000000 //晶振8MHZ
(0043) #define baud 9600 //串口通讯波特率
(0044) #define TIME50ms 0xae //定时50ms的初装值
(0045)
(0046) #define osccal_addr 0x1ff
(0047)
(0048) uint m,n,k;
(0049) ulong num; //脉冲计数
(0050) uchar numLL,numLH,numHL,numHH,K,nLL,nLH;
(0051) uchar flag_receive,ndata[8]={0xFB,0x86,0x55,0x00,0x00,0x00,0x00,0x00};
(0052) uchar i,cx,xxx[3];
(0053) uchar data_receive[3];
(0054)
(0055)
(0056) //最小延时单位,约16微秒
(0057) void delay(uchar x)
(0058) { uchar j;
0038 C005 RJMP 0x003E
(0059) while(x-->0)
(0060) {
(0061) for(j=0;j<5;j++)
0039 2744 CLR R20
003A C001 RJMP 0x003C
003B 9543 INC R20
003C 3045 CPI R20,5
003D F3E8 BCS 0x003B
003E 2E20 MOV R2,R16
003F 2433 CLR R3
0040 5001 SUBI R16,1
0041 2444 CLR R4
0042 1442 CP R4,R2
0043 F3A8 BCS 0x0039
(0062) {;}
(0063) }
(0064) }
0044 D1DA RCALL pop_gset1
0045 9508 RET
(0065)
(0066) void decompose(void)
(0067) {
(0068) numLL = num;
_decompose:
0046 9040007A LDS R4,_num+2
0048 9050007B LDS R5,_num+3
004A 90200078 LDS R2,_num
004C 90300079 LDS R3,_num+1
004E 92200077 STS _numLL,R2
(0069) num=(num>>8);
0050 E088 LDI R24,0x8
0051 E090 LDI R25,0
0052 938A ST R24,-Y
0053 0181 MOVW R16,R2
0054 0192 MOVW R18,R4
0055 D21A RCALL lsr32
0056 93100079 STS _num+1,R17
0058 93000078 STS _num,R16
005A 9330007B STS _num+3,R19
005C 9320007A STS _num+2,R18
(0070) numLH= num;
005E 0118 MOVW R2,R16
005F 0129 MOVW R4,R18
0060 92200076 STS _numLH,R2
(0071) num= (num>>8);
0062 E088 LDI R24,0x8
0063 E090 LDI R25,0
0064 938A ST R24,-Y
0065 D20A RCALL lsr32
0066 93100079 STS _num+1,R17
0068 93000078 STS _num,R16
006A 9330007B STS _num+3,R19
006C 9320007A STS _num+2,R18
(0072) numHL=num;
006E 0118 MOVW R2,R16
006F 0129 MOVW R4,R18
0070 92200075 STS _numHL,R2
(0073) num=(num>>8);
0072 E088 LDI R24,0x8
0073 E090 LDI R25,0
0074 938A ST R24,-Y
0075 D1FA RCALL lsr32
0076 93100079 STS _num+1,R17
0078 93000078 STS _num,R16
007A 9330007B STS _num+3,R19
007C 9320007A STS _num+2,R18
(0074) numHH=num;
007E 0118 MOVW R2,R16
007F 0129 MOVW R4,R18
0080 92200074 STS _numHH,R2
(0075)
(0076) //nLL = n;
(0077) //n=(n>>8);
(0078) //nLH= n;
(0079) }
0082 9508 RET
_combination:
0083 D1AF RCALL push_gset2
(0080)
(0081) void combination(void)
(0082) {
(0083) num = 0;
0084 E040 LDI R20,0
0085 E050 LDI R21,0
0086 E060 LDI R22,0
0087 E070 LDI R23,0
0088 93500079 STS _num+1,R21
008A 93400078 STS _num,R20
008C 9370007B STS _num+3,R23
008E 9360007A STS _num+2,R22
(0084) num = numHH;
0090 90200074 LDS R2,_numHH
0092 2433 CLR R3
0093 2444 CLR R4
0094 2455 CLR R5
0095 92300079 STS _num+1,R3
0097 92200078 STS _num,R2
0099 9250007B STS _num+3,R5
009B 9240007A STS _num+2,R4
(0085) num = num<<8;
009D E088 LDI R24,0x8
009E E090 LDI R25,0
009F 9040007A LDS R4,_num+2
00A1 9050007B LDS R5,_num+3
00A3 90200078 LDS R2,_num
00A5 90300079 LDS R3,_num+1
00A7 938A ST R24,-Y
00A8 0181 MOVW R16,R2
00A9 0192 MOVW R18,R4
00AA D1B9 RCALL lsl32
00AB 93100079 STS _num+1,R17
00AD 93000078 STS _num,R16
00AF 9330007B STS _num+3,R19
00B1 9320007A STS _num+2,R18
(0086) num += numHL;
00B3 90200075 LDS R2,_numHL
00B5 2433 CLR R3
00B6 2444 CLR R4
00B7 2455 CLR R5
00B8 0138 MOVW R6,R16
00B9 0149 MOVW R8,R18
00BA 0C62 ADD R6,R2
00BB 1C73 ADC R7,R3
00BC 1C84 ADC R8,R4
00BD 1C95 ADC R9,R5
00BE 92700079 STS _num+1,R7
00C0 92600078 STS _num,R6
00C2 9290007B STS _num+3,R9
00C4 9280007A STS _num+2,R8
(0087) num = num<<8;
00C6 E088 LDI R24,0x8
00C7 E090 LDI R25,0
00C8 938A ST R24,-Y
00C9 0183 MOVW R16,R6
00CA 0194 MOVW R18,R8
00CB D198 RCALL lsl32
00CC 93100079 STS _num+1,R17
00CE 93000078 STS _num,R16
00D0 9330007B STS _num+3,R19
00D2 9320007A STS _num+2,R18
(0088) num += numLH;
00D4 90200076 LDS R2,_numLH
00D6 2433 CLR R3
00D7 2444 CLR R4
00D8 2455 CLR R5
00D9 0138 MOVW R6,R16
00DA 0149 MOVW R8,R18
00DB 0C62 ADD R6,R2
00DC 1C73 ADC R7,R3
00DD 1C84 ADC R8,R4
00DE 1C95 ADC R9,R5
00DF 92700079 STS _num+1,R7
00E1 92600078 STS _num,R6
00E3 9290007B STS _num+3,R9
00E5 9280007A STS _num+2,R8
(0089) num = num<<8;
00E7 E088 LDI R24,0x8
00E8 E090 LDI R25,0
00E9 938A ST R24,-Y
00EA 0183 MOVW R16,R6
00EB 0194 MOVW R18,R8
00EC D177 RCALL lsl32
00ED 93100079 STS _num+1,R17
00EF 93000078 STS _num,R16
00F1 9330007B STS _num+3,R19
00F3 9320007A STS _num+2,R18
(0090) num += numLL;
00F5 90200077 LDS R2,_numLL
00F7 2433 CLR R3
00F8 2444 CLR R4
00F9 2455 CLR R5
00FA 0138 MOVW R6,R16
00FB 0149 MOVW R8,R18
00FC 0C62 ADD R6,R2
00FD 1C73 ADC R7,R3
00FE 1C84 ADC R8,R4
00FF 1C95 ADC R9,R5
0100 92700079 STS _num+1,R7
0102 92600078 STS _num,R6
0104 9290007B STS _num+3,R9
0106 9280007A STS _num+2,R8
(0091)
(0092) //n = 0;
(0093) //n= nLH;
(0094) //n = n<<8;
(0095) //n += nLL;
(0096)
(0097) }
0108 D111 RCALL pop_gset2
0109 9508 RET
(0098)
(0099) void e2rom_write(uint e2addr,uchar e2data) //EEROM写数据
(0100) {
(0101) while(EECR & (1<<EEWE));
_e2rom_write:
e2data --> R18
e2addr --> R16
010A 99E1 SBIC 0x1C,1
010B CFFE RJMP _e2rom_write
(0102) EEAR = e2addr;
010C BB1F OUT 0x1F,R17
010D BB0E OUT 0x1E,R16
(0103) EEDR = e2data;
010E BB2D OUT 0x1D,R18
(0104)
(0105) EECR |= (1<<EEMWE);
010F 9AE2 SBI 0x1C,2
(0106) EECR |= (1<<EEWE);
0110 9AE1 SBI 0x1C,1
(0107) }
0111 9508 RET
(0108)
(0109) uchar e2rom_read(uint e2addr) //EEROM读数据
(0110) {
(0111) while(EECR & (1<<EEWE));
_e2rom_read:
e2addr --> R16
0112 99E1 SBIC 0x1C,1
0113 CFFE RJMP _e2rom_read
(0112) EEAR = e2addr;
0114 BB1F OUT 0x1F,R17
0115 BB0E OUT 0x1E,R16
(0113) EECR |= (1<<EERE);
0116 9AE0 SBI 0x1C,0
(0114) return EEDR;
0117 B30D IN R16,0x1D
0118 9508 RET
(0115) }
(0116)
(0117) void num_read(void) //从EEROM读出num
(0118) {
(0119) numLL = e2rom_read(E2ADDRLL);
_num_read:
0119 2700 CLR R16
011A 2711 CLR R17
011B DFF6 RCALL _e2rom_read
011C 93000077 STS _numLL,R16
(0120) numLH = e2rom_read(E2ADDRLH);
011E E001 LDI R16,1
011F E010 LDI R17,0
0120 DFF1 RCALL _e2rom_read
0121 93000076 STS _numLH,R16
(0121) numHL = e2rom_read(E2ADDRHL);
0123 E002 LDI R16,2
0124 E010 LDI R17,0
0125 DFEC RCALL _e2rom_read
0126 93000075 STS _numHL,R16
(0122) numHH = e2rom_read(E2ADDRHH);
0128 E003 LDI R16,3
0129 E010 LDI R17,0
012A DFE7 RCALL _e2rom_read
012B 93000074 STS _numHH,R16
(0123) combination();
(0124)
(0125) }
012D CF55 RJMP _combination
(0126)
(0127) void num_write(void) //将num写入EEROM
(0128) {
(0129) decompose();
_num_write:
012E DF17 RCALL _decompose
(0130) e2rom_write(E2ADDRLL,numLL);
012F 91200077 LDS R18,_numLL
0131 2700 CLR R16
0132 2711 CLR R17
0133 DFD6 RCALL _e2rom_write
(0131) e2rom_write(E2ADDRLH,numLH);
0134 91200076 LDS R18,_numLH
0136 E001 LDI R16,1
0137 E010 LDI R17,0
0138 DFD1 RCALL _e2rom_write
(0132) e2rom_write(E2ADDRHL,numHL);
0139 91200075 LDS R18,_numHL
013B E002 LDI R16,2
013C E010 LDI R17,0
013D DFCC RCALL _e2rom_write
(0133) e2rom_write(E2ADDRHH,numHH);
013E 91200074 LDS R18,_numHH
0140 E003 LDI R16,3
0141 E010 LDI R17,0
(0134) }
0142 CFC7 RJMP _e2rom_write
(0135)
(0136) void DataTransmit(void) //串行485数据发送
(0137) {
(0138) //ndata[2] = nLL;
(0139) ndata[3] = n;
_DataTransmit:
0143 9020007E LDS R2,_n
0145 9030007F LDS R3,_n+1
0147 92200063 STS 0x63,R2
(0140) ndata[4] = numLL;
0149 90200077 LDS R2,_numLL
014B 92200064 STS 0x64,R2
(0141) ndata[5] = numLH;
014D 90200076 LDS R2,_numLH
014F 92200065 STS 0x65,R2
(0142) ndata[6] = numHL;
0151 90200075 LDS R2,_numHL
0153 92200066 STS 0x66,R2
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -