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

📄 cscj_timer1_cd.lis

📁 超声测距c语言程序 利用定时器产生40khz站空比50 的方波 通过检测收到超声波的时间来测距
💻 LIS
📖 第 1 页 / 共 4 页
字号:
                        .module cscj_timer1_cd.C
                        .area text(rom, con, rel)
 0000                   .dbfile E:\重新整理的文件\控制类\超声波检测电路\程序\avr/lcd12864.h
 0000                   .dbfunc e lcd12864_init _lcd12864_init fV
                        .even
 0000           _lcd12864_init::
 0000                   .dbline -1
 0000                   .dbline 25
 0000           ; /*******************************************
 0000           ; 程序名称: cscj_timer1
 0000           ; 功    能: 用超声波模块检测小车前方是否有障碍物并测量其距离
 0000           ; 说明    : 
 0000           ;           1.定时器0产生40khz占空比50%的方波驱动超声波发射头发射超声波
 0000           ;           2.定时器1定时计算超声波发射到接收需要的时间,从而计算距离
 0000           ;                 3.外部中断2用于检测是否遇到障碍物 遇到障碍物时进入外部中断处理子函数
 0000           ; /********************************************/
 0000           ; #include <iom128v.h>
 0000           ; #include <iom128.h>
 0000           ; #include <macros.h>
 0000           ; #include "lcd12864.h"
 0000           ; #define  uchar unsigned char
 0000           ; #define  uint  unsigned int
 0000           ; #pragma interrupt_handler int2:4 
 0000           ; #pragma interrupt_handler timer1:15
 0000           ; uchar flag=0,aa=0;//flag为标志位  为1是表示收到超声波 为0时 没收到
 0000           ; uint s=0,cscj=34;// cscj是超声的传播速度为  34mm/100us
 0000           ; /*******************************************
 0000           ; 函数名称: delayus
 0000           ; 功    能: 延时指定微秒(8.31M晶振)
 0000           ; 参    数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
 0000           ; 返回值  : 无
 0000           ; /********************************************/
 0000           ; void delayus(uint us)           
 0000                   .dbline 26
 0000           ; {
 0000 8FEF              ldi R24,255
 0002 84BB              out 0x14,R24
 0004                   .dbline 27
 0004           ;  uint i;
 0004 2224              clr R2
 0006 25BA              out 0x15,R2
 0008                   .dbline 28
 0008           ;  us=us*13/10;                  //13/10是在8.31MHz晶振下,通过反复实验得到的数值
 0008 80916400          lds R24,100
 000C 8460              ori R24,4
 000E 80936400          sts 100,R24
 0012                   .dbline 30
 0012           ;  for( i=0;i<us;i++); 
 0012           ; }
 0012 80916500          lds R24,101
 0016 8B7F              andi R24,251
 0018 80936500          sts 101,R24
 001C                   .dbline 31
 001C           ; 
 001C 06E0              ldi R16,6
 001E 10E0              ldi R17,0
 0020 A4D1              xcall _delay_ms
 0022                   .dbline 33
 0022           ; /*******************************************
 0022           ; 函数名称: delay()
 0022 00E3              ldi R16,48
 0024 10E0              ldi R17,0
 0026 28D0              xcall _write_com
 0028                   .dbline 34
 0028           ; 功    能: 8.31MHz晶振下延时 z ms 
 0028 01E0              ldi R16,1
 002A 10E0              ldi R17,0
 002C 25D0              xcall _write_com
 002E                   .dbline 35
 002E           ; 参    数: z 延时参数
 002E 06E0              ldi R16,6
 0030 10E0              ldi R17,0
 0032 9BD1              xcall _delay_ms
 0034                   .dbline 36
 0034           ; 返回值  : 无
 0034 0CE0              ldi R16,12
 0036 10E0              ldi R17,0
 0038 1FD0              xcall _write_com
 003A                   .dbline 37
 003A           ; /********************************************/
 003A 05E0              ldi R16,5
 003C 10E0              ldi R17,0
 003E                   .dbline -2
 003E                   .dbline 38
 003E           ; void delayms(uint z)
 003E           L1:
 003E                   .dbline 0 ; func end
 003E 95C1              xjmp _delay_ms
 0040                   .dbend
 0040                   .dbfunc e clear_dis _clear_dis fV
                        .even
 0040           _clear_dis::
 0040                   .dbline -1
 0040                   .dbline 42
 0040           ; {
 0040           ;    uint x,y;
 0040           ;    for(x=z;x>0;x--)
 0040           ;     for(y=1185;y>0;y--);
 0040                   .dbline 43
 0040           ; }
 0040 00E3              ldi R16,48
 0042 10E0              ldi R17,0
 0044 19D0              xcall _write_com
 0046                   .dbline 44
 0046           ; /*******************************************
 0046 01E0              ldi R16,1
 0048 10E0              ldi R17,0
 004A 16D0              xcall _write_com
 004C                   .dbline 45
 004C           ; 函数名称: int2()
 004C 0AE0              ldi R16,10
 004E 10E0              ldi R17,0
 0050                   .dbline -2
 0050                   .dbline 46
 0050           ; 功    能: 进入中断后置标志位,表示收到超声波
 0050           L2:
 0050                   .dbline 0 ; func end
 0050 8CC1              xjmp _delay_ms
 0052                   .dbend
 0052                   .dbfunc e write_byte _write_byte fV
 0052           ;              i -> R20
 0052           ;           word -> R16
                        .even
 0052           _write_byte::
 0052 0E940000          xcall push_gset1
 0056                   .dbline -1
 0056                   .dbline 54
 0056           ;           并计算距离 
 0056           ; 返回值  : 无
 0056           ; /********************************************/
 0056           ; void int2()  
 0056           ; {
 0056           ;   DDRB&=~BIT(PB4);
 0056           ;   TIMSK&=~BIT(2);
 0056           ;   flag=1;
 0056                   .dbline 56
 0056           ;   s=aa*cscj/20-8;//距离计算公式  -8是校准后的数值
 0056           ; }
 0056 4427              clr R20
 0058 0AC0              xjmp L7
 005A           L4:
 005A                   .dbline 57
 005A           ; 
 005A                   .dbline 58
 005A           ; /*******************************************
 005A AC98              cbi 0x15,4
 005C                   .dbline 59
 005C           ; 函数名称: timer1()
 005C 07FF              sbrs R16,7
 005E 02C0              rjmp L8
 0060                   .dbline 59
 0060 AA9A              sbi 0x15,2
 0062 01C0              xjmp L9
 0064           L8:
 0064                   .dbline 60
 0064           ; 功    能: 进入定时器中断后aa加1,用于距离的计算
 0064 AA98              cbi 0x15,2
 0066           L9:
 0066                   .dbline 61
 0066 000F              lsl R16
 0068                   .dbline 62
 0068 AC9A              sbi 0x15,4
 006A                   .dbline 63
 006A AC98              cbi 0x15,4
 006C                   .dbline 64
 006C           L5:
 006C                   .dbline 56
 006C 4395              inc R20
 006E           L7:
 006E                   .dbline 56
 006E 4830              cpi R20,8
 0070 A0F3              brlo L4
 0072                   .dbline -2
 0072                   .dbline 65
 0072           ; 返回值  : 无
 0072           ; /********************************************/
 0072           ; void timer1()
 0072           ; {
 0072           ;    TCNT1H=0xff;
 0072           L3:
 0072 0E940000          xcall pop_gset1
 0076                   .dbline 0 ; func end
 0076 0895              ret
 0078                   .dbsym r i 20 c
 0078                   .dbsym r word 16 c
 0078                   .dbend
 0078                   .dbfunc e write_com _write_com fV
 0078           ;            com -> R20
                        .even
 0078           _write_com::
 0078 0E940000          xcall push_gset1
 007C 402F              mov R20,R16
 007E                   .dbline -1
 007E                   .dbline 71
 007E           ;    TCNT1L=0xac;
 007E           ;    aa++;
 007E           ; }
 007E           ; 
 007E           ; 
 007E           ; /*******************************************
 007E                   .dbline 72
 007E           ; 函数名称: int2_init()
 007E A89A              sbi 0x15,0
 0080                   .dbline 73
 0080           ; 功    能: 外部中断2初始化
 0080 01E0              ldi R16,1
 0082 10E0              ldi R17,0
 0084 72D1              xcall _delay_ms
 0086                   .dbline 74
 0086           ; 参    数: 无
 0086 08EF              ldi R16,248
 0088 E4DF              xcall _write_byte
 008A                   .dbline 75
 008A           ; 返回值  : 无
 008A 042F              mov R16,R20
 008C 007F              andi R16,240
 008E E1DF              xcall _write_byte
 0090                   .dbline 76
 0090           ; /********************************************/
 0090 042F              mov R16,R20
 0092 0F70              andi R16,#0x0F
 0094 0295              swap R16
 0096 007F              andi R16,240
 0098 DCDF              xcall _write_byte
 009A                   .dbline 77
 009A           ; void int2_init() 
 009A A898              cbi 0x15,0
 009C                   .dbline -2
 009C                   .dbline 78
 009C           ; {
 009C           L10:
 009C 0E940000          xcall pop_gset1
 00A0                   .dbline 0 ; func end
 00A0 0895              ret
 00A2                   .dbsym r com 20 c
 00A2                   .dbend
 00A2                   .dbfunc e write_data _write_data fV
 00A2           ;           data -> R20
                        .even
 00A2           _write_data::
 00A2 0E940000          xcall push_gset1
 00A6 402F              mov R20,R16
 00A8                   .dbline -1
 00A8                   .dbline 84
 00A8           ;    DDRD&=~BIT(2); 
 00A8           ;    PORTD|=BIT(2); //设置输出口上拉
 00A8           ;    EICRA=0X20; 
 00A8           ;    EIMSK|=BIT(2);
 00A8           ;    SREG|=BIT(7);
 00A8           ; }
 00A8                   .dbline 85
 00A8           ; 
 00A8 A89A              sbi 0x15,0
 00AA                   .dbline 86
 00AA           ; /*******************************************
 00AA 01E0              ldi R16,1
 00AC 10E0              ldi R17,0
 00AE 5DD1              xcall _delay_ms
 00B0                   .dbline 87
 00B0           ; 函数名称: timer0_init()
 00B0 0AEF              ldi R16,250
 00B2 CFDF              xcall _write_byte
 00B4                   .dbline 88
 00B4           ; 功    能: 定时器0初始化  配置输出40khz占空比50%的方波
 00B4 042F              mov R16,R20
 00B6 007F              andi R16,240
 00B8 CCDF              xcall _write_byte
 00BA                   .dbline 89
 00BA           ; 参    数: 无
 00BA 042F              mov R16,R20
 00BC 0F70              andi R16,#0x0F
 00BE 0295              swap R16
 00C0 007F              andi R16,240
 00C2 C7DF              xcall _write_byte
 00C4                   .dbline 90
 00C4           ; 返回值  : 无
 00C4 A898              cbi 0x15,0
 00C6                   .dbline -2
 00C6                   .dbline 91
 00C6           ; /********************************************/
 00C6           L11:
 00C6 0E940000          xcall pop_gset1
 00CA                   .dbline 0 ; func end
 00CA 0895              ret
 00CC                   .dbsym r data 20 c
 00CC                   .dbend
 00CC                   .dbfunc e lcd_writexy _lcd_writexy fV
 00CC           ;            str -> R20,R21
 00CC           ;              y -> R22
 00CC           ;              x -> R10
                        .even
 00CC           _lcd_writexy::
 00CC 0E940000          xcall push_gset3
 00D0 622F              mov R22,R18
 00D2 A02E              mov R10,R16
 00D4 4E81              ldd R20,y+6
 00D6 5F81              ldd R21,y+7
 00D8                   .dbline -1
 00D8                   .dbline 95
 00D8           ; void timer0_init()
 00D8           ; {
 00D8           ;    DDRB&=~BIT(PB4);
 00D8           ;    ASSR&=~BIT(3);
 00D8                   .dbline 96
 00D8           ;    TCCR0=0X19;
 00D8 BB24              clr R11
 00DA C501              movw R24,R10
 00DC 8130              cpi R24,1
 00DE E0E0              ldi R30,0
 00E0 9E07              cpc R25,R30
 00E2 69F0              breq L16
 00E4 8230              cpi R24,2
 00E6 E0E0              ldi R30,0
 00E8 9E07              cpc R25,R30
 00EA 69F0              breq L17
 00EC 8330              cpi R24,3
 00EE E0E0              ldi R30,0
 00F0 9E07              cpc R25,R30
 00F2 69F0              breq L18
 00F4 8430              cpi R24,4
 00F6 E0E0              ldi R30,0
 00F8 9E07              cpc R25,R30
 00FA 69F0              breq L19
 00FC 15C0              xjmp L21
 00FE           X0:
 00FE                   .dbline 97
 00FE           ;    OCR0=0X66;//经示波器测试产生39.92kHZ的正弦方波
 00FE           L16:
 00FE                   .dbline 98
 00FE           ;  //  TIMSK|=BIT(1);
 00FE 062F              mov R16,R22
 0100 0058              subi R16,128    ; addi 128
 0102 BADF              xcall _write_com
 0104                   .dbline 98
 0104 11C0              xjmp L21
 0106           L17:
 0106                   .dbline 99
 0106           ; }
 0106 062F              mov R16,R22
 0108 0057              subi R16,112    ; addi 144
 010A B6DF              xcall _write_com
 010C                   .dbline 99
 010C 0DC0              xjmp L21
 010E           L18:
 010E                   .dbline 100
 010E           ; 
 010E 062F              mov R16,R22
 0110 0857              subi R16,120    ; addi 136
 0112 B2DF              xcall _write_com
 0114                   .dbline 100
 0114 09C0              xjmp L21
 0116           L19:
 0116                   .dbline 101
 0116           ; /*******************************************
 0116 062F              mov R16,R22
 0118 0856              subi R16,104    ; addi 152
 011A AEDF              xcall _write_com
 011C                   .dbline 101
 011C 05C0              xjmp L21
 011E           L20:
 011E                   .dbline 105
 011E                   .dbline 106
 011E FA01              movw R30,R20
 0120 0081              ldd R16,z+0
 0122 BFDF              xcall _write_data
 0124                   .dbline 107
 0124 4F5F              subi R20,255  ; offset = 1
 0126 5F4F              sbci R21,255
 0128                   .dbline 108
 0128           L21:
 0128                   .dbline 104
 0128           ; 函数名称: timer1_init()
 0128           ; 功    能: 定时器1初始化 用于测量距离
 0128           ; 参    数: 无
 0128 FA01              movw R30,R20
 012A 2080              ldd R2,z+0
 012C 2220              tst R2
 012E B9F7              brne L20
 0130                   .dbline -2
 0130                   .dbline 109
 0130           ; 返回值  : 无
 0130           ; /********************************************/
 0130           ; void timer1_init()
 0130           ; {
 0130           ;     TCCR1B=0X01;// 设置分频数为1  计数频率为8.31MHZ  
 0130           L12:
 0130 0E940000          xcall pop_gset3
 0134                   .dbline 0 ; func end
 0134 0895              ret

⌨️ 快捷键说明

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