📄 cscj_timer0.s
字号:
.module cscj_timer0.C
.area vector(rom, abs)
.org 4
jmp _int0
.area data(ram, con, rel)
_flag::
.blkb 1
.area idata
.byte 0
.area data(ram, con, rel)
.dbfile E:\重新整理的文件\控制类\超声波检测电路\程序\avr\cscj_timer0.C
.dbsym e flag _flag c
.area text(rom, con, rel)
.dbfile E:\重新整理的文件\控制类\超声波检测电路\程序\avr\cscj_timer0.C
.dbfunc e delayus _delayus fV
; i -> R20,R21
; us -> R22,R23
.even
_delayus::
xcall push_gset2
movw R22,R16
.dbline -1
.dbline 16
; #include <iom128v.h>
; #include <iom128.h>
; #include <macros.h>
; #define uchar unsigned char
; #define uint unsigned int
; #pragma interrupt_handler int0:2
;
; uchar flag=0;
; /*******************************************
; 函数名称: delayus
; 功 能: 延时指定微秒(8.31M晶振)
; 参 数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
; 返回值 : 无
; /********************************************/
; void delayus(uint us)
; {
.dbline 18
; uint i;
; us=us*13/10; //13/10是在8.31MHz晶振下,通过反复实验得到的数值
ldi R16,13
ldi R17,0
movw R18,R22
xcall empy16s
ldi R18,10
ldi R19,0
xcall div16u
movw R22,R16
.dbline 19
clr R20
clr R21
xjmp L5
L2:
.dbline 19
L3:
.dbline 19
subi R20,255 ; offset = 1
sbci R21,255
L5:
.dbline 19
; for( i=0;i<us;i++);
cp R20,R22
cpc R21,R23
brlo L2
.dbline -2
.dbline 20
; }
L1:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r us 22 i
.dbend
.dbfunc e delayms _delayms fV
; x -> R20,R21
; y -> R22,R23
; z -> R16,R17
.even
_delayms::
xcall push_gset2
.dbline -1
.dbline 29
;
; /*******************************************
; 函数名称: delay()
; 功 能: 8.31MHz晶振下延时 z ms
; 参 数: z
; 返回值 : 无
; /********************************************/
; void delayms(uint z)
; {
.dbline 31
; uint x,y;
; for(x=z;x>0;x--)
movw R20,R16
xjmp L10
L7:
.dbline 32
ldi R22,1185
ldi R23,4
xjmp L14
L11:
.dbline 32
L12:
.dbline 32
subi R22,1
sbci R23,0
L14:
.dbline 32
cpi R22,0
cpc R22,R23
brne L11
X0:
L8:
.dbline 31
subi R20,1
sbci R21,0
L10:
.dbline 31
cpi R20,0
cpc R20,R21
brne L7
X1:
.dbline -2
.dbline 33
; for(y=1185;y>0;y--);
; }
L6:
xcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r x 20 i
.dbsym r y 22 i
.dbsym r z 16 i
.dbend
.dbfunc e int0 _int0 fV
.even
_int0::
st -y,R24
in R24,0x3f
st -y,R24
.dbline -1
.dbline 41
; /*******************************************
; 函数名称: int0()
; 功 能: 进入中断后让发光二极管点亮
; 检测是否收到超声波
; 返回值 : 无
; /********************************************/
; void int0()
; {
.dbline 42
; flag=1;
ldi R24,1
sts _flag,R24
.dbline -2
.dbline 43
; }
L15:
ld R24,y+
out 0x3f,R24
ld R24,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e int0_init _int0_init fV
.even
_int0_init::
.dbline -1
.dbline 52
;
; /*******************************************
; 函数名称: int0_init()
; 功 能: 中断初始化
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void int0_init()
; {
.dbline 53
; DDRD&=~BIT(0);
cbi 0x11,0
.dbline 54
; PORTD|=BIT(0); //设置输出口上拉
sbi 0x12,0
.dbline 55
; EICRA=0X02;
ldi R24,2
sts 106,R24
.dbline 56
; EIMSK=0X01;
ldi R24,1
out 0x39,R24
.dbline 57
; SREG=BIT(7);
ldi R24,128
out 0x3f,R24
.dbline -2
.dbline 58
; }
L16:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 67
;
; /*******************************************
; 函数名称: timer0_init()
; 功 能: 定时器0初始化 配置输出40khz占空比50%的方波
; 参 数: 无
; 返回值 : 无
; /********************************************/
; void timer0_init()
; {
.dbline 68
; DDRB|=BIT(PB4);
sbi 0x17,4
.dbline 69
; ASSR&=~BIT(3);
in R24,0x30
andi R24,247
out 0x30,R24
.dbline 70
; TCCR0=0X19;
ldi R24,25
out 0x33,R24
.dbline 71
; OCR0=0XC7;//经示波器测试产生39.92kHZ的正弦方波
ldi R24,199
out 0x31,R24
.dbline -2
.dbline 72
; }
L17:
.dbline 0 ; func end
ret
.dbend
.dbfunc e main _main fV
.even
_main::
.dbline -1
.dbline 75
;
; void main()
; {
.dbline 76
; DDRA=0XFF;
ldi R24,255
out 0x1a,R24
.dbline 77
; PORTA=0X00;
clr R2
out 0x1b,R2
.dbline 78
; timer0_init();
xcall _timer0_init
.dbline 79
; int0_init();
xcall _int0_init
xjmp L20
L19:
.dbline 81
; while(1)
; {
.dbline 82
; if(flag==1)
lds R24,_flag
cpi R24,1
brne L22
.dbline 83
; {
.dbline 84
; flag=0;
clr R2
sts _flag,R2
.dbline 85
; PORTA=0X55;
ldi R24,85
out 0x1b,R24
.dbline 86
; delayms(500);
ldi R16,500
ldi R17,1
xcall _delayms
.dbline 87
; PORTA=0X00;
clr R2
out 0x1b,R2
.dbline 89
; // delayms(500);
; }
L22:
.dbline 90
L20:
.dbline 80
xjmp L19
X2:
.dbline -2
.dbline 91
; }
; }
L18:
.dbline 0 ; func end
ret
.dbend
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -