0.png (69.42 KB, 下載次數: 62)
下載附件
2016-10-20 19:10 上傳
51單片機常用的匯編程序,每個程序都帶詳細的注釋
所有資料下載:
51單片機匯編源程序包 帶詳細注釋.rar
(222.66 KB, 下載次數: 46)
2016-10-20 19:10 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
實例1:
- ;************************;
- ;八路模擬數據采集顯示電路;
- ; 2001.10.08編 ;
- ;************************;
- ;
- ;70H-77H存放采樣值,78H-7BH存放顯示數據,依次為個位、十位、百位、通道標志
- ;
- ;*************************************
- ;* *
- ;* 主程序和中斷程序入口 *
- ;* *
- ;*************************************
- ORG 0000H ;程序執行開始地址
- LJMP START ;跳至START執行
- ORG 0003H ;外中斷0中斷入口地址
- RETI ;中斷返回(不開中斷)
- ORG 000BH ;定時器T0中斷入口地址
- RETI ;中斷返回(不開中斷)
- ORG 0013H ;外中斷1中斷入口地址
- RETI ;中斷返回(不開中斷)
- ORG 001BH ;定時器T1中斷入口地址
- RETI ;中斷返回(不開中斷)
- ORG 0023H ;串行口中斷入口地址
- RETI ;中斷返回(不開中斷)
- ORG 002BH ;定時器T2中斷入口地址
- RETI ;中斷返回(不開中斷)
- ;
- ;*************************************
- ;* *
- ;* 初始化程序中的各變量 *
- ;* *
- ;*************************************
- CLEARMEMIO: CLR A ;
- MOV P2,A ;P2口置0
- MOV R0,#70H ;內存循環清0(70H-7BH)
- MOV R2,#0CH ;
- LOOPMEM: MOV @R0,A ;
- INC R0 ;
- DJNZ R2,LOOPMEM ;
- MOV A,#0FFH ;
- MOV P0,A ;P0、P1、P3端口置1
- MOV P1,A ;
- MOV P3,A ;
- RET ;子程序返回
- ;
- ;*************************************
- ;* *
- ;* 主 程 序 *
- ;* *
- ;*************************************
- START: LCALL CLEARMEMIO ;初始化
- MAIN: LCALL DISPLAY ;顯示數據一次
- LCALL TEST ;測量一次
- AJMP MAIN ;返回MAIN循環
- NOP ;PC值出錯處理
- NOP ;空操作
- NOP ;空操作
- LJMP START ;重新復位起動
- ;
- DISPLAY: MOV R3,#08H ;8路信號循環顯示控制
- MOV R0,#70H ;顯示數據初址(70H-77H)
- MOV 7BH,#00H ;顯示通道路數(0-7)
- DISLOOP1: MOV A,@R0 ;顯示數據轉為三位十進制BCD碼存入
- MOV B,#100 ;7AH、79H、78H顯示單元內
- DIV AB ;顯示數據除100
- MOV 7AH,A ;商入7AH
- MOV A,#10 ;A放入數10
- XCH A,B ;余數與數10交換
- DIV AB ;余數除10
- MOV 79H,A ;商入79H
- MOV 78H,B ;余數入78H
- MOV R2,#0FFH ;每路顯示時間控制 4MS*255
- DISLOOP2: LCALL DISP ;調四位LED顯示程序
- DJNZ R2,DISLOOP2 ;每路顯示時間控制
- INC R0 ;顯示下一路
- INC 7BH ;通道顯示數值加1
- DJNZ R3,DISLOOP1 ;8路顯示未完轉DISLOOP1再循環
- RET ;8路顯示完子程序結束
- ;
- ; LED共陽顯示子程序,顯示內容在78H-7BH,數據在P1輸出,列掃描在P3.0-P3.3口
- DISP: MOV R1,#78H ;賦顯示數據單元首址
- MOV R5,#0FEH ;掃描字
- PLAY: MOV P1,#0FFH ;關顯示
- MOV A,R5 ;取掃描字
- ANL P3,A ;開顯示
- MOV A,@R1 ;取顯示數據
- MOV DPTR,#TAB ;取段碼表首址
- MOVC A,@A+DPTR ;查顯示數據對應段碼
- MOV P1,A ;段碼放入P1口
- LCALL DL1MS ;顯示1MS
- INC R1 ;指向下一地址
- MOV A,P3 ;取P3口掃描字
- JNB ACC.3,ENDOUT ;四位顯示完轉ENDOUT結束
- RL A ;掃描字循環左移
- MOV R5,A ;掃描字放入R5暫存
- MOV P3,#0FFH ;顯示暫停
- AJMP PLAY ;轉PLAY循環
- ENDOUT: MOV P3,#0FFH ;顯示結束,端口置1
- MOV P1,#0FFH ;
- RET ;子程序返回
- ;
- ;LED數碼顯示管用共陽段碼表,分別對應0-9,最后一個是"熄滅符"
- TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,0FFH
- ;
- ; 1MS延時子程序,LED顯示用
- DL1MS: MOV R6,#14H ;
- DL1: MOV R7,#19H
- DL2: DJNZ R7,DL2
- DJNZ R6,DL1
- RET
- ;
- ;模數轉換測量子程序
- TEST: CLR A ;清累加器A
- MOV P2,A ;清P2口
- MOV R0,#70H ;轉換值存放首址
- MOV R7,#08H ;轉換8次控制
- LCALL TESTART ;啟動測試
- WAIT: JB P3.7,MOVD ;等A/D轉換結束信號后轉MOVD
- AJMP WAIT ;P3.7為0等待
- ;
- TESTART: SETB P2.3 ;鎖存測試通道地址
- NOP ; 延時2微秒
- NOP ;
- CLR P2.3 ;測試通道地址鎖存完畢
- SETB P2.4 ; 啟動測試,發開始脈沖
- NOP ; 延時2微秒
- NOP ;
- CLR P2.4 ; 發啟動脈沖完畢
- NOP ;延時4微秒
- NOP ;
- NOP ;
- NOP ;
- RET ;子程序調用結束
- ;
- ; 取A/D轉換數據至70H-77H內存單元
- MOVD: SETB P2.5 ;8090輸出允許
- MOV A,P0 ;將A/D轉換值移入A
- MOV @R0,A ;放入內存單元
- CLR P2.5 ;關閉8090輸出
- INC R0 ;內存地址加1
- MOV A,P2 ;通道地址移入A
- INC A ;通道地址加1
- MOV P2,A ; 通道地址送8090
- CLR C ;清進位標志
- CJNE A,#08H,TESTCON ; 通道地址不等于8轉TESTCONT再測試
- JC TESTCON ; 通道地址小于8轉TESTCONT再測試
- CLR A ; 大于或等于8,A/D轉換結束,恢復端口
- MOV P2,A ; P2口置0
- MOV A,#0FFH ;
- MOV P0,A ; P0口置1
- MOV P1,A ; P1口置1
- MOV P3,A ; P3口置1
- RET ; 取A/D轉換數據結束
- TESTCON: LCALL TESTART ; 再發測試啟動脈沖
- LJMP WAIT ; 跳至WAIT等待A/D轉換結束信號
- ;
- END ; 程序結束
復制代碼
|