多功能波形发生器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

1.设计选题及任务

设计题目:多功能波形发生器

任务与要求:

设计一个由单片机控制的波形发生器。运用单片机系统控制产生多种波形,这些波形包括方波、三角波、锯齿波、正弦波等。信号发生器所产生的波形的频率、幅度均可调节。并可通过软件任意改变信号的波形。

基本要求:

1. 产生方波、三角波、锯齿波、正弦波可通过开关选择

2.波形幅值调围80H~FFH,两档。周期两档

3.有波形指示幅值周期档显示功能。

2.系统概述及硬件简介

随着科技的发展和现代科研的需要,信号发生器已经成为了很多行业进行研究测试不可或缺的工具,但目前使用波形发生器大部分体积大,可靠性差,准确度低。因此为了实验研究方便,研制一种体积小、可靠性强、准确性高的波形发生器显得尤为重要。

方案总体设计框图

图2.1

总体电路图见附录2。由于proteus单片机已默认连接复位电路、晶振电路、以及电源,所以本设计中没有这几个模块的具体电路。

3.软件的实现

系统软件由主程序和外部中断程序,定时器中断程序以及键值判断子程序,显示子程序子程序组成,波形的产生主要通过定时器中断来完成。波形的转换通过改变波形标志位实现。周期的改变可通过定时器的初值改变的方法来实现。幅值可通过初始值的改变而方法来实现,由LCD1602完成显示部分。具体如下所述3.1波形的产生原理

将各种波形的每个周期平均分成255份,把每份的值依次发给P0口,每份的时间间隔通过开启定时器0来控制,当定时时间到时单片机就产生中断,在中

断服务程序里面通过P0口将每份的值发出去,这个值通过DAC0832转换为模拟量。 如图3.1

图3.1

3.2波形的产生过程 3.2.1正弦波的产生过程

对正弦波的一个周期进行等间隔的采样,采样次数为255次,将所采样的数值转化为8位二进制数存放在数组tosin[255]里面。然后定义一个无符号型变量b ,当定时器产生一次中断,单片机就将tosin[b]值赋予P0引脚,同时变量b 自加1,并且当b 加到255时会自动变为0,因为无符号型变量的围是0~255。 程序如下:

{

case 0: //fun==0

正弦波 { P0=tosin[b] ; b++; }break;

3.2.2三角波的产生过程 定义一个无符号变量c ,每当定时器定时时间到达时,如果c 值大于0而小于128,c 自加1,将c 值赋予P0口;如果c 值大于128,则用255减去c 值赋予P0口;

程序如下:

case 1: // fun==1三角波

{

if(c<128) P0=2*c;

else

P0=2*(255-c);

c++; } break;

给赋值结果乘以2,因为不乘2的话,锯

齿波中的变量e 最大可以加到255,但三

角波中赋予P0口的最大值只有128,为了让输出电压幅值统一期间,我们对其乘以

2。

图3.3

3.2.3方波的产生过程

方波较其它波的产生原理较简单,它也是定义一个无符号字符变量d ,当定时器产生一次中断则d 自动加1。当d 小于128时,将0xff 赋予P0口;当d 大于128时,将0x00赋予P0口;

程序如下:

case 2: //fun==2 方波

{

d++;

if(d<=128)

P0=0x00; else

P0=0xff;

}break;

图3.4

3.2.4锯齿波的产生过程

锯齿波的产生是定义一个变量e,每当定时器中断一次,则把n值赋予P0口。同时n自加1。在此处当e加到255时则会自动溢出变为0。

程序如下:

case 3: //fun==3锯Array齿波

{ if(n<255)

{P0=n;}

n++;

}break;

图3.5

3.3波形的选择及调频调幅的实现

波形的选择及调频调幅通过P1口按键选择来实现,具体如下所述

3.3.1波形的选择

在本方案中,我们通过1#按键进行波形选择。具体方法是定义一个变量fun,当1#按键按下一次时,其就自动加1。其不同的数值代表不同的波形。

具体如下:

fun==0代表正弦波

fun==1代表三角波

fun==2代表方波

fun==3代表锯齿波

3.3.2调幅功能的实现

本方案对波形的幅值可以调节为5V、4V、3V、2V、1V;在这里我们定义一个变量“chu”,并且将赋予P0端口的值5等分,也就是把那个值先除以5,再乘以变量“chu”,所以在这里只要改变变量“chu"的值就可以改变输出波形的幅值。在方案中是通过2#按键改变变量的。

void key2(void) //选择幅值

{ chu++;

if(chu==11)

chu=0x01;}

具体的调压方式以正弦波说明如下:

case 0: //fun==0正弦波

{

P0=tosin[b]/5*chu;

b++;

}break;

也就是说,调压功能把将要赋给P0口的值除以5乘以“chu”即可实现。

3.3.3调频功能的实现

由于波形的输出时通过将一个周期的完整波形平均分成255份,每等份的时间是由定时器0初值来确定的。故在这里改变定时器0的初值就可以改变输出波形的频率。

本方案是通过3#按键来调频的,定义一个变量fre,每按一下fre加1,则定时器初值改变,频率改变。

3.4按键中断方式的介绍及程序

本方案采用独立式按键中断来控制单片机的,相比较键盘扫描方式而言大大的节省了CPU运行时间,因为扫描方式单片机不停的忙于扫描键盘,而中断方式不需要,只要键盘有按键按下,硬件就会给单片机一次中断,单片机收到外部中断后采取扫面键盘一次,所以无需不停地扫描。

void exinto(void) interrupt 0

{EA=0;

TR0=1;

key_value=(P1&0Xff);

EA=1;

}

void judge(void) //键值判断程序

{

uchar line;

line=key_value;

if(line==0xfe)key1();

if(line==0xfd)key2();

if(line==0xfb)key3();

key_value=0;

}

4.仿真与调试分析

本次实验我们是在proteus仿真软件下完成的。

系统的仿真波形如下:

正弦波

相关文档
最新文档