求stc12c5a08ad芯片的A/D转换汇编程序

作者&投稿:袁瑾 (若有异议请与网页底部的电邮联系)
需要STC12C5A60S2的AD转换,汇编的~

ADC_CONTR EQU 0C5H ;A/D转换寄存器
ADC_DATA EQU 0C6H ;A/D转换结果寄存器,为10位A/D转化结果的高8位
ADC_LOW2 EQU 0BEH ;A/D转换结果寄存器,低2位有效,为10位A/D转换结果的低2位
;如果不用ADC_LOW2的低2位,只有ADC_DATA的8位,则为8位A/D转化
P1M0 EQU 91H ;P1口模式选择寄存器0
P1M1 EQU 92H ;P1口模式选择寄存器1


ADC_POWER_ON_SPEED_CHANNEL_0 EQU 11100000B ;P1.0作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_1 EQU 11100001B ;P1.1作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_2 EQU 11100010B ;P1.2作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_3 EQU 11100011B ;P1.3作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_4 EQU 11100100B ;P1.4作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_5 EQU 11100101B ;P1.5作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_6 EQU 11100110B ;P1.6作为A/D输入
ADC_POWER_ON_SPEED_CHANNEL_7 EQU 11100110B ;P1.7作为A/D输入


;定义变量
ADC_CHANNEL_0RESULT EQU 30H ;0通道A/D转换结果
ADC_CHANNEL_1RESULT EQU 31H ;1通道A/D转换结果
ADC_CHANNEL_2RESULT EQU 32H ;2通道A/D转换结果
ADC_CHANNEL_3RESULT EQU 33H ;3通道A/D转换结果
ADC_CHANNEL_4RESULT EQU 34H ;4通道A/D转换结果
ADC_CHANNEL_5RESULT EQU 35H ;5通道A/D转换结果
ADC_CHANNEL_6RESULT EQU 36H ;6通道A/D转换结果
ADC_CHANNEL_7RESULT EQU 37H ;7通道A/D转换结果

ORG 0000H
LJMP MAIN
ORG 0050H
MAIN:
MOV SP,#40H
ACALL ADC_POWER_ON //;开ADC电源,第一次使用时要打开内部模拟电源
;开ADC电源,可适当加延时,1MS以内就足够了

ACALL SET_P12_OPEN_DRAIN //;设置P1.2位开漏

ACALL SET_ADC_CHANNEL_2 //;设置P1.2作为A/D转换通道

ACALL GET_ADC_RESULT //;测量电压并且取A/D转化结果



ADC_POWER_ON:
PUSH ACC
ORL ADC_CONTR,#80H //;开A/D转换电源

MOV A,#20H
ACALL DELAY ;开A/D转换电源后要加延时,1MS以内就足够了

POP ACC
RET


;设置P1.2,设置A/D通道所在的I/O为开漏模式

SET_P12_OPEN_DRAIN:
PUSH ACC
MOV A,#00000100B
ORL P1M0,A
ORL P1M1,A
POP ACC
RET


SET_ADC_CHANNEL_2:
MOV ADC_CONTR,#ADC_POWER_ON_SPEED_CHANNEL_2 //;选择P1.2作为A/D转换通道

MOV A,#01H //;更换A/D转换通道后要适当延时,使输入电压稳定
;以后如果不更换A/D转换通道的话,不需要加延时

ACALL DELAY //;切换A/D转换通道,加延时时20US~200US就可以了,与输入电压源的内阻有关

RET


GET_ADC_RESULT:
PUSH ACC
MOV ADC_DATA,#0
ORL ADC_CONTR,#00001000B ;启动AD转换


WAIT_AD_FINISH:
MOV A,#00010000B //;判断AD转换是否完成

ANL A,ADC_CONTR
JZ WAIT_AD_FINISH //;AD转换尚未完成,继续等待

ANL ADC_CONTR,#11100111B
MOV A,ADC_DATA //取10位AD转换数据寄存器的高八位显示到P2口
CLR C
MOV P2,A
LJMP GET_ADC_RESULT //不停的进行重复的AD采集


