生产实习报告2Word下载.docx
《生产实习报告2Word下载.docx》由会员分享,可在线阅读,更多相关《生产实习报告2Word下载.docx(22页珍藏版)》请在冰豆网上搜索。
晶振通常选用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;
P0=255-c;
c++;
3.2.4正弦波产生
#include<
math.h>
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();
//对键值赋值
case0xde:
key3();
case0xbe:
key4();
case0x7e:
key5();
case0xed:
key6();
case0xdd:
key7();
case0xbd:
key8();
}
3.5键盘处理
/*1键选择发波类型,1为正弦波,2为三角波,3为方波*/
voidkey1(void)
if(wave_choice<
4)
wave_choice=wave_choice+1;
{
wave_choice=1;
4系统的测试
在调试过程中,会有各种各样的问题,出现问题是,可以从两方面入手,一个是硬件方面,看原件是否焊接正确,是否存在虚焊;
另一个方面就是从软件入手,看程序中是否从在错误。
5总结
单片机控制多功能信号发生器可以用于“单片机技术”的教学实践,也可以用于实验信号的产生。
其比较典型的接口电路设计也为实际应用提供参考。
该仪器的研制既解决了实验教学的需求,也节约了实验设备投资,降低了实验成本。
经过进一步完善后,可由学生利用课程设计的机会,亲自动手制作,这样还可以进一步降低成本,同时极大地提高了学生的动手能力,是一件一举多得的好事。
随着科学技术的不断发展,以及实验教学要求的不断更新,要求我们开发的应用系统具有良好的可扩充性和更新能力,作为一名技术人员,应时刻跟踪科技发展的步伐,不断丰富专业知识,不断完善我们开发的系统。
参考文献
[1]周润景等编著.Proteus在MCS-51&
ARM7系统中的应用百例:
电子工业出版社,2006
[2]杨宁编著.单片机与控制技术.北京:
北京航空航天大学出版社,2005
[3]李朝青.单片机原理及接口技术[M].北京:
附录1原理图
1、系统总体结构框图设计:
2、初始化流程图:
3、信号发生器电路图:
附录2源程序清单
#include<
reg52.h>
#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];
P3=0xfb;
P2=init_tab[2];
//小数点显示
P2=0x80;
P3=0xf7;
P2=init_tab[3];
P3=0xef;
P2=init_tab[4];
for(i=0;
i<
=60;
i++);
P3=0xdf;
P2=init_tab[5];
P3=0xbf;
P2=init_tab[6];
P3=0x7f;
P2=init_tab[7];
/*频率个位调整*/
voidkey2(void)
if(gw<
9)
gw=gw+1;
gw=0;
/*频率十位调整*/
voidkey3(void)
if(sw<
9)
sw=sw+1;
sw=0;
/*频率百位调整*/
voidkey4(void)
if(bw<
bw=bw+1;
bw=0;
/*频率千位调整*/
voidkey5(void)
if(qw<
qw=qw+1;
qw=0;
/*频率万位调整*/
voidkey6(void)
if(ww<
5)
ww=ww+1;
ww=0;
/*方波占空比加大*/
voidkey7(void)
if(zk<
100)
zk=zk+1;
zk=0;
/*方波占空比减小*/
voidkey8(void)
if(zk>
=1)
zk=zk-1;
/*计算显示数字*/
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)
P2=number_tab[wave_choice];
//小数点显示
P2=number_tab[ww];
P2=number_tab[qw];
P2=number_tab[bw];
P2=number_tab[sw];
P2=number_tab[gw];
if(wave_choice==3)
P2=number_tab[zkgw];
P2=number_tab[zksw];
P2=0x80;
/*键盘扫描*/
//先对P1置数行扫描
voidmain(void)//主函数
intn;
for(n=0;
n<
500;
n++)
chushihua();
TMOD=0X01;
tl=-t%156;
TH0=th;
TL0=tl;
ET0=1;
EA=1;
while
(1)
jisuan();
=50;
display();
judge();
//键盘扫描
voidtime0_int(void)interrupt1//