
对余慧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
}
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)