求助 ADC0809 7路信号采集并存储到51单片机 汇编语言

求助 ADC0809 7路信号采集并存储到51单片机 汇编语言,第1张

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_DATA =0x00 //清A/D转换结果寄存器

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

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12466659.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-25
下一篇 2023-05-25

发表评论

登录后才能评论

评论列表(0条)

保存