📄 测脉宽.lst
字号:
__text_start:
__start:
0036 E5CF LDI R28,0x5F
0037 E0D4 LDI R29,4
0038 BFCD OUT 0x3D,R28
0039 BFDE OUT 0x3E,R29
003A 51C0 SUBI R28,0x10
003B 40D0 SBCI R29,0
003C EA0A LDI R16,0xAA
003D 8308 STD Y+0,R16
003E 2400 CLR R0
003F E6E7 LDI R30,0x67
0040 E0F0 LDI R31,0
0041 E010 LDI R17,0
0042 36EB CPI R30,0x6B
0043 07F1 CPC R31,R17
0044 F011 BEQ 0x0047
0045 9201 ST R0,Z+
0046 CFFB RJMP 0x0042
0047 8300 STD Z+0,R16
0048 E6E4 LDI R30,0x64
0049 E0F0 LDI R31,0
004A E6A0 LDI R26,0x60
004B E0B0 LDI R27,0
004C E010 LDI R17,0
004D 36EB CPI R30,0x6B
004E 07F1 CPC R31,R17
004F F021 BEQ 0x0054
0050 95C8 LPM
0051 9631 ADIW R30,1
0052 920D ST R0,X+
0053 CFF9 RJMP 0x004D
0054 940E00BF CALL _main
_exit:
0056 CFFF RJMP _exit
FILE: F:\李鹏飞\sl-avrad-m16\测脉宽\pulse_time.c
(0001) /******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /* 测脉宽程序 */
(0005) /* 用跳线将PD6依次与PA0~PA7相连 */
(0006) /* 作者:lpf@sl.com.cn */
(0007) /* 2003年8月28日 */
(0008) /* 目标MCU:MEGA16 晶振:外部(EXT) 8MHZ */
(0009) /******************************************/
(0010)
(0011)
(0012) #include<iom16v.h>
(0013) #pragma interrupt_handler Icp_timer1:6
(0014) //ICP中断入口地址
(0015) #pragma interrupt_handler Timer0:10
(0016) //定时器T0中断入口地址
(0017) #pragma data:code
(0018) //设置数据区为程序存储器
(0019) //七段码译码字形表
(0020) const unsigned char table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
(0021) 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
(0022) #pragma data:data
(0023) //设置数据区回到数据存储器
(0024) unsigned char ledbuff[]={0x3f,0x3f,0x3f,0x3f,0x3f,0x3f};//显示缓冲区
(0025) unsigned int oldcount;
(0026) unsigned int newcount;
(0027) unsigned char i=0;
(0028) //1MS延时程序
(0029) void delay_1ms()
(0030) {
(0031) unsigned int i;
(0032) for(i=1;i<1142;i++);
_delay_1ms:
i --> R16
0057 E001 LDI R16,1
0058 E010 LDI R17,0
0059 C002 RJMP 0x005C
005A 5F0F SUBI R16,0xFF
005B 4F1F SBCI R17,0xFF
005C 3706 CPI R16,0x76
005D E0E4 LDI R30,4
005E 071E CPC R17,R30
005F F3D0 BCS 0x005A
(0033) }
0060 9508 RET
_display:
i --> R20
0061 940E0125 CALL push_gset1
(0034) //六路动态扫描显示
(0035) void display()
(0036) {
(0037) unsigned char i;
(0038) for(i=0;i<6;i++)
0063 2744 CLR R20
0064 C018 RJMP 0x007D
(0039) {
(0040) PORTB=ledbuff[i];
0065 E680 LDI R24,0x60
0066 E090 LDI R25,0
0067 2FE4 MOV R30,R20
0068 27FF CLR R31
0069 0FE8 ADD R30,R24
006A 1FF9 ADC R31,R25
006B 8020 LDD R2,Z+0
006C BA28 OUT 0x18,R2
(0041) PORTD=~(1<<i);
006D E001 LDI R16,1
006E 2F14 MOV R17,R20
006F 940E0144 CALL lsl8
0071 2E20 MOV R2,R16
0072 9420 COM R2
0073 BA22 OUT 0x12,R2
(0042) delay_1ms();
0074 DFE2 RCALL _delay_1ms
(0043) PORTD|=(1<<i);
0075 E001 LDI R16,1
0076 2F14 MOV R17,R20
0077 940E0144 CALL lsl8
0079 B222 IN R2,0x12
007A 2A20 OR R2,R16
007B BA22 OUT 0x12,R2
007C 9543 INC R20
007D 3046 CPI R20,6
007E F330 BCS 0x0065
(0044) }
(0045) }
007F 940E0128 CALL pop_gset1
0081 9508 RET
_hextobcd:
temp --> R20
i --> R22
count --> R10
0082 940E0140 CALL push_gset3
0084 0158 MOVW R10,R16
(0046) //将COUNT十六进制数据转换为LED七段码
(0047) void hextobcd(unsigned int count)
(0048) {
(0049) unsigned char i,temp;
(0050) for(i=0;i<6;i++)
0085 2766 CLR R22
0086 C01B RJMP 0x00A2
(0051) {
(0052) temp=count%10;
0087 E02A LDI R18,0xA
0088 E030 LDI R19,0
0089 0185 MOVW R16,R10
008A 940E0106 CALL mod16u
008C 2F40 MOV R20,R16
(0053) ledbuff[i]=table[temp];
008D E584 LDI R24,0x54
008E E090 LDI R25,0
008F 2FE4 MOV R30,R20
0090 27FF CLR R31
0091 0FE8 ADD R30,R24
0092 1FF9 ADC R31,R25
0093 91E4 LPM R30,0(Z)
0094 E680 LDI R24,0x60
0095 E090 LDI R25,0
0096 2FA6 MOV R26,R22
0097 27BB CLR R27
0098 0FA8 ADD R26,R24
0099 1FB9 ADC R27,R25
009A 93EC ST R30,0(X)
(0054) count=count/10;
009B E02A LDI R18,0xA
009C E030 LDI R19,0
009D 0185 MOVW R16,R10
009E 940E0108 CALL div16u
00A0 0158 MOVW R10,R16
00A1 9563 INC R22
00A2 3066 CPI R22,6
00A3 F318 BCS 0x0087
(0055) }
(0056) }
00A4 940E0122 CALL pop_gset3
00A6 9508 RET
(0057) //MCU初始化
(0058) void mcu_init()
(0059) {
(0060) DDRA=0XFF;
_mcu_init:
00A7 EF8F LDI R24,0xFF
00A8 BB8A OUT 0x1A,R24
(0061) PORTA=0XFF;
00A9 BB8B OUT 0x1B,R24
(0062) DDRD=0X3F;
00AA E38F LDI R24,0x3F
00AB BB81 OUT 0x11,R24
(0063) DDRB=0XFF;
00AC EF8F LDI R24,0xFF
00AD BB87 OUT 0x17,R24
(0064) PORTD=0XFF;
00AE BB82 OUT 0x12,R24
(0065) PORTB=0XFF;//端口初始化
00AF BB88 OUT 0x18,R24
(0066) TIMSK=0X21;//使能ICP捕捉中断;使能T/C0溢出中断
00B0 E281 LDI R24,0x21
00B1 BF89 OUT 0x39,R24
(0067) TCCR0=0X02;
00B2 E082 LDI R24,2
00B3 BF83 OUT 0x33,R24
(0068) TCCR1A=0X00;
00B4 2422 CLR R2
00B5 BC2F OUT 0x2F,R2
(0069) TCCR1B=0XC2;//8分频;捕捉最小单位1us
00B6 EC82 LDI R24,0xC2
00B7 BD8E OUT 0x2E,R24
(0070) TCNT0=0;
00B8 BE22 OUT 0x32,R2
(0071) ICR1=0;
00B9 2433 CLR R3
00BA BC37 OUT 0x27,R3
00BB BC26 OUT 0x26,R2
(0072) TCNT1=0;
00BC BC3D OUT 0x2D,R3
00BD BC2C OUT 0x2C,R2
(0073) }
00BE 9508 RET
(0074) //主程序:测量ICP引脚上信号的周期
(0075) void main()
(0076) {
(0077) mcu_init();
_main:
00BF DFE7 RCALL _mcu_init
(0078) SREG|=0X80;
00C0 9478 BSET 7
(0079) for(;;)
(0080) {
(0081) if((newcount&0xfff8)!=(oldcount&0xfff8))
00C1 91800069 LDS R24,_oldcount
00C3 9190006A LDS R25,_oldcount+1
00C5 7F88 ANDI R24,0xF8
00C6 91E00067 LDS R30,_newcount
00C8 91F00068 LDS R31,_newcount+1
00CA 7FE8 ANDI R30,0xF8
00CB 17E8 CP R30,R24
00CC 07F9 CPC R31,R25
00CD F041 BEQ 0x00D6
(0082) {
(0083) oldcount=newcount;
00CE 90200067 LDS R2,_newcount
00D0 90300068 LDS R3,_newcount+1
00D2 9230006A STS _oldcount+1,R3
00D4 92200069 STS _oldcount,R2
(0084) }
(0085) hextobcd(oldcount);
00D6 91000069 LDS R16,_oldcount
00D8 9110006A LDS R17,_oldcount+1
00DA DFA7 RCALL _hextobcd
(0086) display();
00DB DF85 RCALL _display
00DC CFE4 RJMP 0x00C1
00DD 9508 RET
_Icp_timer1:
00DE 922A ST R2,-Y
00DF 923A ST R3,-Y
00E0 938A ST R24,-Y
00E1 B62F IN R2,0x3F
00E2 922A ST R2,-Y
(0087) }
(0088) }
(0089) //捕捉中断处理程序
(0090) void Icp_timer1()
(0091) {
(0092) newcount=ICR1;
00E3 B426 IN R2,0x26
00E4 B437 IN R3,0x27
00E5 92300068 STS _newcount+1,R3
00E7 92200067 STS _newcount,R2
(0093) ICR1=0;
00E9 2422 CLR R2
00EA 2433 CLR R3
00EB BC37 OUT 0x27,R3
00EC BC26 OUT 0x26,R2
(0094) TCNT1=0;
00ED BC3D OUT 0x2D,R3
00EE BC2C OUT 0x2C,R2
(0095) TCCR1B=0XC2;
00EF EC82 LDI R24,0xC2
00F0 BD8E OUT 0x2E,R24
(0096) }
00F1 9029 LD R2,Y+
00F2 BE2F OUT 0x3F,R2
00F3 9189 LD R24,Y+
00F4 9039 LD R3,Y+
00F5 9029 LD R2,Y+
00F6 9518 RETI
_Timer0:
00F7 938A ST R24,-Y
00F8 939A ST R25,-Y
00F9 B78F IN R24,0x3F
00FA 938A ST R24,-Y
(0097) //方波产生中断程序
(0098) void Timer0()
(0099) {
(0100) i++;
00FB 91800066 LDS R24,__idata_start+2
00FD 5F8F SUBI R24,0xFF
00FE 93800066 STS __idata_start+2,R24
(0101) PORTA=i;//在PA口产生频率不同的方波
0100 BB8B OUT 0x1B,R24
(0102)
(0103) }
FILE: <library>
0101 9189 LD R24,Y+
0102 BF8F OUT 0x3F,R24
0103 9199 LD R25,Y+
0104 9189 LD R24,Y+
0105 9518 RETI
mod16u:
0106 9468 BSET 6
0107 C001 RJMP xdiv16u
div16u:
0108 94E8 BCLR 6
xdiv16u:
0109 92EA ST R14,-Y
010A 92FA ST R15,-Y
010B 938A ST R24,-Y
010C 24EE CLR R14
010D 24FF CLR R15
010E E180 LDI R24,0x10
010F 0F00 LSL R16
0110 1F11 ROL R17
0111 1CEE ROL R14
0112 1CFF ROL R15
0113 16E2 CP R14,R18
0114 06F3 CPC R15,R19
0115 F018 BCS 0x0119
0116 1AE2 SUB R14,R18
0117 0AF3 SBC R15,R19
0118 9503 INC R16
0119 958A DEC R24
011A F7A1 BNE 0x010F
011B F416 BRTC 0x011E
011C 2D0E MOV R16,R14
011D 2D1F MOV R17,R15
011E 9189 LD R24,Y+
011F 90F9 LD R15,Y+
0120 90E9 LD R14,Y+
0121 9508 RET
pop_gset3:
0122 E0E4 LDI R30,4
0123 940C0129 JMP pop
push_gset1:
0125 935A ST R21,-Y
0126 934A ST R20,-Y
0127 9508 RET
pop_gset1:
0128 E0E1 LDI R30,1
pop:
0129 9149 LD R20,Y+
012A 9159 LD R21,Y+
012B FDE0 SBRC R30,0
012C 9508 RET
012D 9169 LD R22,Y+
012E 9179 LD R23,Y+
012F FDE1 SBRC R30,1
0130 9508 RET
0131 90A9 LD R10,Y+
0132 90B9 LD R11,Y+
0133 FDE2 SBRC R30,2
0134 9508 RET
0135 90C9 LD R12,Y+
0136 90D9 LD R13,Y+
0137 FDE3 SBRC R30,3
0138 9508 RET
0139 90E9 LD R14,Y+
013A 90F9 LD R15,Y+
013B 9508 RET
push_gset2:
013C 937A ST R23,-Y
013D 936A ST R22,-Y
013E 940C0125 JMP push_gset1
push_gset3:
0140 92BA ST R11,-Y
0141 92AA ST R10,-Y
0142 940C013C JMP push_gset2
lsl8:
0144 2311 TST R17
0145 F019 BEQ 0x0149
0146 0F00 LSL R16
0147 951A DEC R17
0148 CFFB RJMP lsl8
0149 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -