ADc0804控制程序:轉動電位器,數碼管后三位依次顯示000-255 //定義ADC的連接端口 ad_cs equ P3.6 ;芯片選擇 ad_wr equ P2.0 ;轉換開始 ad_rd equ P3.7 ;RD=LOW,數字信號輸出 ad_input_port equ p1 ;定義數據位 Counter EQU 59H ;計數器,顯示程序通過它得知現正顯示哪個數碼管 FIRST EQU P2.4 ;第一位數碼管的位控制 SECOND EQU P2.5 ;第二位數碼管的位控制 THEER EQU P2.6 ; 第三位數碼管的位控制 DISPBUF EQU 5AH ;顯示緩沖區為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位定時/計數模式) MOV TH0,#HIGH(65536-2000) MOV TL0,#LOW(65536-2000) SETB TR0 ;開定時器0 SETB EA ;開總中斷 SETB ET0 ;開定時器0中斷 MOV Counter,#0 ;計數器初始化 LOOP: lcall adc_demo ;調用AD子程序 ajmp LOOP
;//========================================== ;// 啟動AD轉換 ;//========================================== Adc_Start: clr ad_cs nop clr ad_wr nop setb ad_wr nop setb ad_cs nop ret ;//========================================== ;// 讀AD轉換 ;//========================================== 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轉換讀取延時程序,顯示讀到的數值 ;//========================================== Adc_Demo: lcall Adc_Start lcall delay1ms lcall adc_read MOV B,#100 ;AD轉換出的值除100商為百位數 DIV AB ; 取百位數 余數在B寄存器 MOV DISPBUF,A ;把百位存入百位寄存器DISPBUF MOV A,B ;余數再送A MOV B,#10 ;余數除10商為十位數 DIV AB ; 除法,余數在寄存器B MOV DISPBUF+1,A ;A是十位數存第二位顯示寄存器 MOV DISPBUF+2,B ; B是個位數存第三位顯示寄存器 RET
DISP: ;定時器T0的中斷響應程序動態掃描 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 ;顯示緩沖區首地址 ADD A,Counter MOV R0,A MOV A,@R0 ;根據計數器的值取相應的顯示緩沖區的值 MOV DPTR,#DISPTAB ;字形表首地址 MOVC A,@A+DPTR ;取字形碼 MOV P0,A ;將字形碼送P0位(段口) MOV A,Counter ;取計數器的值 JZ DISPFIRST ;如果是0則顯示第一位 DEC A JZ DISPSECOND ;如果是1顯示第二位 CLR THEER ;否則顯示第3位 AJMP DISPNEXT DISPFIRST: CLR FIRST ;顯示第一位 AJMP DISPNEXT DISPSECOND: CLR SECOND DISPNEXT: INC Counter ;計數器加1 MOV A,Counter DEC A ;如果計數器計到3,則讓它回0 DEC A DEC A JZ RSTCOUNT AJMP DISPEXIT RSTCOUNT: MOV Counter,#0 ;計數器的值回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)
|