此程序是我做单片机课程设计的程序,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 "stc2052h"
#include "mainh"
void ADC_init(void);
void del(INT8U x);
void uart_init(void);
void PutHex(INT8U cp,INT8U len);
void ADC_SPI_Routine(void);
void Putstr(char cs);
/用的是5406,12M晶体,波特率不能太大,用2400,
实验过程是 在P16脚 接25v电压,开AD 读到最终值是80H,7FH 左右/
void main()
{
EA=0;
P1M0=0x40;
P1M1=0x00; //表示第P16作为AD输入
EA=1;
uart_init();
ADC_init();
while(1){
del(100);
uart_s_buf[0] = ADC_DATA;
uart_s_buf[1]=0x23;
PutHex(uart_s_buf,2);
del(1000);
}
}
void ADC_init(void)
{
ADC_CONTR |= 0x06;
ADC_CONTR |= 0x80;//开启ADC电源
del(1);
ADC_CONTR |= 0x08; //启动AD
AUXR |= 0x10;
EADC_SPI = 1;
}
void del(INT8U yj)
{
INT8U yj2=5000;
while(yj!=0)
{
while(yj2!=0)
{
yj2--;
}
yj2=1000;
yj--;
}
}
void uart_init(void)
{
SCON = 0x50;
//SCON: mode 1,8-bit UART, enable rcvr
AUXR = 0x80; // 作在1T模式
// PCON = 0x80; // 加速
TMOD = 0x20; // TMOD: timer 1,mode 2,8-bit reload TL0 NO USED
TH1 = SYS_TDATA; / 2400 Bds at 111184MHz /
TL1 = SYS_TDATA; / 2400 Bds at 111184MHz /
// ES = 1; / Enable serial interrupt/
TR1 = 1;
/ Timer 1 run /
}
void PutHex(INT8U cp,INT8U len)
{
ES=0;
TI = 0;
while(len--)
{
SBUF=cp;
cp++;
while(TI==0); //等待发送结束,死循环,如果TI==0,则死循环,如果TI==1,则执行下条。 同while(TI==0){;};
TI=0;
}
ES=0;
}
void Putstr(char cs)
{
TI=0;
while(cs) / 例如 :指向数组的指针,例如
int b[10];
int a = b;
a就是b[0]的地址a就是b[0]的内容
a+1就是b[1]的地址依此类推
又如char a = "hank";
那么通过a就能得到整个字符串"hank"
a是h
(a+1)是a 所以发送完k后 就是(cs==0)0了,那就跳出循环 /
{
SBUF=cs;
cs++;
while(TI==0);
TI=0;
}
}
void ADC_SPI_Routine(void) interrupt 5
{
EADC_SPI = 0;
ADC_CONTR |= 0x08; //ADC_START启动
ADC_CONTR &= 0xef; //ADC_FLAG清零
EADC_SPI = 1;
}
ORG 0000H
LJMP MAIN
ORG 0013H
LJMP PTM
MAIN: MOV TCON,#04H ;外部中断1设为下降沿触发
SETB EX1 ;开启外部中断1
SETB EA ;开启总中断
MOV A,#0F8H
MOV DPTR,#0EFF8H ;外围口EFF8H
MOVX @DPTR,A ;将F8H送外围口
LOOP: ACALL DALY
MOV A,#0F8H
MOV DPTR,#0EFF8H ;同上
MOVX @DPTR,A ;同上
AJMP LOOP
DALY: MOV R7,#250
DJNZ R7,$
RET
PTM: MOV DPH,#0EFH ;同上同一个外围口
MOVX A,@DPTR ;读取该口的值
MOV P1,A ;送P1(或许是显示吧)
RETI
END
可以尝试一下办法:
1、点击设置﹣应用程序﹣全部﹣找到该软件﹣﹣清除数据,清除一下软件数据再打开。
2、卸载后重新下载安装相应的程序。
3、如果是所有的软件都出现打开慢或者打开有问题的情况,可以备份在 recovery 里清空缓存和用户数据试一下。
方法:关机状态下,先按住“音量增加键”再按住“电源键”,等出现开机画面时松手,进入 Recovery 。选择简体中文>清除数据>清除缓存+清除用户数据。提示:Recove ry 状态下触摸屏暂时失效,用“电源键”确认,“音量键”选择。
4、如果通过上述方法 *** 作后,应的程序都有问题,而其他软件程序都正常的话,可以判断该程序跟系统不兼容,可以尝试更换其他版本的程序或者游戏试一下。
5、建议备份重新线刷一下系统版本后尝试。
以上就是关于传感器 ad转换程序全部的内容,包括:传感器 ad转换程序、单片机AD程序,如何采样,要求自己写的,不要网络版本、单片机ad转换实验,本人学渣,有程序,但不知道怎么用,明天实验验收求大神等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)