
ADC_CONTR EQU 0BCH A/D转换寄存器
ADC_RES EQU 0BDH 8位A/D转换结果寄存器
P1ASF EQU 9DHP1口中的相应位作为模拟功能使用时的控制寄存器,如做A/D用,相应位要置1
ADC_Power_On_Speed_Channel_0 EQU 11100000BP1.0作为A/D输入
ADC_Power_On_Speed_Channel_1 EQU 11100001BP1.1作为A/D输入
ADC_Power_On_Speed_Channel_2 EQU 11100010BP1.2作为A/D输入
ADC_Power_On_Speed_Channel_3 EQU 11100011BP1.3作为A/D输入
ADC_Power_On_Speed_Channel_4 EQU 11100100BP1.4作为坦桐物轮物A/D输入
ADC_Power_On_Speed_Channel_5 EQU 11100101BP1.5作为A/D输入
ADC_Power_On_Speed_Channel_6 EQU 11100110BP1.6作为A/D输入
ADC_Power_On_Speed_Channel_7 EQU 11100111BP1.7作为A/D输入
-------------------------------------------------
定义变量
ADC_Channel_0_Result EQU 30H0通道A/D转换结果
ADC_Channel_1_Result EQU 31H1通道A/D转换结果
ADC_Channel_2_Result EQU 32H2通道A/D转换结果
ADC_Channel_3_Result EQU 33H3通道A/D转换结果
ADC_Channel_4_Result EQU 34H4通道A/D转换结果
ADC_Channel_5_Result EQU 35H5通道A/D转换结果
ADC_Channel_6_Result EQU 36H6通道A/D转换结果
ADC_Channel_7_Result EQU 37H7通道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, #50H0101,0000 8位数据位, 无奇偶校验
MOV TH1, #0FBH18.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
JZWait_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_Loop4 CLOCK| |
DJNZ R3, Delay_Loop1 4 CLOCK ------+ |
DJNZ R4, Delay_Loop0 4 CLOCK ---------------------+
POP 04
POP 03
POP 02
RET
----------------------------------------------------------------
END 希望对你有帮助
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)