求AD转换程序

求AD转换程序,第1张

仅供参考:

#include<reg52.h> //52单片机头文件

#include<intrins.h> //内部库函数头文件

#define uchar unsigned char //变量宏定义

#define uint  unsigned int

//LCD

sbit CS1=P2^4 //片选1

sbit CS2=P2^3 //片选2

sbit DI=P2^2 //数据\指令选择

sbit RW=P2^1 //读\写选择

sbit E=P2^0 //读\写使能

sbit busy=P0^7 //忙标志位

//键盘

sbit jia=P1^0 //X+,X轴增加

sbit jian=P1^1 //X-,X轴减小

sbit jia1=P1^2 //Y+,Y轴增加

sbit jian1=P1^3 //Y-,Y轴减小

//ADC

sbit START=P2^7 //ADC转换启动

sbit OE=P2^6 //ADC输出使能

sbit EOC=P2^5 //ADC转换状态标志

//变量与数组

char a[107] //ADC数据采样缓存团圆敬

uint g=0,dianya=1 //采样频率,电压(信号幅度)

uchar code word[]= //汉字字模(楷体,右旋90,横向取码)

{

0x04,0x00,0x45,0x20,0x44,0xA8,0x2C,0x60,0x13,0xFE,0x1A,0x10,0x27,0x58,0x10,0x94,//数

0x0A,0x40,0x04,0x70,0x0B,0x4C,0x10,0xE0,0x30,0x20,0x20,0x20,0x20,0x00,0x00,0x00,

0x00,0x00,0x02,0x00,0x02,0x18,0x02,0x08,0x02,0x28,0x02,0x28,0x21,0x29,0x41,0x96,//字

0x3F,0x54,0x01,0x34,0x01,0x04,0x01,0x14,0x01,0x0C,0x01,0x00,0x00,0x00,0x00,0x00,

0x00,0x00,0x00,0x40,0x0C,0x40,0x07,0x40,0x00,0x44,0x00,0x44,0x10,0x44,0x3F,0xC4,//示

0x00,0x24,0x00,0x22,0x01,0x22,0x02,0x20,0x06,0x20,0x00,0x20,0x00,0x00,0x00,0x00,

0x00,0x00,0x18,0x20,0x0C,0x40,0x23,0x04,0x18,0x08,0x06,0x00,0x11,0xF0,0x11,0x10,//波

0x0A,0x90,0x04,0xFF,0x0A,0x88,0x11,0x88,0x30,0x18,0x20,0x00,0x20,0x00,0x00,0x00,

}

//ADC0808转塌慎换控制

uchar adc()

{

char AD //读数变量

START=0 //拉低电平

START=1 //拉高电平,在上升沿清零所有内部寄存器

START=0 //拉低电平,在下降沿的时候,开始进行AD转换

while(EOC==0) //等待转换结束(EOC=1,表腔毕示转换结束)

OE=1 //使能输出,允许数据线输出数据

AD=P3 //读取端口

OE=0   //停止输出

return AD

}

//LCD忙检测

void checkstate()

{

E=0DI=0RW=1 //读指令寄存器

do //循环输出状态值

{ E=1E=0}

while(busy==1) //判断,仅当busy=0时,中断循环

}

//写命令到LCD

void writecommand(uchar command)

{

checkstate() //查忙

E=0DI=0RW=0 //准备写指令

P0=command //指令送端口

E=1 //使能写入

E=0 //停止写入

}

//写数据到LCD

void writedate(uchar date)

{

checkstate() //查忙

E=0DI=1RW=0 //准备写数据

P0=date //数据送端口

E=1 //使能写入

E=0 //停止写入

}

//左右屏选择

void selectscreen(uint ss)

{

if(ss==0)CS1=0,CS2=0 //参数0,选全屏

if(ss==1)CS1=0,CS2=1 //参数1,选左屏

if(ss==2)CS1=1,CS2=0 //参数2,选右屏

if(ss==3)CS1=1,CS2=1 //参数3,不选屏

}

//清屏

void clearscreen(uchar ss)

{

uchar i,j //页,列变量

selectscreen(ss) //选屏

for(i=0i<8i++) //从0到7共8页

{

writecommand(0xb8+i) //写入页地址

writecommand(0x40) //首列地址

for(j=0j<64j++) //每页64列

writedate(0x00) //逐列写空字节,列地址自加1

}

}

//初始化LCD

void init_lcd()

{

selectscreen(0)

writecommand(0xc0) //设置起始行0行

writecommand(0x3f) //开显示

}

//us延时

void delayus(uint t)

{

while(t--)

}

//ms延时

void delayms(uint t)

{

uint i

while(t--)

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

}

//显示汉字(按列纵向显示)

void displaychines(uchar ss,uchar page,uchar col,uchar *dat,uchar n)

{

uchar k,y,x //汉字显示变量:字数,页,列,

for(k=0,y=0k<nk++,y+=2) //写入4个汉字,每写入一个汉字,页码+2

{

selectscreen(ss) //选屏

writecommand(0xb8+page+y) //写上半字页地址0页(0~2~4~6)

writecommand(0x40+col) //首列地址112列(右屏48列),自动加1

for(x=0x<16x++) //循环16次, 写上半字16个编码字节

{

writedate(dat[2*x+1+32*k]) //依次读取字符编码:1,3,5...15写入

}

writecommand(0xb8+page+y+1) //写下半字页地址1页(1~3~5~7)

writecommand(0x40+col) //首列地址112列(右屏48列),自动加1

for(x=0x<16x++) //循环16次, 写下半字16个编码

{

writedate(dat[2*x+32*k]) //依次读取字符编码:0,2,4...14写入

}

}

}

//按键 *** 作

void keyscan()

{

while(jia==0) //如果 X+ 键被按下

{

while(jia==0) //等待键松开后

if(g>0)g-=10 //若g 不为0则减1(采样频率减小)

}

while(jian==0) //如果 X- 键被按下

{

while(jian==0) //等待键松开后

if(g<100)g+=10 //g自加1  (采样频率增大)

}

while(jia1==0) //如果 Y+ 键被按下

{

while(jia1==0) //等待键松开后

if(dianya>1)dianya-=2 //若电压值不为0 则-1(幅度增大)

}

while(jian1==0) //如果 Y- 键被按下

{

while(jian1==0) //等待键松开后

if(dianya<12)dianya+=2 //电压值自+1  (幅度减小)

}

}

//在指定坐标(x,y)上描点函数(逐点绘图)

void lcd_pixel(uchar x,char y) //x水平坐标,y垂直坐标,Vect矢量绘图参数

{

char dat[8]  //定义列字节数组

uchar j  //循环变量

// y=63-y //更改y坐标为习惯方式

for(j=0j<8j++) dat[j]=0x00    //数组元素赋初值 0x00

dat[y>>3]|=0x01<<(y&0x07) //y值所在字节对应位置 1

if(x<64) //列坐标小于64

selectscreen(1) //选择左半屏

else   //列坐标大于等于64

{selectscreen(2)x-=64} //选择右半屏,列坐标调整为0~63

for(j=0j<8j++)   //每屏8页(0~7),8个字节

{

writecommand(0xb8+j)    //写页地址

writecommand(0x40+x)    //写列地址

writedate(dat[j]) //写字节数据

}

}

//主程序

void main()

{

uchar i //定义变量

char U

init_lcd() //初始化LCD

clearscreen(0) //清屏

while(1)

{

displaychines(2,0,48,word,4) //显示汉字:数字示波

keyscan() //按键扫描

for(i=0i<107i++) //ADC采样(取94个读数值)

{

a[i]=adc()/4 //读取AD值存入缓存数组

delayus(g) //延时g us,控制采样频率

}

for(i=0i<107i++ ) //循环94次,读取缓存数组中数据

{

U=a[i]/dianya //计算在12864中的幅值

lcd_pixel(i,U) //定位描点显示波形

}

delayms(2000)

clearscreen(0)

}

}

此程序是我做单片机课程设计的程序,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 P1.4 四个频率早含并选择按键

K2 EQU P1.5

K3 EQU P1.6

K4 EQU P1.7

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 P1.0,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 延时为0.001s的倍

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 P1.0,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 P1.4 四个频率选择按键

K2 EQU P1.5

K3 EQU P1.6

K4 EQU P1.7

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 P1.0,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 延时为0.001s的倍

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 P1.0,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.硬件设计上还有一个复位键,可以对程序进行按键复位

理光mp2014ad黑白数码复印机扫描过程不复杂,详细步骤如下肢坦:

1、打开理光打印一体机,点击显示屏左侧的scanner扫描按键。

2、然后打开上盖,把需要扫描的文件放到平台(注意是扫描内容朝下面)竖饥乱。

3、找到扫描文档的存放目的地,这里选择电子邮件。

4、选择邮箱地址,找不到也可以手动输入电子邮箱地址。

5、设置好之后,点击start开始扫描。

6、进入下图提示正在扫描界面,之后打开邮箱就可以下载已经扫描的文档。余档


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存