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

📄 cscj_timer0.lis

📁 超声测距c语言程序 利用定时器产生40khz站空比50 的方波 通过检测收到超声波的时间来测距
💻 LIS
字号:
                        .module cscj_timer0.C
                        .area vector(rom, abs)
                        .org 4
 0004 0C942C00          jmp _int0
                        .area data(ram, con, rel)
 0000           _flag::
 0000                   .blkb 1
                        .area idata
 0000 00                .byte 0
                        .area data(ram, con, rel)
 0001                   .dbfile E:\重新整理的文件\控制类\超声波检测电路\程序\avr\cscj_timer0.C
 0001                   .dbsym e flag _flag c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\重新整理的文件\控制类\超声波检测电路\程序\avr\cscj_timer0.C
 0000                   .dbfunc e delayus _delayus fV
 0000           ;              i -> R20,R21
 0000           ;             us -> R22,R23
                        .even
 0000           _delayus::
 0000 0E940000          xcall push_gset2
 0004 B801              movw R22,R16
 0006                   .dbline -1
 0006                   .dbline 16
 0006           ; #include <iom128v.h>
 0006           ; #include <iom128.h>
 0006           ; #include <macros.h>
 0006           ; #define  uchar unsigned char
 0006           ; #define  uint  unsigned int
 0006           ; #pragma interrupt_handler int0:2 
 0006           ; 
 0006           ; uchar flag=0;
 0006           ; /*******************************************
 0006           ; 函数名称: delayus
 0006           ; 功    能: 延时指定微秒(8.31M晶振)
 0006           ; 参    数: us--延时的微秒数(大约,不是很精确,MS越大越准确)
 0006           ; 返回值  : 无
 0006           ; /********************************************/
 0006           ; void delayus(uint us)           
 0006           ; {
 0006                   .dbline 18
 0006           ;  uint i;
 0006           ;  us=us*13/10;                  //13/10是在8.31MHz晶振下,通过反复实验得到的数值
 0006 0DE0              ldi R16,13
 0008 10E0              ldi R17,0
 000A 9B01              movw R18,R22
 000C 0E940000          xcall empy16s
 0010 2AE0              ldi R18,10
 0012 30E0              ldi R19,0
 0014 0E940000          xcall div16u
 0018 B801              movw R22,R16
 001A                   .dbline 19
 001A 4427              clr R20
 001C 5527              clr R21
 001E 02C0              xjmp L5
 0020           L2:
 0020                   .dbline 19
 0020           L3:
 0020                   .dbline 19
 0020 4F5F              subi R20,255  ; offset = 1
 0022 5F4F              sbci R21,255
 0024           L5:
 0024                   .dbline 19
 0024           ;  for( i=0;i<us;i++); 
 0024 4617              cp R20,R22
 0026 5707              cpc R21,R23
 0028 D8F3              brlo L2
 002A                   .dbline -2
 002A                   .dbline 20
 002A           ; }
 002A           L1:
 002A 0E940000          xcall pop_gset2
 002E                   .dbline 0 ; func end
 002E 0895              ret
 0030                   .dbsym r i 20 i
 0030                   .dbsym r us 22 i
 0030                   .dbend
 0030                   .dbfunc e delayms _delayms fV
 0030           ;              x -> R20,R21
 0030           ;              y -> R22,R23
 0030           ;              z -> R16,R17
                        .even
 0030           _delayms::
 0030 0E940000          xcall push_gset2
 0034                   .dbline -1
 0034                   .dbline 29
 0034           ; 
 0034           ; /*******************************************
 0034           ; 函数名称: delay()
 0034           ; 功    能: 8.31MHz晶振下延时 z ms 
 0034           ; 参    数: z
 0034           ; 返回值  : 无
 0034           ; /********************************************/
 0034           ; void delayms(uint z)
 0034           ; {
 0034                   .dbline 31
 0034           ;    uint x,y;
 0034           ;    for(x=z;x>0;x--)
 0034 A801              movw R20,R16
 0036 0AC0              xjmp L10
 0038           L7:
 0038                   .dbline 32
 0038 61EA              ldi R22,1185
 003A 74E0              ldi R23,4
 003C 02C0              xjmp L14
 003E           L11:
 003E                   .dbline 32
 003E           L12:
 003E                   .dbline 32
 003E 6150              subi R22,1
 0040 7040              sbci R23,0
 0042           L14:
 0042                   .dbline 32
 0042 6030              cpi R22,0
 0044 6707              cpc R22,R23
 0046 D9F7              brne L11
 0048           X0:
 0048           L8:
 0048                   .dbline 31
 0048 4150              subi R20,1
 004A 5040              sbci R21,0
 004C           L10:
 004C                   .dbline 31
 004C 4030              cpi R20,0
 004E 4507              cpc R20,R21
 0050 99F7              brne L7
 0052           X1:
 0052                   .dbline -2
 0052                   .dbline 33
 0052           ;     for(y=1185;y>0;y--);
 0052           ; }
 0052           L6:
 0052 0E940000          xcall pop_gset2
 0056                   .dbline 0 ; func end
 0056 0895              ret
 0058                   .dbsym r x 20 i
 0058                   .dbsym r y 22 i
 0058                   .dbsym r z 16 i
 0058                   .dbend
 0058                   .dbfunc e int0 _int0 fV
                        .even
 0058           _int0::
 0058 8A93              st -y,R24
 005A 8FB7              in R24,0x3f
 005C 8A93              st -y,R24
 005E                   .dbline -1
 005E                   .dbline 41
 005E           ; /*******************************************
 005E           ; 函数名称: int0()
 005E           ; 功    能: 进入中断后让发光二极管点亮 
 005E           ;           检测是否收到超声波 
 005E           ; 返回值  : 无
 005E           ; /********************************************/
 005E           ; void int0()  
 005E           ; {
 005E                   .dbline 42
 005E           ;    flag=1;
 005E 81E0              ldi R24,1
 0060 80930000          sts _flag,R24
 0064                   .dbline -2
 0064                   .dbline 43
 0064           ; }
 0064           L15:
 0064 8991              ld R24,y+
 0066 8FBF              out 0x3f,R24
 0068 8991              ld R24,y+
 006A                   .dbline 0 ; func end
 006A 1895              reti
 006C                   .dbend
 006C                   .dbfunc e int0_init _int0_init fV
                        .even
 006C           _int0_init::
 006C                   .dbline -1
 006C                   .dbline 52
 006C           ; 
 006C           ; /*******************************************
 006C           ; 函数名称: int0_init()
 006C           ; 功    能: 中断初始化
 006C           ; 参    数: 无
 006C           ; 返回值  : 无
 006C           ; /********************************************/
 006C           ; void int0_init() 
 006C           ; {
 006C                   .dbline 53
 006C           ;    DDRD&=~BIT(0); 
 006C 8898              cbi 0x11,0
 006E                   .dbline 54
 006E           ;    PORTD|=BIT(0); //设置输出口上拉
 006E 909A              sbi 0x12,0
 0070                   .dbline 55
 0070           ;    EICRA=0X02; 
 0070 82E0              ldi R24,2
 0072 80936A00          sts 106,R24
 0076                   .dbline 56
 0076           ;    EIMSK=0X01;
 0076 81E0              ldi R24,1
 0078 89BF              out 0x39,R24
 007A                   .dbline 57
 007A           ;    SREG=BIT(7);
 007A 80E8              ldi R24,128
 007C 8FBF              out 0x3f,R24
 007E                   .dbline -2
 007E                   .dbline 58
 007E           ; }
 007E           L16:
 007E                   .dbline 0 ; func end
 007E 0895              ret
 0080                   .dbend
 0080                   .dbfunc e timer0_init _timer0_init fV
                        .even
 0080           _timer0_init::
 0080                   .dbline -1
 0080                   .dbline 67
 0080           ; 
 0080           ; /*******************************************
 0080           ; 函数名称: timer0_init()
 0080           ; 功    能: 定时器0初始化  配置输出40khz占空比50%的方波
 0080           ; 参    数: 无
 0080           ; 返回值  : 无
 0080           ; /********************************************/
 0080           ; void timer0_init()
 0080           ; {
 0080                   .dbline 68
 0080           ;    DDRB|=BIT(PB4);
 0080 BC9A              sbi 0x17,4
 0082                   .dbline 69
 0082           ;    ASSR&=~BIT(3);
 0082 80B7              in R24,0x30
 0084 877F              andi R24,247
 0086 80BF              out 0x30,R24
 0088                   .dbline 70
 0088           ;    TCCR0=0X19;
 0088 89E1              ldi R24,25
 008A 83BF              out 0x33,R24
 008C                   .dbline 71
 008C           ;    OCR0=0XC7;//经示波器测试产生39.92kHZ的正弦方波
 008C 87EC              ldi R24,199
 008E 81BF              out 0x31,R24
 0090                   .dbline -2
 0090                   .dbline 72
 0090           ; }
 0090           L17:
 0090                   .dbline 0 ; func end
 0090 0895              ret
 0092                   .dbend
 0092                   .dbfunc e main _main fV
                        .even
 0092           _main::
 0092                   .dbline -1
 0092                   .dbline 75
 0092           ; 
 0092           ; void main()
 0092           ; {
 0092                   .dbline 76
 0092           ;    DDRA=0XFF;
 0092 8FEF              ldi R24,255
 0094 8ABB              out 0x1a,R24
 0096                   .dbline 77
 0096           ;    PORTA=0X00;
 0096 2224              clr R2
 0098 2BBA              out 0x1b,R2
 009A                   .dbline 78
 009A           ;    timer0_init();
 009A F2DF              xcall _timer0_init
 009C                   .dbline 79
 009C           ;    int0_init(); 
 009C E7DF              xcall _int0_init
 009E 0EC0              xjmp L20
 00A0           L19:
 00A0                   .dbline 81
 00A0           ;    while(1)
 00A0           ;     {
 00A0                   .dbline 82
 00A0           ;          if(flag==1)
 00A0 80910000          lds R24,_flag
 00A4 8130              cpi R24,1
 00A6 51F4              brne L22
 00A8                   .dbline 83
 00A8           ;          {
 00A8                   .dbline 84
 00A8           ;            flag=0;
 00A8 2224              clr R2
 00AA 20920000          sts _flag,R2
 00AE                   .dbline 85
 00AE           ;            PORTA=0X55;
 00AE 85E5              ldi R24,85
 00B0 8BBB              out 0x1b,R24
 00B2                   .dbline 86
 00B2           ;                delayms(500);
 00B2 04EF              ldi R16,500
 00B4 11E0              ldi R17,1
 00B6 BCDF              xcall _delayms
 00B8                   .dbline 87
 00B8           ;                PORTA=0X00;
 00B8 2224              clr R2
 00BA 2BBA              out 0x1b,R2
 00BC                   .dbline 89
 00BC           ;               // delayms(500);
 00BC           ;          }
 00BC           L22:
 00BC                   .dbline 90
 00BC           L20:
 00BC                   .dbline 80
 00BC F1CF              xjmp L19
 00BE           X2:
 00BE                   .dbline -2
 00BE                   .dbline 91
 00BE           ;       }
 00BE           ; }
 00BE           L18:
 00BE                   .dbline 0 ; func end
 00BE 0895              ret
 00C0                   .dbend

⌨️ 快捷键说明

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