传感器 ad转换程序

传感器 ad转换程序,第1张

此程序是我做单片机课程设计的程序,PROTEL原理图在附件里

程序经过了实验的测试,没有任何问题。

一 设计要求:

1 以8031为主控器组成A/D,D/A转换系统。

2 对任意波形的脉冲信号进行A/D转换后进入数据存储器,要求能够存储5~10个周波,然后定时将数据经D/A转换输出示波器显示。

3 采样的频率可由键盘有级调节。

二 课程设计条件:

硬件:个人PC一台,8051单片机仿真头一个,89S51单片机一个,ADC0809芯片一块,DAC0832芯片一块,7402一个,LM358一片,按键开关5个,电阻电容若干,6M晶振一个,稳压电源,函数信号发生器,及示波器个一个

软件:PC机WINDOWS *** 作系统,KEIL单片机仿真调试软件

三 设计思想:

通过ADC0809将正弦波模拟信号按照一定的频率进行采样,频率由键盘进行串级控制,转换成数字量,然后存储到8155的RAM里面,再将数据输出到DAC0832,将数字量转化成模拟量,经过LM358将信号放大,送到示波器终端循环显示出来

BUFFRE EQU 31H ;采样频率设置单元

BUFRAM EQU 7E00H ;8155RAM首地址

BUFADC EQU 0FD1FH ;0809启动地址

BUFDAC EQU 0BFFH ;0832启动地址

K1 EQU P14 ; 四个频率选择按键

K2 EQU P15

K3 EQU P16

K4 EQU P17

ORG 0000H

LJMP START

ORG 0030H

START: MOV R4,#02 ;由于8155的复位时间比8051慢,所以在对8155初始化之前必须有延时

DEL11:MOV R6,#200 ; 延时为021s的倍

DEL21:MOV R7,#126

DEL31:DJNZ R7,DEL31

DJNZ R6,DEL21

DJNZ R5,DEL11

MOV DPTR,#7FF8H ; 8155初始化

MOV A,#00H ; 写入命令字

MOVX @DPTR,A

MOV R0,#0FAH

MOV DPTR,#BUFRAM

LOOP:MOVX @DPTR,A ;对8155RAM清零

INC DPTR

DJNZ R0,LOOP

FRESET:MOV P1,#0FFH ;准备读取P1 口状态

JB K1,NEXT1 ; 依次判断按下了哪一个按键

MOV BUFFRE,#02H ;送相应的频率设置到31内存单元

LJMP INPUT

NEXT1:JB K2,NEXT2

MOV BUFFRE,#04H

LJMP INPUT

NEXT2:JB K3,NEXT3

MOV BUFFRE,#08H

LJMP INPUT

NEXT3:JB K4,NEXT4

MOV BUFFRE,#06H

LJMP REALIO ;如果是K4按下,则进行实时输入输出

NEXT4:LJMP FRESET ; 循环等待按键按下

INPUT: ; A/D采样程序

MOV R0,#0FAH ;共采集250个数据

MOV DPTR,#BUFRAM ; 8155RAM首地址

LOOP1:PUSH DPL ; 先保存次地址

PUSH DPH

MOV DPTR,#BUFADC ; 0809启动地址

MOV A,#00H

MOVX @DPTR,A ; 启动0809 A/D转换开始

NOP ; 一定时间延时

NOP

WAIT:JB P10,WAIT ; 等待转换结束

MOVX A,@DPTR ;读取转换结果

POP DPH

POP DPL ;恢复RAM地址

MOVX @DPTR,A ; 保存数据至8155RAM

INC DPTR ;RAM地址加一,指向下一个存储单元

ACALL DELAY ; 延时,即以一定频率采样

DJNZ R0,LOOP1 ; 250个数据是否采集完成,否则继续

OUTPUT: ; D/A转换模块

MOV R1,#0FAH ;250个数据

MOV DPTR,#BUFRAM ; 8155RAM首地址

LOOP2: PUSH DPL ; 保存此地址

PUSH DPH

MOVX A,@DPTR ;将数据输出到A中

MOV DPTR,#BUFDAC ; 0832地址

MOVX @DPTR,A ;将数据输出进行D/A转换

NOP ;为了与采样频率一直,设定一定延时

NOP

POP DPH ;恢复RAM地址

POP DPL

INC DPTR ;指向下一个要转换的数据单元

ACALL DELAY ; 与采样相同延时

DJNZ R1,LOOP2 ; 直道转换完成

WAIT2:JNB K4,NEXT

LJMP OUTPUT ;循环显示输出结果

NEXT:LJMP REALIO

DELAY:MOV R5,BUFFRE ;延时程序,通过R5的不同,改变延时时间,从而改变

DEL1:MOV R6,#2 ; 延时为0001s的倍

DEL2:MOV R7,#126

DEL3:DJNZ R7,DEL3

DJNZ R6,DEL2

DJNZ R5,DEL1

RET

REALIO: ;实时显示程序

MOV DPTR,#BUFADC

MOV A,#00H

MOVX @DPTR,A

NOP

NOP

WAIT1:JB P10,WAIT1

MOVX A,@DPTR

MOV DPTR,#BUFDAC

MOVX @DPTR,A

NOP

NOP

FRESET1:MOV P1,#0FFH ;准备读取P1 口状态

JB K1,NEXT11 ; 依次判断按下了哪一个按键

MOV BUFFRE,#02H ;送相应的频率设置到31内存单元

LJMP INPUT

NEXT11:JB K2,NEXT12

MOV BUFFRE,#04H

LJMP INPUT

NEXT12:JB K3,NEXT13

MOV BUFFRE,#08H

LJMP INPUT

NEXT13:LJMP REALIO

END

八 使用说明

1上电复位或者按键复位后,程序开始运行后,等待K1-K4的按键被按下,根据按下的键值作不同的处理。

2如果被按下的是K1-K3键,则根据按下的键分别设置不同的采样频率,然后开始进行A/D转换进行信号的采样,再存储至8155的RAM中,如果存储完了250个数据,则自动开始进行数据的D/A输出,在示波器上可以看到相应的波形,数据是循环输出的,所以可以一直看到数据输出!

3如果是按键K4被按下,则进行的是实时的采样输入输出,即将信号通过ADC0809采样进来,不保存至8155的RAM中,就立即送到DAC0832输出到示波器显示,这样的信号基本上就是原来的信号波形。

4在K1-K3按下后正常的采样,存储,输出过程中,也可以按下K4键而转到实时的输入输出程序,便于将采样数据和原数据进行对照。

5在实时的输入输出时,也可以同过按下K1-K3键,立即切换到原来的一定频率采样,存储,输出过程。

6硬件设计上还有一个复位键,可以对程序进行按键复位(汇编,已经实验通过)

简单的A/D,D/A转换程序

此程序是我做单片机课程设计的程序,PROTEL原理图在附件里

程序经过了实验的测试,没有任何问题,

一 设计要求:

1 以8031为主控器组成A/D,D/A转换系统。

2 对任意波形的脉冲信号进行A/D转换后进入数据存储器,要求能够存储5~10个周波,然后定时将数据经D/A转换输出示波器显示。

3 采样的频率可由键盘有级调节。

二 课程设计条件:

硬件:个人PC一台,8051单片机仿真头一个,89S51单片机一个,ADC0809芯片一块,DAC0832芯片一块,7402一个,LM358一片,按键开关5个,电阻电容若干,6M晶振一个,稳压电源,函数信号发生器,及示波器个一个

软件:PC机WINDOWS *** 作系统,KEIL单片机仿真调试软件

三 设计思想:

通过ADC0809将正弦波模拟信号按照一定的频率进行采样,频率由键盘进行串级控制,转换成数字量,然后存储到8155的RAM里面,再将数据输出到DAC0832,将数字量转化成模拟量,经过LM358将信号放大,送到示波器终端循环显示出来

BUFFRE EQU 31H ;采样频率设置单元

BUFRAM EQU 7E00H ;8155RAM首地址

BUFADC EQU 0FD1FH ;0809启动地址

BUFDAC EQU 0BFFH ;0832启动地址

K1 EQU P14 ; 四个频率选择按键

K2 EQU P15

K3 EQU P16

K4 EQU P17

ORG 0000H

LJMP START

ORG 0030H

START: MOV R4,#02 ;由于8155的复位时间比8051慢,所以在对8155初始化之前必须有延时

DEL11:MOV R6,#200 ; 延时为021s的倍

DEL21:MOV R7,#126

DEL31:DJNZ R7,DEL31

DJNZ R6,DEL21

DJNZ R5,DEL11

MOV DPTR,#7FF8H ; 8155初始化

MOV A,#00H ; 写入命令字

MOVX @DPTR,A

MOV R0,#0FAH

MOV DPTR,#BUFRAM

LOOP:MOVX @DPTR,A ;对8155RAM清零

INC DPTR

DJNZ R0,LOOP

FRESET:MOV P1,#0FFH ;准备读取P1 口状态

JB K1,NEXT1 ; 依次判断按下了哪一个按键

MOV BUFFRE,#02H ;送相应的频率设置到31内存单元

LJMP INPUT

NEXT1:JB K2,NEXT2

MOV BUFFRE,#04H

LJMP INPUT

NEXT2:JB K3,NEXT3

MOV BUFFRE,#08H

LJMP INPUT

NEXT3:JB K4,NEXT4

MOV BUFFRE,#06H

LJMP REALIO ;如果是K4按下,则进行实时输入输出

NEXT4:LJMP FRESET ; 循环等待按键按下

INPUT: ; A/D采样程序

MOV R0,#0FAH ;共采集250个数据

MOV DPTR,#BUFRAM ; 8155RAM首地址

LOOP1:PUSH DPL ; 先保存次地址

PUSH DPH

MOV DPTR,#BUFADC ; 0809启动地址

MOV A,#00H

MOVX @DPTR,A ; 启动0809 A/D转换开始

NOP ; 一定时间延时

NOP

WAIT:JB P10,WAIT ; 等待转换结束

MOVX A,@DPTR ;读取转换结果

POP DPH

POP DPL ;恢复RAM地址

MOVX @DPTR,A ; 保存数据至8155RAM

INC DPTR ;RAM地址加一,指向下一个存储单元

ACALL DELAY ; 延时,即以一定频率采样

DJNZ R0,LOOP1 ; 250个数据是否采集完成,否则继续

OUTPUT: ; D/A转换模块

MOV R1,#0FAH ;250个数据

MOV DPTR,#BUFRAM ; 8155RAM首地址

LOOP2: PUSH DPL ; 保存此地址

PUSH DPH

MOVX A,@DPTR ;将数据输出到A中

MOV DPTR,#BUFDAC ; 0832地址

MOVX @DPTR,A ;将数据输出进行D/A转换

NOP ;为了与采样频率一直,设定一定延时

NOP

POP DPH ;恢复RAM地址

POP DPL

INC DPTR ;指向下一个要转换的数据单元

ACALL DELAY ; 与采样相同延时

DJNZ R1,LOOP2 ; 直道转换完成

WAIT2:JNB K4,NEXT

LJMP OUTPUT ;循环显示输出结果

NEXT:LJMP REALIO

DELAY:MOV R5,BUFFRE ;延时程序,通过R5的不同,改变延时时间,从而改变

DEL1:MOV R6,#2 ; 延时为0001s的倍

DEL2:MOV R7,#126

DEL3:DJNZ R7,DEL3

DJNZ R6,DEL2

DJNZ R5,DEL1

RET

REALIO: ;实时显示程序

MOV DPTR,#BUFADC

MOV A,#00H

MOVX @DPTR,A

NOP

NOP

WAIT1:JB P10,WAIT1

MOVX A,@DPTR

MOV DPTR,#BUFDAC

MOVX @DPTR,A

NOP

NOP

FRESET1:MOV P1,#0FFH ;准备读取P1 口状态

JB K1,NEXT11 ; 依次判断按下了哪一个按键

MOV BUFFRE,#02H ;送相应的频率设置到31内存单元

LJMP INPUT

NEXT11:JB K2,NEXT12

