资源描述
单片机技术课程设计说明书
课题名称
目录
引言 3
一 设计任务 3
1设计内容 3
2设计要求 4
二 芯片功能介绍 4
三 总体功能图和总原理图 5
四 程序流程图 6
1 锯齿波程序流程图 6
2 三角波程序流程图 7
3 梯形波程序流程图 8
4 方波程序流程图 9
5 正弦波程序流程图 11
6 整体程序流程图 12
五 程序设计 13
六 仿真测试 16
七 总结与体会 19
八 参考文献 19
引言
信号发生器又称信号源或振荡器,在生产实践和科技领域中有着广泛的应用。这次的设计分为五个模块:单片机控制及显示模块、数模转换模块、波形产生模块、输出显示模块、电源模块。使用AT98C52作为主控台结合芯片DAC0832产生1HZ-10HZ频率可调的五种信号波(锯齿波、三角波、方波、梯形波、正弦波)。这几种波形有几个开关控制,可以随意进行切换,十分方便。另外,波形的频率和振幅也可以通过开关进行更改。可以说这次的设计操作简单,内容丰富,而且电路快捷明了。
1设计任务
1.1设计内容
以单片机为基础,设计并开发能输出多种波形(正弦波、三角波、锯齿波、梯形波等),且频率、幅度可变的函数发生器。
1.2设计要求
设计借口电路,将这些外设构成一个简单的单片机应用系统,画出接口的连接图和仿真图,并编写出控制波形的程序。
2芯片功能介绍
2.1、DAC0832芯片介绍:
DAC0832为一个8位D/A转换器,单电源供电,在+5~+15V范围内均可正常工作。基准电压的范围为±10V,电流建立时间为1μs,CMOS工艺,低功耗20mW。DAC0832的内部结构框图如下图所示。
图2.1 DAC0832的内部结构框图
2.2 DAC0832的外部引脚及功能介绍图如下:
图2.2 DAC0832介绍
2.3 DAC0832的应用:
DAC0832一是用作单极性电压输出,二是用作双极性电压输出,最后是用作程控放大器。
2.4 DAC0832与8031的连接方式:
DAC0832的与单片机的连接方式有三种方式:(1)单缓冲;(2)双缓冲、(3)直通方式。本程序采用的是方式一即单缓冲方式,ILE为高电平,CS、WR1、WR2、XFER为低电平。
图2.4 DAC0832引脚图
3 总体功能图和总原理图
函数发生器的设计
K2
键三角波
K3键梯形波
K4键方波
K5键正弦波
K6
调频调幅
K1
键
锯
齿
波
图3.1 总体功能图
图3.2 总原理图
4 程序流程图
4.1 锯齿波程序流程图
锯齿波的实现过程是首先定义一个初值然后进行加法操作,加的步数的多少则根据要求的频率来进行。然后加到某个数之后就再重新设置为初值,再重复执行刚刚的操作,如此循环下去。流程图如下所示:
设置初值A
MOV A,#00H DPT#8000H
MOVX @DPTR,A
加上设定的步数,ADD A,步数
判断A是否已经满了?
否
重新设置初值A
是
开 始
4.2 三角波程序流程图
三角波的实现是设置一个初值,然后进行加数,同样是加到某个数之后再进行减数,减到初值之后就再返回到先前的操作,这个操作跟锯齿波的实现是相似的。此程序输入的VREF的电压是+5V,因此该波形输出的最大频率是初值为00H和最终值为0FFH,且步数为1,这样输出的波形是最大的。
程序流程图如下图所示:
给A设置初值
MOV DPTR,#8000H
MOVX @DPTR,A
ADD A,步数
判断A是否已满?
否
是
SUBB A,步数
判断是否等于初值?
否/是
开 始
4.3 梯形波程序流程图
梯形波输出跟锯齿波和三角波相似,只不过当加到顶峰后的一段时间内不改变A的值,过了一段时间后再将减少A的值,不过先后的步数可以一样也可以不一样。然后减到初始的值后也要持续一段时间,然后再进行加数,如此循环下去。
程序流程图如下图所示:
开 始
给A设置初值
MOV A,#00H
是
持续一段时间
SUBB A,步数2
判断是否等于初值?
否
是
持续一段时间
MOVX @DPTR,A
ADD A,步数1
判断A是否已满?
否
4.4 方波程序流程图
此波形的实现更加简单,只需开始的时候设置一个初值然后直接输出这个值就行了,输出一段时间后,然后再重新置一个数据,然后再输出这个数据一段时间,但是此时的时间一定要等于前面那段时间。这样才是一个方波,如果两个时间不相同,那就相当于一个脉冲波了。流程图如下图所示:
开 始
给A设置初值
MOV DPTR,#8000H
MOVX @DPTR,A
设置输出的时间
再设置一个初值放入A中
MOVX @DPTR,A
输出一段时间
4.5 正弦波程序流程图
正弦波的实现则相对比较复杂,因为正弦波的实现是输出各个点的值就行了,可是各个点值则要通过正弦函数来求出,不过这些值直接去网上下载下来使用就可以了。输出的数据刚好是256个数据,这样则可以直接相加就行了。
流程图如下图所示:
4.6 整体程序流程图
如下图所示:
开 始
判断P1.0是否为1?
判断P1.1是否为1?
判断P1.2是否为1?
判断P1.3是否为1?
判断P1.4是否为1?
否
否
否
否
否
是
是
是
是
是
输出响应的波形
5 程序设计
//注:51单片机配合DAC0832生成三角波,和正旋波
#include<reg52.h>
#include<absacc.h>
#define uint unsigned int
#define uchar unsigned char
#define LED7 XBYTE[0x9f00]
#define LED6 XBYTE[0x9f01]
#define LED5 XBYTE[0x9f02]
#define LED4 XBYTE[0x9f03]
#define LED3 XBYTE[0x9f04]
#define LED2 XBYTE[0x9f05]
#define LED1 XBYTE[0x9f06]
#define LED0 XBYTE[0x9f07]
uint t[]= //共阴数码显示表(89c52)
{
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x40
};
sbit p27=P2^7;
sbit p26=P2^6;
sbit p25=P2^5;
sbit d0=P0^0;
sbit d1=P0^1;
sbit d2=P0^2;
sbit d3=P0^3;
sbit d4=P0^4;
sbit d5=P0^5;
sbit d6=P0^6;
sbit d7=P0^7;
unsigned char i;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void init()
{
LED0=0;
LED1=0;
LED2=0;
LED3=0;
LED4=0;
LED5=0;
LED6=0;
LED7=0;
}
unsigned char flag; //波型输出标置变量
void display()
{
LED7=t[flag];
}
bit time;
unsigned char sin(unsigned char x)
{
unsigned char code sin_tab[]={125,128,131,134,138,141,144,147,150,153,156,159,
162,165,168,171,174,177,180,182,185,188,191,193,196,198,201,203,
206,208,211,213,215,217,219,221,223,225,227,229,231,232,234,235,
237,238,239,241,242,243,244,245,246,246,247,248,248,249,249,250,
250,250,250,250,250,250,250,249,249,248,248,247,246,246,245,244,
243,242,241,239,238,237,235,234,232,231,229,227,225,223,221,219,
217,215,213,211,208,206,203,201,198,196,193,191,188,185,182,180,
177,174,171,168,165,162,159,156,153,150,147,144,141,138,134,131,
128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82,79,76,73,
70,68,65,62,59,57,54,52,49,47,44,42,39,37,35,33,31,29,27,25,27,29,27,25,23,21,
19,18,16,15,13,12,11,9,8,7,6,5,4,4,3,2,2,1,1,0,0,0,0,0,0,0,0,1,1,2,
2,3,4,4,5,6,7,8,9,11,12,13,15,16,18,19,21,23,25,27,29,31,33,35,37,
39,42,44,47,49,52,54,57,59,62,65,68,70,73,76,79,82,85,88,97,94,97,
100,103,106,109,112,116,119,122};
return sin_tab[x];
}
void DAC0832(unsigned char x)
{
P1=x;
}
void keyscan()
{
p27=1;
p26=0;
p25=1;
if(d1==0)
{
delay(5);
if(d1==0)
flag=0;
}
if(d2==0)
{
//delay(5);
// if(d2==0)
flag=1;
}
if(d3==0)
{
delay(5);
if(d3==0)
flag=2;
}
if(d4==0)
{
delay(5);
if(d4==0)
flag=3;
}
}
void main()
{
init();
//unsigned char i;
TMOD=0X02; //定时器0用于控制输出波的频率
TH0=256-40;
ET0=1; //按键接于外部中断0,与中断1
IT0=1;
IT1=1;
EX0=1;
EX1=1;
EA=1;
TR0=1;
flag=2; //开始时无输出
i=0;
while(1)
{
keyscan();
display();.
if(time==1)
{
time=0;
if(i>249)
i=0;
else
i++;
switch(flag) //当按键1的为输出三角波,按键2时输出正弦波
{
case 0AC0832(0);break;
case 1:
if(i>125)
DAC0832(250-i);
else
DAC0832(i);
break;
case 2:
DAC0832(sin(i));
break;
default: break;
}
}
}
}
void time0() interrupt 1
{
time=1;
}
/*
void int0() interrupt 0
{ //按键1接于外部中断0
flag=1;
}
void int1() interrupt 2 //按键2接于外部中断1
{
flag=2;
}
*/
6 仿真测试
现在使用软件Proteus进行仿真测试,下面就相应的仿真效果图:
图5 锯齿波仿真效果图
图6 三角波仿真效果图
图7 梯形波仿真效果图
图8 方波仿真效果图
图9 正弦波仿真效果图
从仿真的效果来看,这次的信号发生器的设计是很成功的。而且波形也产生的很漂亮和标准。
7 总结与体会
经过一系列的努力,终于顺利地完成了这个单片机课程的设计。这是一个磨练意志的过程。从课题的选择开始,计算器的设计、硬件和软件系统的设计、到最后的Proteus软件仿真完成,这其中经历了很多困难,但是更重要的是在这个过程中我得到了很大的锻炼。一方面通过C51单片机等一些器件的设计让我学习和掌握了单片机技术的基础知识和技术要点,也使以前学的很多知识都得到了运用;另一方面在用Proteus软件画电路图时,然后再转换成一维的WORD中进行编辑,这个过程中让我掌握了计算机辅助的设计技术。当然,这是一个需要不断的尝试,不断的校核,不断的修改,最后完成一个合理的设计的过程。需要的是细心和耐心。在很大程度上培养了我拼搏的工作精神。使我受益匪浅,更加明确了自己专业的方向。
在这一次的设计中,我不仅学到了关于单片机技术方面的许多专业知识,同时也让我感觉到团队合作的重要性。其实如何有效和快速的找到资料也是课设给我的启发,利用好图书馆和网络,是资源的到最好的利用。与他人交流思想是取得成功的关键,在交流中,不仅强化了自己原有的知识体系,也扩展了自己的思维。课设是一个通过思考、发问、自己解惑并动手、提高的过程。我会在以后的学习中不断学习,积累经验,不断完善自己,让自己变得更加出色。
参考文献
1、主编:张毅刚,副主编:彭喜元,董继成 《单片机原理及应用》,高等教育出版社
19
展开阅读全文