单片机实验之AD转换实验
一、实验目的
1、掌握单片机与ADC0809的接口
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
方法。
2、掌握Proteus软件与Keil软件的使用方法。
二、设计
要求
对教师党员的评价套管和固井爆破片与爆破装置仓库管理基本要求三甲医院都需要复审吗
1、用Proteus软件画出电路原理图,在单片机的外部扩展片外三总线,并通过片外三总线与0809接口。
2、在0809的某一模拟量输入通道上接外部模拟量。
3、在单片机的外部扩展数码管显示器。
4、分别采用延时和查询的方法编写A/D转换程序。
5、启动A/D转换,将输入模拟量的转换结果在显示器上显示。 三、电路原理图
六、实验
总结
初级经济法重点总结下载党员个人总结TXt高中句型全总结.doc高中句型全总结.doc理论力学知识点总结pdf
通过本实验基本掌握了AD0809通道选择设计,数码管显示器的动态显示接线,整个采样应是多通道巡回采样,运用了显示子程序来显示数码管。
七、思考题
1、采用中断的方法编写A/D转换程序,完成实验要求。
答:程序见程序清单。
四、实验程序流程框图和程序清单
1、延时 汇编
ORG 0000H 开始START:LJMP MAIN
启动AD ORG 0100H
MAIN:MOV SP, #2FH
延时 CLR EA
MOV DPTR, #0FEF8H
MOV R0, #7BH 从AD中取数据 MOV @R0, #0AH
MOVX @DPTR, A
数据处理 DEC R0
LCALL DELAY
MOVX A, @DPTR 调显示子函数 MOV B, #51
DIV AB
MOV @R0, A 结束 DEC R0
MOV A, B
MOV B, #5
DIV AB display MOV @R0, A
DEC R0
送百分位字符代码 MOV A, B 送个位及小数点字符代码 MOV B, #2
MUL AB 送位选信号 MOV @R0, A
LCALL DIR 送位选信号
LJMP MAIN 延时1ms
/**********显示程序************/ 延时1ms送十分位字符代码
DIR:PUSH ACC
熄灭第四位数码管 PUSH DPH 送位选信号 PUSH DPL
PUSH PSW
延时1ms SETB RS0
延时1ms SETB RS1
MOV R0, #78H 返回 MOV R7, #4
MOV R6, #0
LOOP:MOV DPTR, #WK
MOV A, R6
MOVC A, @A+DPTR //位控
MOV P2, A
MOV DPTR, #DK
MOV A, @R0
MOVC A, @A+DPTR
JNB P2.2, LOOPD
CLR ACC.7
LOOPD:MOV P0, A
LCALL MS1
INC R6
INC R0
DJNZ R7, LOOP
POP PSW
POP DPL
POP DPH
POP ACC
RET
WK:DB 0001B
DB 0010B
DB 0100B
DB 1000B
DK:DB 0C0H ;0
DB 0F9H ;1
DB 0A4H ;2
DB 0B0H ;3
DB 099H ;4
DB 092H ;5
DB 082H ;6
DB 0F8H ;7
DB 080H ;8
DB 090H ;9
DB 0FFH ;灭
/**********延时**********/ DELAY:MOV R6,#01H //200us
DL0: MOV R5,#61H
DJNZ R5,$
DJNZ R6,DL0
RET
MS1:MOV R5, #250 //1ms
LOOPX:NOP
NOP
DJNZ R5, LOOPX
RET
END
延时 C语言
#include"absacc.h" #include"reg52.h"
#define uchar unsigned char
#define TD0 XBYTE[0Xfef8] sbit EOC=P3^3;
sbit P22=P2^2;
sbit P07=P0^7;
uchar code wk[]={1,2,4,8}; Uchar code
dk[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90,0XFF};
uchar b[]={0,0,0,10};
/*********延时程序***********/
void ms1(void) //延时1ms {
unsigned char a,b,c;
for(c=1;c>0;c--)
for(b=142;b>0;b--)
for(a=2;a>0;a--);
}
void delay(void) //延时 200us {
unsigned char a,b;
for(b=1;b>0;b--)
for(a=97;a>0;a--); }
/**********A/D模块********/ short int ad0808()
{
unsigned short int t;
TD0=0X00;
delay();
t=TD0;
return(t);
}
/*********显示程序*********/ void display(void)
{ unsigned short int i=0;
unsigned short int k=0;
unsigned short int c=4;
unsigned short int j;
while(c--)
{
P2=wk[i++];
j=b[k++];
P0=dk[j];
if(P22)
{
P07=0;
}
ms1();
}
}
/*********主函数***********/ void main()
{
while(1)
{
unsigned short int m;
unsigned short int n;
unsigned short int a;
unsigned short int k;
SP=0X2F;
a=ad0808();
m=(a*5)/256;
n=((a*5)%256)*10/256;
k=((((a*5)%256)*10)%256)*10/256;
b[0]=k;
b[1]=n;
b[2]=m;
display();
}
}
2、查询法 汇编:
只需将 延时法 汇编程序中 “LCALL DELAY”语句改为
“LOOP0:JB P3.3, LOOP0” 以及 DELAY 延时子程序删除即可。
查询法 C语言
将“delay();”改为“while(!EOC){;}”以及删除void delay(void)延时程序,其他程序不变即可。
3 中断法(思考题)汇编:
在延时法 汇编程序中“START:LJMP MAIN” 下加入以下语句:
ORG 0013H
LJMP INTT1
再将“LCALL DELAY”语句改为“HERE:LJMP HERE”
在将“MOVX A, @DPTR”语句改为“INTT1:MOVX A, @DPTR”
以及 DELAY 延时子程序删除即可。
五、实验结果