基于STC89C52的简易波形发生器文档格式.docx

上传人:b****6 文档编号:16769758 上传时间:2022-11-26 格式:DOCX 页数:19 大小:222.75KB
下载 相关 举报
基于STC89C52的简易波形发生器文档格式.docx_第1页
第1页 / 共19页
基于STC89C52的简易波形发生器文档格式.docx_第2页
第2页 / 共19页
基于STC89C52的简易波形发生器文档格式.docx_第3页
第3页 / 共19页
基于STC89C52的简易波形发生器文档格式.docx_第4页
第4页 / 共19页
基于STC89C52的简易波形发生器文档格式.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

基于STC89C52的简易波形发生器文档格式.docx

《基于STC89C52的简易波形发生器文档格式.docx》由会员分享,可在线阅读,更多相关《基于STC89C52的简易波形发生器文档格式.docx(19页珍藏版)》请在冰豆网上搜索。

基于STC89C52的简易波形发生器文档格式.docx

总体系统框架是由按键、最小系统模块、DAC0832、转串口模块组成,这样就可以实现多函数输出和PC机通信。

按键是为了实现波形的切换和频率的大小调节,最小系统是系统的主控制模块,是沟通按键、DAC0832模块、PC机的主控模块,是系统必不可少的模块。

转串口模块式为了实现单片机与PC的通信,PC可以通过上位机控制波形的选择和频率大小设置。

3.2最小系统模块电路

图3.2

图3.2是STC89C52的最小系统图,组成局部有时钟电路和复位电路。

实现的功能是控制DAC0832的模拟输出量的大小和输出的频率,以产生方波、三角波、正弦波、锯齿波,并通过与转串口电路的结合以实现与PC机之间的通信。

3.3DAC0832模块电路

图3.3

上图中DAC0832电路的接法是直通型接法,这种接法的最大特点就是只需要对DAC0832的数据口赋值就可以实现电压的输出,所以操作起来非常方便,而DAC0832输出的并不是电压,而是电流所以要在输出端加上一个运放实现电流到电压的转换。

选用LM358的原因是它输出端的电压可以到达负电压,这样就可以实现单电源供电了。

3.4按键电路

图3.4

按键是通过单片机的P0口进展监控,当单片机检查到有按键按下时,单片机就会根据按键对DA输出进展相应的改变,这样就可以实现按键对输出波形的切换和频率的调节。

3.5转串口电路

图3.5

转串口用的芯片是CH340,CH340产家提供有两种接法,一种是可以把PC机串口的电平转变为USB电平,另外一种可以直接把单片机的电平转换为USB电平,本设计选用的是第二种接法,因为这样接就可以省去了MAX232把单片机电平转换外PC机电平,这样设计电路变得更加可靠稳定了,同时也可以节省本钱,同样本电路也是需要时钟电路让CH340能正常工作。

4.系统软件设计

系统软件由主程序和产生波形的子程序组成,软件设计主要是产生各种波形的子程序的编程,通过编程可得到各种波形。

周期的改变可采用插入延时子程序的方法来实现。

主程序和几种常用波形子程序的流程图如下图。

4.1主流程图

图4.1

由图4.1可以简单的知道,程序的大概思路是,判断按键与上位机是否发送数据来觉得DA的输出量,初始化的时候程序是写输出频率为200HZ的方波信号。

 

4.2软件模拟仿真

图4.2锯齿波仿真

锯齿波产生是通过P2口将00H送入存放器A中,DAC0832输出A中的内容,读取P2口的状态,取反后作为延时常数,当A中的内容不为0FFH时,A中的内容加1,当A中的内容等于FFH返回开场,从而输出波形。

锯齿波程序

voidjuchibo(void)

{

for(num=0;

num<

256;

num++)

{cs=0;

DAC0832=num;

cs=1;

while(a==0);

a=0;

}

}

4.3方波仿真图

图4.3方波仿真

方波产生是通过P2口将00H输出给DAC0808,输出对应模拟量,然后读取P2口的状态,取反后作为定时器延时,延时时间到,将FFH输出时,同样输出对应模拟量,再延时,从而得到方波。

方波程序如下:

voidfangbo(void)

127;

