‘壹’ 求解STC 12C5A60S2的编程问题,本人初次涉及单片机,对编程不太了解,编了个AD转化的小程序,求高手看下!
我最近也在弄STC的单片机,看了下代码,觉得以下这段似乎有点问题
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0;
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
ad_average_result=ADC_RES;
q=q+ad_average_result;
}
你的意图是局铅悔想做10次转换,然后取平均值作为最激圆终结果吧, while(!tp) 就是说转换完成后将转换完成标志位清零接着再取出转换后的数,可是转换未完成的话就跳出while直接执行后面桐正的语句了吧,不过这个就是有问题应该也不会导致完全没结果输出,也就是结果有问题的话灯应该也会亮的,还有是否确定模拟信号输入口是否和寄存器设置所选的一致,P1ASF这个寄存器我也找不到说明
‘贰’ 谁能给我解释一下以下的单片机程序
ORG 0000H
LJMP MAIN
ORG 0100H ;主程序地址
MAIN: JNB P1.0,P10 ;哪个键按下,显示哪个波形
JNB P1.1,P11
JNB P1.2,P12
JNB P1.3,P13
LJMP MAIN ;没有键按下返回主程序循环
P10: MOV R7,#00H ;方波波形,R7为特征码,放00,表示方波
LCALL SQU ;调用方波波形函数
LJMP MAIN ;调用完返回主程序循环
P11: MOV R7,#01H ;01表示SAW波
LCALL SAW
LJMP MAIN
P12: MOV R7,#02H
LCALL TRI
LJMP MAIN
P13: MOV R7,#03H
LCALL SIN
LJMP MAIN
SQU: JNB P1.1,N1 ;方波函数,如果有其他键按下
JNB P1.2,N2 ;退出程序
JNB P1.3,N3
LJMP SSQU ;没有键按下,到SSQU函数产生方波
N1: MOV R7,#01H ;哪个键按下就在R7中记下特征码
LJMP TC0
N2: MOV R7,#02H
LJMP TC0
N3: MOV R7,#03H
LJMP TC0
SSQU: CJNE R7,#00H,TC0 ;R7不为0退出
MOV R0,#00H ;R0中放00
MOV DPTR,#7FFFH ;这个应该是DAC0832的地址
K00: MOV A,#0FFH ;A中放FF,高电平
MOVX @DPTR,A ;A到0832转换
MOV P0,#0FFH ;这一句不怎么懂,感觉可以去掉
MOV P2,#0FFH ;值P2输入方式,P2是通过拨码按钮改
MOV A,P2 ;变数值,P2越大,波形周期越小
CPL A
MOV R3,A
L00: DEC R3
CJNE R3,#255,L00 ;这个循环改变周期
INC R0
INC R0
CJNE R0,#254,K00 ;高电平波循环127次
MOV R0,#00H
K01: MOV A,#00H ;低电平,跟高电平差不多
MOVX @DPTR,A
MOV P0,#00H
MOV P2,#0FFH
MOV A,P2
CPL A
MOV R3,A
L01: DEC R3
CJNE R3,#255,L01
INC R0
INC R0
CJNE R0,#254,K01
LJMP SQU ;显示完一个波形,回到方波函数开始,判断有无其他按键
TC0: RET ;返回主函数
SAW: JNB P1.0,N4 ;判断有无其他按键,同方波
JNB P1.2,N5
JNB P1.3,N6
LJMP SSAW
N4: MOV R7,#00H
LJMP TC1
N5: MOV R7,#02H
LJMP TC1
N6: MOV R7,#03H
LJMP TC1
SSAW: CJNE R7,#01H,TC1 ;特征码不是01 退出
MOV R0,#0FFH ;RO中放即将输出的值
MOV DPTR,#7FFFH
K10: MOV A,R0 ;锯齿波的每个值
MOVX @DPTR,A ;输出
MOV P0,R0
MOV P2,#0FFH ;通过P2改变周期
MOV A,P2
CPL A
MOV R3,A
L10: DEC R3
CJNE R3,#255,L10
INC R0 ;通过R0加1 来显示锯齿波的斜坡
CJNE R0,#255,K10 ;RO不等于255,循环锯齿波的每个值
LJMP SAW ;等于255,完成一个锯齿波周期,回锯齿波开始
TC1: RET ;退出
TRI: JNB P1.0,N7 ;三角波,类似于两个相反的锯齿波
JNB P1.1,N8
JNB P1.3,N9
LJMP TTRI
N7: MOV R7,#00H
LJMP TC2
N8: MOV R7,#01H
LJMP TC2
N9: MOV R7,#03H
LJMP TC2
TTRI: CJNE R7,#02H,TC2
MOV R0,#00H
MOV DPTR,#7FFFH
K20: MOV A,R0
MOVX @DPTR,A
MOV P0,R0
MOV P2,#0FFH
MOV A,P2
CPL A
MOV R3,A
L20: DEC R3
CJNE R3,#255,L20
INC R0
INC R0
CJNE R0,#254,K20
K21: MOV A,R0
MOVX @DPTR,A
MOV P0,R0
MOV P2,#0FFH
MOV A,P2
CPL A
MOV R3,A
L21: DEC R3
CJNE R3,#255,L21
DEC R0
DEC R0
CJNE R0,#0,K21
LJMP TRI
TC2: RET
SIN: JNB P1.0,N10 ;正弦波,是通过存储在代码区的一个数
JNB P1.1,N11 ;组来显示值的
JNB P1.2,N12
LJMP SSIN
N10: MOV R7,#00H
LJMP TC3
N11: MOV R7,#01H
LJMP TC3
N12: MOV R7,#02H
LJMP TC3
SSIN: CJNE R7,#03H,TC3
MOV R0,#00H
MOV DPTR,#7FFFH
K30: MOV A,R0
MOV DPTR,#TAB ;数组的地址
MOVC A,@A+DPTR ;把第R0个数放到A中
MOV DPTR,#7FFFH
MOVX @DPTR,A ;输出A
MOV P0,A
INC R0 ;RO加1
MOV P2,#0FFH ;周期
MOV A,P2
CPL A
MOV R3,A
L30: DEC R3
CJNE R3,#255,L30
CJNE R0,#255,K30 ;不等于255表示一个周期内,跳到K30
LJMP SIN ;等于表示显示完一个周期,到SIN开始
TC3: RET ;退出
TAB: DB ;定义正弦函数的各个值
看了你的图和你的程序,感觉你的图画得简单了一点,特别是0832地址,控制信号都没接,看起来还在调试,建议P2口做地址总线,这样,编程比较方便,你可以把P3口做周期.或者把P1口的其他口做控制总线,这样要对0832时序比较熟悉才行.
我平时是用C开发的,很少用汇编,如果有什么错误,可以共同探讨.