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

📄 cscj_timer1.s

📁 一个超声波测距的东西
💻 S
字号:
	.module cscj_timer1.C
	.area data(ram, con, rel)
_AC_TABLE::
	.blkb 2
	.area idata
	.byte 128,129
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 130,131
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 132,133
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 134,135
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 144,145
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 146,147
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 148,149
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 150,151
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 136,137
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 138,139
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 140,141
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 142,143
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 152,153
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 154,155
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 156,157
	.area data(ram, con, rel)
	.blkb 2
	.area idata
	.byte 158,159
	.area data(ram, con, rel)
	.dbfile d:\我的文档\桌面\超声波/12864.h
	.dbsym e AC_TABLE _AC_TABLE A[32:32]c
	.area text(rom, con, rel)
	.dbfile d:\我的文档\桌面\超声波/12864.h
	.dbfunc e delay_us _delay_us fV
;              i -> R20,R21
;              j -> R22,R23
;              t -> R16,R17
	.even
_delay_us::
	xcall push_gset2
	.dbline -1
	.dbline 63
; /*******************************************
; * 文件名: ultrawave.c
; * 功能: 用超声波模块检测小车前方是否有障碍物并测量其距离
; * 说明: 
;           1.定时器0产生40khz占空比50%的方波驱动超声波发射头发射超声波
;           2.定时器1定时计算超声波发射到接收需要的时间,从而计算距离
; 		  3.外部中断2用于检测是否遇到障碍物 遇到障碍物时进入外部中断处理子函数
; 		  4.分段进行距离校正,3~10cm减2cm,10~20减1cm,20~100精确
; /********************************************/
; #include <iom128v.h>
; #include <macros.h>
; #include "12864.h"
; //变量、常量定义
; static uchar data[16];
; static float distance=0.0;
; volatile flag=0;
; volatile uint time_counter=0;
; //中断定义
; #pragma interrupt_handler interrupt_int2:4 
; #pragma interrupt_handler interrupt_timer1:15
; 
; /*******************************************
; * 函数名称: int2()
; * 函数功能: 进入中断后置标志位,表示收到超声波,并计算距离           
; * 入口参数: 无
; * 出口参数: 无
; /********************************************/
; void interrupt_int2()  
; {
;    DDRB &= ~BIT(PB4); 
;    EIMSK &= ~BIT(2);
;    TIMSK &= ~BIT(2);   
;    flag = 1;  
; }
; 
; /*******************************************
; * 函数名称: timer1()
; * 函数功能: 进入定时器中断后time_counter加1,用于距离的计算
; * 入口参数: 无
; * 出口参数: 无
; /********************************************/
; void interrupt_timer1()
; {
;    TCNT1H = 0xff;
;    TCNT1L = 0x60;
;    time_counter++;
;    if(time_counter == 589)//设定测量上限为1米
;        {
; 	       TIMSK &= ~BIT(2);   
; 	       time_counter = 589;
; 	    }		   
; }
; 
; /*******************************************
; * 函数名称: int2_init()
; * 函数功能: 外部中断2初始化
; * 入口参数: 无
; * 出口参数: 无
; /********************************************/
; void int2_init() 
; {
;    DDRD &= ~BIT(2); 
;    PORTD|= BIT(2); //设置输出口上拉
	.dbline 65
;    EICRA = 0X20; 
;    EIMSK &= ~BIT(2); 
	movw R20,R16
	xjmp L5
L2:
	.dbline 66
	ldi R22,2
	ldi R23,0
	xjmp L9
L6:
	.dbline 66
L7:
	.dbline 66
	subi R22,1
	sbci R23,0
L9:
	.dbline 66
	cpi R22,0
	cpc R22,R23
	brne L6
X0:
L3:
	.dbline 65
	subi R20,1
	sbci R21,0
L5:
	.dbline 65
	cpi R20,0
	cpc R20,R21
	brne L2
X1:
	.dbline -2
L1:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r t 16 i
	.dbend
	.dbfunc e delay_ms _delay_ms fV
;              i -> R20,R21
;              j -> R22,R23
;              t -> R16,R17
	.even
_delay_ms::
	xcall push_gset2
	.dbline -1
	.dbline 77
; }
; 
; /*******************************************
; * 函数名称: timer0_init()
; * 函数功能: 定时器0初始化  配置输出40khz占空比50%的方波
; * 入口参数: 无
; * 出口参数: 无
; /********************************************/
; void timer0_init()
; {
;    DDRB &= ~BIT(PB4);
;    ASSR &= ~BIT(3);
	.dbline 79
;    TCCR0 = 0X19;
;    OCR0 = 0Xc7;//经示波器测试产生39.92kHZ的正弦方波
	movw R20,R16
	xjmp L14
L11:
	.dbline 80
	ldi R22,2800
	ldi R23,10
	xjmp L18
L15:
	.dbline 80
L16:
	.dbline 80
	subi R22,1
	sbci R23,0
L18:
	.dbline 80
	cpi R22,0
	cpc R22,R23
	brne L15
X2:
L12:
	.dbline 79
	subi R20,1
	sbci R21,0
L14:
	.dbline 79
	cpi R20,0
	cpc R20,R21
	brne L11
X3:
	.dbline -2
L10:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 i
	.dbsym r j 22 i
	.dbsym r t 16 i
	.dbend
	.dbfunc e Sendbyte _Sendbyte fV
;              i -> R20
;           data -> R22
	.even
_Sendbyte::
	xcall push_gset2
	mov R22,R16
	.dbline -1
	.dbline 91
; }
; 
; /*******************************************
; * 函数名称: timer1_init()
; * 函数功能: 定时器1初始化 用于测量距离
; * 入口参数: 无
; * 出口参数: 无
; /********************************************/
; void timer1_init()
; {
;     TCCR1B = 0X01;// 设置分频数为1,16MHZ  
; 	TCNT1H = 0xFF;// 设置计数初值, 每10微秒进入定时器中断处理子函数 使time_counter加1
	.dbline 92
;     TCNT1L = 0x60;//
	clr R20
	.dbline 93
; 	TIMSK &= ~BIT(2);//关闭溢出中断
	.dbline 94
; }
	ldi R16,8
	ldi R17,0
	xcall _delay_us
	.dbline 95