DAC0832=0XFF;

};

for(num=127;

num>

0;

num--)

DAC0832=0X00;

4.4按键检测原理

voidchangbo(void)

if(P32==0);

delay(20);

if(P32==0)

flag++;

if(flag>

=4)

flag=0;

总结

通过设计简易的函数发生器,我学会了自己查资料,通过大量的资料结合,最终决定了现在所选用的方案,接下来就是运用之前学习过的Protel99se画板技术,成功的画出了电路图。

接着是电路的调试,这一个步骤是最难的,当然遇到的挫折也是最多的,例如开场的时候没有对DAC0832深入了解造成了,电路设计没错就是不能正常工作,最后慢慢的调节,发现原来是自己所选用的参考电压出问题,本来应该选用负电压作为参考电压,按照手册提供的经典电路才能得到一个正电压,但是由于没注意到这点所以画了很多的时间。

能够把电路正常的调处来还要感谢同学对我的帮助,因为他们做过这样给我更加大的信心。

调完了电路后接下来的是进展写程序,开场调式程序的时候有点乱,因为没有画完流程图在调,所以思路会比拟混乱。

不过后来通过参照网上的程序,终于实现了题目所要的功能。

参考文献

[1]周明德.微型计算机系统原理及应用[M].:

清华大学,2002.341~364.

[2]X乐善.微型计算机接口技术及应用[M].:

航空航天大学,2001.258~264.

[3]童诗白.模拟电路技术根底[M].:

高等教育,2000.171~202.

[4]杜华.任意波形发生器及应用[J].国外电子测量技术,2005.1:

38~40.

[5]X友德.单片微型机原理、应用与实践[M].XX:

复旦大学,2004.40~44.

[6]程朗.基于8051单片机的双通道波形发生器的设计与实现[J].计算机工程与应用,2004.8:

100~103.

[7]X永瑞.电子测量技术根底[M].XX:

XX电子科技大学,2006.61~101.

[8]李叶紫.MCS-51单片机应用教程[M].:

清华大学,2004.232~238.

附件

I源程序

/********************************************

时间:

2021年6月23日15:

33:

43

硬件条件:

stc89c52rc单片机上

工程:

函数发生器

龙腾跃

准备知识:

通过DAC0832实现信号的发生,DAC0832选用的是直通型输出方式

修改:

*********************************************/

#include<

REGX52.H>

#include"

Delay_time.h"

Uart.h"

#include<

intrins.h>

//#include"

boxing.h"

sbitCS=P3^7;

sbitup=P0^0;

sbitdown=P0^1;

bitflag=0,flag1=0,flag2=1,flag3=0,flag5=0,flag6=1,cont=1;

unsignedintnum4=170,num3=188,num2=0,num1=0;

unsignedcharmark=0;

unsignedchark=1;

unsignedcharN=0x00;

unsignedinttmp;

unsignedchari=0;

unsignedintt=2;

unsignedchartable[4];

voidTriangle();

//输出三角波

voidSquare();

//方波

voidsin();

//正弦波

voidSawtooth();

//锯齿波

voidchange();

unsignedcharcodesin_tab[]=//正弦波输出表

0x80,0x83,0x86,0x89,0x8D,0x90,0x93,0x96,0x99,0x9C,0x9F,0xA2,0xA5,0xA8,0xAB,0xAE,

0xB1,0xB4,0xB7,0xBA,0xBC,0xBF,0xC2,0xC5,0xC7,0xCA,0xCC,0xCF,0xD1,0xD4,0xD6,0xD8,

0xDA,0xDD,0xDF,0xE1,0xE3,0xE5,0xE7,0xE9,0xEA,0xEC,0xEE,0xEF,0xF1,0xF2,0xF4,0xF5,

0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,

0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFE,0xFD,0xFD,0xFC,0xFB,0xFA,0xF9,0xF8,0xF7,0xF6,

0xF5,0xF4,0xF2,0xF1,0xEF,0xEE,0xEC,0xEA,0xE9,0xE7,0xE5,0xE3,0xE1,0xDF,0xDD,0xDA,

0xD8,0xD6,0xD4,0xD1,0xCF,0xCC,0xCA,0xC7,0xC5,0xC2,0xBF,0xBC,0xBA,0xB7,0xB4,0xB1,

0xAE,0xAB,0xA8,0xA5,0xA2,0x9F,0x9C,0x99,0x96,0x93,0x90,0x8D,0x89,0x86,0x83,0x80,

0x80,0x7C,0x79,0x76,0x72,0x6F,0x6C,0x69,0x66,0x63,0x60,0x5D,0x5A,0x57,0x55,0x51,

0x4E,0x4C,0x48,0x45,0x43,0x40,0x3D,0x3A,0x38,0x35,0x33,0x30,0x2E,0x2B,0x29,0x27,

0x25,0x22,0x20,0x1E,0x1C,0x1A,0x18,0x16,0x15,0x13,0x11,0x10,0x0E,0x0D,0x0B,0x0A,

0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,0x0B,0x0D,0x0E,0x10,0x11,0x13,0x15,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x25,

0x27,0x29,0x2B,0x2E,0x30,0x33,0x35,0x38,0x3A,0x3D,0x40,0x43,0x45,0x48,0x4C,0x4E,

0x51,0x55,0x57,0x5A,0x5D,0x60,0x63,0x66,0x69,0x6C,0x6F,0x72,0x76,0x79,0x7C,0x7E

voidmain()

Uart_init();

Delaynms(1000);

send_string("

作者:

龙腾跃"

);

Delaynms(10);

Enter();

作品:

简易信号发"

生器"

初始波形为200HZ"

方波"

CS=0;

up=1;

down=1;

while

(1)

{

if(flag)

Triangle();

if(flag1)

Sawtooth();

if(flag2)

Square();

if(flag3)

sin();

change();

if(flag5&

&

flag6)

if(mark==4&

cont)

{

num4=170-t;

flag=0;

flag1=0;

flag2=0;

flag3=1;

send_data(num4);

}

if(mark==3&

num3=(200.0/t)*188;

flag2=1;

flag3=0;

send_string("

频率:

"

send_data(t);

send_string("

HZ"

}

if(mark==2&

num2=t;

flag1=1;

send_data(num2);

if(mark==1&

num1=5-t/10;

flag=1;

flag5=0;

}

voidUart(void)interrupt4using1//串口中断子函数

if(1==RI)//必须进展判断才可以实现中断的对应响应

RI=0;

table[i]=SBUF;

i++;

if(i==4)

t=(table[2]-48)*100+(table[3]-48)*10+(table[0]-48);

mark=table[1]-48;

flag5=1;

TR0=0;

i=0;

flag6=~flag6;

cont=1;

/*********************************************************

输出三角波

*********************************************************/

voidTriangle()

unsignedcharl;

unsignedintj;

for(l=0;

l<

255;

l=l+k)

{

P2=l;

while(j<

num1)

j++;

j=0;

for(l=255;

l>

1;

l=l-k)

输出方波函数

voidSquare()

unsignedintj=0;

N=~N;

P2=N;

while(j<

num3)

j++;

j=0;

输出正弦波函数

voidsin()

unsignedinti,j=0;

for(i=0;

i<

i++,j=0)

num4)

P2=sin_tab[i];

输出锯齿波函数

voidSawtooth()

l++)

num2)

P2=l;

//databyte

调整函数

voidchange()

if(!

up)

Delaynms(15);

k++;

while(!

up);

if(k==2)

flag=0;

flag1=1;

flag2=0;

flag3=0;

if(k==3)

flag1=0;

flag2=1;

if(k==4)

flag3=1;

if(k==5)

flag=1;

k=1;

if(!

down)

if(mark==4)

num4=num4-10;

if(mark==3)

num3=num3+10;

send_data(num3);

if(mark==2)

num2=num2+10;

if(mark==1)

num1=num1+10;

cont=0;

down);

II总电路图

总图PCB

元器件清单

电解电容10uf

1个

瓷片电容30pf

2个

电阻10K

晶振12MHz

按钮开关

LM324集成块

1块

DAC0832

AT89S52

DIP-40封装插座

DIP-20封装插座

导线假设干

星轨

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

当前位置:首页 > 幼儿教育 > 家庭教育

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

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