基于51单片机和DAC0832的信号源proteus电路图加程序.docx

上传人:b****8 文档编号:9482850 上传时间:2023-02-04 格式:DOCX 页数:21 大小:1,005.73KB
下载 相关 举报
基于51单片机和DAC0832的信号源proteus电路图加程序.docx_第1页
第1页 / 共21页
基于51单片机和DAC0832的信号源proteus电路图加程序.docx_第2页
第2页 / 共21页
基于51单片机和DAC0832的信号源proteus电路图加程序.docx_第3页
第3页 / 共21页
基于51单片机和DAC0832的信号源proteus电路图加程序.docx_第4页
第4页 / 共21页
基于51单片机和DAC0832的信号源proteus电路图加程序.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于51单片机和DAC0832的信号源proteus电路图加程序.docx

《基于51单片机和DAC0832的信号源proteus电路图加程序.docx》由会员分享,可在线阅读,更多相关《基于51单片机和DAC0832的信号源proteus电路图加程序.docx(21页珍藏版)》请在冰豆网上搜索。

基于51单片机和DAC0832的信号源proteus电路图加程序.docx

基于51单片机和DAC0832的信号源proteus电路图加程序

基于51单片机和DAC0832的信号源(proteus电路图加程序)

LT

此方案,电路复杂,干扰因素多,不易实现。

方案二:

直接利用波形产生芯片,例如,利用MAX038芯片组成的电路输出波形。

MAX038是精密高频波形产生电路,能够产生准确的锯齿波、三角波、方波和正弦波四种周期性波形。

但此方案成本高,程序复杂度高。

方案三:

通过单片机控制DAC,输出五种波形。

此方案输出的波形分辨率不够高,频率有限。

但此方案电路简单、成本低,波形和频率容易选择。

一.实验元件及原理介绍

1.80C51单片机

80C51单片机属于MCS-51系列单片机,由Intel公司开发,其结构是8048的延伸,改进了8048的缺点,增加了如乘(MUL)、除(DIV)、减(SUBB)、比较(CMP)、16位数据指针、布尔代数运算等指令,以及串行通信能力和5个中断源。

采用40引脚双列直插式DIP(DualInLinePackage),内有128个RAM单元及4K的ROM。

它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机、而且其价格便宜。

图1.80C51单片机及键盘电路

图1所示是80C51单片机以及接口电路,由于Proteus对单片机的VCC和GND是默认自动连接的,所以这里就不需要再连接电源和地了。

本次试验使用80C51单片机内部晶振,所以也无需外接晶振。

按键S1和S2分别连接到80C51的INT0(P3.2)和INT1(P3.3),按键S1控制波形选择,每按一次变换一次波形,分别为正弦波、方波、锯齿波、梯形波和三角波。

按键S2控制频率,共七档,每按一次频率下降为上一次的1/3。

2.DAC0832数模转换器

DAC0832是8分辨率的D/A转换集成芯片。

与微处理器完全兼容。

这个DA芯片以其价格低廉、接口简单、转换控制容易等优点,在单片机应用系统中得到广泛的应用。

D/A转换器由8位输入锁存器、8位DAC寄存器、8位D/A转换电路及转换控制电路构成。

图2.DAC0832器件以及I/V变换电路

图2所示是DAC0832器件以及I/V变换电路。

DAC0832有两级缓冲,本次试验采用直通模式,即把ILE、CS、WR1、WR2、XFER都设置为有效,使两个寄存器都处于开放状态,无需控制信号,DAC0832的输出随时跟谁输入数字的变化而变化,这样只要输入的八位数字量变化,就直接进行DA转换。

图中的运算放大器是实现I/V变化功能,由于DAC0832输出的是电流信号,且Iout1和Iout2的电流之和为一常数,在DAC寄存器各位都是1时,Iout1输出最大,一般在单极性输出时把Iout2接地,双极性输出时接运放。

如果要调整放大系数,只需要在运放输出端与反馈端串联一可调电阻即可。

三.系统软件介绍

本信号源主程序主要有三部分构成:

主程序模块、外部中断一模块、外部中断2模块。

1.主程序介绍

主程序开始后首先进行初始化,然后根据波形标志a,b,c,d,e的值进入相应的while循环,这样写的好处是指令简洁,输出的波形频率可达近800Hz。

在while循环中,单片机根据地址标志位不停低查表,然后把查得的值赋给DAC0832的数据口,然后地址标志位加一,并判断地址标志位是否等于64,如果是就置0再往下执行,如果不是直接往下执行。

然后根据频率标志位进行相应的延时。

其中波形是取一个周期内的64个点进行描绘,波形ROM表是将信号一个周期等间距地分离成64个点,储存在单片机得RON内。

具体ROM表是通过MATLAB生成的,例如正弦表,MATLAB生成的程序如下:

x=0:

2*pi/64:

2*pi;y=round(sin(x)*127)+128

输出数字量到DAC0832

开始

延时

数组下标置零

数组下标是否为64

数组下标加一

根据数组下标查表

While循环

根据不同波形标志选择相应的while循环

初始化

 

图3主程序流程图

2.中断服务子程序

本程序有两个中断,中断1控制波形选择,中断2控制频率。

图4.中断程序框图

四.实验结果

用Proteus软件绘制好原理图,用Keil软件生产程序的Hex文件,导入到80C51单片机中,就可以仿真了。

实现结果用一下图形表示。

1.生成的正弦波

系统开机默认的是正弦波,通过按动S1按钮可以选择波形,按动S2可以调节频率。

图5798.6Hz频率正弦波

按S2按钮,频率降低三倍后的正弦波

图6.266.2Hz正弦波

 

2.生成方波

图7.798.6Hz方波

调节S2按钮,生成88.7Hz的方波

