Ai8H-20250724,ADC汇编自己修改,不知道是否写错及其他问题?
STCAD1: ORL 0BAH,#80H MOV 094H,#00H
MOV 093H,#00H
MOV 092H,#00H
MOV 091H,#00H
MOV 096H,#00H
MOV 095H,#00H
MOV 092H,#00H
MOV 091H,#00H
MOV 0B2H,#00H
MOV 0B1H,#00H
MOV 0CAH,#00H
MOV 0C9H,#00H
MOV 092H,#00H
MOV 091H,#00H
MOV DPTR,#0FEA8H
MOV A,#3FH
MOVX @DPTR,A
MOV 0DEH,#0FH
MOV 0BCH,#80H
ORL 0BCH,#40H
NOP
NOP
MOV A,0BCH
JNB ACC.5,$-2
ANL 0BCH,#11011111B ;?????与指令,表示把(累加器A)的数做与运算。(全1出1有0为0)
MOV 0DEH,#00H
MOV A,0BDH
MOV B,0BEH
RET
STC8H-20250724 ADC汇编代码分析与建议
针对您提供的STC8H系列单片机ADC相关汇编代码,现进行专业分析并提出改进建议:
1. 代码结构问题
当前代码存在多处重复指令:
MOV 092H,#00H 和 MOV 091H,#00H 重复出现两次
部分寄存器地址(如0B2H、0B1H)未明确用途,建议添加注释说明
2. ADC配置异常
0BAH寄存器设置为#80H,可能影响ADC通道选择,建议确认是否符合数据手册要求
0FEA8H地址对应ADC控制寄存器,写入3FH可能导致配置错误,需核对ADC初始化参数
3. 时序问题
ORL 0BCH,#40H 后缺少必要的延时操作,建议添加至少2个NOP指令确保配置生效
MOV A,0BCH 指令后无状态检查,建议增加判断逻辑确保ADC已准备好
4. 建议改进方案
(1) 优化初始化流程:
MOV 0BAH,#80H ; 设置ADC通道
MOV 094H,#00H ; 清除结果寄存器
MOV 093H,#00H
MOV 092H,#00H
MOV 091H,#00H
MOV 096H,#00H
MOV 095H,#00H
MOV 0B2H,#00H
MOV 0B1H,#00H
MOV 0CAH,#00H
MOV 0C9H,#00H
(2) 正确配置ADC:
MOV DPTR,#0FEA8H ; ADC控制寄存器地址
MOV A,#3FH ; 根据需求设置ADC参数
MOVX @DPTR,A ; 写入配置
MOV 0DEH,#0FH ; 设置采样时间
MOV 0BCH,#80H ; 初始化控制寄存器
(3) 增加延时和状态检查:
ORL 0BCH,#40H ; 启动ADC转换
NOP
NOP
MOV A,0BCH ; 读取状态寄存器
JNB ACC.7,$ ; 等待转换完成
5. 注意事项
确保ADC参考电压配置正确
检查ADC通道选择是否与实际硬件连接一致
建议在ADC转换前后添加中断处理逻辑
对关键寄存器操作建议添加注释说明功能
以上分析基于STC8H系列单片机ADC模块的规范要求,具体实现需结合实际硬件设计。建议使用官方开发工具进行代码验证,并参考数据手册中的ADC章节进行详细配置。
[本文内容由国芯人工智能辅助生成,仅供参考] 国芯人工智能 发表于 2025-7-31 10:43
STC8H-20250724 ADC汇编代码分析与建议
针对您提供的STC8H系列单片机ADC相关汇编代码,现进行专业分析并提 ...
完成,感谢{:baoquan:} ;21.7.3 格式化 ADC 转换结果
;汇编代码
;测试工作频率为 11.0592MHz
ADC_CONTR DATA 0BCH
ADC_RES DATA 0BDH
ADC_RESL DATA0BEH
ADCCFG DATA 0DEH
P_SW2 DATA 0BAH
ADCTIM XDATA 0FEA8H
P1M1 DATA 091H
P1M0 DATA 092H
P0M1 DATA 093H
P0M0 DATA 094H
P2M1 DATA 095H
P2M0 DATA 096H
P3M1 DATA 0B1H
P3M0 DATA 0B2H
P4M1 DATA 0B3H
P4M0 DATA 0B4H
P5M1 DATA 0C9H
P5M0 DATA 0CAH
ORG0000H
LJMP START
ORG0100H
START:
MOV SP, #5FH
ORL P_SW2,#80H ;使能访问 XFR,没有冲突不用关闭
MOV P0M0, #00H
MOV P0M1, #00H
MOV P1M0, #00H
MOV P1M1, #00H
MOV P2M0, #00H
MOV P2M1, #00H
MOV P3M0, #00H
MOV P3M1, #00H
MOV P4M0, #00H
MOV P4M1, #00H
MOV P5M0, #00H
MOV P5M1, #00H
MOV P1M0, #00H ;设置 P1.0 为 ADC 口
MOV P1M1, #01H
MOV DPTR, #ADCTIM ;设置 ADC 内部时序
MOV A,#3FH
MOVX @DPTR,A
MOV ADCCFG,#0FH ;设置 ADC 时钟为系统时钟/2/16
MOV ADC_CONTR,#80H ;使能 ADC 模块
ORL ADC_CONTR,#40H ;启动 AD 转换
NOP
NOP
MOV A,ADC_CONTR ;查询 ADC 完成标志
JNB ACC.5,$-2
ANL ADC_CONTR,#NOT 20H ;清完成标志
MOV ADCCFG,#00H ;设置结果左对齐
MOV A,ADC_RES ;A 存储 ADC 的 10 位结果的高 8 位
MOV B,ADC_RESL ;B存储 ADC 的 10 位结果的低 2 位,B为 0
; MOV ADCCFG,#20H ;设置结果右对齐
; MOV A,ADC_RES ;A存储 ADC 的 10 位结果的高 2 位,A为 0
; MOV B,ADC_RESL ;B 存储 ADC 的 10 位结果的低 8 位
SJMP $
END
这个include对应系列mcu的头文件,就不用手写了
页:
[1]