生产实习报告2.docx

上传人:b****6 文档编号:6207676 上传时间:2023-01-04 格式:DOCX 页数:22 大小:157.56KB
下载 相关 举报
生产实习报告2.docx_第1页
第1页 / 共22页
生产实习报告2.docx_第2页
第2页 / 共22页
生产实习报告2.docx_第3页
第3页 / 共22页
生产实习报告2.docx_第4页
第4页 / 共22页
生产实习报告2.docx_第5页
第5页 / 共22页
点击查看更多>>
下载资源
资源描述

生产实习报告2.docx

《生产实习报告2.docx》由会员分享,可在线阅读,更多相关《生产实习报告2.docx(22页珍藏版)》请在冰豆网上搜索。

生产实习报告2.docx

生产实习报告2

基于单片机的信号发生器设计

1方案设计

实习目的

掌握PWM和低通滤波器工作原理,实现一个函数信号发生器。

功能要求

结合键盘和数码管,设计信号发生器。

键盘的功能键用来切换波形类型,包括方波、锯齿波、三角波和正弦波。

数字键用来设置对应波形的频率,要求波形重复频率大于500Hz。

数码管显示当前输出波形的频率。

系统方案

以单片机为核心,结合键盘和数码管,利用I/O口产生PWM波,通过二阶有源低通滤波器输出波形信号。

二阶有源低通滤波采用OP07,为一款低噪声高精度运算放大器。

数码管显示信号频率

数字键:

调整信号频率

选择键A:

方波、锯齿波、三角波、正弦波

功能键B:

修改信号频率

2系统的硬件设计

2.1主控制器

本设计采用89S52及其外围扩展系统,软件方面主要是应用C语言设计程序。

系统以89S52单片机为核心,配置相应的外设及接口电路,用C语言开发,组成一个多功能信号发生系统。

该系统的软件可运行于WindowsXP环境下,硬件电路设计具有典型性。

同时,本系统中任何一部分电路模块均可移植于实用开发系统的设计中,电路设计具有实用性。

2.2复位电路设计

单片机的复位是靠外电路实现的,在时钟电路工作后,只要在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平,单片机便实现初始化状态复位。

为了保证应用系统可靠地复位,通常是RST引脚保持10ms以上的高电平。

复位电路连接如图3-2所示。

此电路仅用一个电容及一个电阻。

系统上电时,在RC电路充电过程中,由于电容两端电压不能跳变,故使RESET端电平呈高电位,系统复位。

经过一段时间,电容充电,使RESET端呈低电位,复位结束[2]。

图3-2复位电路

2.3时钟电路设计

8XX51系列单片机的时钟信号通常用两种电路形式得到:

内部振荡方式和外部振荡方式。

在引脚XTAL1和XTAL2外接晶体振荡器(简称晶振),就构成了内部振荡方式。

由于单片机内部有一个高增益反向放大器,当外接晶振后,就构成了自激振荡器,并产生振荡时钟脉冲。

晶振通常选用6MHZ、12MHZ或24MHZ。

内部振荡方式如图3-3所示。

图中电容C1、C2起稳定振荡频率、快速起振的作用。

电容值一般为5~30pF。

内部振荡方式所得时钟信号比较稳定,实用电路中使用较多。

外部振荡方式是把已有的时钟信号引入单片机内。

这种方式适宜用来使单片机的时钟与外部信号保持一致。

外部振荡方式电路如图3-4所示。

对HMOS的单片机(8031,8031AH等),外部时钟信号由XTAL2引入;对于CHMOS的单片机(8XCXX),外部时钟信号由XTAL1引入。

图3-3内部振荡

图3-4外部振荡

2.4信号产生电路

DAC0808简介:

DAC0808是八位电流输出型D/A转换器件,由4脚输出转换电流,其简化电路图及引脚结构如图3-7所示。

VREF为参考电源,VEE负电压供电;D0是高数据位(MSB),D7才是地数据位(LSB)。

DAC0808的电源极性:

VCC=+5V,VEE=-15V,VREF=+15V。

D0~D7是数据输入端,I0是电流输出端,COMP是接电容进行补偿。

在单片机应用系统中通常需要的是电压信号,电流信号与电压信号之间的转换可由运算放大器实现。

