adc0809的多通道c程序设计?

adc0809的多通道c程序设计?,第1张

可以参考这个题目:

对余慧0809进行数据采睁或集编程。要求对8路模拟量连续采集24h,每隔10min采集一次,数据存储在外部数据存储区中。

程序如下:

#include<absacc.h>

#include<reg51.h>

#define

uchar

unsigned

char

#define

uint

unsigned

int

#define

IN0

XBYTE[0x7ff8]

/*设置ADC0809的通道0地址*/

sbit

ad_busy=P3^3

/*即EOC状态*/

uint

overflow_count

=

0

/*T1中断次数初值*/

void

ad0809(uchar

xdata

*

x)

/*采样函数,结果x[]放外部数据存储器*/

{

uchar

i

uchar

idata

*

ad_adr

ad_adr=&IN0

for(i=0i<8i++)

/*处理8通道*/

{

*ad_adr=0

/*启动转换*/

i=i

/*延时等待EOC变低*/

i=i

while(ad_busy==0)

/悉毁伍*查询等待转换结束*/

x[i]=*ad_adr

/*存转换结果*/

*(*(p+j)+i)=x[i]

ad_adr++

/*下一通道*/

}

}

/*

定时器1中断服务程序每100ms执行一次,fosc=6MHz*/

void

timer1_ISR(void)

interrupt

3

{

TH1

=

(65536

50000)/256

//定时器1赋初值

TL1

=

(65536

50000)%256

//

100ms/1us=50000次计数

overflow_count++

}

void

main(void)

{

static

char

xdata

ad[10]

char

(*p)[8]

TMOD

=

0X10

//设置定时器1工作方式1,

TH1

=

(65536

50000)/256

//定时器1赋初值

TL1

=

(65536

50000)%256

EA

=

1

//开定时器1中断

ET1

=

1

TR1

=

1

//启动定时器1

uchar

j

for(j=0j<144j++){

/

*采样24h*/

if

(

overflow_count

==

6000){

/*10分钟到,采样ADC0809通道的值*/

uchar

i,(*p)[8]

uchar

idata

*

ad_adr

ad_adr=&IN0

for(i=0i<8i++)

/*处理8通道*/

{

*ad_adr=0

/*启动转换*/

i=i

/*延时等待EOC变低*/

i=i

while(ad_busy==0)

/*查询等待转换结束*/

x[i]=*ad_adr

/*存转换结果*/

ad_adr++}

for(i=0i<8i++)

{

*(*(p+j)+i)=x[i]}

}

}

}

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

}

}


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

原文地址:https://54852.com/yw/12512185.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存