A51 MACRO ASSEMBLER AD_TO_PC 06/04/2007 22:24:01 PAGE 1
MACRO ASSEMBLER A51 V7.07
OBJECT MODULE PLACED IN ad-to-pc.OBJ
ASSEMBLER INVOKED BY: D:\mcu\keil\C51\BIN\A51.EXE ad-to-pc.asm SET(SMALL) DEBUG EP
LOC OBJ LINE SOURCE
1 ;copyright:-----维斯特开发天地-----
2 ;;led.asm
3 ;;作者 :xtgk
4 ;;MCU:stc12c4052 COLCK:11.0592MHZ
5
6 ;时钟 11.0532MHz, 波特率 = 9600bps。按k1键,A/D 转换结果在上位机显示
7 ;ADC DEMO_4052_ASM.ASM 汇编程序演示 STC12C5410AD 系列 MCU 的 A/D 转换功能。
8
9 ;转换结果以 16 进制形式输出到串行口,可以用串行口调试程序观察输出结果。
10
11
0097 12 LED_MCU_START EQU P1.7
00C5 13 ADC_CONTR EQU 0C5H ;A/D 转换寄存器
00C6 14 ADC_DATA EQU 0C6H ;A/D 转换结果寄存器, 为10 位 A/D 转换结果的高8 位
15 ;ADC_LOW2 EQU 0BEH ;A/D 转换结果寄存器, 低2 位有效, 为10 位 A/D 转换结果的低2 位
16 ;如果不用ADC_LOW2 的低2 位,只用ADC_DATA 的8 位,则为8 位A/D 转换
0091 17 P1M0 EQU 91H ;P1 口模式选择寄存器0
0092 18 P1M1 EQU 92H ;P1 口模式选择寄存器1
00E0 19 ADC_Power_On_Speed_Channel_0 EQU 11100000B ;P1.0 作为A/D 输入
00E1 20 ADC_Power_On_Speed_Channel_1 EQU 11100001B ;P1.1 作为A/D 输入
00E2 21 ADC_Power_On_Speed_Channel_2 EQU 11100010B ;P1.2 作为A/D 输入
00E3 22 ADC_Power_On_Speed_Channel_3 EQU 11100011B ;P1.3 作为A/D 输入
00E4 23 ADC_Power_On_Speed_Channel_4 EQU 11100100B ;P1.4 作为A/D 输入
00E5 24 ADC_Power_On_Speed_Channel_5 EQU 11100101B ;P1.5 作为A/D 输入
00E6 25 ADC_Power_On_Speed_Channel_6 EQU 11100110B ;P1.6 作为A/D 输入
00E7 26 ADC_Power_On_Speed_Channel_7 EQU 11100111B ;P1.7 作为A/D 输入
27 ;-------------------------------------------------
28 ;定义变量
0030 29 ADC_Channel_0_Result EQU 30H ;0 通道A/D 转换结果
0031 30 ADC_Channel_1_Result EQU 31H ;1 通道A/D 转换结果
0032 31 ADC_Channel_2_Result EQU 32H ;2 通道A/D 转换结果
0033 32 ADC_Channel_3_Result EQU 33H ;3 通道A/D 转换结果
0034 33 ADC_Channel_4_Result EQU 34H ;4 通道A/D 转换结果
0035 34 ADC_Channel_5_Result EQU 35H ;5 通道A/D 转换结果
0036 35 ADC_Channel_6_Result EQU 36H ;6 通道A/D 转换结果
0037 36 ADC_Channel_7_Result EQU 37H ;7 通道A/D 转换结果
37 ;--------------------------------------------------
0000 38 ORG 0000H
0000 020050 39 LJMP MAIN
0050 40 ORG 0050H
0050 41 MAIN:
0050 C297 42 CLR LED_MCU_START ;MCU 工作指示灯 LED_MCU_START EQU P1.7
0052 75817F 43 MOV SP, #7FH ;设置堆栈
0055 1169 44 ACALL Initiate_RS232 ;初始化串口
0057 1184 45 ACALL ADC_Power_On ;开ADC 电源, 第一次使用时要打开内部模拟电源
46 ;开ADC 电源, 可适当加延时,1mS 以内就足够了
0059 1190 47 ACALL Set_P12_Open_Drain ;设置 P1.2 为开漏
005B 11A6 48 ACALL Set_ADC_Channel_2 ;设置 P1.2 作为A/D 转换通道
49 ;ACALL Set_P10_Normal_IO ;设置 P1.0为普通IO
50
005D 51 loop:
52
53
54 ; JB P1.0,$;判断K1是否按下,如果没有按下就等待
55 ; ACALL Delay;延时10毫秒消触点抖动
56 ; JB P1.0,WRIT;去除干扰信号
57 ; JNB P1.0,$;等待按键松开
005D 58 WRIT:
A51 MACRO ASSEMBLER AD_TO_PC 06/04/2007 22:24:01 PAGE 2
005D 11B7 59 ACALL Get_AD_Result ;测量电压并且取A/D 转换结果
005F 11AE 60 ACALL Send_AD_Result ;发送转换结果到 PC 机
0061 11CF 61 ACALL Delay
0063 11CF 62 ACALL Delay
0065 11CF 63 ACALL Delay
64 ;MOV A, ADC_Channel_2_Result ;用 P1 口显示A/D 转换结果
65 ;CPL A
66 ;MOV P1, A
67 ;Wait_Loop:
0067 80F4 68 SJMP Loop ;停机
69 ;-------------------------------------------------------------
70 ;-------------------------------------------------------------
71 ;-------------------------------------------------------------
72 ;-------------------------------------------------------------
0069 73 Initiate_RS232: ;串口初始化
0069 C2AC 74 CLR ES ;禁止串口中断
006B 758920 75 MOV TMOD, #20H ;设置 T1 为波特率发生器
006E 759850 76 MOV SCON, #50H ;0101,0000 8 位数据位, 无奇偶校验
0071 758DFD 77 MOV TH1, #0FdH ;11.0592MHz 晶振, 波特率 = 9600
0074 758BFD 78 MOV TL1, #0FdH
0077 D28E 79 SETB TR1 ;启动 T1
0079 22 80 RET
81 ;--------------------------------------------------------------
007A 82 Send_Byte:
007A C299 83 CLR TI
007C F599 84 MOV SBUF, A
007E 85 Send_Byte_Wait_Finish:
007E 3099FD 86 JNB TI, Send_Byte_Wait_Finish
0081 C299 87 CLR TI
0083 22 88 RET
89 ;--------------------------------------------------------------
0084 90 ADC_Power_On:
0084 C0E0 91 PUSH ACC
0086 43C580 92 ORL ADC_CONTR, #80H ;开A/D 转换电源
0089 7420 93 MOV A, #20H
008B 11CF 94 ACALL Delay ;开A/D 转换电源后要加延时,1mS 以内就足够了
008D D0E0 95 POP ACC
008F 22 96 RET
97 ;-------------------------------------------------------------
98 ;设置P1.2,设置A/D 通道所在的I/O 为开漏模式
0090 99 Set_P12_Open_Drain:
0090 C0E0 100 PUSH ACC
0092 7404 101 MOV A, #00000100B
0094 4291 102 ORL P1M0, A
0096 4292 103 ORL P1M1, A
0098 D0E0 104 POP ACC
009A 22 105 RET
106 ;-------------------------------------------------------------
107 ;设置 P1.2 为普通IO
009B 108 Set_P12_Normal_IO:
009B C0E0 109 PUSH ACC
009D 74FB 110 MOV A, #11111011B
009F 5291 111 ANL P1M0, A
00A1 5292 112 ANL P1M1, A
00A3 D0E0 113 POP ACC
00A5 22 114 RET
115 ;-------------------------------------------------------------
00A6 116 Set_ADC_Channel_2:
00A6 75C5E2 117 MOV ADC_CONTR, #ADC_Power_On_Speed_Channel_2
118 ;选择P1.2 作为A/D 转换通道
00A9 7405 119 MOV A, #05H ;更换 A/D 转换通道后要适当延时, 使输入电压稳定
120 ;以后如果不更换 A/D 转换通道的话, 不需要加延时
00AB 11CF 121 ACALL Delay ;切换 A/D 转换通道,加延时20uS~200uS 就可以了,与输入电压源的内阻有关
122 ;如果输入电压信号源的内阻在10K 以下,可不加延时
00AD 22 123 RET
124 ;-------------------------------------------------------------
A51 MACRO ASSEMBLER AD_TO_PC 06/04/2007 22:24:01 PAGE 3
00AE 125 Send_AD_Result:
00AE C0E0 126 PUSH ACC
00B0 E532 127 MOV A, ADC_Channel_2_Result ;取 AD 转换结果
00B2 117A 128 ACALL Send_Byte ;发送转换结果到 PC 机
00B4 D0E0 129 POP ACC
00B6 22 130 RET
131 ;----------------------------------------------------------
00B7 132 Get_AD_Result:
00B7 C0E0 133 PUSH ACC ;入栈保护
00B9 75C600 134 MOV ADC_DATA, #0
00BC 43C508 135 ORL ADC_CONTR, #00001000B ;启动 AD 转换
00BF 136 Wait_AD_Finishe:
00BF 7410 137 MOV A, #00010000B ;判断 AD 转换是否完成
00C1 55C5 138 ANL A, ADC_CONTR
00C3 60FA 139 JZ Wait_AD_Finishe ;AD 转换尚未完成, 继续等待
00C5 53C5E7 140 ANL ADC_CONTR, #11100111B ;清0 ADC_FLAG, ADC_START 位, 停止A/D 转换
00C8 E5C6 141 MOV A, ADC_DATA
00CA F532 142 MOV ADC_Channel_2_Result, A ;保存 AD 转换结果
00CC D0E0 143 POP ACC
00CE 22 144 RET
145 ;---------------------------------------------------------------
00CF 146 Delay:
00CF C002 147 PUSH 02 ;将寄存器组0 的 R2 入栈
00D1 C003 148 PUSH 03 ;将寄存器组0 的 R3 入栈
00D3 C004 149 PUSH 04 ;将寄存器组0 的 R4 入栈
00D5 FC 150 MOV R4, A
00D6 151 Delay_Loop0:
00D6 7BC8 152 MOV R3, #200 ;2 CLOCK ---------------------+
00D8 153 Delay_Loop1: ; |
00D8 7AF9 154 MOV R2, #249 ;2 CLOCK ------+ |
00DA 155 Delay_Loop: ; | 1002 CLOCK |200406 CLOCK
00DA DAFE 156 DJNZ R2, Delay_Loop ;4 CLOCK | |
00DC DBFA 157 DJNZ R3, Delay_Loop1 ;4 CLOCK ------+ |
00DE DCF6 158 DJNZ R4, Delay_Loop0 ;4 CLOCK ---------------------+
00E0 D004 159 POP 04
00E2 D003 160 POP 03
00E4 D002 161 POP 02
00E6 22 162 RET
163 ;----------------------------------------------------------------
164 END
A51 MACRO ASSEMBLER AD_TO_PC 06/04/2007 22:24:01 PAGE 4
SYMBOL TABLE LISTING
------ ----- -------
N A M E T Y P E V A L U E ATTRIBUTES
ACC. . . . . . . . . . . . . D ADDR 00E0H A
ADC_CHANNEL_0_RESULT . . . . N NUMB 0030H A
ADC_CHANNEL_1_RESULT . . . . N NUMB 0031H A
ADC_CHANNEL_2_RESULT . . . . N NUMB 0032H A
ADC_CHANNEL_3_RESULT . . . . N NUMB 0033H A
ADC_CHANNEL_4_RESULT . . . . N NUMB 0034H A
ADC_CHANNEL_5_RESULT . . . . N NUMB 0035H A
ADC_CHANNEL_6_RESULT . . . . N NUMB 0036H A
ADC_CHANNEL_7_RESULT . . . . N NUMB 0037H A
ADC_CONTR. . . . . . . . . . N NUMB 00C5H A
ADC_DATA . . . . . . . . . . N NUMB 00C6H A
ADC_POWER_ON . . . . . . . . C ADDR 0084H A
ADC_POWER_ON_SPEED_CHANNEL_0 N NUMB 00E0H A
ADC_POWER_ON_SPEED_CHANNEL_1 N NUMB 00E1H A
ADC_POWER_ON_SPEED_CHANNEL_2 N NUMB 00E2H A
ADC_POWER_ON_SPEED_CHANNEL_3 N NUMB 00E3H A
ADC_POWER_ON_SPEED_CHANNEL_4 N NUMB 00E4H A
ADC_POWER_ON_SPEED_CHANNEL_5 N NUMB 00E5H A
ADC_POWER_ON_SPEED_CHANNEL_6 N NUMB 00E6H A
ADC_POWER_ON_SPEED_CHANNEL_7 N NUMB 00E7H A
DELAY. . . . . . . . . . . . C ADDR 00CFH A
DELAY_LOOP . . . . . . . . . C ADDR 00DAH A
DELAY_LOOP0. . . . . . . . . C ADDR 00D6H A
DELAY_LOOP1. . . . . . . . . C ADDR 00D8H A
ES . . . . . . . . . . . . . B ADDR 00A8H.4 A
GET_AD_RESULT. . . . . . . . C ADDR 00B7H A
INITIATE_RS232 . . . . . . . C ADDR 0069H A
LED_MCU_START. . . . . . . . B ADDR 0090H.7 A
LOOP . . . . . . . . . . . . C ADDR 005DH A
MAIN . . . . . . . . . . . . C ADDR 0050H A
P1 . . . . . . . . . . . . . D ADDR 0090H A
P1M0 . . . . . . . . . . . . N NUMB 0091H A
P1M1 . . . . . . . . . . . . N NUMB 0092H A
SBUF . . . . . . . . . . . . D ADDR 0099H A
SCON . . . . . . . . . . . . D ADDR 0098H A
SEND_AD_RESULT . . . . . . . C ADDR 00AEH A
SEND_BYTE. . . . . . . . . . C ADDR 007AH A
SEND_BYTE_WAIT_FINISH. . . . C ADDR 007EH A
SET_ADC_CHANNEL_2. . . . . . C ADDR 00A6H A
SET_P12_NORMAL_IO. . . . . . C ADDR 009BH A
SET_P12_OPEN_DRAIN . . . . . C ADDR 0090H A
SP . . . . . . . . . . . . . D ADDR 0081H A
TH1. . . . . . . . . . . . . D ADDR 008DH A
TI . . . . . . . . . . . . . B ADDR 0098H.1 A
TL1. . . . . . . . . . . . . D ADDR 008BH A
TMOD . . . . . . . . . . . . D ADDR 0089H A
TR1. . . . . . . . . . . . . B ADDR 0088H.6 A
WAIT_AD_FINISHE. . . . . . . C ADDR 00BFH A
WRIT . . . . . . . . . . . . C ADDR 005DH A
REGISTER BANK(S) USED: 0
ASSEMBLY COMPLETE. 0 WARNING(S), 0 ERROR(S)