⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cscj_timer1_cd.s

📁 超声测距c语言程序 利用定时器产生40khz站空比50 的方波 通过检测收到超声波的时间来测距
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -