// ADC0809模数转换
//ADC0809采样通道3输入的模拟量,转换后结果显示在数码管上
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code LEDData[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}
//ADC0809引脚定义
sbit OE=P1^0
sbit EOC=P1^1
sbit ST=P1^2
sbit CLK=P1^3
//延时
void Delayms(uint ms)
{
uchar i
while(ms--)for(i=0i<120i++)
}
//显示转换结果
void Display_Result(uchar d)
{
P2=0xf7
P0=LEDData[d%10]
Delayms(5)
P2=0xfd
P0=LEDData[d%100/10]
Delayms(5)
P2=0xfd
P0=LEDData[d/100]
Delayms(5)
}
// 主程序
void main()
{
TMOD=0x02
TH0=0x14
TL0=0x00
IE=0x82
TR0=1
P1=0x3f//选择ADC0809通道3(0111)
//高4位设通道地址为0111
while(1)
{
ST=0ST=1ST=0//启动转换
while(EOC==0) //等待转换结果
OE=1 //允许输出
Display_Result(P3) //显示A/D转换结果
OE=0 //关闭输出
}
}
//T0定时器中断给ADC0809提供时钟信号
void Timer0_INT() interrupt 1
{
CLK=!CLK//ADC0809时钟信号
}
stequ
p3.7
eoc
equ
p3.6
oe
equ
p3.5
BAI
EQU
30H
SHI
EQU
31H
GEWEI
EQU
32H
org
0000h
MOV
DPTR,#0FEF8H
AD转换IN0通道地址
MOV
A,#00H
MOVX
@DPTR,A
启动AD转换
START:
clr
st
setb
st
clr
st
jnb
eoc,$
setb
oe
mov
30H,P2
clr
oe
mov
a,30h
mov
b,#100
div
ab
LOOP:
MOV
BAI,A
MOV
SHI,B
MOV
A,SHI
MOV
B,#10
DIV
AB
MOV
SHI,A
MOV
GEWEI,B
MOV
A,BAI
MOV
P1,A
CLR
P3.2
LCALL
DELAY
SETB
P3.2
MOV
A,SHI
MOV
P1,A
CLR
P3.1
LCALL
DELAY
SETB
P3.1
MOV
A,GEWEI
mov
p1,a
CLR
P3.0
LCALL
DELAY
SETB
P3.0
SJMP
START
DELAY:
mov
R6,#5
D1:
MOV
R7,#200
DJNZ
R7,$
DJNZ
R6,D1
RET
end
这是我编的程序,可以用,你只用0通道的话那就把那个通道选择的三个引脚全接地就是了。
MOV
DPTR,#0FEF8H
AD转换IN0通道地址
MOV
A,#00H
MOVX
@DPTR,A
启动AD转换
这个是启动转换的语句
以上的程序是实现,电位器调节过程中,数码管从0到255变化
ADC0809要工作得在单片机的ALE脚上接个四分频的器件,不然ADC0809是不会工作的。QQ:77254708
0000H和000BH是固定的,000BH是中断入口地址那个0100H应该是根据程序的长短来定的,要看你单片机的程序存储器有多大,还有程序的前面要放多少东西了。7FF8H
这个是0809AD转换器的地址,51单片机的P2口默认为十六位地址的高八位地址,要根据是不是有其它的外围设备来定地址,如果没接的话,可以随便来定!!MOVX
@DPTR,A这句是用来启动0809,不用知道A里放的是什么东西,有这句的话0809就会被启动了
HERE
SJMP
HERE
这句无限循环
应该是用来等待中断的
end的话程序会被终止,中断程序也不会再被执行了
LED那个你需要知道LED的结构很简单,网上很容易找
硬件地址的分配是看你接的那几根线了,原则上只要不重复应该都可以
有一些
是电路直接与单片机I/0口连接,而没有经过AD转换,请问什么“情况下可以进行这样的处理,也就是说,单片机I/0口可以接多大的电流或者电压?”这句电压的话一般是5V,但是那个AD不是因为电压不匹配才接的,单片机要的是数字量,AD是将模拟两转换成数字量的!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)