DELAY:
PUSH 02
PUSH 03
PUSH 04
MOV R4,A

DELAY_LOOP0:
MOV R3,#50
DELAY_LOOP:
DJNZ R3,DELAY_LOOP
DJNZ R4,DELAY_LOOP0


POP 04
POP 03
POP 02
RET


END

这就要看你设置的AUXR1值是多少了。

可以这样,首先定义一个16位无符号整型ADC_RESULT
如果AUXR1=0则
ADC_RESULT=ADC_RES;先将结果高字节放入ADC_RESULT=ADC_RESULT<<2;然后左移2位ADC_RESL=ADC_RESL&0x03;确保无用位为0ADC_RESULT=ADC_RESULT | ADC_RESL;最后组合起来称为16位二进制数如果AUXR1=1则
ADC_RESULT=ADC_RES;先将结果高字节放入ADC_RESULT=ADC_RESULT<<8;然后左移8位ADC_RESULT=ADC_RESULT | ADC_RESL;最后组合起来称为16位二进制数

LED_MCU_START EQU P3.7

ADC_CONTR EQU 0BCH ;A/D转换寄存器
ADC_RES EQU 0BDH ;8位A/D转换结果寄存器
P1ASF EQU 9DH ;P1口中的相应位作为模拟功能使用时的控制寄存器,如做A/D用,相应位要置1

ADC_Power_On_Speed_Channel_0 EQU 11100000B ;P1.0作为A/D输入
ADC_Power_On_Speed_Channel_1 EQU 11100001B ;P1.1作为A/D输入
ADC_Power_On_Speed_Channel_2 EQU 11100010B ;P1.2作为A/D输入
ADC_Power_On_Speed_Channel_3 EQU 11100011B ;P1.3作为A/D输入
ADC_Power_On_Speed_Channel_4 EQU 11100100B ;P1.4作为A/D输入
ADC_Power_On_Speed_Channel_5 EQU 11100101B ;P1.5作为A/D输入
ADC_Power_On_Speed_Channel_6 EQU 11100110B ;P1.6作为A/D输入
ADC_Power_On_Speed_Channel_7 EQU 11100111B ;P1.7作为A/D输入
;-------------------------------------------------
;定义变量
ADC_Channel_0_Result EQU 30H ;0通道A/D转换结果
ADC_Channel_1_Result EQU 31H ;1通道A/D转换结果
ADC_Channel_2_Result EQU 32H ;2通道A/D转换结果
ADC_Channel_3_Result EQU 33H ;3通道A/D转换结果
ADC_Channel_4_Result EQU 34H ;4通道A/D转换结果
ADC_Channel_5_Result EQU 35H ;5通道A/D转换结果
ADC_Channel_6_Result EQU 36H ;6通道A/D转换结果
ADC_Channel_7_Result EQU 37H ;7通道A/D转换结果
;--------------------------------------------------
ORG 0000H
LJMP MAIN

ORG 0050H
MAIN:
CLR LED_MCU_START ;MCU工作指示灯 LED_MCU_START EQU P3.7
MOV SP, #7FH ;设置堆栈

ACALL Initiate_RS232 ;初始化串口

ACALL ADC_Power_On ;开ADC电源, 第一次使用时要打开内部模拟电源
;开ADC电源, 可适当加延时,1mS以内就足够了
ACALL Set_P12_ASF ;设置 P1.2 为模拟功能口
ACALL Set_ADC_Channel_2 ;设置 P1.2 作为A/D转换通道

ACALL Get_AD_Result ;测量电压并且取A/D转换结果
ACALL Send_AD_Result ;发送转换结果到 PC 机

ACALL Set_P12_Normal_IO ;设置 P1.2 为普通IO
MOV A, ADC_Channel_2_Result ;用 P1 口显示A/D转换结果
CPL A
MOV P1, A

Wait_Loop:
SJMP Wait_Loop ;停机