DAC0808不带锁存器,所以在使用时必须加一个74LS373进行数据锁存。

图3-7DAC0808简化电路框图和管脚排列

工作原理:

本系统由VREF提供参考电压,相应参考电流为I=VREF/R1。

电容C4提供补偿,OUT输出电流,经过LM324运算放大器转换成电压。

所以输出电压:

=5K

(3—5)

根据DAC0808的特性设计出本系统的D/A转换电路如图3-8所示。

图3-8系统D/A实现

2.3显示电路

本机显示采用软件译码动态显示,系统显示电路如图3-1所示。

采用软件译码动态显示的理由如下:

1)如果用静态显示,单片机的接口资源肯定不够用,那么还要进行接口的扩展,增加了系统的复杂度;2)如果要制成印刷线路板,得占相当大一块面积;3)另外,采用动态显示,可以明显的降低功耗,因为每一时刻只有一个LED发光,其功耗为静态显示的1/8。

一个LED最大电流为120mA,如用静态显示,8个LED就耗电流960mA综上分析,采用动态显示才是最经济的方案。

在显示的时候,只要把显示的字码输送到P2口,再经过74LS373进行数据锁存,P3口作为位选控制信号。

由于采用的是共阴极数码管,当需要显示哪一位的时候,只要在相应的位选控制信号输出低电平就行。

例如,要在第一个数码管显示P,那么在P2口就要输出73H字段码,同时P3口输出FEH位选码。

2.4键盘电路

工作原理如下:

1.检测键盘上是否有键按下:

将行线送入低电平,列线送入高电平。

读入P1口的状态来判别。

其具体过程如下:

P1口输出0FH,即所有行线置成高电平,所有列线置成低电平,然后将P1口状态读入与0FH比较。

如果有键按下,总会有一根行线电平被拉至低电平,从而使行输入状态不全为1。

2.识别键盘中哪一个键按下:

确认有键按下后,保存行扫描时有键按下时的状态X。

P1口输出F0H,进行列扫描,保存列扫描状态Y,取出键值Z=X|Y.例如第一行第一列有键按下,那么行扫描读入的状态为00001110,列扫描读入的状态为11100000,最后键值Z=11101110=EEH,然后转去执行相应的服务程序。

3系统的软件设计

3.1主程序(见附录2)

3.2信号产生

3.2.1方波产生

方波发生程序运用延时的方法实现,只用一个主程序即可,因为产生一个方波只需要高低两个数,所以程序比较简单。

要给一个频率,再计算所需的延时即可。

实现方波的程序如下:

elseif(wave_choice==3)//方波

{

k=zk*256/100;

d++;

if(d<=k)

{

P0=0x00;

}

else

P0=0xff;

}

3.2.2锯齿波产生

锯齿波中的斜线用一个个小台阶来逼近,在一个周期内从最小值开始逐步递增,当达到最大值后又回到最小值,如此循环,当台阶间隔很小时,波形基本上近似于直线。

适当选择循环的时间,可以得到不同周期的锯齿波。

锯齿波发生原理与方波类似,只是高低两个延时的常数不同,所以用延时法,来产生锯齿波。

elseif(wave_choice==4)//锯齿波

{

if(e<=255)

{

P0=255-e;

}

else

{

P0=0;

}

e++;

}

3.2.3三角波产生

可直接通过如下程序段实现。

elseif(wave_choice==2)//三角波

{

if(c<=128)

{

P0=c;

}

else

{

P0=255-c;

}

c++;

}

3.2.4正弦波产生

#include

main()

{

intn,i=0,j,k;

floaty=0,a=3.1415926,b=0,c=2.5000,d=0;

for(n=0;n<=64;n++)

{

y=2.5*sin(a*n/128)+2.5;

b=y;//b,y为当前幅度值

d=b-c;//d为递增率

j=d/0.0196;//j为数字递增率,0.0196为δ

k=128+j;//k为数字量

printf(“%d,%f,%f,%d,%d\n”,i,y,d,j,k);

i++;

}

}

3.3键盘扫描

键盘扫描流程图如下:

键盘扫描源程序如下:

voidjudge(void)

