ADc0804控制程序:轉(zhuǎn)動電位器,數(shù)碼管后三位依次顯示000-255 //定義ADC的連接端口 ad_cs equ P3.6 ;芯片選擇 ad_wr equ P2.0 ;轉(zhuǎn)換開始 ad_rd equ P3.7 ;RD=LOW,數(shù)字信號輸出 ad_input_port equ p1 ;定義數(shù)據(jù)位 Counter EQU 59H ;計數(shù)器,顯示程序通過它得知現(xiàn)正顯示哪個數(shù)碼管 FIRST EQU P2.4 ;第一位數(shù)碼管的位控制 SECOND EQU P2.5 ;第二位數(shù)碼管的位控制 THEER EQU P2.6 ; 第三位數(shù)碼管的位控制 DISPBUF EQU 5AH ;顯示緩沖區(qū)為5AH和5BH
org 0000h ajmp main ORG 000BH ;定時器T0的入口 AJMP DISP ;顯示程序 org 0030h main: MOV SP,#5FH ;設置堆棧 MOV P1,#0FFH MOV P0,#0FFH MOV P2,#0FFH ;初始化,所顯示器,LED滅 MOV TMOD,#00000001B ;定時器T0工作于模式1(16位定時/計數(shù)模式) MOV TH0,#HIGH(65536-2000) MOV TL0,#LOW(65536-2000) SETB TR0 ;開定時器0 SETB EA ;開總中斷 SETB ET0 ;開定時器0中斷 MOV Counter,#0 ;計數(shù)器初始化 LOOP: lcall adc_demo ;調(diào)用AD子程序 ajmp LOOP
;//========================================== ;// 啟動AD轉(zhuǎn)換 ;//========================================== Adc_Start: clr ad_cs nop clr ad_wr nop setb ad_wr nop setb ad_cs nop ret ;//========================================== ;// 讀AD轉(zhuǎn)換 ;//========================================== Adc_Read: MOV ad_input_port,#0ffh clr ad_cs nop clr ad_rd nop nop MOV a,AD_INPUT_PORT nop setb ad_rd nop setb ad_cs ret ;//========================================== ;// AD轉(zhuǎn)換讀取延時程序,顯示讀到的數(shù)值 ;//========================================== Adc_Demo: lcall Adc_Start lcall delay1ms lcall adc_read MOV B,#100 ;AD轉(zhuǎn)換出的值除100商為百位數(shù) DIV AB ; 取百位數(shù) 余數(shù)在B寄存器 MOV DISPBUF,A ;把百位存入百位寄存器DISPBUF MOV A,B ;余數(shù)再送A MOV B,#10 ;余數(shù)除10商為十位數(shù) DIV AB ; 除法,余數(shù)在寄存器B MOV DISPBUF+1,A ;A是十位數(shù)存第二位顯示寄存器 MOV DISPBUF+2,B ; B是個位數(shù)存第三位顯示寄存器 RET
DISP: ;定時器T0的中斷響應程序動態(tài)掃描 PUSH ACC ;ACC入棧 PUSH PSW ;PSW入棧 MOV TH0,#HIGH(65536-2000);定時時間為2000個周期,約2170微秒 MOV TL0,#LOW(65536-2000) SETB FIRST SETB SECOND ;關顯示 SETB THEER MOV A,#DISPBUF ;顯示緩沖區(qū)首地址 ADD A,Counter MOV R0,A MOV A,@R0 ;根據(jù)計數(shù)器的值取相應的顯示緩沖區(qū)的值 MOV DPTR,#DISPTAB ;字形表首地址 MOVC A,@A+DPTR ;取字形碼 MOV P0,A ;將字形碼送P0位(段口) MOV A,Counter ;取計數(shù)器的值 JZ DISPFIRST ;如果是0則顯示第一位 DEC A JZ DISPSECOND ;如果是1顯示第二位 CLR THEER ;否則顯示第3位 AJMP DISPNEXT DISPFIRST: CLR FIRST ;顯示第一位 AJMP DISPNEXT DISPSECOND: CLR SECOND DISPNEXT: INC Counter ;計數(shù)器加1 MOV A,Counter DEC A ;如果計數(shù)器計到3,則讓它回0 DEC A DEC A JZ RSTCOUNT AJMP DISPEXIT RSTCOUNT: MOV Counter,#0 ;計數(shù)器的值回0 DISPEXIT: POP PSW POP ACC RETI DISPTAB:db 28h,7eh,0a2h,62h,74h,61h,21h,7ah,20h,60h ;字形代碼表 ;0 1 2 3 4 5 6 7 8 9 delay1ms: ;延時子程序 MOV r7,#10 MM:MOV r6,#50 djnz r6,$ ;2us djnz r7,MM ret end
(摘自www.51c51.com)
|