;-------------------------------------------------------------
;-------------------------------------------------------------
;-------------------------------------------------------------
;-------------------------------------------------------------
Initiate_RS232: ;串口初始化
CLR ES ;禁止串口中断
MOV TMOD, #20H ;设置 T1 为波特率发生器
MOV SCON, #50H ;0101,0000 8位数据位, 无奇偶校验
MOV TH1, #0FBH ;18.432MHz 晶振, 波特率 = 9600
MOV TL1, #0FBH

SETB TR1 ;启动 T1
RET
;--------------------------------------------------------------
Send_Byte:
CLR TI
MOV SBUF, A
Send_Byte_Wait_Finish:
JNB TI, Send_Byte_Wait_Finish
CLR TI
RET
;--------------------------------------------------------------
ADC_Power_On:
PUSH ACC
ORL ADC_CONTR, #80H ;开A/D转换电源
MOV A, #20H
ACALL Delay ;开A/D转换电源后要加延时,1mS以内就足够了
POP ACC
RET

;-------------------------------------------------------------
;设置P1.2为模拟功能
Set_P12_ASF:
PUSH ACC
MOV A, #00000100B
ORL P1ASF, A
POP ACC
RET

;-------------------------------------------------------------
;设置 P1.2 为普通IO
Set_P12_Normal_IO:
PUSH ACC
MOV A, #11111011B
ANL P1ASF, A
POP ACC
RET

;-------------------------------------------------------------
Set_ADC_Channel_2:
MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_2
;选择P1.2作为A/D转换通道
MOV A, #05H ;更换 A/D 转换通道后要适当延时, 使输入电压稳定
;以后如果不更换 A/D 转换通道的话, 不需要加延时
ACALL Delay ;切换 A/D 转换通道,加延时20uS~200uS就可以了,与输入电压源的内阻有关
;如果输入电压信号源的内阻在10K以下,可不加延时
RET

;-------------------------------------------------------------

Send_AD_Result:
PUSH ACC
MOV A, ADC_Channel_2_Result ;取 AD 转换结果
ACALL Send_Byte ;发送转换结果到 PC 机
POP ACC
RET

;----------------------------------------------------------
Get_AD_Result:
PUSH ACC ;入栈保护
MOV ADC_RES, #0
ORL ADC_CONTR, #00001000B ;启动 AD 转换
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
NOP ;在对ADC_CONTR寄存器进行写操作后,要加4个空操作延时,才能够正确读到ADC_CONTR的值
Wait_AD_Finishe:
MOV A, #00010000B ;判断 AD 转换是否完成
ANL A, ADC_CONTR
JZ Wait_AD_Finishe ;AD 转换尚未完成, 继续等待

ANL ADC_CONTR, #11100111B ;清0 ADC_FLAG, ADC_START 位, 停止A/D转换

MOV A, ADC_RES
MOV ADC_Channel_2_Result, A ;保存 AD 转换结果
POP ACC
RET
;---------------------------------------------------------------
Delay:
PUSH 02 ;将寄存器组0 的 R2 入栈
PUSH 03 ;将寄存器组0 的 R3 入栈
PUSH 04 ;将寄存器组0 的 R4 入栈
MOV R4, A
Delay_Loop0:
MOV R3, #200 ;2 CLOCK ---------------------+
Delay_Loop1: ; |
MOV R2, #249 ;2 CLOCK ------+ |
Delay_Loop: ; | 1002 CLOCK |200406 CLOCK
DJNZ R2, Delay_Loop ;4 CLOCK | |
DJNZ R3, Delay_Loop1 ;4 CLOCK ------+ |
DJNZ R4, Delay_Loop0 ;4 CLOCK ---------------------+

POP 04
POP 03
POP 02
RET
;----------------------------------------------------------------
END 希望对你有帮助


