07211185许胜锋低频信号发生器.docx
- 文档编号:29329112
- 上传时间:2023-07-22
- 格式:DOCX
- 页数:26
- 大小:3.01MB
07211185许胜锋低频信号发生器.docx
《07211185许胜锋低频信号发生器.docx》由会员分享,可在线阅读,更多相关《07211185许胜锋低频信号发生器.docx(26页珍藏版)》请在冰豆网上搜索。
07211185许胜锋低频信号发生器
北京交通大学
单片机课程设计
实验报告
实验题目:
低频信号发生器
作者:
许胜锋
班级:
通信0703
学号:
07211185
一、实验目的
1.了解D/A转换芯片0832的基本原理、性能及编程方法
2.了解单片机系统中扩展D/A转换的基本方法
二、设计任务及要求
用实验台上模/数转换芯片TCL5620或扩展一片D/A0832,要求:
利用单片机通过D/A转换芯片产生方波、锯齿波、.正弦波和三角波,并可通过按键改变波形频率。
三、工作原理及设计思路
1.系统总体结构框图
2.复位电路设计
单片机的复位是靠外电路实现的,在时钟电路工作后,只要在单片机的RST引脚上出现24个时钟振荡脉冲(2个机器周期)以上的高电平,单片机便实现初始化状态复位。
为了保证应用系统可靠地复位,通常是RST引脚保持10ms以上的高电平。
复位电路连接如图3-14所示。
此电路仅用一个电容及一个电阻。
系统上电时,在RC电路充电过程中,由于电容两端电压不能跳变,故使RESET端电平呈高电位,系统复位。
经过一段时间,电容充电,使RESET端呈低电位,复位结束。
3.LED数码管的显示方式
LED动态显示是将所有的数码管的段选线并接在一起,用一个I/O口控制,公共端不是直接接地(共阴极)或电源(共阳极),而是通过相应的I/O口线控制。
设数码管为共阳极,它的工作过程为:
第一步使右边第一个数码管的公共端D0为1,其余的数码管的公共端为0。
同时在I/O
(1)上送右边第一个数码管的字段码,这时,只有右边第一个数码管显示,其余不显示;第二步使右边第二个数码管的公共端D1为1,其余的数码管的公共端为0,同时在I/O
(1)上送右边第二个数码管的字段码。
这时,只有右边第二个数码管显示,其余不显示,依此类推,直到最后一个,这样四个数码管轮流显示相应的信息,一个循环完后,下一循环又这样轮流显示,从计算机的角度看是一个一个的显示,但由于人的视觉滞留,只要循环的周期足够快,看起来所有的数码管都是一起显示的了。
4.矩阵键盘的工作方式
系统键盘结构如下图:
工作原理如下:
A.检测键盘上是否有键按下:
将行线送入低电平,列线送入高电平。
读入P1口的状态来判别。
其具体过程如下:
P1口输出0FH,即所有行线置成高电平,所有列线置成低电平,然后将P1口状态读入与0FH比较。
如果有键按下,总会有一根行线电平被拉至低电平,从而使行输入状态不全为1。
B.识别键盘中哪一个键按下:
确认有键按下后,保存行扫描时有键按下时的状态X。
P1口输出F0H,进行列扫描,保存列扫描状态Y,取出键值Z=X|Y.例如第一行第一列有键按下,那么行扫描读入的状态为00001110,列扫描读入的状态为11100000,最后键值Z=11101110=EEH,然后转去执行相应的服务程序。
5.DA与电压转换
DAC0832原理框图:
连接电路如下:
6.软件部分设计
包括以下几个程序模块:
(1)初始化程序;
复位程序完成如下工作:
1.显示2秒的2010初始界面;
2.初始周期设置为10ms;
3.将周期值转换成定时器的初值;
4.置定时器0工作于方式1,即16位定时器方式,送入定时器0定时初值,启动定时器0工作;
5.显示初始周期;
6.转键盘扫描程序。
(2)扫描判断程序
采用程序控制扫描工作方式。
在该设计中的键盘的行列线连接于89S52的P1口上。
键盘扫描程序自复位后就开始工作,时刻监视键盘,有无键按下。
在监视键盘过程中,允许定时器T0中断,即同时动态显示数据和输出波形。
一旦有键按下,先延时10ms,去除键的抖动,然后关中断,不允许定时器T0发生中断。
其框图如图所示:
图4-2键盘扫描
键盘扫描源程序如下:
voidjudge(void)
{
unsignedcharX,Y,Z;
P1=0xff;
P1=0x0f;//先对P1置数行扫描
if(P1!
=0x0f)//判断是否有键按下
{delay1ms();//延时,软件去干扰
if(P1!
=0x0f)//确认按键按下X=P1;
{X=P1;//保存行扫描时有键按下时状态
P1=0xf0;//列扫描
Y=P1;//保存列扫描时有键按下时状态
while(P1!
=0xf0);
Z=X|Y;//取出键值
switch(Z)//判断键值(那一个键按下)
{
case0x7e:
key1();break;
case0x7d:
key2();break;//对键值赋值
case0x7b:
key3();break;
case0x77:
key4();break;
case0xbe:
key5();break;
case0xbd:
key6();break;
case0xbb:
key7();break;
case0xb7:
key8();break;
case0xde:
key9();break;
case0xdd:
key10();break;
case0xdb:
keya();break;
case0xd7:
keyb();break;
}
}
}
}
(3)中断服务程序设计
采用定时器T0定时中断,根据不同的choice值,产生不同的波形。
其中方波的占空比可以通过K变量来控制。
voidtime0_int(void)interrupt1//中断服务程序
{
TR0=0;
if(wave_choice==1)
{if(b==100)
{b=0;P3=to_sin[b];
}//正弦波
else
{P3=to_sin[b];}
b++;
}
elseif(wave_choice==2)//三角波
{
if(c<=50)
{P3=2*c;}
else
{P3=200-2*c;}
c++;
if(c==100)
{c=0;}
}
elseif(wave_choice==3)//方波
{
k=zk;
d++;
if(d<=k)
{P3=0xff;}
else
{P3=0x00;}
if(d==100)
{d=0;}
}
elseif(wave_choice==4)//锯齿波
{if(e<=100)
{P3=200-2*e;}
else
{P3=0;}
e++;
if(e==100)
{e=0;}
}
TH0=th;
TL0=tl;
TR0=1;
}
(4)正弦波发生程序设计
数字量化C程序:
#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++;
}
}
(5)三角波发生程序设计
由于三角波的函数值比较容易计算,所以不必要像正弦波那样还需用表格。
可直接通过如下程序段实现。
elseif(wave_choice==2)//三角波
{if(c<=50)
{P3=2*c;}
else
{P3=200-2*c;}
c++;
if(c==100)
{c=0;}
}
(6)方波发生程序设计
方波发生程序运用延时的方法实现,只用一个主程序即可,因为产生一个方波只需要高低两个数,所以程序比较简单。
要给一个频率,再计算所需的延时即可。
实现方波的程序如下:
elseif(wave_choice==3)//方波
{
k=zk;
d++;
if(d<=k)
{P3=0xff;}
else
{P3=0x00;}
if(d==100)
{d=0;}
}
(7)锯齿波发生程序设计
锯齿波中的斜线用一个个小台阶来逼近,在一个周期内从最小值开始逐步递增,当达到最大值后又回到最小值,如此循环,当台阶间隔很小时,波形基本上近似于直线。
适当选择循环的时间,可以得到不同周期的锯齿波。
锯齿波发生原理与方波类似,只是高低两个延时的常数不同,所以用延时法,来产生锯齿波。
elseif(wave_choice==4)//锯齿波
{
if(e<=100)
{P3=200-2*e;}
else
{P3=0;}
e++;
if(e==100)
{e=0;}
}
四.PROTEUS软件仿真
第一步,打开PROTEUS软件,选择所需器件。
窗口下图所示。
第二步,将所有器件排列好,连接导线,见下图
第三步,打开KEIL软件,调出程序编译,生成HEX文件。
见下图
第四步,调试仿真。
以1000HZ为例,见下图
A.选择波形1,为正弦波
B.选择波形2,为三角波
C.选择波形3,为方波,占空比为50%
占空比为80%
D.选择波形4,为锯齿波
注:
小数点前一位为波形选择位,当波形为方波时,前两位显示占空比。
分析:
利用仿真软件显示图形稳定,能在1HZ-5KH工作正常。
五.实测电路波形
A.周期为10ms时,方波图形
B.周期为10ms时,正弦波图形
C.周期为10ms时,三角波图形
D.周期为10ms时,锯齿波图形
E.周期为200ms时,正弦波图形
F.周期为500ms时,正弦波图形
分析:
从以上图形能够看出软件仿真和实际测量波形的不同之处。
由于实验中使用DAC0832的位数仅有8位,精度低,再者为了显示和计算周期的需要,程序中每个周期的点数仅有100个,尤其在波形周期较大时,造成了波形失真较大,吸取教训,运用12位的DA芯片会更好些;当显示较小周期时,数码管的闪烁频率太快,数字有点模糊不清了,值得改进;由于电流电压转换时使用LM324,运用正负5V电源供电,电路麻烦,对电压的需求苛刻,可以改进为单电源供电。
六.实验总结
通过本实验,我学习了单片机89C51的内部结构,掌握了单片机89C51的基本功能及其编程要领,深化了课堂上所学到的理论知识。
还了解了DAC0832芯片的工作原理,及其输入输出关系,由于其输出为电流故需要电流电压转换电路,用运放实现其功能。
在实验中使用了数码管动态扫描,只有在使用才能深刻理解其原理及内涵。
此外还运用PROTEUS软件进行了仿真,更加增加了对单片机的兴趣。
总之,经过一次实验,都有一次实验的收获,希望对以后的学习中能有帮助。
七.附件
/****************低频信号发生器设计*****************************/
/*能产生低频1hz-----1khz正弦波,三角波,方波,锯齿波*/
/*频率可调,方波占空比可调,通过P2输出用8位数码管显示*/
/*P1做矩阵键盘,P2接8个数码管动态扫描,P3做位选信号*/
/*P0经过373锁存后送到DAC0808进行D/A转换*/
/***************************************************************/
#include
#defineucharunsignedchar
ucharcodenumber_tab[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//0---9数字共阴极
ucharcodeinit_tab[4]={0xa4,0xc0,0xf9,0xc0};//2010共阴极
ucharcodeto_sin[100]=
{0x7F,0x87,0x8F,0x97,0x9F,0xA6,0xAE,0xB5,0xBC,0xC3,0xCA,0xD0,0xD6,0xDC,0xE1,0xE6,0xEB,0xEF,0xF2,0xF6,0xF8,0xFA,0xFC,0xFD,0xFE,0xFE,0xFE,0xFD,0xFC,0xFA,0xF8,0xF6,0xF2,0xEF,0xEB,0xE6,0xE1,0xDC,0xD6,0xD0,0xCA,0xC3,0xBC,0xB5,0xAE,0xA6,0x9F,0x97,0x8F,0x87,0x7F,0x77,0x6F,0x67,0x5F,0x58,0x50,0x49,0x42,0x3B,0x34,0x2E,0x28,0x22,0x1D,0x18,0x13,0x0F,0x0C,0x08,0x06,0x04,0x02,0x01,0x00,0x00,0x00,0x01,0x02,0x04,0x06,0x08,0x0C,0x0F,0x13,0x18,0x1D,0x22,0x28,0x2E,0x34,0x3B,0x42,0x49,0x50,0x58,0x5F,0x67,0x6F,0x77};//正弦波数据
ucharcodethb[51]={0,255,255,254,254,254,253,253,252,252,252,
251,251,250,250,250,249,249,248,248,248,
247,247,247,246,246,245,245,245,244,244,
243,243,243,242,242,241,241,241,240,240,
239,239,239,238,238,238,237,237,236,236};
ucharcodetlb[51]={0,156,56,212,112,12,168,68,224,124,24,
180,80,236,136,36,192,92,248,148,48,
204,104,4,160,60,216,116,16,172,72,
228,128,28,184,84,240,140,40,196,96,
252,152,52,208,108,8,164,64,220,120};
ucharb=0,c=0,d=0,e=0,i,k;
intqw=0,bw=0,sw=1,gw=0,zkgw=0,zksw=5,zkb=1,zq=1,tl,th;//ww为万位数字,qw为千位数字,bw为百位数字,//sw为十位数字,gw为个位数字,zkgw为占空比个位数字,zksw为占空比十位数字
intt,tt,f,wave_choice=3,zk=50;//t为时间变量,f为频率变量,choice为波形类型选择变量,zk为占空比变量,默认占空比为50%
voiddelay1ms()//延时1程序
{unsignedchari,j;
for(i=10;i>0;i--)
for(j=44;j>0;j--);}
voidchushihua(void)//初始化显示2010
{P0=0xef;
P2=init_tab[0];
for(i=0;i<=60;i++);
P2=number_tab[10];
P0=0xdf;
P2=init_tab[1];
for(i=0;i<=60;i++);
P2=number_tab[10];
P0=0xbf;
P2=init_tab[2];
for(i=0;i<=60;i++);
P2=number_tab[10];
P0=0x7f;
P2=init_tab[3];
for(i=0;i<=60;i++);
P2=number_tab[10];
}
/*1键选择发波类型,1为正弦波,2为三角波,3为方波,4为锯齿波*/
voidkey1(void)
{wave_choice=1;}
voidkey2(void)
{wave_choice=2;}
voidkey3(void)
{wave_choice=3;}
voidkey4(void)
{wave_choice=4;}
/*频率个位调整*/
voidkey8(void)
{if(gw<9)
{gw=gw+1;}
else
gw=0;}
/*频率十位调整*/
voidkey7(void)
{if(sw<9)
{sw=sw+1;}
else
sw=0;}
/*频率百位调整*/
voidkey6(void)
{if(bw<9)
{bw=bw+1;}
else
bw=0;}
/*频率千位调整*/
voidkey5(void)
{if(qw<9)
{qw=qw+1;}
else
qw=0;}
/*方波占空比加大*/
voidkey9(void)
{if(zk<100)
{zk=zk+1;}
else
zk=0;}
/*方波占空比减小*/
voidkey10(void)
{if(zk>=1)
{zk=zk-1;}
else
zk=0;
}
voidkeya(void)
{if(zkb==1)
{zkb=0;}
else
zkb=1;
}
voidkeyb(void)
{if(zq==1)
{zq=0;}
else
zq=1;
}
/*计算显示数字*/
voidjisuan(void)
{t=1000*qw+100*bw+10*sw+gw;
if(t>=10)
{
tt=t/10;
th=thb[tt];
tl=tlb[tt];}
else
{th=255;
tl=256-t*10;}
zkgw=zk%10;
zksw=zk/10;
}
/*显示*/
voiddisplay(void)
{if(wave_choice==3&&zkb==0)
{P0=0xbf;
P2=number_tab[zksw];
for(i=0;i<=50;i++);
P2=number_tab[10];
P0=0x7f;
P2=number_tab[zkgw];
for(i=0;i<=50;i++);
P2=number_tab[10];
}
elseif(zq==1)
{P0=0xef;
P2=number_tab[qw];
for(i=0;i<=50;i++);
P2=number_tab[10];
P0=0xdf;
P2=number_tab[bw];
for(i=0;i<=50;i++);
P2=number_tab[10];
P0=0xbf;
P2=number_tab[sw];
for(i=0;i<=50;i++);
P2=number_tab[10];
P0=0x7f;
P2=number_tab[gw];
for(i=0;i<=50;i++);
P2=number_tab[10];
}
}
/*键盘扫描*/
voidjudge(void)
{unsignedcharX,Y,Z;
P1=0xff;
P1=0x0f;//先对P1置数行扫描
if(P1!
=0x0f)//判断是否有键按下
{delay1ms();//延时,软件去干扰
if(P1!
=0x0f)//确认按键按下X=P1;
{X=P1;//保存行扫描时有键按下时状态
P1=0xf0;//列扫描
Y=P1;//保存列扫描时有键按下时状态
while(P1!
=0xf0);
Z=X|Y;//取出键值
switch(Z)//判断键值(那一个键按下)
{case0x7e:
key1();break;
case0x7d:
key2();break;//对键值赋值
case0x7b:
key3();break;
case0x77:
key4();break;
case0xbe:
key5();break;
case0xbd:
key6();break;
case0xbb:
key7();break;
case0xb7:
key8();break;
case0xde:
key9();break;
case0xdd:
key10();break;
case0xdb:
keya();break;
case0xd7:
keyb();break;
}
}
}
}
voidmain(void)//主函数
{intn;
for(n=0;n<800;n++)
{chushihua();}
TMOD=0x01;
TR0=1;
th=-t/256;
tl=-t%256;
TH0=th;
TL0=tl;
ET0=1;
EA=1;
while
(1)
{jisuan();
//for(i=0;i<=50;i++);
display();
judge();}
}
voidtime0_int(void)interrupt1//中断服务程序
{TR0=0;
if(wave_choice==1)
{if(b==100)
{b=0;P3=to_sin[b];}//正弦波
else
{P3=to_sin[b];}
b++;
}
elseif(wave_choice==2)//三角波
{if(c<=50)
{P3=2*c;}
else
{P3=200-2*c;}
c++;
if(c==100)
{c=0;}
}
elseif(w
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 07211185 许胜锋 低频 信号发生器