图7.88.7Hz方波

3.生成锯齿波

图8.798.6Hz锯齿波

4.生成梯形波

图9.798.6Hz梯形波

5.生成三角波

图10.798.6Hz梯形波

按动S按钮,生成266.2Hz三角波

图11.266.2Hz三角波

五.实验总结

第一次使用Proteus软件,感觉这个软件使用非常方便,上手很快,仿真的时候还可以看到引脚上的电平变化,对于故障排除与实验分析非常方便。

本次实验产生的波形能够满足一般的要求,但是频率还是比较低,最大仅有798.6Hz,而且分辨率还不够高,把时间调小后还可以看到阶梯线,这个把函数表做的大一点,可以提高分辨率,但是那样又会影响频率。

这种单片机信号源,提高信号频率的最好方法是提高单片机的主频。

六.附录

1.实验硬件总体电路图

图12.实验总电路图

2.实验程序

#include

#defineucharunsignedchar

#defineuintunsignedint

sbitcsda=P2^2;//p2.2口作为0832的片选端

sbitwr=P2^1;//p2.1口作为0832的写信号控制端

sbits1=P3^2;//按键1的接口,选择波形

sbits2=P3^3;//按键2的接口,选择频率

uchark=0,p=0,delay=0;//k是数组下标p是频率标志delay是延时时间

ucharbxxz=0;pinlv=0;//bxxz波形标志,pinlv是频率对应的延时

uchara=1,b=0,c=0,d=0,e=0;//a,b,c,d,e分别对应正弦波,方波,锯齿波,梯形波,三角波

ucharcodesin[64]={

135,145,158,167,176,188,199,209,218,226,234,240,245,249,252,254,254,253,251,247,243,237,230,222,213,204,193,182,170,158,

146,133,121,108,96,84,72,61,50,41,32,24,17,11,7,3,1,0,0,2,5,9,14,20,28,36,45,55,66,78,90,102,114,128

};//正弦波函数表

ucharcodejuxing[64]={

255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,

255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0

};//方波函数表

ucharcodejuchi[64]={

0,4,8,12,16,20,24,28,32,36,40,45,49,53,57,61,65,69,73,77,81,85,89,93,97,101,105,109,113,117,121,125,130,134,138,142,

146,150,154,158,162,166,170,174,178,182,186,190,194,198,202,206,210,215,219,223,227,231,235,239,243,247,251,255

};//锯齿波函数表

ucharcodetixing[64]={

0,13,26,39,52,65,78,91,104,117,130,143,156,169,182,195,208,221,234,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,247,

247,247,247,247,247,247,247,242,229,216,203,190,177,164,151,138,125,112,99,86,73,60,47,34,21,8

};//梯形波函数表

ucharcodesanjiao[64]={

0,8,16,24,32,40,48,56,64,72,80,88,96,104,112,120,128,136,144,152,160,168,176,184,192,200,208,216,224,232,240,248,

248,240,232,224,216,208,200,192,184,176,168,160,152,144,136,128,120,112,104,96,88,80,72,64,56,48,40,32,24,16,8,0

};//三角波波函数表

voiddelay1()//延时时间函数,延时一毫秒

{

inta,b;

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

for(b=122;b>0;b--);

}

voidint0()interrupt0///中断1,选择波形

{

EX0=0;//关中断

delay1();

if(s1==0)

{

bxxz++;

if(bxxz==5)//波形标志为5后,重新置零

bxxz=0;

switch(bxxz)//每按动一次S2,改变波形

{

case0:

{a=1,b=0,c=0,d=0,e=0;}

break;

case1:

{a=0,b=1,c=0,d=0,e=0;}

break;

case2:

{a=0,b=0,c=1,d=0,e=0;}

break;

case3:

{a=0,b=0,c=0,d=1,e=0;}

break;

case4:

{a=0,b=0,c=0,d=0,e=1;}

break;

}

delay1();

while(!

s1);

}

while(!

s1);

EX0=1;

}

voidint1()interrupt2//中断1,频率选择

{

EX1=0;

delay1();

if(s2==0)

{

p++;

if(p==8)//频率标志是8后,重新置零

p=0;

switch(p)//每按动一次,频率减为三分之一

{

case1:

pinlv=3;

break;

case2:

pinlv=6;

break;

case3:

pinlv=9;

break;

case4:

pinlv=12;

break;

case5:

pinlv=15;

break;

case6:

pinlv=18;

break;

case7:

pinlv=21;

break;

default:

pinlv=0;

break;

}

delay1();

while(!

s2);//按键没松开,不再重新执行中断,防止抖动

}

while(!

s2);

EX1=1;//开中断

}

voidmain()

{

csda=0;

wr=0;//片选和WR端置零,0832直通模式

EA=1;//开中断

IT0=1;

EX0=1;

IT1=1;

EX1=1;//中断0和1开中断

while

(1)

{

while(a)//根据五种波形的标志位执行相应的循环

{

delay=pinlv;

P0=sin[k];//把数组中的数值付给p0口

k++;

if(k==64)//查表下标为64后重新置零

k=0;

while(delay)

delay--;//根据频率不同延时相应的时间

}

while(b)

{

delay=pinlv;

P0=juxing[k];

k++;

if(k==64)

k=0;

while(delay)

delay--;

}

while(c)

{

delay=pinlv;

P0=juchi[k];

k--;

if(k==0)

k=64;

while(delay)

delay--;

}

while(d)

{

delay=pinlv;

P0=(247-tixing[k]);

k++;

if(k==64)

k=0;

while(delay)

delay--;

}

while(e)

{

delay=pinlv;

P0=sanjiao[k];

k++;

if(k==64)

k=0;

while(delay)

delay--;

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1