📄 adc.lst
字号:
__start:
__text_start:
0036 E5CF LDI R28,0x5F
0037 E0D2 LDI R29,2
0038 BFCD OUT 0x3D,R28
0039 BFDE OUT 0x3E,R29
003A 51C0 SUBI R28,0x10
003B 40D0 SBCI R29,0
003C EA0A LDI R16,0xAA
003D 8308 STD Y+0,R16
003E 2400 CLR R0
003F E8E1 LDI R30,0x81
0040 E0F0 LDI R31,0
0041 E010 LDI R17,0
0042 38E1 CPI R30,0x81
0043 07F1 CPC R31,R17
0044 F011 BEQ 0x0047
0045 9201 ST R0,Z+
0046 CFFB RJMP 0x0042
0047 8300 STD Z+0,R16
0048 E4EB LDI R30,0x4B
0049 E0F0 LDI R31,0
004A E6A0 LDI R26,0x60
004B E0B0 LDI R27,0
004C E010 LDI R17,0
004D 36EC CPI R30,0x6C
004E 07F1 CPC R31,R17
004F F021 BEQ 0x0054
0050 95C8 LPM
0051 9631 ADIW R30,1
0052 920D ST R0,X+
0053 CFF9 RJMP 0x004D
0054 D0C9 RCALL _main
_exit:
0055 CFFF RJMP _exit
_DelaymS:
j --> R20
k --> R22
i --> R16
0056 D14A RCALL push_gset2
FILE: E:\iccavr代码\实验7_片内模数转换器adc\adc.c
(0001) //******************************************************************************
(0002) // *
(0003) // FileName : 实验板ADC.c ICCAVR V6.31A编译 *
(0004) // Function : 实验板的片内模数转换器ADC的使用练习 *
(0005) // Date : 2006-11-05 *
(0006) // Version : 1.0 *
(0007) // *
(0008) // Author : 开关电源 hongtusy@163.com *
(0009) // Company : 电子信息技术咨询网 http://www.itsn.cn *
(0010) // *
(0011) //***************************描述与记事*****************************************
(0012) //实验板的AVR程序,片内模数转换器ADC的应用,用1602LCD显示两个通道的ADC测量电压数值
(0013) //接线定义:使用PC和PD口驱动1602LCD作显示,PD4,5,6 为RS,R/W,EA。数据位为PC口。
(0014) // 开关位置:SW2-1,2,3.SW1-1~8.SW2-5为背光开关。SW3-8为系统复位端。
(0015) // PA0(SW3-1)和PA1(SW3-2)作为两个通道的模拟量输入端。
(0016) //记事:本程序旨在对片内模数转换器ADC的理解与演示,程序适合初学者使用.
(0017) // 使用ATmega8535,片内1MHz晶振。
(0018) //******************************************************************************
(0019)
(0020) #include <iom8535v.h> //头文件,ATmega8535单片机的寄存器定义
(0021) #include <macros.h> //包含有SEI()、CLI()、NOP()、WDR()、等宏定义.
(0022)
(0023) typedef unsigned char uchar; //数据类型说明
(0024) typedef unsigned int uint; //数据类型说明
(0025)
(0026) uchar buf[]="TEST CH1:0.000Vvolt CH2:0.000V";
(0027)
(0028) /************************************************
(0029) 函 数 名: DelaymS()
(0030) 功 能: 毫秒级延时函数
(0031) 输入参数: 延迟时间/系统晶体
(0032) 输出参数: 做相应的延迟处理
(0033) 描 述: /
(0034) ***********************************************/
(0035) void DelaymS (uint i) //延时函数,参数i为延时时间
(0036) {
(0037) uint j,k; //双重延时
(0038) for (j=0;j<i;j++)
0057 2744 CLR R20
0058 2755 CLR R21
0059 C00C RJMP 0x0066
(0039) {
(0040) for (k=0;k<=500;k++);
005A 2766 CLR R22
005B 2777 CLR R23
005C C002 RJMP 0x005F
005D 5F6F SUBI R22,0xFF
005E 4F7F SBCI R23,0xFF
005F EF84 LDI R24,0xF4
0060 E091 LDI R25,1
0061 1786 CP R24,R22
0062 0797 CPC R25,R23
0063 F7C8 BCC 0x005D
0064 5F4F SUBI R20,0xFF
0065 4F5F SBCI R21,0xFF
0066 1740 CP R20,R16
0067 0751 CPC R21,R17
0068 F388 BCS 0x005A
0069 D12F RCALL pop_gset2
006A 9508 RET
_write_data:
h --> R20
006B D137 RCALL push_gset1
006C 2F40 MOV R20,R16
(0041) }
(0042) }
(0043) /********************************************************
(0044) 子程序名: write_data()
(0045) 功 能: 写入一字节LCD数据
(0046) 输入参数: /
(0047) 输出参数: /
(0048) 描 述: /
(0049) ********************************************************/
(0050) void write_data(uchar h)
(0051) {
(0052) PORTC = h; //先将数据送出
006D BB45 OUT 0x15,R20
(0053) PORTD |= (1<<PD4); //RS=1,数据
006E 9A94 SBI 0x12,4
(0054) PORTD &= ~(1<<PD5); //R/W=0,写
006F 9895 CBI 0x12,5
(0055) PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
0070 9896 CBI 0x12,6
(0056) DelaymS (1);
0071 E001 LDI R16,1
0072 E010 LDI R17,0
0073 DFE2 RCALL _DelaymS
(0057) PORTD |= (1<<PD6); //EN=1 ,除能
0074 9A96 SBI 0x12,6
0075 D130 RCALL pop_gset1
0076 9508 RET
_write_code:
h --> R20
0077 D12B RCALL push_gset1
0078 2F40 MOV R20,R16
(0058) }
(0059) /********************************************************
(0060) 子程序名: write_code()
(0061) 功 能: 写入一字节LCD指令/地址
(0062) 输入参数: /
(0063) 输出参数: /
(0064) 描 述: /
(0065) ********************************************************/
(0066) void write_code(uchar h)
(0067) {
(0068) PORTC = h; //先将地址送出
0079 BB45 OUT 0x15,R20
(0069) PORTD &= ~(1<<PD4); //RS=0,命令或数据
007A 9894 CBI 0x12,4
(0070) PORTD &= ~(1<<PD5); //R/W=0,写
007B 9895 CBI 0x12,5
(0071) PORTD &= ~(1<<PD6); //EN=0 ,使能,产生一个下降沿。
007C 9896 CBI 0x12,6
(0072) DelaymS (1);
007D E001 LDI R16,1
007E E010 LDI R17,0
007F DFD6 RCALL _DelaymS
(0073) PORTD |= (1<<PD6); //EN=1 ,除能
0080 9A96 SBI 0x12,6
0081 D124 RCALL pop_gset1
0082 9508 RET
(0074) }
(0075) /********************************************************
(0076) 子程序名: Init_lcd()
(0077) 功 能: 初始化LCD
(0078) 输入参数: /
(0079) 输出参数: /
(0080) 描 述: /
(0081) ********************************************************/
(0082) void Init_lcd(void)
(0083) {
(0084) write_code(0x01); //清除屏幕
_Init_lcd:
0083 E001 LDI R16,1
0084 DFF2 RCALL _write_code
(0085) write_code(0x38); //功能设定,8位数据口/2行/5*7的点阵
0085 E308 LDI R16,0x38
0086 DFF0 RCALL _write_code
(0086) write_code(0b00001111); //显示幕ON,光标ON,闪烁ON
0087 E00F LDI R16,0xF
0088 DFEE RCALL _write_code
(0087) write_code(0x06); //模式,加1,显示幕ON。
0089 E006 LDI R16,6
008A DFEC RCALL _write_code
(0088) write_code(0b00000011); //光标回到原点
008B E003 LDI R16,3
008C DFEA RCALL _write_code
008D 9508 RET
_display_lcd:
i --> R20
p --> R22
008E D112 RCALL push_gset2
008F 01B8 MOVW R22,R16
(0089) }
(0090) /********************************************************
(0091) 子程序名: display_lcd()
(0092) 功 能: 刷新显示一屏数据,独立的LCD显示程序,用户将显存内容更新后,只要调用此程序即可更新显示。
(0093) 输入参数: /
(0094) 输出参数: /
(0095) 描 述: 在写一个字符前,先设定显示的位置地址,然后再写数据。系统可以自动地址加一。
(0096) ********************************************************/
(0097) void display_lcd(uchar *p)
(0098) {
(0099) uchar i;
(0100) write_code(0x80); //第一行起始地址,0b10000000B=0x80.
0090 E800 LDI R16,0x80
0091 DFE5 RCALL _write_code
(0101) for(i=0;i<16;i++)
0092 2744 CLR R20
0093 C007 RJMP 0x009B
(0102) {
(0103) write_data(p[i]);
0094 2FE4 MOV R30,R20
0095 27FF CLR R31
0096 0FE6 ADD R30,R22
0097 1FF7 ADC R31,R23
0098 8100 LDD R16,Z+0
0099 DFD1 RCALL _write_data
009A 9543 INC R20
009B 3140 CPI R20,0x10
009C F3B8 BCS 0x0094
(0104) }
(0105) write_code(0xc0); //第二行起始地址,0b11000000B=0xc0.
009D EC00 LDI R16,0xC0
009E DFD8 RCALL _write_code
(0106) for(i=16;i<32;i++)
009F E140 LDI R20,0x10
00A0 C007 RJMP 0x00A8
(0107) {
(0108) write_data(p[i]);
00A1 2FE4 MOV R30,R20
00A2 27FF CLR R31
00A3 0FE6 ADD R30,R22
00A4 1FF7 ADC R31,R23
00A5 8100 LDD R16,Z+0
00A6 DFC4 RCALL _write_data
00A7 9543 INC R20
00A8 3240 CPI R20,0x20
00A9 F3B8 BCS 0x00A1
00AA D0EE RCALL pop_gset2
00AB 9508 RET
(0109) }
(0110) }
(0111) /************************************************
(0112) 函 数 名: Init_mcu()
(0113) 功 能: 单片机初始化函数
(0114) 输入参数: /
(0115) 输出参数: /
(0116) 描 述: 相关口方向的设置等
(0117) ***********************************************/
(0118) void Init_mcu(void)
(0119) {
(0120) DDRC = 0xff; //PC口为推挽1输出,段码
_Init_mcu:
00AC EF8F LDI R24,0xFF
00AD BB84 OUT 0x14,R24
(0121) DDRD = 0xff; //PD口为推挽1输出,位码
00AE BB81 OUT 0x11,R24
(0122) DDRA = 0x00; //PA口为输入
00AF 2422 CLR R2
00B0 BA2A OUT 0x1A,R2
(0123) PORTA = 0x00; //内部不接上拉电阻
00B1 BA2B OUT 0x1B,R2
00B2 9508 RET
(0124) }
(0125) /************************************************
(0126) 函 数 名: adc_Init()
(0127) 功 能: ADC初始化函数
(0128) 输入参数: /
(0129) 输出参数: /
(0130) 描 述: 设置片内模数转换器ADC的一些参数
(0131) ***********************************************/
(0132) void Init_adc(void)
(0133) {
(0134) ADMUX = 0b11000000; //内参2.56V参考电压源、右对齐、选择0通道(单输入,无增益)。
_Init_adc:
00B3 EC80 LDI R24,0xC0
00B4 B987 OUT 0x07,R24
(0135) //多工选择寄存器ADMUX
(0136) ADCSRA = 0b11101011; //ADC使能、启动转换、自由转换、中断使能、8分频。
00B5 EE8B LDI R24,0xEB
00B6 B986 OUT 0x06,R24
00B7 9508 RET
(0137) //控制和状态寄存器A,ADCSRA
(0138) }
(0139) /************************************************
(0140) 函 数 名: adc_convert()
(0141) 功 能: A/D转换函数
(0142) 输入参数: /
(0143) 输出参数: /
(0144) 描 述: 读取采样获得的10位数据
(0145) ***********************************************/
(0146) uint adc_convert(void)
(0147) {
(0148) uint temp1,temp2;
(0149) temp1 = (uint)ADCL; //必须先读低字节
_adc_convert:
temp1 --> R18
temp2 --> R16
00B8 B124 IN R18,0x04
00B9 2733 CLR R19
(0150) temp2 = (uint)ADCH;
00BA B105 IN R16,0x05
00BB 2711 CLR R17
(0151) temp2 = (temp2<<8) + temp1; //左移8位
00BC 0118 MOVW R2,R16
00BD 2C32 MOV R3,R2
00BE 2422 CLR R2
00BF 0E22 ADD R2,R18
00C0 1E33 ADC R3,R19
00C1 0181 MOVW R16,R2
(0152) return (temp2);
00C2 9508 RET
_process:
j --> R22
i --> R20
00C3 D0DD RCALL push_gset2
00C4 2F62 MOV R22,R18
00C5 01A8 MOVW R20,R16
(0153) }
(0154) /********************************************************
(0155) 子程序名: process()
(0156) 输入参数: 数据处理函数
(0157) 输出参数: /
(0158) 描 述:
(0159) 数据格式:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -