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

📄 cscj_timer0.s

📁 超声测距c语言程序 利用定时器产生40khz站空比50 的方波 通过检测收到超声波的时间来测距
💻 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 + -