⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dac0809.txt

📁 0809 A/D 转换程序,可进行高精度的转换显示.
💻 TXT
字号:
START EQU P3.4;转换启动信号,上跳沿所有内部寄存器清零,下降沿开始进行A/D转换
ALE EQU P3.0;地址所存允许输入线,高电平有效
OE EQU P3.1;输出允许信号.1输出数字,0高阻态

EOC EQU P3.3;转换结束信号,1表示转换结束,0正在转换.

DATA_TEMP EQU 30H;
LED_5 EQU 31H;
LED_6 EQU 32H;
LED_7 EQU 33H;

ORG 0000H;
LJMP MAIN;

ORG 000BH;
LJMP START_FRESH;

ORG 0013H;
LJMP GET_DATA;

MAIN:
CLR START;
CLR ALE;
CLR OE;

SETB EA;
;-------外部中断设置---------
SETB EX1;允许外部中断1申请
;SETB IT0;设置外部中断为边沿触发方式,*********设置外部中断触发方式,仔细研究再作决定
SETB IT1;
;----------------------------
;-------内部定时器设置-------
;设制定时器
MOV TMOD,#10H;设置定时器为工作模式1,即16位计数器.
MOV TH0,#03CH;
MOV TL0,#0B0H;设置定时时间为50ms
MOV R0,#0000H;计数器次数控制,只有在R4为20的时候才能加秒!
SETB ET0;允许T0溢出中断
SETB TR0;启动T0计数
;----------------------------
MOV LED_5,#00H;
MOV LED_6,#00H;
MOV LED_7,#00H;


DISPLAY:
MOV DPTR,#LED;
MOV A,LED_5;
MOVC A,@A+DPTR;
MOV P2,#11011111B;
MOV P0,A;显示数字
CALL DE_10MS;
MOV P2,#0FFH;

MOV A,LED_6;
MOVC A,@A+DPTR;
MOV P2,#10111111B;
MOV P0,A;显示数字
CALL DE_10MS;
MOV P2,#0FFH;


MOV DPTR,#LED_;这一位显示小数点
MOV A,LED_7;
MOVC A,@A+DPTR;
MOV P2,#01111111B;
MOV P0,A;显示数字
CALL DE_10MS;
MOV P2,#0FFH;

LJMP DISPLAY;
;-------------------------
;-------------------------
;刷新数据函数
START_FRESH:
MOV TH0,#03CH;
MOV TL0,#0B0H;
INC R0;
CJNE R0,#050H,RETURN_0; 
MOV R0,#00H;
SETB START;清寄存器
CALL DE_10MS;
CLR START;开始转换
RETURN_0:
RETI;
;-------------------------
;-------------------------
;获取数据函数
GET_DATA:
CALL DE_10MS;
SETB OE;输出数据允许;
CALL DE_10MS;
MOV DATA_TEMP,P1;将P1口的数据传给DATA,记录数据;
CALL DE_10MS;
CALL DE_10MS;
CLR OE;
;LCALL CONVERT;调用转换数据函数.
MOV A,DATA_TEMP;
MOV B,#033H;根据公式:V=DATA/51,给b传入除数51
DIV AB;
MOV LED_7,A;将电压值的个位传给第八个LED
MOV A,B;将除以51后的余值传给A

;*****************************************************
;下面应该先乘以10,再除以51
MOV B,#0AH;
MUL AB;
;在这里又遇到问题,例如余数可能是45,乘以10以后是450,它会将高八位传给B,低八位传给A;
MOV R0,B;高八位暂存于R1
MOV B,#33H;
DIV AB;
MOV R2,A;
MOV R3,B;
MOV A,R0;高八位还给A
CJNE A,#01H,LOOP0;
MOV A,R2;
ADD A,#05H;
MOV R2,A;
LOOP0:
;至此已将小数点后一位计算精确
MOV A,R3;将小数点后二位算得更精确一点
MOV B,#0AH;
MUL AB;
;在这里又遇到问题,例如余数可能是45,乘以10以后是450,它会将高八位传给B,低八位传给A;
MOV R0,B;高八位暂存于R1
MOV B,#33H;
DIV AB;
MOV R4,A;
MOV R5,B;
MOV A,R0;高八位还给A
CJNE A,#01H,LOOP1;因为高位只可能是1或0;
MOV A,R4;
ADD A,#05H;
MOV R4,A;
;*****************************************************
LOOP1:
MOV LED_6,R2;将电压值的小数点后一位传给第七个LED
MOV LED_5,R4;将电压值的小数点后第2位传给第六个LED

RETI;
;-------------------------

DE_10MS:
MOV R3,#064H;64
DE: MOV R4,#05H;5
DJNZ R4,$;
DJNZ R3,DE;
RET;

;定义带小数点的数值显示:
LED_:   DB 002H;0.
        DB 09EH;1.
        DB 024H;2.
        DB 00CH;3.
        DB 098H;4.
        DB 048H;5.
       DB 040H;6.
         DB 01EH;7.
        DB 000H;8.
        DB 008H;9.
;定义不带小数点数值显示
LED:    DB 003H;0
        DB 09FH;1
        DB 025H;2
        DB 00DH;3
        DB 099H;4
        DB 049H;5
        DB 041H;6
        DB 01FH;7
        DB 001H;8
        DB 009H;9
END;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -