这是个自己写的数模调试程序

源代码在线查看: ad-to-pc.asm

软件大小: 13 K
上传用户: lwp
关键词: 数模 调试 程序
下载地址: 免注册下载 普通下载 VIP

相关代码

				;copyright:-----维斯特开发天地-----
				;;led.asm
				;;作者  :xtgk
				;;MCU:stc12c4052    COLCK:11.0592MHZ
				
				;时钟 11.0532MHz, 波特率 = 9600bps。按k1键,A/D 转换结果在上位机显示
				;ADC DEMO_4052_ASM.ASM 汇编程序演示 STC12C5410AD 系列 MCU 的 A/D 转换功能。
				
				;转换结果以 16 进制形式输出到串行口,可以用串行口调试程序观察输出结果。
				
				
				LED_MCU_START EQU P1.7
				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 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 P1.7
				MOV SP, #7FH ;设置堆栈
				ACALL Initiate_RS232 ;初始化串口
				ACALL ADC_Power_On ;开ADC 电源, 第一次使用时要打开内部模拟电源
				;开ADC 电源, 可适当加延时,1mS 以内就足够了
				ACALL Set_P12_Open_Drain ;设置 P1.2 为开漏
				ACALL Set_ADC_Channel_2 ;设置 P1.2 作为A/D 转换通道
				;ACALL Set_P10_Normal_IO ;设置 P1.0为普通IO
				
				loop:
				
				
				       ; JB P1.0,$;判断K1是否按下,如果没有按下就等待
				       ; ACALL Delay;延时10毫秒消触点抖动
				       ; JB P1.0,WRIT;去除干扰信号
				       ; JNB P1.0,$;等待按键松开
				WRIT:       
				        ACALL Get_AD_Result ;测量电压并且取A/D 转换结果
					ACALL Send_AD_Result ;发送转换结果到 PC 机
				        ACALL Delay
				        ACALL Delay
				        ACALL Delay
				;MOV A, ADC_Channel_2_Result ;用 P1 口显示A/D 转换结果
				;CPL A
				;MOV P1, A
				;Wait_Loop:
				SJMP  Loop ;停机
				;-------------------------------------------------------------
				;-------------------------------------------------------------
				;-------------------------------------------------------------
				;-------------------------------------------------------------
				Initiate_RS232: ;串口初始化
				CLR ES ;禁止串口中断
				MOV TMOD, #20H ;设置 T1 为波特率发生器
				MOV SCON, #50H ;0101,0000 8 位数据位, 无奇偶校验
				MOV TH1, #0FdH ;11.0592MHz 晶振, 波特率 = 9600
				MOV TL1, #0FdH
				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,设置A/D 通道所在的I/O 为开漏模式
				Set_P12_Open_Drain:
				PUSH ACC
				MOV A, #00000100B
				ORL P1M0, A
				ORL P1M1, A
				POP ACC
				RET
				;-------------------------------------------------------------
				;设置 P1.2 为普通IO
				Set_P12_Normal_IO:
				PUSH ACC
				MOV A, #11111011B
				ANL P1M0, A
				ANL P1M1, 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_DATA, #0
				ORL ADC_CONTR, #00001000B ;启动 AD 转换
				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_DATA
				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			

相关资源