{

unsignedcharX,Y,Z;

P1=0xff;

P1=0x0f;//先对P1置数行扫描

if(P1!

=0x0f)//判断是否有键按下

{

delay10ms();//延时,软件去干扰

if(P1!

=0x0f)//确认按键按下X=P1;

{

X=P1;//保存行扫描时有键按下时状态

P1=0xf0;//列扫描

Y=P1;//保存列扫描时有键按下时状态

Z=X|Y;//取出键值

switch(Z)//判断键值(那一个键按下)

{

case0x7d:

key1();break;

case0xee:

key2();break;//对键值赋值

case0xde:

key3();break;

case0xbe:

key4();break;

case0x7e:

key5();break;

case0xed:

key6();break;

case0xdd:

key7();break;

case0xbd:

key8();break;

}

}

}

}

3.5键盘处理

/*1键选择发波类型,1为正弦波,2为三角波,3为方波*/

voidkey1(void)

{

if(wave_choice<4)

{

wave_choice=wave_choice+1;

}

else

{

wave_choice=1;

}

}

4系统的测试

在调试过程中,会有各种各样的问题,出现问题是,可以从两方面入手,一个是硬件方面,看原件是否焊接正确,是否存在虚焊;另一个方面就是从软件入手,看程序中是否从在错误。

5总结

单片机控制多功能信号发生器可以用于“单片机技术”的教学实践,也可以用于实验信号的产生。

其比较典型的接口电路设计也为实际应用提供参考。

该仪器的研制既解决了实验教学的需求,也节约了实验设备投资,降低了实验成本。

经过进一步完善后,可由学生利用课程设计的机会,亲自动手制作,这样还可以进一步降低成本,同时极大地提高了学生的动手能力,是一件一举多得的好事。

随着科学技术的不断发展,以及实验教学要求的不断更新,要求我们开发的应用系统具有良好的可扩充性和更新能力,作为一名技术人员,应时刻跟踪科技发展的步伐,不断丰富专业知识,不断完善我们开发的系统。

参考文献

[1]周润景等编著.Proteus在MCS-51&ARM7系统中的应用百例:

电子工业出版社,2006

[2]杨宁编著.单片机与控制技术.北京:

北京航空航天大学出版社,2005

[3]李朝青.单片机原理及接口技术[M].北京:

北京航空航天大学出版社,2005

附录1原理图

1、系统总体结构框图设计:

2、初始化流程图:

3、信号发生器电路图:

附录2源程序清单

#include

#defineucharunsignedchar

ucharcodenumber_tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,

0x07,0x7f,0x6f};//0---9数字共阴极

ucharcodeinit_tab[8]={0X73,0x73,0x73,0x76,0x79,0x38,0x38,

0x3f};//PPP.HELLO共阴极

ucharcodeto_sin[256]=

{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,0xde,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,0x80};//正弦波数据

ucharb=0,c=0,d=0,e=0,i,k,tl,th;

intww=0,qw=0,bw=9,sw=8,gw=3,zkgw=0,zksw=5;//ww为万位数字,qw为千位数字,bw为百位数字,

//sw为十位数字,gw为个位数字,zkgw为占空比个位数字,zksw为占空比十位数字

intt,f,m,wave_choice=1,zk=50;//t为时间变量,f为频率变量,choice为波形类型选择变量,zk为占空比变量,默认占空比为50%

voiddelay10ms()//延时10ms程序

{

unsignedchari,j;

for(i=10;i>0;i--)

for(j=120;j>0;j--);

}

voidchushihua(void)//初始化显示PPP.HELLO

{

P3=0xfe;

P2=init_tab[0];

for(i=0;i<=60;i++);

P3=0xfd;

P2=init_tab[1];

for(i=0;i<=60;i++);

P3=0xfb;

P2=init_tab[2];

for(i=0;i<=60;i++);

P3=0xfb;//小数点显示

P2=0x80;

for(i=0;i<=60;i++);

P3=0xf7;

P2=init_tab[3];

for(i=0;i<=60;i++);

P3=0xef;

P2=init_tab[4];

for(i=0;i<=60;i++);

P3=0xdf;

P2=init_tab[5];

for(i=0;i<=60;i++);

P3=0xbf;

P2=init_tab[6];

for(i=0;i<=60;i++);

P3=0x7f;

P2=init_tab[7];

for(i=0;i<=60;i++);

}

/*1键选择发波类型,1为正弦波,2为三角波,3为方波*/

voidkey1(void)

{

if(wave_choice<4)

{

wave_choice=wave_choice+1;

}

else

{

wave_choice=1;

}

}

/*频率个位调整*/

voidkey2(void)

{

if(gw<9)

{

gw=gw+1;

}

else

gw=0;

}

/*频率十位调整*/

voidkey3(void)

{

if(sw<9)

{

sw=sw+1;

}

else

sw=0;

}

/*频率百位调整*/

voidkey4(void)

{

if(bw<9)

{

bw=bw+1;

}

else

bw=0;

}

/*频率千位调整*/

voidkey5(void)

{

if(qw<9)

{

qw=qw+1;

}

else

qw=0;

}

/*频率万位调整*/

voidkey6(void)

{

if(ww<5)

{

ww=ww+1;

}

else

ww=0;

}

/*方波占空比加大*/

voidkey7(void)

{

if(zk<100)

{

zk=zk+1;

}

else

zk=0;

}

/*方波占空比减小*/

voidkey8(void)

{

if(zk>=1)

{

zk=zk-1;

}

else

zk=0;

}

/*计算显示数字*/

voidjisuan(void)

{

TR0=0;//关闭定时器

f=100000*ww+1000*qw+100*bw+10*sw+gw;

t=1000000/f;

th=-t/256;

tl=-t%256;

ww=f/10000;

f=f%10000;

qw=f/1000;

f=f%1000;

bw=f/100;

f=f%100;

sw=f/10;

gw=f%10;

zkgw=zk%10;

zksw=zk/10;

TR0=1;

}

/*显示*/

voiddisplay(void)

{

P3=0xfb;

P2=number_tab[wave_choice];

for(i=0;i<=60;i++);

P3=0xfb;

P2=0x80;//小数点显示

for(i=0;i<=60;i++);

P3=0xf7;

P2=number_tab[ww];

for(i=0;i<=60;i++);

P3=0xef;

P2=number_tab[qw];

for(i=0;i<=60;i++);

P3=0xdf;

P2=number_tab[bw];

for(i=0;i<=60;i++);

P3=0xbf;

P2=number_tab[sw];

for(i=0;i<=60;i++);

P3=0x7f;

P2=number_tab[gw];

for(i=0;i<=60;i++);

if(wave_choice==3)

{

P3=0xfd;

P2=number_tab[zkgw];

for(i=0;i<=60;i++);

P3=0xfe;

P2=number_tab[zksw];

for(i=0;i<=60;i++);

P3=0xfd;

P2=0x80;//小数点显示

for(i=0;i<=60;i++);

}

}

/*键盘扫描*/

voidjudge(void)

{

unsignedcharX,Y,Z;

P1=0xff;

P1=0x0f;//先对P1置数行扫描

if(P1!

=0x0f)//判断是否有键按下

{

delay10ms();//延时,软件去干扰

if(P1!

=0x0f)//确认按键按下X=P1;

{

X=P1;//保存行扫描时有键按下时状态

P1=0xf0;//列扫描

Y=P1;//保存列扫描时有键按下时状态

Z=X|Y;//取出键值

switch(Z)//判断键值(那一个键按下)

{

case0x7d:

key1();break;

case0xee:

key2();break;//对键值赋值

case0xde:

key3();break;

case0xbe:

key4();break;

case0x7e:

key5();break;

case0xed:

key6();break;

case0xdd:

key7();break;

case0xbd:

key8();break;

}

}

}

}

voidmain(void)//主函数

{

intn;

for(n=0;n<500;n++)

{

chushihua();

}

TMOD=0X01;

TR0=1;

th=-t/256;

tl=-t%156;

TH0=th;

TL0=tl;

ET0=1;

EA=1;

while

(1)

{

jisuan();

for(i=0;i<=50;i++);

display();

judge();//键盘扫描

}

}

voidtime0_int(void)interrupt1//

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

当前位置:首页 > 解决方案 > 工作计划

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

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