ADC0809是8通道并口AD.应用如下:
(1). 初始化时,使ST和OE信号全为低电平。
(2). 送要转换的哪一通道的地址到A,B,C端口上。
(3). 在ST端给出一个至少有100ns宽的正脉冲信号。
(4). 是否转换完毕,我们根据EOC信号来判断。
(5). 当EOC变为高电平时,这时给OE为高电平,转换的数据就输出给单片机了。
如下图所示,从ADC0809的通道IN3输入0-5V之间的模拟量,通过ADC0809转换成数字量在数码管上以十进制形成显示出来。ADC0809的VREF接+5V电压。
程序如下:只采集了CH0通道的。其余的只要设置下ABC三个控制脚即可。同样实现。
CH EQU 30H
DPCNT EQU 31H
DPBUF EQU 33H
GDATA EQU 32H
ST BIT P3.0
OE 伏指BIT P3.1
EOC BIT P3.2
ORG 00H
LJMP START
ORG 0BH
LJMP T0X
ORG 30H
START: MOV CH,#0BCH
MOV DPCNT,#00H
MOV R1,#DPCNT
MOV R7,#5
MOV A,#10
MOV R0,#DPBUF
LOP: MOV @R0,A
INC R0
DJNZ R7,LOP
MOV @R0,#00H
INC R0
MOV @R0,#00H
INC R0
MOV @R0,#00H
MOV TMOD,#01H
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
SETB TR0
SETB ET0
SETB EA
WT: CLR ST
SETB ST
CLR ST
WAIT: JNB EOC,WAIT
SETB OE
MOV GDATA,P0
CLR OE
MOV A,GDATA
MOV B,#100
DIV AB
MOV 33H,A
MOV A,B
MOV B,#10
DIV AB
MOV 34H,A
MOV 35H,B
SJMP WT
T0X: NOP
MOV TH0,#(65536-4000)/256
MOV TL0,#(65536-4000) MOD 256
MOV DPTR,#DPCD
MOV A,DPCNT
ADD A,#DPBUF
MOV R0,A
MOV A,@R0
MOVC A,@A+DPTR
MOV P1,A
MOV DPTR,#DPBT
MOV A,DPCNT
MOVC A,@A+DPTR
MOV P2,A
INC DPCNT
MOV A,DPCNT
CJNE A,#8,NEXT
MOV DPCNT,#00H
NEXT: 铅厅中RETI
DPCD: DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH,00H
DPBT: DB 0FEH,0FDH,0FBH,0F7H
DB 0EFH,0DFH,0BFH,07FH
END
再给你个C程序:
#include <AT89X52.H>
unsigned char code dispbitcode[]={0xfe,0xfd,0xfb,0xf7,
0xef,0xdf,0xbf,0x7f}
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00}
unsigned char dispbuf[8]={10,10,10,10,10,0,0,0}
unsigned char dispcount
sbit ST=P3^0
sbit OE=P3^1
sbit EOC=P3^2
unsigned char 槐山channel=0xbc//IN3
unsigned char getdata
void main(void)
{
TMOD=0x01
TH0=(65536-4000)/256
TL0=(65536-4000)%256
TR0=1
ET0=1
EA=1
P3=channel
while(1)
{
ST=0
ST=1
ST=0
while(EOC==0)
OE=1
getdata=P0
OE=0
dispbuf[2]=getdata/100
getdata=getdata%10
dispbuf[1]=getdata/10
dispbuf[0]=getdata%10
}
}
void t0(void) interrupt 1 using 0
{
TH0=(65536-4000)/256
TL0=(65536-4000)%256
P1=dispcode[dispbuf[dispcount]]
P2=dispbitcode[dispcount]
dispcount++
if(dispcount==8)
{
dispcount=0
}
}
STC单项片机说明文档里有例子下面是我的采集程序,采三次,求平均值:
void adchange()//AD采集程序,采集3路
{
uchar temp7,temp8,temp9,temp10,temp11,temp12
uint tempa,tempb,tempc,tempd
ADC_CONTR=ADC_CONTR|0X80 //10000000 开启转换电源
Delay1ms(1) //延时,等待内部电源稳定
//P1M0=P1M0|0X07 //设置p1.0 P1.1和 p1.3所在通道为开/漏模式
//P1M1=P1M1|0X07
ADC_CONTR=0xe0 //11100000 开启P1.0通道开始转换
Delay25us(10) //延毁哗搜时一端时间,使输入电压达到稳定
ADC_LOW2 =0x00
ADC_CONTR |= 0x08 //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)) //0001,0000 等待A/D转换结束
temp7=ADC_DATA //读取转换结果
temp8=ADC_LOW2
ADC_DATA =0x00 //清A/D转换结果寄存器
ADC_LOW2 =0x00
ADC_CONTR=ADC_CONTR&0xe7 //将ADC_FLAG软件清零
Delay25us(1)
ADC_CONTR |= 0x08 //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)) //0001,0000 等待A/D转换结束
temp9=ADC_DATA //读取转换结果
temp10=ADC_LOW2
ADC_CONTR=ADC_CONTR&0xe7 //将ADC_FLAG软件清零
Delay25us(1)
ADC_DATA =0x00 //清A/D转换结果寄存器
ADC_LOW2 =0x00
ADC_CONTR |= 0x08 //ADC_START=1,开始转换
while(!(ADC_CONTR&0x10)) //0001,0000 等待A/D转换结束
temp11=ADC_DATA //读取转换结果
temp12=ADC_LOW2
ADC_CONTR=ADC_CONTR&0xe7 //将ADC_FLAG软件清零
Delay25us(1)
ADC_DATA =0x00 //清A/D转换结果寄存器
ADC_LOW2 =0x00
tempa=(temp7*4+temp8)//真烦人,但必须这么算,一次算会出错
tempb=(temp9*4+temp10)
tempc=(temp11*4+temp12)
tempd=tempa+tempb+tempc
temp1=(tempd+1)/3
。。。。。。其它两芦告路略
//P1M0=P1M0&0X00 //设置P1口为普通I/O模式,以便用P1口显示数据纤历。
//P1M1=P1M1&0X00
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)