📄 cscj_timer1_cd.s
字号:
.module cscj_timer1_cd.C
.area text(rom, con, rel)
.dbfile E:\重新整理的文件\控制类\超声波检测电路\程序\avr/lcd12864.h
.dbfunc e lcd12864_init _lcd12864_init fV
.even
_lcd12864_init::
.dbline -1
.dbline 25
; /*******************************************
; 程序名称: cscj_timer1
; 功 能: 用超声波模块检测小车前方是否有障碍物并测量其距离
; 说明 :
; 1.定时器0产生40khz占空比50%的方波驱动超声波发射头发射超声波
; 2.定时器1定时计算超声波发射到接收需要的时间,从而计算距离
; 3.外部中断2用于检测是否遇到障碍物 遇到障碍物时进入外部中断处理子函数
; /********************************************/
; #include <iom128v.h>
; #include <iom128.h>
; #include <macros.h>
; #include "lcd12864.h"
; #define uchar unsigned char
; #define uint unsigned int
; #pragma interrupt_handler int2:4
; #pragma interrupt_handler timer1:15
; uchar flag=0,aa=0;//flag为标志位 为1是表示收到超声波 为0时 没收到
; uint s=0,cscj=34;// cscj是超声的传播速度为 34mm/100us
; /*******************************************
; 函数名称: delayus
; 功 能: 延时指定微秒(8.31M晶振)
; 参 数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
; 返回值 : 无
; /********************************************/
; void delayus(uint us)
.dbline 26
; {
ldi R24,255
out 0x14,R24
.dbline 27
; uint i;
clr R2
out 0x15,R2
.dbline 28
; us=us*13/10; //13/10是在8.31MHz晶振下,通过反复实验得到的数值
lds R24,100
ori R24,4
sts 100,R24
.dbline 30
; for( i=0;i<us;i++);
; }
lds R24,101
andi R24,251
sts 101,R24
.dbline 31
;
ldi R16,6
ldi R17,0
xcall _delay_ms
.dbline 33
; /*******************************************
; 函数名称: delay()
ldi R16,48
ldi R17,0
xcall _write_com
.dbline 34
; 功 能: 8.31MHz晶振下延时 z ms
ldi R16,1
ldi R17,0
xcall _write_com
.dbline 35
; 参 数: z 延时参数
ldi R16,6
ldi R17,0
xcall _delay_ms
.dbline 36
; 返回值 : 无
ldi R16,12
ldi R17,0
xcall _write_com
.dbline 37
; /********************************************/
ldi R16,5
ldi R17,0
.dbline -2
.dbline 38
; void delayms(uint z)
L1:
.dbline 0 ; func end
xjmp _delay_ms
.dbend
.dbfunc e clear_dis _clear_dis fV
.even
_clear_dis::
.dbline -1
.dbline 42
; {
; uint x,y;
; for(x=z;x>0;x--)
; for(y=1185;y>0;y--);
.dbline 43
; }
ldi R16,48
ldi R17,0
xcall _write_com
.dbline 44
; /*******************************************
ldi R16,1
ldi R17,0
xcall _write_com
.dbline 45
; 函数名称: int2()
ldi R16,10
ldi R17,0
.dbline -2
.dbline 46
; 功 能: 进入中断后置标志位,表示收到超声波
L2:
.dbline 0 ; func end
xjmp _delay_ms
.dbend
.dbfunc e write_byte _write_byte fV
; i -> R20
; word -> R16
.even
_write_byte::
xcall push_gset1
.dbline -1
.dbline 54
; 并计算距离
; 返回值 : 无
; /********************************************/
; void int2()
; {
; DDRB&=~BIT(PB4);
; TIMSK&=~BIT(2);
; flag=1;
.dbline 56
; s=aa*cscj/20-8;//距离计算公式 -8是校准后的数值
; }
clr R20
xjmp L7
L4:
.dbline 57
;
.dbline 58
; /*******************************************
cbi 0x15,4
.dbline 59
; 函数名称: timer1()
sbrs R16,7
rjmp L8
.dbline 59
sbi 0x15,2
xjmp L9
L8:
.dbline 60
; 功 能: 进入定时器中断后aa加1,用于距离的计算
cbi 0x15,2
L9:
.dbline 61
lsl R16
.dbline 62
sbi 0x15,4
.dbline 63
cbi 0x15,4
.dbline 64
L5:
.dbline 56
inc R20
L7:
.dbline 56
cpi R20,8
brlo L4
.dbline -2
.dbline 65
; 返回值 : 无
; /********************************************/
; void timer1()
; {
; TCNT1H=0xff;
L3:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r i 20 c
.dbsym r word 16 c
.dbend
.dbfunc e write_com _write_com fV
; com -> R20
.even
_write_com::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 71
; TCNT1L=0xac;
; aa++;
; }
;
;
; /*******************************************
.dbline 72
; 函数名称: int2_init()
sbi 0x15,0
.dbline 73
; 功 能: 外部中断2初始化
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 74
; 参 数: 无
ldi R16,248
xcall _write_byte
.dbline 75
; 返回值 : 无
mov R16,R20
andi R16,240
xcall _write_byte
.dbline 76
; /********************************************/
mov R16,R20
andi R16,#0x0F
swap R16
andi R16,240
xcall _write_byte
.dbline 77
; void int2_init()
cbi 0x15,0
.dbline -2
.dbline 78
; {
L10:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r com 20 c
.dbend
.dbfunc e write_data _write_data fV
; data -> R20
.even
_write_data::
xcall push_gset1
mov R20,R16
.dbline -1
.dbline 84
; DDRD&=~BIT(2);
; PORTD|=BIT(2); //设置输出口上拉
; EICRA=0X20;
; EIMSK|=BIT(2);
; SREG|=BIT(7);
; }
.dbline 85
;
sbi 0x15,0
.dbline 86
; /*******************************************
ldi R16,1
ldi R17,0
xcall _delay_ms
.dbline 87
; 函数名称: timer0_init()
ldi R16,250
xcall _write_byte
.dbline 88
; 功 能: 定时器0初始化 配置输出40khz占空比50%的方波
mov R16,R20
andi R16,240
xcall _write_byte
.dbline 89
; 参 数: 无
mov R16,R20
andi R16,#0x0F
swap R16
andi R16,240
xcall _write_byte
.dbline 90
; 返回值 : 无
cbi 0x15,0
.dbline -2
.dbline 91
; /********************************************/
L11:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r data 20 c
.dbend
.dbfunc e lcd_writexy _lcd_writexy fV
; str -> R20,R21
; y -> R22
; x -> R10
.even
_lcd_writexy::
xcall push_gset3
mov R22,R18
mov R10,R16
ldd R20,y+6
ldd R21,y+7
.dbline -1
.dbline 95
; void timer0_init()
; {
; DDRB&=~BIT(PB4);
; ASSR&=~BIT(3);
.dbline 96
; TCCR0=0X19;
clr R11
movw R24,R10
cpi R24,1
ldi R30,0
cpc R25,R30
breq L16
cpi R24,2
ldi R30,0
cpc R25,R30
breq L17
cpi R24,3
ldi R30,0
cpc R25,R30
breq L18
cpi R24,4
ldi R30,0
cpc R25,R30
breq L19
xjmp L21
X0:
.dbline 97
; OCR0=0X66;//经示波器测试产生39.92kHZ的正弦方波
L16:
.dbline 98
; // TIMSK|=BIT(1);
mov R16,R22
subi R16,128 ; addi 128
xcall _write_com
.dbline 98
xjmp L21
L17:
.dbline 99
; }
mov R16,R22
subi R16,112 ; addi 144
xcall _write_com
.dbline 99
xjmp L21
L18:
.dbline 100
;
mov R16,R22
subi R16,120 ; addi 136
xcall _write_com
.dbline 100
xjmp L21
L19:
.dbline 101
; /*******************************************
mov R16,R22
subi R16,104 ; addi 152
xcall _write_com
.dbline 101
xjmp L21
L20:
.dbline 105
.dbline 106
movw R30,R20
ldd R16,z+0
xcall _write_data
.dbline 107
subi R20,255 ; offset = 1
sbci R21,255
.dbline 108
L21:
.dbline 104
; 函数名称: timer1_init()
; 功 能: 定时器1初始化 用于测量距离
; 参 数: 无
movw R30,R20
ldd R2,z+0
tst R2
brne L20
.dbline -2
.dbline 109
; 返回值 : 无
; /********************************************/
; void timer1_init()
; {
; TCCR1B=0X01;// 设置分频数为1 计数频率为8.31MHZ
L12:
xcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r str 20 pc
.dbsym r y 22 c
.dbsym r x 10 c
.dbend
.dbfunc e lcd_write _lcd_write fV
; str -> R20,R21
.even
_lcd_write::
xcall push_gset1
movw R20,R16
.dbline -1
.dbline 112
; TCNT1H=0xFF;// 设置计数初值 每一微秒进入定时器中断处理子函数 使aa加1
; TCNT1L=0xAC;//
; TIMSK&=~BIT(2);
xjmp L25
L24:
.dbline 114
.dbline 115
movw R30,R20
ldd R16,z+0
xcall _write_data
.dbline 116
subi R20,255 ; offset = 1
sbci R21,255
.dbline 117
L25:
.dbline 113
; }
movw R30,R20
ldd R2,z+0
tst R2
brne L24
.dbline -2
.dbline 118
;
; void main()
; {
; uchar i;
; DDRA=0XFF;
L23:
xcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r str 20 pc
.dbend
.dbfunc e display _display fV
.even
_display::
.dbline -1
.dbline 124
; PORTA=0X44;
; int2_init();
; timer1_init();
; timer0_init();
; lcd12864_init();
; line1 = "检测到障碍物";
.dbline 125
; line2 = " 距离:";
ldi R16,128
xcall _write_com
xjmp L29
L28:
.dbline 127
.dbline 128
lds R30,_line1
lds R31,_line1+1
ldd R16,z+0
xcall _write_data
.dbline 129
lds R24,_line1
lds R25,_line1+1
adiw R24,1
sts _line1+1,R25
sts _line1,R24
.dbline 130
L29:
.dbline 126
; DDRB|=BIT(PB4);
lds R30,_line1
lds R31,_line1+1
ldd R2,z+0
tst R2
brne L28
.dbline 132
; TIMSK|=BIT(2);
; while(1)
; {
; if(flag==1)
; {
; flag=0;
ldi R16,144
xcall _write_com
xjmp L32
L31:
.dbline 134
.dbline 135
lds R30,_line2
lds R31,_line2+1
ldd R16,z+0
xcall _write_data
.dbline 136
lds R24,_line2
lds R25,_line2+1
adiw R24,1
sts _line2+1,R25
sts _line2,R24
.dbline 137
L32:
.dbline 133
; line1 = "检测到障碍物";
lds R30,_line2
lds R31,_line2+1
ldd R2,z+0
tst R2
brne L31
.dbline 152
; line2 = " 距离:";
; display();
; PORTA=0x77;
;
; write_com(0x94);
; write_data((s%1000/100)+0x30);
; write_data((s%100/10)+0x30);
; write_data((s%10)+0x30);
; lcd_write("mm");
; delayms(500);
; PORTA=0X00;
; aa=0;
; TCNT1H=0xff;//
; TCNT1L=0xac;//
; DDRB|=BIT(PB4);
; TIMSK|=BIT(2);
; }
; if(flag==0)
; {
ldi R24,<L34
ldi R25,>L34
sts _line1+1,R25
sts _line1,R24
.dbline 153
; clear_dis();
sts _line2+1,R25
sts _line2,R24
.dbline 154
; }
sts _line3+1,R25
sts _line3,R24
.dbline 155
; }
sts _line4+1,R25
sts _line4,R24
.dbline -2
.dbline 156
; }
L27:
.dbline 0 ; func end
ret
.dbend
.dbfunc e clear_disp_pic _clear_disp_pic fV
; j -> R20
; i -> R22
.even
_clear_disp_pic::
xcall push_gset2
.dbline -1
.dbline 164
; }
; }
; }
; }
; }
; }
; }
; }
.dbline 165
; }
clr R20
.dbline 166
; }
xjmp L39
L36:
.dbline 167
; }
.dbline 168
; }
clr R22
xjmp L43
L40:
.dbline 169
.dbline 170
ldi R16,52
xcall _write_com
.dbline 171
mov R16,R20
subi R16,128 ; addi 128
xcall _write_com
.dbline 172
mov R16,R22
subi R16,128 ; addi 128
xcall _write_com
.dbline 173
ldi R16,48
xcall _write_com
.dbline 174
clr R16
xcall _write_data
.dbline 175
clr R16
xcall _write_data
.dbline 176
L41:
.dbline 168
inc R22
L43:
.dbline 168
cpi R22,16
brlo L40
.dbline 177
L37:
.dbline 166
inc R20
L39:
.dbline 166
cpi R20,32
brlo L36
.dbline -2
.dbline 178
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
L35:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r j 20 c
.dbsym r i 22 c
.dbend
.dbfunc e disp_pic _disp_pic fV
; j -> R20
; i -> R22
; img -> R10,R11
.even
_disp_pic::
xcall push_gset3
movw R10,R16
.dbline -1
.dbline 184
; }
; }
; }
; }
; }
; }
.dbline 186
; }
; }
clr R20
xjmp L48
L45:
.dbline 187
; }
.dbline 188
; }
clr R22
xjmp L52
L49:
.dbline 189
.dbline 190
ldi R16,52
xcall _write_com
.dbline 191
mov R16,R20
subi R16,128 ; addi 128
xcall _write_com
.dbline 192
mov R16,R22
subi R16,128 ; addi 128
xcall _write_com
.dbline 193
ldi R16,48
xcall _write_com
.dbline 194
ldi R24,2
mul R24,R22
movw R2,R0
ldi R24,16
mul R24,R20
movw R30,R0
add R30,R2
adc R31,R3
add R30,R10
adc R31,R11
lpm R16,Z
xcall _write_data
.dbline 195
ldi R24,2
mul R24,R22
movw R2,R0
ldi R24,16
mul R24,R20
movw R30,R0
add R30,R2
adc R31,R3
add R30,R10
adc R31,R11
adiw R30,1
lpm R16,Z
xcall _write_data
.dbline 196
L50:
.dbline 188
inc R22
L52:
.dbline 188
cpi R22,8
brlo L49
.dbline 197
L46:
.dbline 186
inc R20
L48:
.dbline 186
cpi R20,32
brsh X1
xjmp L45
X1:
.dbline 198
; }
; }
; }
; }
; }
; }
; }
; }
; }
; }
ldi R20,32
xjmp L56
L53:
.dbline 199
; }
.dbline 200
; }
clr R22
xjmp L60
L57:
.dbline 201
.dbline 202
ldi R16,52
xcall _write_com
.dbline 203
mov R16,R20
subi R16,128 ; addi 128
subi R16,32
xcall _write_com
.dbline 204
mov R16,R22
subi R16,120 ; addi 136
xcall _write_com
.dbline 205
ldi R16,48
xcall _write_com
.dbline 206
ldi R24,2
mul R24,R22
movw R2,R0
ldi R24,16
mul R24,R20
movw R30,R0
add R30,R2
adc R31,R3
add R30,R10
adc R31,R11
lpm R16,Z
xcall _write_data
.dbline 207
ldi R24,2
mul R24,R22
movw R2,R0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -