
#include <intrins.h>
#include <string.h>颤丛核
#include <stdio.h>
//定义与ADC有关的寄存器
sfr P1_ADC_EN=0x9d //AD转换功能允许寄存器
sfr ADC_CONTR=0xbc //AD转换控制寄存器
sfr ADC_DATA=0xbd //AD转换结果寄存器,高8位
sfr ADC_DATAL2=0xbe //AD转换结果寄存器,低2位
sfr ADC_AUXR1=0xa2
sbit LED1_CS=P0^0
typedef unsigned char INT8U
typedef unsigned int INT16U
void delay(INT8U delay_time)//延时函数
{
INT8U n
INT16U m
for(n=0n<delay_timen++)
{
for(m=0m<1000m++)
}
}
INT16U get_AD_result(INT8U channel)
{ int i
INT16U myRS
INT8U myRSL
INT8U AD_finished=0 //存储AD转郑渗化标志
ADC_DATA=0
ADC_CONTR=channel //选择ad当前通道
_nop_()
_nop_()
_nop_()
_nop_()
ADC_CONTR |=0x80
_nop_()
_nop_()
_nop_()
_nop_()
ADC_AUXR1&=0xfb
ADC_CONTR |=0x08 //令ADC_START=1,启动AD转换茄掘
for(i=1i<=100i++)
AD_finished=0
while(AD_finished==0)
{
AD_finished=(ADC_CONTR &0x10)//AD_FLAG==1测试AD转换结束否
}
ADC_CONTR &=0xf7 //令ADC_START=0,关闭AD转换,AD_FLAG=0,清零
myRSL =ADC_DATAL2
myRSL&=0x03
myRS=0
myRS=ADC_DATA
myRS=myRS*4
myRS=myRS+myRSL
return(myRS) //返回AD转换结果
}
void main()
{
float rs
SCON=0x50
TMOD=0x20
PCON=0x80
TL1=0xf4
TH1=0xf4
TR1=1
TI=1
P1=P1|0x63 //要设置为AD专函的P1.x口,先设为高
P1_ADC_EN=0x63 //p1.0.1.5.6设置为AD转换输入脚
//断开P1.0,P1.1,P1.5,P1.6内部上拉电阻
while(1)
{
if (LED1_CS==0)
LED1_CS=1
else
LED1_CS=0
rs=get_AD_result(0)
rs=rs/1024.00
printf("ad is %f\n",rs)
delay(0x20)
}
}
此程序是我做单片机课程设计的程序,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.硬件设计上还有一个复位键,可以对程序进行按键复位
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)