📄 cscj_timer1_cd.lis
字号:
.module cscj_timer1_cd.C
.area text(rom, con, rel)
0000 .dbfile E:\重新整理的文件\控制类\超声波检测电路\程序\avr/lcd12864.h
0000 .dbfunc e lcd12864_init _lcd12864_init fV
.even
0000 _lcd12864_init::
0000 .dbline -1
0000 .dbline 25
0000 ; /*******************************************
0000 ; 程序名称: cscj_timer1
0000 ; 功 能: 用超声波模块检测小车前方是否有障碍物并测量其距离
0000 ; 说明 :
0000 ; 1.定时器0产生40khz占空比50%的方波驱动超声波发射头发射超声波
0000 ; 2.定时器1定时计算超声波发射到接收需要的时间,从而计算距离
0000 ; 3.外部中断2用于检测是否遇到障碍物 遇到障碍物时进入外部中断处理子函数
0000 ; /********************************************/
0000 ; #include <iom128v.h>
0000 ; #include <iom128.h>
0000 ; #include <macros.h>
0000 ; #include "lcd12864.h"
0000 ; #define uchar unsigned char
0000 ; #define uint unsigned int
0000 ; #pragma interrupt_handler int2:4
0000 ; #pragma interrupt_handler timer1:15
0000 ; uchar flag=0,aa=0;//flag为标志位 为1是表示收到超声波 为0时 没收到
0000 ; uint s=0,cscj=34;// cscj是超声的传播速度为 34mm/100us
0000 ; /*******************************************
0000 ; 函数名称: delayus
0000 ; 功 能: 延时指定微秒(8.31M晶振)
0000 ; 参 数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
0000 ; 返回值 : 无
0000 ; /********************************************/
0000 ; void delayus(uint us)
0000 .dbline 26
0000 ; {
0000 8FEF ldi R24,255
0002 84BB out 0x14,R24
0004 .dbline 27
0004 ; uint i;
0004 2224 clr R2
0006 25BA out 0x15,R2
0008 .dbline 28
0008 ; us=us*13/10; //13/10是在8.31MHz晶振下,通过反复实验得到的数值
0008 80916400 lds R24,100
000C 8460 ori R24,4
000E 80936400 sts 100,R24
0012 .dbline 30
0012 ; for( i=0;i<us;i++);
0012 ; }
0012 80916500 lds R24,101
0016 8B7F andi R24,251
0018 80936500 sts 101,R24
001C .dbline 31
001C ;
001C 06E0 ldi R16,6
001E 10E0 ldi R17,0
0020 A4D1 xcall _delay_ms
0022 .dbline 33
0022 ; /*******************************************
0022 ; 函数名称: delay()
0022 00E3 ldi R16,48
0024 10E0 ldi R17,0
0026 28D0 xcall _write_com
0028 .dbline 34
0028 ; 功 能: 8.31MHz晶振下延时 z ms
0028 01E0 ldi R16,1
002A 10E0 ldi R17,0
002C 25D0 xcall _write_com
002E .dbline 35
002E ; 参 数: z 延时参数
002E 06E0 ldi R16,6
0030 10E0 ldi R17,0
0032 9BD1 xcall _delay_ms
0034 .dbline 36
0034 ; 返回值 : 无
0034 0CE0 ldi R16,12
0036 10E0 ldi R17,0
0038 1FD0 xcall _write_com
003A .dbline 37
003A ; /********************************************/
003A 05E0 ldi R16,5
003C 10E0 ldi R17,0
003E .dbline -2
003E .dbline 38
003E ; void delayms(uint z)
003E L1:
003E .dbline 0 ; func end
003E 95C1 xjmp _delay_ms
0040 .dbend
0040 .dbfunc e clear_dis _clear_dis fV
.even
0040 _clear_dis::
0040 .dbline -1
0040 .dbline 42
0040 ; {
0040 ; uint x,y;
0040 ; for(x=z;x>0;x--)
0040 ; for(y=1185;y>0;y--);
0040 .dbline 43
0040 ; }
0040 00E3 ldi R16,48
0042 10E0 ldi R17,0
0044 19D0 xcall _write_com
0046 .dbline 44
0046 ; /*******************************************
0046 01E0 ldi R16,1
0048 10E0 ldi R17,0
004A 16D0 xcall _write_com
004C .dbline 45
004C ; 函数名称: int2()
004C 0AE0 ldi R16,10
004E 10E0 ldi R17,0
0050 .dbline -2
0050 .dbline 46
0050 ; 功 能: 进入中断后置标志位,表示收到超声波
0050 L2:
0050 .dbline 0 ; func end
0050 8CC1 xjmp _delay_ms
0052 .dbend
0052 .dbfunc e write_byte _write_byte fV
0052 ; i -> R20
0052 ; word -> R16
.even
0052 _write_byte::
0052 0E940000 xcall push_gset1
0056 .dbline -1
0056 .dbline 54
0056 ; 并计算距离
0056 ; 返回值 : 无
0056 ; /********************************************/
0056 ; void int2()
0056 ; {
0056 ; DDRB&=~BIT(PB4);
0056 ; TIMSK&=~BIT(2);
0056 ; flag=1;
0056 .dbline 56
0056 ; s=aa*cscj/20-8;//距离计算公式 -8是校准后的数值
0056 ; }
0056 4427 clr R20
0058 0AC0 xjmp L7
005A L4:
005A .dbline 57
005A ;
005A .dbline 58
005A ; /*******************************************
005A AC98 cbi 0x15,4
005C .dbline 59
005C ; 函数名称: timer1()
005C 07FF sbrs R16,7
005E 02C0 rjmp L8
0060 .dbline 59
0060 AA9A sbi 0x15,2
0062 01C0 xjmp L9
0064 L8:
0064 .dbline 60
0064 ; 功 能: 进入定时器中断后aa加1,用于距离的计算
0064 AA98 cbi 0x15,2
0066 L9:
0066 .dbline 61
0066 000F lsl R16
0068 .dbline 62
0068 AC9A sbi 0x15,4
006A .dbline 63
006A AC98 cbi 0x15,4
006C .dbline 64
006C L5:
006C .dbline 56
006C 4395 inc R20
006E L7:
006E .dbline 56
006E 4830 cpi R20,8
0070 A0F3 brlo L4
0072 .dbline -2
0072 .dbline 65
0072 ; 返回值 : 无
0072 ; /********************************************/
0072 ; void timer1()
0072 ; {
0072 ; TCNT1H=0xff;
0072 L3:
0072 0E940000 xcall pop_gset1
0076 .dbline 0 ; func end
0076 0895 ret
0078 .dbsym r i 20 c
0078 .dbsym r word 16 c
0078 .dbend
0078 .dbfunc e write_com _write_com fV
0078 ; com -> R20
.even
0078 _write_com::
0078 0E940000 xcall push_gset1
007C 402F mov R20,R16
007E .dbline -1
007E .dbline 71
007E ; TCNT1L=0xac;
007E ; aa++;
007E ; }
007E ;
007E ;
007E ; /*******************************************
007E .dbline 72
007E ; 函数名称: int2_init()
007E A89A sbi 0x15,0
0080 .dbline 73
0080 ; 功 能: 外部中断2初始化
0080 01E0 ldi R16,1
0082 10E0 ldi R17,0
0084 72D1 xcall _delay_ms
0086 .dbline 74
0086 ; 参 数: 无
0086 08EF ldi R16,248
0088 E4DF xcall _write_byte
008A .dbline 75
008A ; 返回值 : 无
008A 042F mov R16,R20
008C 007F andi R16,240
008E E1DF xcall _write_byte
0090 .dbline 76
0090 ; /********************************************/
0090 042F mov R16,R20
0092 0F70 andi R16,#0x0F
0094 0295 swap R16
0096 007F andi R16,240
0098 DCDF xcall _write_byte
009A .dbline 77
009A ; void int2_init()
009A A898 cbi 0x15,0
009C .dbline -2
009C .dbline 78
009C ; {
009C L10:
009C 0E940000 xcall pop_gset1
00A0 .dbline 0 ; func end
00A0 0895 ret
00A2 .dbsym r com 20 c
00A2 .dbend
00A2 .dbfunc e write_data _write_data fV
00A2 ; data -> R20
.even
00A2 _write_data::
00A2 0E940000 xcall push_gset1
00A6 402F mov R20,R16
00A8 .dbline -1
00A8 .dbline 84
00A8 ; DDRD&=~BIT(2);
00A8 ; PORTD|=BIT(2); //设置输出口上拉
00A8 ; EICRA=0X20;
00A8 ; EIMSK|=BIT(2);
00A8 ; SREG|=BIT(7);
00A8 ; }
00A8 .dbline 85
00A8 ;
00A8 A89A sbi 0x15,0
00AA .dbline 86
00AA ; /*******************************************
00AA 01E0 ldi R16,1
00AC 10E0 ldi R17,0
00AE 5DD1 xcall _delay_ms
00B0 .dbline 87
00B0 ; 函数名称: timer0_init()
00B0 0AEF ldi R16,250
00B2 CFDF xcall _write_byte
00B4 .dbline 88
00B4 ; 功 能: 定时器0初始化 配置输出40khz占空比50%的方波
00B4 042F mov R16,R20
00B6 007F andi R16,240
00B8 CCDF xcall _write_byte
00BA .dbline 89
00BA ; 参 数: 无
00BA 042F mov R16,R20
00BC 0F70 andi R16,#0x0F
00BE 0295 swap R16
00C0 007F andi R16,240
00C2 C7DF xcall _write_byte
00C4 .dbline 90
00C4 ; 返回值 : 无
00C4 A898 cbi 0x15,0
00C6 .dbline -2
00C6 .dbline 91
00C6 ; /********************************************/
00C6 L11:
00C6 0E940000 xcall pop_gset1
00CA .dbline 0 ; func end
00CA 0895 ret
00CC .dbsym r data 20 c
00CC .dbend
00CC .dbfunc e lcd_writexy _lcd_writexy fV
00CC ; str -> R20,R21
00CC ; y -> R22
00CC ; x -> R10
.even
00CC _lcd_writexy::
00CC 0E940000 xcall push_gset3
00D0 622F mov R22,R18
00D2 A02E mov R10,R16
00D4 4E81 ldd R20,y+6
00D6 5F81 ldd R21,y+7
00D8 .dbline -1
00D8 .dbline 95
00D8 ; void timer0_init()
00D8 ; {
00D8 ; DDRB&=~BIT(PB4);
00D8 ; ASSR&=~BIT(3);
00D8 .dbline 96
00D8 ; TCCR0=0X19;
00D8 BB24 clr R11
00DA C501 movw R24,R10
00DC 8130 cpi R24,1
00DE E0E0 ldi R30,0
00E0 9E07 cpc R25,R30
00E2 69F0 breq L16
00E4 8230 cpi R24,2
00E6 E0E0 ldi R30,0
00E8 9E07 cpc R25,R30
00EA 69F0 breq L17
00EC 8330 cpi R24,3
00EE E0E0 ldi R30,0
00F0 9E07 cpc R25,R30
00F2 69F0 breq L18
00F4 8430 cpi R24,4
00F6 E0E0 ldi R30,0
00F8 9E07 cpc R25,R30
00FA 69F0 breq L19
00FC 15C0 xjmp L21
00FE X0:
00FE .dbline 97
00FE ; OCR0=0X66;//经示波器测试产生39.92kHZ的正弦方波
00FE L16:
00FE .dbline 98
00FE ; // TIMSK|=BIT(1);
00FE 062F mov R16,R22
0100 0058 subi R16,128 ; addi 128
0102 BADF xcall _write_com
0104 .dbline 98
0104 11C0 xjmp L21
0106 L17:
0106 .dbline 99
0106 ; }
0106 062F mov R16,R22
0108 0057 subi R16,112 ; addi 144
010A B6DF xcall _write_com
010C .dbline 99
010C 0DC0 xjmp L21
010E L18:
010E .dbline 100
010E ;
010E 062F mov R16,R22
0110 0857 subi R16,120 ; addi 136
0112 B2DF xcall _write_com
0114 .dbline 100
0114 09C0 xjmp L21
0116 L19:
0116 .dbline 101
0116 ; /*******************************************
0116 062F mov R16,R22
0118 0856 subi R16,104 ; addi 152
011A AEDF xcall _write_com
011C .dbline 101
011C 05C0 xjmp L21
011E L20:
011E .dbline 105
011E .dbline 106
011E FA01 movw R30,R20
0120 0081 ldd R16,z+0
0122 BFDF xcall _write_data
0124 .dbline 107
0124 4F5F subi R20,255 ; offset = 1
0126 5F4F sbci R21,255
0128 .dbline 108
0128 L21:
0128 .dbline 104
0128 ; 函数名称: timer1_init()
0128 ; 功 能: 定时器1初始化 用于测量距离
0128 ; 参 数: 无
0128 FA01 movw R30,R20
012A 2080 ldd R2,z+0
012C 2220 tst R2
012E B9F7 brne L20
0130 .dbline -2
0130 .dbline 109
0130 ; 返回值 : 无
0130 ; /********************************************/
0130 ; void timer1_init()
0130 ; {
0130 ; TCCR1B=0X01;// 设置分频数为1 计数频率为8.31MHZ
0130 L12:
0130 0E940000 xcall pop_gset3
0134 .dbline 0 ; func end
0134 0895 ret
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -