📄 cscj_timer1.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 + -