; 
	xjmp L23
L20:
	.dbline 96
; /**************************************************************
	.dbline 97
; * 函数名称:calculate_distance()
	sbrs R22,7
	rjmp L24
	.dbline 98
; * 函数功能:计算距离
	in R24,0x1b
	ori R24,2
	out 0x1b,R24
	xjmp L25
L24:
	.dbline 100
; * 入口参数:无
; * 出口参数:无
	in R24,0x1b
	andi R24,253
	out 0x1b,R24
L25:
	.dbline 101
	in R24,0x1b
	ori R24,4
	out 0x1b,R24
	.dbline 102
	ldi R16,8
	ldi R17,0
	xcall _delay_us
	.dbline 103
	lsl R22
	.dbline 104
	in R24,0x1b
	andi R24,251
	out 0x1b,R24
	.dbline 105
	ldi R16,8
	ldi R17,0
	xcall _delay_us
	.dbline 106
L21:
	.dbline 95
	inc R20
L23:
	.dbline 95
	cpi R20,8
	brlo L20
	.dbline -2
L19:
	xcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i 20 c
	.dbsym r data 22 c
	.dbend
	.dbfunc e Receivebyte _Receivebyte fc
;          temp2 -> R16
;          temp1 -> R18
;              i -> R20
	.even
_Receivebyte::
	xcall push_gset1
	.dbline -1
	.dbline 117
; **************************************************************/
; float calculate_distance(uint time)
; {
;     float value;    
; 	value = time*0.17;//time的单位为10us,S=(T*time/2),单位:cm
; 	return value;//返回距离值	
; }
; 
; void main()
; {  
;    CLI();
;    DDRA = 0XFF;
;    int2_init();
;    timer1_init();
;    timer0_init();
;    Init_12864(); //液晶初始化
;    LcmClearTXT();//液晶清屏
	.dbline 119
;    Display_x_y_data(0,0,"距离:");//液晶显示
;    Display_x_y_data(0,7,"CM");//液晶显示	
	clr R16
	clr R18
	.dbline 120
;    SEI();
	clr R20
	xjmp L30
L27:
	.dbline 121
;    DDRB |= BIT(PB4);
	.dbline 122
;    TIMSK |= BIT(2);
	lsl R18
	.dbline 123
;    delay_us(200);//设定测量下限为3CM
	in R24,0x1b
	andi R24,251
	out 0x1b,R24
	.dbline 124
;    EIMSK |= BIT(2);
	in R24,0x1b
	ori R24,4
	out 0x1b,R24
	.dbline 125
;    while(1)
	in R24,0x1b
	andi R24,251
	out 0x1b,R24
	.dbline 126
;    {
	in R24,0x1b
	lsr R24
	andi R24,1
	breq L31
	.dbline 126
	inc R18
L31:
	.dbline 127
L28:
	.dbline 120
	inc R20
L30:
	.dbline 120
	cpi R20,8
	brlo L27
	.dbline 128
;       if(flag == 1)
; 	  {
	clr R20
	xjmp L36
L33:
	.dbline 129
; 	    //收到返回超声波,清除标志位
	.dbline 130
; 	    flag = 0;			
	lsl R16
	.dbline 131
; 		//计算距

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -