简易信号发生器及其测试仪设计与制作Word文档格式.docx
- 文档编号:21153687
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:31
- 大小:5.24MB
简易信号发生器及其测试仪设计与制作Word文档格式.docx
《简易信号发生器及其测试仪设计与制作Word文档格式.docx》由会员分享,可在线阅读,更多相关《简易信号发生器及其测试仪设计与制作Word文档格式.docx(31页珍藏版)》请在冰豆网上搜索。
1.利用计算机设置信号波形、幅度、频率等;
2.利用计算机显示所测得的信号参数;
3.其他(如扫频等)。
四、设计思路
使用C语言进行编程,控制按下键盘中某个键实现特定的功能,通过单片机的I/O口进行输出,产生的信号通过DA转换器变换为模拟信号,并使用数码管进行波形种类和频率、幅度的显示。
五、设计内容
(一)软件部分
1、幅度、频率调节模块
本次实验中,我们所作出的信号发生器需要实现幅度、频率可调,对于幅度,我们可取默认值1V,当按键检测到按下时执行加或减的命令。
而频率的调节可以通过运用中断时间的调节来实现。
elseif(keyboard_status==5)//幅值加1,最大为5
{Asign=Asign+1;
xianshi();
if(Asign>
=5)
{Asign=5;
}}
elseif(keyboard_status==6)//幅值减1,最小为1
{Asign=Asign-1;
if(Asign<
=1)
{Asign=1;
}xianshi();
}
elseif(keyboard_status==7)//频率加1,最大为10ms
{count=count+1000;
if(count>
=10000)
{count=10000;
elseif(keyboard_status==8)//频率减1,最小为1ms
{count=count-1000;
if(count<
=1000)
{count=1000;
2、波形的输出模块
信号发生器需要实现的是方波,三角波,锯齿波和正弦波四种波形,我们采用的是取点法,在一个周期内选择64个点,并将其转化为10位数字量送到DA转换器中。
voidtime(void)interrupt1
{
TH0=(65536-count)/256;
TL0=(65536-count)%256;
if(lx==0)
{
for(m=0;
m<
64;
m++)
{CP=0;
qudian[m]=Asign*1024/5;
P3=qudian[m];
D1=qudian[m]>
>
8;
D2=qudian[m]>
9;
CP=1;
if(m>
=32)
{CP=0;
qudian[m]=0x00;
elseif(lx==1)
32;
m++)
{qudian[m]=Asign*1024*m/64/5;
CP=0;
CP=1}
for(m=32;
m>
=1;
m--)
elseif(lx==2)
elseif(lx==3)
for(m=0;
{qudian[m]=Asign*1024*sin(0.09817477*m)/5;
}
}
voidmain()
EA=1;
ET0=1;
TR0=1;
TMOD=0x00;
while
(1)
{TH0=(65536-count)/256;
TL0=(65536-count)%256;
KeyDown();
//读取按键
a1=0;
a2=0;
a3=0;
a4=0;
a5=0;
if(keyboard_status==0)//复位
count=1000;
Asign=1;
lx=0;
}
elseif(keyboard_status==1)//显示方波
{lx=0;
Squarevalue();
elseif(keyboard_status==2)//显示三角波
{lx=1;
Trianglevalue();
elseif(keyboard_status==3)//显示锯齿波
{lx=2;
Sawtoothvalue();
elseif(keyboard_status==4)//显示正弦波
{lx=3;
Sinvalue();
3.键盘扫描模块
利用键盘扫描来读取键值,检测到按键按下时,会进行相应的操作。
voidKeyDown()//按键检测函数的定义
{
chara=0;
KEY=0x0f;
if(KEY!
=0x0f)//读取按键是否按下
Delay10ms();
//延时10ms进行消抖
=0x0f)//再次检测键盘是否按下
{
//测试列
KEY=0X0F;
switch(KEY)
case(0X07):
keyboard_status=0;
break;
case(0X0b):
keyboard_status;
case(0X0d):
case(0X0e):
//测试行
KEY=0XF0;
case(0X70):
keyboard_status=keyboard_status;
case(0Xb0):
keyboard_status=keyboard_status+4;
case(0Xd0):
keyboard_status=keyboard_status+8;
case(0Xe0):
keyboard_status=keyboard_status+12;
while((a<
50)&
&
(KEY!
=0xf0))//检测按键松手检测
a++;
}}}}
4.延时函数
voidDelay10ms(void)//10ms延时函数定义
unsignedchara,b,c;
for(c=1;
c>
0;
c--)
for(b=38;
b>
b--)
for(a=130;
a>
a--);
5.计算各个波形的有效值
显示时显示的为周期与有效值,因此需要将幅值进行转化,利用的为公式,定义的有效值为全局变量。
voidSinvalue()//正弦波有效值
{floatsum1=0,sum2=0;
for(i=0;
i<
i++)
sum1=Asign*Asign*qudian[i]*qudian[i]+sum1;
sum2=sum1/64;
sum3=sqrt(sum2);
a1=1,a2=0,a3=0,a4=0,a5=0;
LED=LED_tab[1];
shu=10;
while(shu--);
LED=0x00;
voidSquarevalue()//方波有效值
sum2=sum1/64;
sum3=sqrt(sum2);
a1=1,a2=0,a3=0,a4=0,a5=0;
LED=LED_tab[2];
shu=10;
while(shu--);
LED=0x00
voidTrianglevalue()//三角波有效值
LED=LED_tab[3];
voidSawtoothvalue()//锯齿波有效值
sum1=Asign*Asign*qudian[i]*qudian[i]+sum1;
LED=LED_tab[4];
LED=0x00;
}
6.显示模块
通过5位数码管进行显示。
第一位为波形的输出,为1时,代表方波,为2时,代表三角波,为3时,代表锯齿波,为4时,代表正弦波,第2.3位显示周期的十位与个位,第4.5位显示有效值的十位与个位。
voidxianshi()//显示函数
{
if(p=1)
{shiwei=count/1000/10;
gewei=count/1000%10;
a1=0;
a4=1;
LED=LED_tab[shiwei];
shu=10;
LED=0x00;
a5=1;
LED=LED_tab[gewei];
}
if(a=1)
{shiwei=sum3/10;
gewei=sum3%10;
a1=0,a2=1,a3=0,a4=0,a5=0;
LED=LED_tab[shiwei];
a1=0,a2=0,a3=1,a4=0,a5=0;
LED=LED_tab[gewei];
}
7.主函数模块
主要是进行按键功能的实现
{
EA=1;
ET0=1;
TR0=1;
TMOD=0x00;
TH0=(65536-count)/256;
while
(1)
{TH0=(65536-count)/256;
KeyDown();
a1=0;
if(keyboard_status==0)//复位
{a1=0;
count=1000;
Asign=1;
lx=0;
elseif(keyboard_status==1)//方波显示
{lx=0;
elseif(keyboard_status==2)//三角波显示
elseif(keyboard_status==3)//锯齿波显示
elseif(keyboard_status==4)//正弦波显示
elseif(keyboard_status==5)//幅值加1
{Asign=Asign+1;
if(Asign>
{Asign=5;
elseif(keyboard_status==6)//幅值减1
{Asign=Asign-1;
if(Asign<
{Asign=1;
elseif(keyboard_status==7)//周期加1ms
{count=count+1000;
if(count>
{count=10000;
}xianshi();
elseif(keyboard_status==8)//周期减1ms
{count=count-1000;
if(count<
{count=1000;
elseif(keyboard_status==9)//显示周期
{p=1;
a=0;
elseif(keyboard_status==10)//显示有效值
{p=0;
a=1;
}
(二)硬件部分
电路图如下:
(1)单片机最小系统
为了让单片机正常工作,需要给单片机加一个最小系统,最小系统的设计很简单,只需要复位电路和时钟电路即可:
(2)键盘部分
采用4X4矩阵键盘用来输入值,在程序中定义按下某个按键的功能,可以实现波形的切换和频率、幅值的更改,在键盘扫描时一旦发现有按键按下,需要进行消抖处理,消抖时间一般为5-10ms。
(3)数码管部分
利用共阴极数码管可以显示波形和频率、幅值,数码管由5位位选(用来控制5个数码管)和8位段选(A-G加小数点),数码管还要连接五个电阻和三极管,同时要注意,在实验中我们定义了P0口为数码管输出,但是P0口还要加8个上拉电阻才能正常工作。
(4)数据锁存部分
因为单片机位宽8位,DA转换器为10位位宽,在单片机里面不能实现10位数据同时变化,这样会导致DA输出不正确,所以需要锁存器。
利用74LS74和74LS573,将单片机的数据先输出两位,再输出八位,然后同步输入到下一级,就可以正常工作了。
(5)数模转换部分
将产生的数字信号转换成模拟信号,就可以输出为波形了。
(6)放大、滤波系列
因为前几步产生的信号大小不能满足题目的要求,所以要利用放大器对信号放大,又因为在波形编程的时候是取点得到的,所以产生的波形会有不平滑的纹波,需要用一个滤波电路进行处理。
(三)器件介绍
本次实验会用到几种比较重要或关键的器件,这里简单地进行一下介绍:
单片机
单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能集成到一块硅片上构成的一个小而完善的微型计算机系统,在工业控制领域广泛应用。
本次实验用到的单片机中有4个8位并行输入/输出端口,记作P0、P1、P2、P3,共32根线,每个并行IO口都能用作输入和输出,所以称它们为双向I/O接口,通过定义每个端口输入或输出不同的数据,在本次实验中的应用是比较简单的。
锁存器74LS74和74LS573
AD转换器AD7520
AD7520是十位CMOS数模转换器,采用倒T形电阻网络。
模开关是CMOS型的,也同时集成在芯片上,但运算放大器是外接的。
AD7520共有16个引脚,各引脚的功能如下。
1为模拟电流输出端,接到运算放大器的反相输入端。
2为模拟电流输出端,一般接“地”。
3为接“地”端。
4~13为十位数字量的输入端。
14为CMOS模拟开关的+UDD电源接线端。
15为参考电压电源接线端,可为正值或负值。
16为芯片内部一个电阻R的引出端,该电阻作为运算放大器的反馈电阻,它的另一端在芯片内部接端。
六、设计成果
电路板焊接展示:
因为电路较为复杂,都从背面走线会导致电路板布局错乱和跳线的产生,所以采用了部分端口使用杜邦线连接的方法,使电路板更加美观、简单。
波形输出展示:
正弦波:
方波:
三角波:
锯齿波:
七、故障排除及注意事项
这是我们第一次接触单片机,也是第一次进行这么复杂的实验,在整个过程中遇到了不少问题,也学会了不少东西,下面简要记录一下。
1.键盘扫描部分,总是不能正确显示按键值,检查了很多遍线路都没问题,后来用万用表来检测,发现原来是P1.2和P1.3口中间短路了,有一块很小的飞溅的焊锡使两个触点连接在一起,然而用肉眼看是看不出来的,所以不要只相信自己的眼睛,要亲手做一做,实践才是检验真理的唯一标准。
2.单片机的底座有一个管脚断掉了,为了节约资源,我们用一根细导线代替了原来的管脚,用焊锡和金属片固定,最后正常使用。
3.在实验过程中需要熟练地使用电烙铁,一是为了焊出的电路不粗不细,美观简单,二是因为电烙铁温度可以达到好几XX,一个不小心就有可能烫伤自己或引起事故。
4.实验结束后要记得关闭实验台电源,以及清理自己产生的垃圾,自觉维护实验室环境是基本的实验素养。
八、实验总结
本次实验已经结束,可是我们学到的却有很多,在实验开始之前,对51单片机的知识基本为0,而现在却已经编出了这么大的程序,这让我们每一个人都感到无比欣慰。
本次实验,无论是搞硬件还是搞软件的同学,都花费了巨大的心血,有的地方需要我们一遍遍的去图书馆和网上查找资料,比如搞硬件同学的电路图原理,软件同学的51单片机定时器应用。
不仅如此,在实验过程中,会遇到各种各样的问题,程序不能成功运行,要一行行检查源程序;
数码管不能正常显示,要一遍遍的去检查电路图。
这不仅培养了我们查找问题解决问题的能力,更培养了我们耐心、细心、专心的态度,所以通过这次实验,我们学会的不只是书本上的知识和本次实验的内容,也懂得了很多生活中的道理,同时我们还认识到有时候只凭一个人的力量是远远不够的,所谓众人拾柴火焰高,集体的力量是无穷的,要在自己思考的同时与同学讨论,集思广益,或许有更好的解决办法。
最后,感谢老师的悉心指导,这么多天麻烦老师给我们解决各种问题了,谢谢老师,祝您暑假愉快!
附源程序:
#include<
reg52.h>
#include<
math.h>
INTRINS.H>
#defineucharunsignedchar
#defineuintunsignedint
#defineLEDP0
#defineKEYP1
sbitD1=P2^1;
//次高位
sbitD2=P2^2;
//高位
sbitCP=P2^0;
//控制端
sbita1=P2^3;
//数码管位选
sbita2=P2^4;
sbita3=P2^5;
sbita4=P2^6;
sbita5=P2^7;
ucharlx=0;
ucharp,a;
ucharcount=1000;
//周期控制
ucharshu;
ucharAsign=1;
//默认幅值
ucharcodeLED_tab[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
intidataqudian[64];
//数组的长度需指明
intkeyboard_status;
//定义键值
intsum3;
intm,i;
uintgewei,shiwei;
voidSinvalue();
//正弦波有效值
voidSquarevalue();
//方波有效值
voidTrianglevalue();
//三角波有效值
voidSawtoothvalue();
//锯齿波有效值
voidKeyDown();
//读键值
voidDelay10ms();
//延时子函数
voidxianshi();
//数码管显示函数
voidtime(void)interrupt1
if(lx==0)
for(m=0;
CP=0;
qudian[m]=Asign*1024/5;
P3=q
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 信号发生器 及其 测试仪 设计 制作