stc12c5a60s2单片机 延时函数怎么写 晶振11.0592Mhz 和 12M
软件延时并不精确,我都是用一个叫dpjxjl的小软件自动生成,具体准确否,没校验过,以1MS例:STC的1T单片机12MHz:void delay(void) \/\/误差 0us { unsigned char a,b;for(b=129;b>0;b--)for(a=45;a>0;a--);} 1T单片机11.0592MHz:void delay(void) \/\/误差 -0.018084490741us...

单片机stc12c5a60s2串口2工作方式0初始化子程序
include<reg51.h> define uchar unsigned char sfr AUXR=0x8e;sfr S2CON=0x9a;sfr S2BUF=0x9b;sfr BRT=0x9c;sfr IE2=0xaf;define S2RI=0x01 define S2TI=0x02 uartinit(){ S2CON=0x50;BRT=-12000000\/32\/9600;AUXR=0x14;IE2=0x01;EA=1;} ...

STC12C5A60S2单片机控制舵机
include<reg51.h> define uint unsigned int define uchar unsigned char uint TH0_1,TL0_1;TH0_2,TL0_2,TH0_3,TL0_3;sbit key1=P3^2;sbit key2=P3^3;sbit key3=P3^4;sbit out=P1^0;void dingshiqi_chushihua(){ out=0;TR1=1;EA=1;TMOD=0x10;ET1=1;TR1=1;TH0_1=(...

STC12C5A60S2单片机频率是怎么计算出来的,或者怎么改!!
频率计算 系统时钟/分频系数/256 系统时钟不一定等于晶振频率 但对于STC12C5A60S2不专门设置的话 系统时钟是等于晶振频率 CMOD=0X02 分频系数是2 PWM频率=11000000\/2\/256=21.48 khz 如果想要PWM频率是12.3KHZ 分频系数=11000000\/256\/12300=3.49,介于3和4之间,确实不太好办 可选 CMOD=...

用STC12C5A60S2单片机做矩阵键盘
KEY&0x0f){case 0x0E:return 12;case 0x0D:return 13;case 0x0B:return 14;case 0x07:return 15;}return 255;}放在整个程序的循环中 只要检测到按键做相应的动作即可。如果要用到延时的地方 可以把显示函数当做延时函数来用,或者把显示函数放到中断里面。这样都不会影响到正常的显示。

STC12C5A60S2 AD转换,转换结果怎么算
char b = ADC_RESL & 0x03;最后合并 a += b;这时的a值就是转换的结果值,共10位。10位的最大值是1023,对应数模转换的参考电压的高电平,0就对应低电平。例如参考电压是5V,那么如果读到的 a = 1023,就是采样得到5V,按这个比例去换算就可得到采样电压的值。括号内的东西在STC的手册上很...