MOV BUFFRE,#04H

LJMP INPUT

NEXT12:JB K3,NEXT13

MOV BUFFRE,#08H

LJMP INPUT

NEXT13:LJMP REALIO

END

八 使用说明

1上电复位或者按键复位后,程序开始运行后,等待K1-K4的按键被按下,根据按下的键值作不同的处理。

2如果被按下的是K1-K3键,则根据按下的键分别设置不同的采样频率,然后开始进行A/D转换进行信号的采样,再存储至8155的RAM中,如果存储完了250个数据,则自动开始进行数据的D/A输出,在示波器上可以看到相应的波形,数据是循环输出的,所以可以一直看到数据输出!

3如果是按键K4被按下,则进行的是实时的采样输入输出,即将信号通过ADC0809采样进来,不保存至8155的RAM中,就立即送到DAC0832输出到示波器显示,这样的信号基本上就是原来的信号波形。

4在K1-K3按下后正常的采样,存储,输出过程中,也可以按下K4键而转到实时的输入输出程序,便于将采样数据和原数据进行对照。

5在实时的输入输出时,也可以同过按下K1-K3键,立即切换到原来的一定频率采样,存储,输出过程。

6硬件设计上还有一个复位键,可以对程序进行按键复位

#include<reg52h>

#include<intrinsh>

#define uchar unsigned char

#define uint unsigned int

uchar A1,A2,A3,A4;

sbit wr=P3^7;

sbit rd=P3^6;

sbit cs=P3^5;

sbit dian=P0^7;

uchar code tab[]={ 0x3f,0x06,0x5b,0x4f,

0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共阴数码管显示0到9的代码

void delay(uint z) //延时函数

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

void display(uchar A1,uchar A2,uchar A3,uchar A4)//显示函数

{

P0=tab[A1];

P2=0x7f;

delay(1);

P0=tab[A2];

dian=1;

P2=0xbf;

delay(1);

P0=tab[A3];

P2=0xdf;

delay(1);

P0=tab[A4];

P2=0xef;

delay(1);

}

void main()

{ uchar a;

uint temp=0,sum=0;

P3=0xdf;//令AD 片选CS一直为选通状态

P1=0xff;

while(1)

{

for(a=255;a>0;a--)

{

display(A1,A2,A3,A4);

}

wr=1;

_nop_();

wr=0;

_nop_();

wr=1;

_nop_();

rd=1;

_nop_();

rd=0;

_nop_();

temp=P1;

rd=1;

temp=(temp100001961);//8位的ADC0804的分辨率为1/256,5x1/255=001961;

A1=temp/1000; // 数码管第一位显示数据

A2=temp%1000/100; // 数码管第二位显示数据

A3=temp%1000%100/10;//数码管第三位显示数据

A4=temp%1000%100%10; //数码管第四位显示数据

}

}

想理解一个芯片,首先要先仔细看用户手册,在网上搜它的手册,然后重点看时序图那一块,你就会明白了,还要要理解IIC总线中的SDA和SCL,一个数据,一个时钟线,void

iic_ack(bit

ackbit)和bit

iic_waitack(void)

分别是应答和等待应答。void

iic_start(void)是开始,stop是结束,时序图里都有写,一般是在SCL拉低的时候,才能改变数据总线,unsigned

char

iic_recbyte(void)是接受字节数,你自己对照手册好好看吧

顺带看看IIC总线

,时间仓促,希望能帮到你一些。

void

iic_ack(bit

ackbit)

{

if(ackbit)

如果收到应答

SDA

=

0;数据为0

else

SDA

=

1;

somenop;延时

SCL

=

1;拉高时钟线

somenop;延时

SCL

=

0;拉低时钟

SDA

=

1;拉高数据线

somenop;

}

以上就是关于传感器 ad转换程序全部的内容,包括:传感器 ad转换程序、求51单片机实现AD转换及串口数据发送的程序谢谢了!、求高手详细解释一下这段单片机程序,是用pcf8591 实现ad转换的。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

原文地址:https://54852.com/zz/9758268.html

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

发表评论

登录后才能评论

评论列表(0条)

    保存