📄 text1.lst
字号:
00F6 F011 BEQ 0x00F9
00F7 3860 CPI R22,0x80
00F8 F409 BNE 0x00FA
(0229) {break;}
00F9 C001 RJMP 0x00FB
00FA CFE6 RJMP 0x00E1
(0230) }
(0231) }
00FB 940E0212 CALL pop_gset2
00FD 9508 RET
(0232) }
(0233)
(0234) void mic_startup()
(0235) {//声控启动程序运行
_mic_startup:
mic_in --> R16
00FE C004 RJMP 0x0103
(0236) unsigned char mic_in;
(0237) while(1)//等待PB2按键按下
(0238) { //无键按下等待
(0239) mic_in=PINB & 0x04; //pb2=0
00FF B306 IN R16,0x16
0100 7004 ANDI R16,4
(0240) if(mic_in==0){break;}
0101 F409 BNE 0x0103
0102 C001 RJMP 0x0104
0103 CFFB RJMP 0x00FF
0104 9508 RET
(0241) }//有键按下运行下面的程序
(0242) }
(0243)
(0244) // #
(0245) // #
(0246) // #
(0247) // #
(0248) // # // delay_time1 转弯时间
(0249) // # # # # # // delay_time2 直行时间
(0250) // # X # //<A> 0x40 delay_time2-50
(0251) // # B C # //<B> 0x20 delay_time1+50
(0252) // # D A # //<C> 0x80 delay_time1-50
(0253) // # # //<D> 0x10 delay_time2+50
(0254) // # # # # // max: 2000 min: 200
(0255)
(0256) unsigned int delay_time1,delay_time2;
(0257)
(0258) void remote_auto_time()
(0259) {
(0260) unsigned char remote_in;
(0261) remote_in = PINB & 0xF0;
_remote_auto_time:
remote_in --> R16
0105 B306 IN R16,0x16
0106 7F00 ANDI R16,0xF0
(0262) switch (remote_in)
0107 2711 CLR R17
0108 3200 CPI R16,0x20
0109 E0E0 LDI R30,0
010A 071E CPC R17,R30
010B F119 BEQ 0x012F
010C E280 LDI R24,0x20
010D E090 LDI R25,0
010E 1780 CP R24,R16
010F 0791 CPC R25,R17
0110 F07C BLT 0x0120
0111 3000 CPI R16,0
0112 0701 CPC R16,R17
0113 F409 BNE 0x0115
0114 C06A RJMP 0x017F
0115 3000 CPI R16,0
0116 E0E0 LDI R30,0
0117 071E CPC R17,R30
0118 F40C BGE 0x011A
0119 C065 RJMP 0x017F
011A 3100 CPI R16,0x10
011B E0E0 LDI R30,0
011C 071E CPC R17,R30
011D F409 BNE 0x011F
011E C039 RJMP 0x0158
011F C05F RJMP 0x017F
0120 3400 CPI R16,0x40
0121 E0E0 LDI R30,0
0122 071E CPC R17,R30
0123 F101 BEQ 0x0144
0124 3400 CPI R16,0x40
0125 E0E0 LDI R30,0
0126 071E CPC R17,R30
0127 F40C BGE 0x0129
0128 C056 RJMP 0x017F
0129 3800 CPI R16,0x80
012A E0E0 LDI R30,0
012B 071E CPC R17,R30
012C F409 BNE 0x012E
012D C03E RJMP 0x016C
012E C050 RJMP 0x017F
(0263) {//检测遥控器是否有键按下
(0264) case 0x20: // < A >
(0265) delay_time2 = delay_time2 - 50;
012F 91800066 LDS R24,delay_time2
0131 91900067 LDS R25,delay_time2+1
0133 97C2 SBIW R24,0x32
0134 93900067 STS delay_time2+1,R25
0136 93800066 STS delay_time2,R24
(0266) if(delay_time2 == 50)
0138 3382 CPI R24,0x32
0139 E0E0 LDI R30,0
013A 079E CPC R25,R30
013B F009 BEQ 0x013D
013C C042 RJMP 0x017F
(0267) {delay_time2 = 100;}
013D E684 LDI R24,0x64
013E E090 LDI R25,0
013F 93900067 STS delay_time2+1,R25
0141 93800066 STS delay_time2,R24
(0268) break;
0143 C03B RJMP 0x017F
(0269) case 0x40: // < B >
(0270) delay_time1 = delay_time1 + 50;
0144 91800068 LDS R24,delay_time1
0146 91900069 LDS R25,delay_time1+1
0148 96C2 ADIW R24,0x32
0149 93900069 STS delay_time1+1,R25
014B 93800068 STS delay_time1,R24
(0271) if(delay_time1 == 2050)
014D 3082 CPI R24,2
014E E0E8 LDI R30,0x8
014F 079E CPC R25,R30
0150 F571 BNE 0x017F
(0272) {delay_time1 = 2000;}
0151 ED80 LDI R24,0xD0
0152 E097 LDI R25,7
0153 93900069 STS delay_time1+1,R25
0155 93800068 STS delay_time1,R24
(0273) break;
0157 C027 RJMP 0x017F
(0274) case 0x10: // < C >
(0275) delay_time1 = delay_time1 - 50;
0158 91800068 LDS R24,delay_time1
015A 91900069 LDS R25,delay_time1+1
015C 97C2 SBIW R24,0x32
015D 93900069 STS delay_time1+1,R25
015F 93800068 STS delay_time1,R24
(0276) if(delay_time1 == 50)
0161 3382 CPI R24,0x32
0162 E0E0 LDI R30,0
0163 079E CPC R25,R30
0164 F4D1 BNE 0x017F
(0277) {delay_time1 = 100;}
0165 E684 LDI R24,0x64
0166 E090 LDI R25,0
0167 93900069 STS delay_time1+1,R25
0169 93800068 STS delay_time1,R24
(0278) break;
016B C013 RJMP 0x017F
(0279) case 0x80: // < D >
(0280) delay_time2 = delay_time2 + 50;
016C 91800066 LDS R24,delay_time2
016E 91900067 LDS R25,delay_time2+1
0170 96C2 ADIW R24,0x32
0171 93900067 STS delay_time2+1,R25
0173 93800066 STS delay_time2,R24
(0281) if(delay_time2 == 2050)
0175 3082 CPI R24,2
0176 E0E8 LDI R30,0x8
0177 079E CPC R25,R30
0178 F431 BNE 0x017F
(0282) {delay_time2 = 2000;}
0179 ED80 LDI R24,0xD0
017A E097 LDI R25,7
017B 93900067 STS delay_time2+1,R25
017D 93800066 STS delay_time2,R24
(0283) break;
(0284) case 0x00: // 无按键
(0285) break;
017F 9508 RET
_timer1:
0180 922A ST R2,-Y
0181 923A ST R3,-Y
0182 938A ST R24,-Y
0183 939A ST R25,-Y
0184 B62F IN R2,0x3F
0185 922A ST R2,-Y
FILE: D:\afish\工作内容\DIY-08-16\M16\DIY-08-16\舵机\motor.c
(0001) /*******************************************/
(0002) /* 广州天河双龙电子公司 */
(0003) /* http://www.sl.com.cn */
(0004) /*功能: PA口控制八路伺服电机。 */
(0005) /*注意:伺服电机数据线是I/O-VCC-GND */
(0006) /*******************************************/
(0007) // ATMEGA16 晶振 8MHz //
(0008) #include <iom16v.h>
(0009) #include <macros.h>
(0010) #include <diy0206.c>
(0011) #pragma interrupt_handler timer1:9
(0012)
(0013) //*********************************************************************
(0014) #define delay_time 0xb1e0 //延时20 ms
(0015)
(0016) //以下常量对应的角度(n为负) n90 n45 0 45 90
(0017) //const unsigned char loc_angle[10]={0x01f4,0x03e8,0x05dc,0x07d0,0x0904};
(0018) const unsigned int loc_angle[8]={0x01f4,0x03e8,0x05dc,0x07d0,0x0904,0x07d0,0x05dc,0x03e8};
(0019) unsigned char pwm_number=0; //脉冲数
(0020) unsigned char pwm_outword=1; //输出命令
(0021) unsigned int delay_timel,delay_timeh; //低电平延时时间,高电平延时时间
(0022) //********************************************************************
(0023) void timer1(void) //T0定时中断服务子程序
(0024) {
(0025)
(0026) if (pwm_outword!=0x80)
0186 91800061 LDS R24,pwm_outword
0188 3880 CPI R24,0x80
0189 F061 BEQ 0x0196
(0027) {
(0028)
(0029) TCNT1=delay_timeh;
018A 90200062 LDS R2,delay_timeh
018C 90300063 LDS R3,delay_timeh+1
018E BC3D OUT 0x2D,R3
018F BC2C OUT 0x2C,R2
(0030) PORTA=pwm_outword; //输出控制命令
0190 2E28 MOV R2,R24
0191 BB8B OUT 0x1B,R24
(0031) pwm_outword<<=1; //控制命令左移一位
0192 0C22 LSL R2
0193 92200061 STS pwm_outword,R2
(0032)
(0033) }
0195 C010 RJMP 0x01A6
(0034) else
(0035) {
(0036)
(0037) pwm_outword=1;
0196 E081 LDI R24,1
0197 93800061 STS pwm_outword,R24
(0038) TCNT1=delay_timel;
0199 90200064 LDS R2,delay_timel
019B 90300065 LDS R3,delay_timel+1
019D BC3D OUT 0x2D,R3
019E BC2C OUT 0x2C,R2
(0039) PORTA=0x00; //输出低电平
019F 2422 CLR R2
01A0 BA2B OUT 0x1B,R2
(0040) pwm_number++; //低电平输出完成,脉冲数++
01A1 91800060 LDS R24,pwm_number
01A3 5F8F SUBI R24,0xFF
01A4 93800060 STS pwm_number,R24
(0041)
(0042) }
01A6 9029 LD R2,Y+
01A7 BE2F OUT 0x3F,R2
01A8 9199 LD R25,Y+
01A9 9189 LD R24,Y+
01AA 9039 LD R3,Y+
01AB 9029 LD R2,Y+
01AC 9518 RETI
(0043)
(0044)
(0045)
(0046) }
(0047) //*******************************************************************
(0048) void time1_init() //定时器初始化
(0049) {
(0050) TCCR1A=0x00;
_time1_init:
01AD 2422 CLR R2
01AE BC2F OUT 0x2F,R2
(0051) TCCR1B=0x00; //停止定时器1
01AF BC2E OUT 0x2E,R2
(0052) TIMSK=0x04; //TIMER1溢出中断使能
01B0 E084 LDI R24,4
01B1 BF89 OUT 0x39,R24
(0053) TCNT1H=0x44; //设置中断初值
01B2 E484 LDI R24,0x44
01B3 BD8D OUT 0x2D,R24
(0054) TCNT1L=0x44;
01B4 BD8C OUT 0x2C,R24
(0055) SEI(); //使能全局中断
01B5 9478 BSET 7
(0056) TCCR1B=0x02; //启动T1,8分频
01B6 E082 LDI R24,2
01B7 BD8E OUT 0x2E,R24
01B8 9508 RET
(0057) }
(0058) //**********************************************************************
(0059) void main(void)
(0060) {
(0061) unsigned char i_temp; //临时变量
(0062) unsigned int temp; //临时变量
(0063) //********************************************************************
(0064) DDRA=0xff; //PA口输出
_main:
temp --> Y+1
i_temp --> R20
01B9 EF8F LDI R24,0xFF
01BA BB8A OUT 0x1A,R24
(0065) PORTA=0xff;
01BB BB8B OUT 0x1B,R24
(0066) mic_startup(); //调用声控
01BC DF41 RCALL _mic_startup
(0067) for(i_temp=0;i_temp<10;i_temp++) //灯闪烁10次
01BD 2744 CLR R20
01BE C00B RJMP 0x01CA
(0068) {
(0069) PORTA=0xff; //灯灭
01BF EF8F LDI R24,0xFF
01C0 BB8B OUT 0x1B,R24
(0070) delay_ms(500); //延时0.5S
01C1 EF04 LDI R16,0xF4
01C2 E011 LDI R17,1
01C3 DEA7 RCALL _delay_ms
(0071) PORTA=0x00; //灯亮
01C4 2422 CLR R2
01C5 BA2B OUT 0x1B,R2
(0072) delay_ms(500); //延时0.5S
01C6 EF04 LDI R16,0xF4
01C7 E011 LDI R17,1
01C8 DEA2 RCALL _delay_ms
01C9 9543 INC R20
01CA 304A CPI R20,0xA
01CB F398 BCS 0x01BF
(0073) }
(0074) time1_init();
01CC DFE0 RCALL _time1_init
01CD C032 RJMP 0x0200
(0075) while(1)
(0076) {
(0077) for (i_temp=0;i_temp<8;i_temp++) //8个位置依次切换
01CE 2744 CLR R20
01CF C02E RJMP 0x01FE
(0078) {
(0079) delay_timeh=0xffff-loc_angle[i_temp];
01D0 E082 LDI R24,2
01D1 9F84 MUL R24,R20
01D2 01F0 MOVW R30,R0
01D3 E584 LDI R24,0x54
01D4 E090 LDI R25,0
01D5 0FE8 ADD R30,R24
01D6 1FF9 ADC R31,R25
01D7 9005 LPM R0,Z+
01D8 9014 LPM R1,0(Z)
01D9 01F0 MOVW R30,R0
01DA EF8F LDI R24,0xFF
01DB EF9F LDI R25,0xFF
01DC 1B8E SUB R24,R30
01DD 0B9F SBC R25,R31
01DE 93900063 STS delay_timeh+1,R25
01E0 93800062 STS delay_timeh,R24
(0080) delay_timel=delay_time+loc_angle[i_temp]*8;
01E2 E082 LDI R24,2
01E3 9F84 MUL R24,R20
01E4 01F0 MOVW R30,R0
01E5 E584 LDI R24,0x54
01E6 E090 LDI R25,0
01E7 0FE8 ADD R30,R24
01E8 1FF9 ADC R31,R25
01E9 9125 LPM R18,Z+
01EA 9134 LPM R19,0(Z)
01EB E008 LDI R16,0x8
01EC E010 LDI R17,0
01ED 940E0202 CALL empy16s
01EF 01C8 MOVW R24,R16
01F0 5280 SUBI R24,0x20
01F1 449E SBCI R25,0x4E
01F2 93900065 STS delay_timel+1,R25
01F4 93800064 STS delay_timel,R24
(0081) while(pwm_number<8);
01F6 91800060 LDS R24,pwm_number
01F8 3088 CPI R24,0x8
01F9 F3E0 BCS 0x01F6
(0082) pwm_number=0;
FILE: <library>
01FA 2422 CLR R2
01FB 92200060 STS pwm_number,R2
01FD 9543 INC R20
01FE 3048 CPI R20,0x8
01FF F280 BCS 0x01D0
0200 CFCD RJMP 0x01CE
0201 9508 RET
empy16s:
0202 920A ST R0,-Y
0203 921A ST R1,-Y
0204 938A ST R24,-Y
0205 939A ST R25,-Y
0206 9F02 MUL R16,R18
0207 01C0 MOVW R24,R0
0208 9F12 MUL R17,R18
0209 0D90 ADD R25,R0
020A 9F03 MUL R16,R19
020B 0D90 ADD R25,R0
020C 018C MOVW R16,R24
020D 9199 LD R25,Y+
020E 9189 LD R24,Y+
020F 9019 LD R1,Y+
0210 9009 LD R0,Y+
0211 9508 RET
pop_gset2:
0212 E0E2 LDI R30,2
0213 940C0221 JMP pop
push_gset5:
0215 92FA ST R15,-Y
0216 92EA ST R14,-Y
push_gset4:
0217 92DA ST R13,-Y
0218 92CA ST R12,-Y
push_gset3:
0219 92BA ST R11,-Y
021A 92AA ST R10,-Y
push_gset2:
021B 937A ST R23,-Y
021C 936A ST R22,-Y
push_gset1:
021D 935A ST R21,-Y
021E 934A ST R20,-Y
021F 9508 RET
pop_gset1:
0220 E0E1 LDI R30,1
pop:
0221 9149 LD R20,Y+
0222 9159 LD R21,Y+
0223 FDE0 SBRC R30,0
0224 9508 RET
0225 9169 LD R22,Y+
0226 9179 LD R23,Y+
0227 FDE1 SBRC R30,1
0228 9508 RET
0229 90A9 LD R10,Y+
022A 90B9 LD R11,Y+
022B FDE2 SBRC R30,2
022C 9508 RET
022D 90C9 LD R12,Y+
022E 90D9 LD R13,Y+
022F FDE3 SBRC R30,3
0230 9508 RET
0231 90E9 LD R14,Y+
0232 90F9 LD R15,Y+
0233 9508 RET
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -