『壹』 求解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開發的,很少用匯編,如果有什麼錯誤,可以共同探討.