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

📄 dac_sin.lis

📁 这是atmega128单片机的数模转换程序
💻 LIS
字号:
                        .module dac_sin.c
                        .area text(rom, con, rel)
 0000                   .dbfile E:\产品\开发板\mega128-board\实验程序\数模转换\正弦波\dac_sin.c
 0000                   .dbfunc e s_ms _s_ms fV
 0000           ;              t -> R16,R17
                        .even
 0000           _s_ms::
 0000                   .dbline -1
 0000                   .dbline 8
 0000           ; #include<iom128v.h>
 0000           ; #include"math.h"
 0000           ; #define uchar unsigned char 
 0000           ; #define uint unsigned int 
 0000           ; 
 0000           ; //延时函数
 0000           ; void s_ms(unsigned int t)
 0000           ; {
 0000                   .dbline 9
 0000           ;     for(;t>1;t--)
 0000 02C0              xjmp L5
 0002           L2:
 0002                   .dbline 10
 0002           ;     {
 0002                   .dbline 11
 0002           ;     }
 0002           L3:
 0002                   .dbline 9
 0002 0150              subi R16,1
 0004 1040              sbci R17,0
 0006           L5:
 0006                   .dbline 9
 0006 81E0              ldi R24,1
 0008 90E0              ldi R25,0
 000A 8017              cp R24,R16
 000C 9107              cpc R25,R17
 000E C8F3              brlo L2
 0010           X0:
 0010                   .dbline -2
 0010           L1:
 0010                   .dbline 0 ; func end
 0010 0895              ret
 0012                   .dbsym r t 16 i
 0012                   .dbend
 0012                   .dbfunc e spi_init _spi_init fV
                        .even
 0012           _spi_init::
 0012                   .dbline -1
 0012                   .dbline 16
 0012           ; }
 0012           ; 
 0012           ; //SPI初始化
 0012           ; void spi_init()    
 0012           ; {
 0012                   .dbline 17
 0012           ; DDRB=0xf7;   //端口设置
 0012 87EF              ldi R24,247
 0014 87BB              out 0x17,R24
 0016                   .dbline 18
 0016           ; PORTB=0xff;
 0016 8FEF              ldi R24,255
 0018 88BB              out 0x18,R24
 001A                   .dbline 19
 001A           ; SPSR&=0x00;
 001A 2224              clr R2
 001C 2EB8              out 0xe,R2
 001E                   .dbline 20
 001E           ; SPCR=0x5d;   //主机模式 方式0 ocs/16
 001E 8DE5              ldi R24,93
 0020 8DB9              out 0xd,R24
 0022                   .dbline -2
 0022           L6:
 0022                   .dbline 0 ; func end
 0022 0895              ret
 0024                   .dbend
 0024                   .dbfunc e spi_send _spi_send fV
 0024           ;         spi_hi -> R12
 0024           ;         spi_lo -> R10
 0024           ;       spi_data -> R16,R17
                        .even
 0024           _spi_send::
 0024 0E940000          xcall push_xgset003C
 0028                   .dbline -1
 0028                   .dbline 24
 0028           ; }
 0028           ; 
 0028           ; void spi_send(uint spi_data)
 0028           ; {
 0028                   .dbline 26
 0028           ; uchar spi_lo,spi_hi;
 0028           ; spi_lo=spi_data;
 0028 A02E              mov R10,R16
 002A                   .dbline 27
 002A           ; spi_hi=spi_data>>8;
 002A 6801              movw R12,R16
 002C CD2C              mov R12,R13
 002E DD24              clr R13
 0030                   .dbline 29
 0030           ; 
 0030           ; PORTB&=~(1<<0);                //ss=0
 0030 C098              cbi 0x18,0
 0032                   .dbline 30
 0032           ; SPDR=spi_hi;                   //发送高字节
 0032 CFB8              out 0xf,R12
 0034           L8:
 0034                   .dbline 31
 0034           ; while(!(SPSR&(1<<SPIF)));  
 0034           L9:
 0034                   .dbline 31
 0034 779B              sbis 0xe,7
 0036 FECF              rjmp L8
 0038           X1:
 0038                   .dbline 32
 0038           ; SPDR=spi_lo;                   //发送低字节
 0038 AFB8              out 0xf,R10
 003A           L11:
 003A                   .dbline 33
 003A           ; while(!(SPSR&(1<<SPIF)));
 003A           L12:
 003A                   .dbline 33
 003A 779B              sbis 0xe,7
 003C FECF              rjmp L11
 003E           X2:
 003E                   .dbline 34
 003E           ; PORTB|=(1<<0);
 003E C09A              sbi 0x18,0
 0040                   .dbline -2
 0040           L7:
 0040                   .dbline 0 ; func end
 0040 0C940000          xjmp pop_xgset003C
 0044                   .dbsym r spi_hi 12 c
 0044                   .dbsym r spi_lo 10 c
 0044                   .dbsym r spi_data 16 i
 0044                   .dbend
 0044                   .dbfunc e main _main fI
 0044           ;             aa -> y+4
 0044           ;          sin_p -> R20,R21
 0044           ;            pai -> y+0
                        .even
 0044           _main::
 0044 2897              sbiw R28,8
 0046                   .dbline -1
 0046                   .dbline 41
 0046           ; }
 0046           ; 
 0046           ; //使用DAC产生27Hz的正弦波
 0046           ; //主要时间消耗在sin的计算上,使用查表会更快
 0046           ; //主函数
 0046           ; main()
 0046           ; {
 0046                   .dbline 42
 0046           ; float pai=0,aa;
 0046 00E0              ldi R16,<L15
 0048 10E0              ldi R17,>L15
 004A 0E940000          xcall elpm32
 004E 0883              std y+0,R16
 0050 1983              std y+1,R17
 0052 2A83              std y+2,R18
 0054 3B83              std y+3,R19
 0056                   .dbline 44
 0056           ; int sin_p;
 0056           ; s_ms(50000);  //等待7512复位
 0056 00E5              ldi R16,50000
 0058 13EC              ldi R17,195
 005A D2DF              xcall _s_ms
 005C                   .dbline 45
 005C           ; spi_init();
 005C DADF              xcall _spi_init
 005E                   .dbline 47
 005E           ; 
 005E           ; spi_send(0x07ff);
 005E 0FEF              ldi R16,2047
 0060 17E0              ldi R17,7
 0062 E0DF              xcall _spi_send
 0064 46C0              xjmp L17
 0066           L16:
 0066                   .dbline 49
 0066           ; while(1)
 0066           ;      {
 0066                   .dbline 50
 0066           ;         pai+=0.1;
 0066 2880              ldd R2,y+0
 0068 3980              ldd R3,y+1
 006A 4A80              ldd R4,y+2
 006C 5B80              ldd R5,y+3
 006E 00E0              ldi R16,<L19
 0070 10E0              ldi R17,>L19
 0072 0E940000          xcall elpm32
 0076 3A93              st -y,R19
 0078 2A93              st -y,R18
 007A 1A93              st -y,R17
 007C 0A93              st -y,R16
 007E 8101              movw R16,R2
 0080 9201              movw R18,R4
 0082 0E940000          xcall fpadd2
 0086 0883              std y+0,R16
 0088 1983              std y+1,R17
 008A 2A83              std y+2,R18
 008C 3B83              std y+3,R19
 008E                   .dbline 51
 008E           ;         sin_p=sin(pai)*2000;
 008E 0881              ldd R16,y+0
 0090 1981              ldd R17,y+1
 0092 2A81              ldd R18,y+2
 0094 3B81              ldd R19,y+3
 0096 0E940000          xcall _sinf
 009A 1801              movw R2,R16
 009C 2901              movw R4,R18
 009E 00E0              ldi R16,<L20
 00A0 10E0              ldi R17,>L20
 00A2 0E940000          xcall elpm32
 00A6 5A92              st -y,R5
 00A8 4A92              st -y,R4
 00AA 3A92              st -y,R3
 00AC 2A92              st -y,R2
 00AE 0E940000          xcall fpmule2
 00B2 0E940000          xcall fpint
 00B6 A801              movw R20,R16
 00B8                   .dbline 52
 00B8           ;       sin_p+=2048;               //2048作为中点
 00B8 4050              subi R20,0  ; offset = 2048
 00BA 584F              sbci R21,248
 00BC                   .dbline 53
 00BC           ;         spi_send(sin_p);
 00BC 8A01              movw R16,R20
 00BE B2DF              xcall _spi_send
 00C0                   .dbline 54
 00C0           ;         if(pai==6.28)              //2pai回零
 00C0 2880              ldd R2,y+0
 00C2 3980              ldd R3,y+1
 00C4 4A80              ldd R4,y+2
 00C6 5B80              ldd R5,y+3
 00C8 00E0              ldi R16,<L23
 00CA 10E0              ldi R17,>L23
 00CC 0E940000          xcall elpm32
 00D0 3A93              st -y,R19
 00D2 2A93              st -y,R18
 00D4 1A93              st -y,R17
 00D6 0A93              st -y,R16
 00D8 8101              movw R16,R2
 00DA 9201              movw R18,R4
 00DC 0E940000          xcall fpcmp2
 00E0 41F4              brne L21
 00E2           X3:
 00E2                   .dbline 55
 00E2           ;           {pai=0;}
 00E2                   .dbline 55
 00E2 00E0              ldi R16,<L15
 00E4 10E0              ldi R17,>L15
 00E6 0E940000          xcall elpm32
 00EA 0883              std y+0,R16
 00EC 1983              std y+1,R17
 00EE 2A83              std y+2,R18
 00F0 3B83              std y+3,R19
 00F2                   .dbline 55
 00F2           L21:
 00F2                   .dbline 56
 00F2           ;        }
 00F2           L17:
 00F2                   .dbline 48
 00F2 B9CF              xjmp L16
 00F4           X4:
 00F4                   .dbline -2
 00F4           L14:
 00F4                   .dbline 0 ; func end
 00F4 2896              adiw R28,8
 00F6 0895              ret
 00F8                   .dbsym l aa 4 D
 00F8                   .dbsym r sin_p 20 I
 00F8                   .dbsym l pai 0 D
 00F8                   .dbend
                        .area lit(rom, con, rel)
 0000           L23:
 0000 C3F5C840          .word 0xf5c3,0x40c8
 0004           L20:
 0004 0000FA44          .word 0x0,0x44fa
 0008           L19:
 0008 CDCCCC3D          .word 0xcccd,0x3dcc
 000C           L15:
 000C 00000000          .word 0x0,0x0
 0010           ; }

⌨️ 快捷键说明

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