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

📄 adc.lst

📁 单片机A/D模数转换 C语言编写 源程序。
💻 LST
📖 第 1 页 / 共 2 页
字号:
__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 + -