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

📄 ad.lis

📁 AtMega169的ADC功能的测试C语言程序
💻 LIS
字号:
                        .module AD.C
                        .area text(rom, con, rel)
 0000                   .dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
 0000                   .dbfunc e adc_init _adc_init fV
                        .even
 0000           _adc_init::
 0000                   .dbline -1
 0000                   .dbline 22
 0000           ; // **************************************************************
 0000           ; // ***                         广 州 天 河 双 龙 电 子 公 司            ***
 0000           ; // ***                   http://www.sl.com.cn                 ***
 0000           ; // ***                   实验:ADC转换                                   ***
 0000           ; // ***                  作者:zxy@sl.com.cn                   ***
 0000           ; // ***                       2006年3月28日                    ***
 0000           ; // ***         目标MCU:MEGA169    晶振:内部(INT)8MHZ         ***
 0000           ; // **************************************************************
 0000           ; //用跳线短接J3的ADC2,调节可变电阻R7,LED显示将发生变化 
 0000           ; #include <iom169v.h>
 0000           ; #include <macros.h>
 0000           ; #define Vref   3212//参考电压值,注意不同环境下的Vref不相同
 0000           ; 
 0000           ; extern const unsigned char seg_table[16];
 0000           ; extern unsigned char led_buff[4];
 0000           ; extern void delay_ms(unsigned int time);
 0000           ; extern void display(void);
 0000           ; unsigned int adc_rel;//AD转换结果
 0000           ; 
 0000           ; //ADC初始化
 0000           ; void adc_init(void)
 0000           ; {
 0000                   .dbline 23
 0000           ;  ADCSRA = 0x00; //设置前,先关闭ADC
 0000 2224              clr R2
 0002 20927A00          sts 122,R2
 0006                   .dbline 24
 0006           ;  ADMUX =(1<<REFS0)|(1<<MUX0);//选择内部AVCC为基准,单端输入口为ADC1
 0006 81E4              ldi R24,65
 0008 80937C00          sts 124,R24
 000C                   .dbline 25
 000C           ;  ACSR  =(1<<ACD);//关闭模拟比较器,禁止位P148
 000C 80E8              ldi R24,128
 000E 80BF              out 0x30,R24
 0010                   .dbline 26
 0010           ;  ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);//ADC时钟64分频
 0010 8FEC              ldi R24,207
 0012 80937A00          sts 122,R24
 0016                   .dbline -2
 0016           L1:
 0016                   .dbline 0 ; func end
 0016 0895              ret
 0018                   .dbend
                        .area vector(rom, abs)
                        .org 76
 004C 0C940C00          jmp _adc_isr
                        .area text(rom, con, rel)
 0018                   .dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
 0018                   .dbfunc e adc_isr _adc_isr fV
                        .even
 0018           _adc_isr::
 0018 8A93              st -y,R24
 001A 9A93              st -y,R25
 001C 8FB7              in R24,0x3f
 001E 8A93              st -y,R24
 0020                   .dbline -1
 0020                   .dbline 34
 0020           ; }
 0020           ; 
 0020           ; //ADC完成中断
 0020           ; #pragma interrupt_handler adc_isr:20 
 0020           ; //AD 中断  
 0020           ; 
 0020           ; void adc_isr(void)
 0020           ; { 
 0020                   .dbline 36
 0020           ; 
 0020           ;  adc_rel = ADC&0x3ff;
 0020 80917800          lds R24,120
 0024 90917900          lds R25,120+1
 0028 9370              andi R25,3
 002A 90930100          sts _adc_rel+1,R25
 002E 80930000          sts _adc_rel,R24
 0032                   .dbline 38
 0032           ;  //ADMUX =(1<<REFS0)|(1<<MUX0);
 0032           ;  ADCSRA|=(1<<ADSC);//启动AD转换
 0032 80917A00          lds R24,122
 0036 8064              ori R24,64
 0038 80937A00          sts 122,R24
 003C                   .dbline -2
 003C           L2:
 003C                   .dbline 0 ; func end
 003C 8991              ld R24,y+
 003E 8FBF              out 0x3f,R24
 0040 9991              ld R25,y+
 0042 8991              ld R24,y+
 0044 1895              reti
 0046                   .dbend
 0046                   .dbfunc e ADCtoBCD _ADCtoBCD fV
 0046           ;              i -> R12
 0046           ;           temp -> R10,R11
                        .even
 0046           _ADCtoBCD::
 0046 0E940000          xcall push_xgsetF03C
 004A 5801              movw R10,R16
 004C                   .dbline -1
 004C                   .dbline 43
 004C           ; }
 004C           ; 
 004C           ; //ADC结果转换成电压值
 004C           ; void ADCtoBCD(unsigned int temp)
 004C           ;  {
 004C                   .dbline 45
 004C           ;   unsigned char i;
 004C           ;   temp=(unsigned int)(((unsigned long)((unsigned long)temp*Vref))/1024);//ADC结果转换成电压值
 004C 1501              movw R2,R10
 004E 4424              clr R4
 0050 5524              clr R5
 0052 4CE8              ldi R20,140
 0054 5CE0              ldi R21,12
 0056 60E0              ldi R22,0
 0058 70E0              ldi R23,0
 005A 5A92              st -y,R5
 005C 4A92              st -y,R4
 005E 3A92              st -y,R3
 0060 2A92              st -y,R2
 0062 8A01              movw R16,R20
 0064 9B01              movw R18,R22
 0066 0E940000          xcall empy32u
 006A 8AE0              ldi R24,10
 006C 90E0              ldi R25,0
 006E 8A93              st -y,R24
 0070 0E940000          xcall lsr32
 0074 5801              movw R10,R16
 0076                   .dbline 46
 0076           ;   for(i=0;i<4;i++)
 0076 CC24              clr R12
 0078 19C0              xjmp L7
 007A           L4:
 007A                   .dbline 47
 007A           ;   {
 007A                   .dbline 48
 007A           ;    led_buff[i]=seg_table[temp%10];//结果存入显示缓存
 007A 2AE0              ldi R18,10
 007C 30E0              ldi R19,0
 007E 8501              movw R16,R10
 0080 0E940000          xcall mod16u
 0084 F801              movw R30,R16
 0086 80E0              ldi R24,<_seg_table
 0088 90E0              ldi R25,>_seg_table
 008A E80F              add R30,R24
 008C F91F              adc R31,R25
 008E 2490              lpm R2,Z
 0090 80E0              ldi R24,<_led_buff
 0092 90E0              ldi R25,>_led_buff
 0094 EC2D              mov R30,R12
 0096 FF27              clr R31
 0098 E80F              add R30,R24
 009A F91F              adc R31,R25
 009C 2082              std z+0,R2
 009E                   .dbline 49
 009E           ;    temp=temp/10;
 009E 2AE0              ldi R18,10
 00A0 30E0              ldi R19,0
 00A2 8501              movw R16,R10
 00A4 0E940000          xcall div16u
 00A8 5801              movw R10,R16
 00AA                   .dbline 50
 00AA           ;    }
 00AA           L5:
 00AA                   .dbline 46
 00AA C394              inc R12
 00AC           L7:
 00AC                   .dbline 46
 00AC 8C2D              mov R24,R12
 00AE 8430              cpi R24,4
 00B0 20F3              brlo L4
 00B2           X0:
 00B2                   .dbline 51
 00B2           ;   led_buff[3]&=0x7f; 
 00B2 80910300          lds R24,_led_buff+3
 00B6 8F77              andi R24,127
 00B8 80930300          sts _led_buff+3,R24
 00BC                   .dbline -2
 00BC           L3:
 00BC                   .dbline 0 ; func end
 00BC 0C940000          xjmp pop_xgsetF03C
 00C0                   .dbsym r i 12 c
 00C0                   .dbsym r temp 10 i
 00C0                   .dbend
 00C0                   .dbfunc e main _main fV
 00C0           ;        adc_old -> R10,R11
                        .even
 00C0           _main::
 00C0                   .dbline -1
 00C0                   .dbline 55
 00C0           ;  }
 00C0           ; 
 00C0           ; void main(void)
 00C0           ; { 
 00C0                   .dbline 57
 00C0           ;  unsigned int adc_old;
 00C0           ;     adc_init();//AD初始化
 00C0 9FDF              xcall _adc_init
 00C2                   .dbline 59
 00C2           ;         
 00C2           ;         DDRE=0xff;//E口初始化
 00C2 8FEF              ldi R24,255
 00C4 8DB9              out 0xd,R24
 00C6                   .dbline 60
 00C6           ;         PORTE=0xff;//E口初始化
 00C6 8EB9              out 0xe,R24
 00C8                   .dbline 61
 00C8           ;         DDRB|=0xf0;//B口初始化
 00C8 84B1              in R24,0x4
 00CA 806F              ori R24,240
 00CC 84B9              out 0x4,R24
 00CE                   .dbline 62
 00CE           ;         PORTB|=0xf0;//B口初始化
 00CE 85B1              in R24,0x5
 00D0 806F              ori R24,240
 00D2 85B9              out 0x5,R24
 00D4                   .dbline 63
 00D4           ;         SEI();//使能全局中断
 00D4 7894              sei
 00D6 0CC0              xjmp L11
 00D8           L10:
 00D8                   .dbline 65
 00D8           ;     while(1)
 00D8           ;     { 
 00D8                   .dbline 66
 00D8           ;          if(adc_old!=adc_rel)
 00D8 20900000          lds R2,_adc_rel
 00DC 30900100          lds R3,_adc_rel+1
 00E0 A214              cp R10,R2
 00E2 B304              cpc R11,R3
 00E4 19F0              breq L13
 00E6           X1:
 00E6                   .dbline 67
 00E6           ;             {
 00E6                   .dbline 68
 00E6           ;                   adc_old=adc_rel;  //AD转换结果
 00E6 5101              movw R10,R2
 00E8                   .dbline 69
 00E8           ;                   ADCtoBCD(adc_old);//进制转换
 00E8 8101              movw R16,R2
 00EA ADDF              xcall _ADCtoBCD
 00EC                   .dbline 70
 00EC           ;                 }             
 00EC           L13:
 00EC                   .dbline 71
 00EC           ;          display();   //显示函数
 00EC 0E940000          xcall _display
 00F0                   .dbline 73
 00F0           ;                                        
 00F0           ;       }
 00F0           L11:
 00F0                   .dbline 64
 00F0 F3CF              xjmp L10
 00F2           X2:
 00F2                   .dbline -2
 00F2           L9:
 00F2                   .dbline 0 ; func end
 00F2 0895              ret
 00F4                   .dbsym r adc_old 10 i
 00F4                   .dbend
                        .area bss(ram, con, rel)
 0000                   .dbfile E:\WORK\WORK_DEMO\169P_demo\169ADC\AD.C
 0000           _adc_rel::
 0000                   .blkb 2
 0002                   .dbsym e adc_rel _adc_rel i
 0002           ; }                                       
 0002           ;               
 0002           ;                               
 0002           ;                  
 0002           ;          
 0002           ; 
 0002           ;  
 0002           ;  
 0002           ;  
 0002           ;  

⌨️ 快捷键说明

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