stc12c5a60s2单片机通用中断方式C语言编程读取按键S1,并记录S1按下的...
include<at89x51.h>unsigned char cont;\/\/定义按键计数变量void delayms(unsigned char time)\/\/stc 1t 12MHz 1ms延时{ unsigned char a,b,c; while(time--) for(c=1;c>0;c--) for(b=222;b>0;b--) for(a=12;a>0;a--);}void main(void){P2=cont=0;IT0=1;...

STC12C5A60S2较89C51的优势?
看一下STC12C5A60S2系列1T单片机的功能就明白较89C51的优势了:1.增强型 8051 CPU,1T,单时钟\/ 机器周期,指令代码完全兼容传统8051 2.工作电压: STC12C5A60S2 系列工作电压: 5.5V - 3.3V STC12LE5A60S2 系列工作电压:3.6V - 2.2V 3. 工作频率范围:0 - 35MHz,相当于普通8051 的...

STC12C5A60S2的特点
1.增强型8051 CPU,1T,单时钟\/机器周期,指令代码完全兼容传统8051;2.工作电压:STC12C5A60S2系列工作电压:5.5V-3.3V(5V单片机)STC12LE5A60S2系列工作电压:3.6V-2.2V(3V单片机);3.工作频率范围:0 - 35MHz,相当于普通8051的 0~420MHz;4.用户应用程序空间8K \/16K \/ 20K \/ 32K \/ ...

使用stc12c5a60s2双串口单片机时 串口2的中断服务子程序怎么写呢?_百 ...
MOV A,S2CON JNB ACC.0,SER2INT1 ;S2RI ANL S2CON,#NOT S2RI MOV A,S2BUF MOV B,A MOV R0,#RXRAM MOV A,RXPUT ANL A,#0FH ORL A,R0 MOV R0,A MOV A,B MOV @R0,A LCALL SENDRXDAT INC RXPUT SJMP SERINT2 SER2INT1:MOV A,S2CON JNB ACC.1,SERINT2 ;S2TI ANL S2...

社旗县14787192650: 我的单片机版是STC的 10位的AD转换 -
宾宋丁苯: 我用的是stc12c5a08ad P1M1=0x01; P1M0=0x00; // p1^0口为AD口 void read() { ADC_CONTR=0xea; //开始转换 while((ADC_CONTR&0x10)!=0x10){;}//dog(); //等待AD结果 ADC_CONTR=0xe2; //AD结束jcdy=ADC_RES; //AD的结果. }

社旗县14787192650: STC12C5A08AD - 35I是什么意思 -
宾宋丁苯: STC12C5A08AD-35I是IC型号

社旗县14787192650: 单片机模数转换 -
宾宋丁苯: 现在的单片机都带有模数转换,老的单片机没有,你只要编写程序操作这个模数转换单元就可以了,不知道你用的是哪个单片机,所以你可以看一下手册,确认有没有,我用的STC89C52RC单片机是有的.

社旗县14787192650: stc12c5a082s怎么将八位ad变成十位ad,为什么怎样不对 -
宾宋丁苯: 读取ADC转换结果的函数返回值应该是unsigned int 型的,才能返回10位的结果.你的函数返回值是8位的,所以,转换结果总是8位的.

社旗县14787192650: 求课程设计《智能4路模拟量巡检仪》数码管,按键,A/D转化编程 -
宾宋丁苯: 如果是使用8051系列单片机的话,建议使用STC12C5A08S2,此芯片带有AD转换模块,使用方便.P1口带8路10位AD.数码管使用P0,P2口,按键使用P3口.对程序的设计比较方便.

社旗县14787192650: STC的单片机最多引脚是多少引脚?哪一款?
宾宋丁苯: 根据官方网站给的资料显示,STC单片机最多引脚为48脚! 芯片有如下几款:(建议最快的解决方法是给宏晶科技打电话,询问销售代表,会得到更详尽的资料) STC12C5A08S2 STC12C5A16S2 STC12C5A32S2 STC12C5A40S2 STC12C5...

社旗县14787192650: stc15系列单片机开发板上有没有A/D转换器或者芯片内有也行 -
宾宋丁苯: STC12C5A60S2这个是我用过的,它有AD,其他的我没用过就不说了

社旗县14787192650: STC12C5A16S2单片机的AD问题 -
宾宋丁苯: 只要是同一个系列(12C5A)的就是一样的.只是有的是10位,有的是8位.10位AD的低8位和8位AD存在一起,高2位另有一个地方存.

社旗县14787192650: STC单片机怎样在EEPROM里存一个16位数据 -
宾宋丁苯: 这是STC12c5A08AD的读写,8位的.16位的也简单分为两个八位就可以了,读出的时候在合并. void byte_write(uchar high_add, uchar low_add, uchar w_data) // iap 字节写 {IAP_DATA = w_data;IAP_ADDRH = high_add;IAP_ADDRL = low_...

社旗县14787192650: 有没有8路以上的AD转换的51单片机? -
宾宋丁苯: 可以 用两个以上的 51 单片机做 ,STC 有8路AD 两个16路 , 有8位和10位的,数据连接应该很好做的. 简单的控制要求成本低,很多产品需要低成本.存在就是合理的,用自己最拿手的工具,利用自己最擅长的能力,才能高效高质.支持!!!!!!!!!!

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网