方波发生器单片机课程设计.docx

上传人:b****5 文档编号:8227304 上传时间:2023-01-30 格式:DOCX 页数:21 大小:243.77KB
下载 相关 举报
方波发生器单片机课程设计.docx_第1页
第1页 / 共21页
方波发生器单片机课程设计.docx_第2页
第2页 / 共21页
方波发生器单片机课程设计.docx_第3页
第3页 / 共21页
方波发生器单片机课程设计.docx_第4页
第4页 / 共21页
方波发生器单片机课程设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

方波发生器单片机课程设计.docx

《方波发生器单片机课程设计.docx》由会员分享,可在线阅读,更多相关《方波发生器单片机课程设计.docx(21页珍藏版)》请在冰豆网上搜索。

方波发生器单片机课程设计.docx

方波发生器单片机课程设计

摘要

本次课程设计以AT89S51单片机为核心器件,外围采用按键作为控制和LCD1602作为显示器所设计的方波发生器。

该方波发生器能实现0-1kHz频率范围、占空比可调的方波输出。

其核心技术为单片机并行端口的应用、单片机定时器为中断应用和数字分离的ASCII码液晶显示技术。

采用8个独立的按键组成控制模块,操作方便,按键控制模式可以通过程序进行设定;显示模块则由液晶屏1602构成,能显示出实时输出方波的频率及占空比,直观明了。

设计过程中遇到的问题是输出方波的频率、占空比与液晶显示数据存在误差,通过不断调试程序,合理编写中断服务程序来修正误差提高精确度,达到设计要求。

该方波发生器具有线路简单、结构紧凑、价格低廉、性能优越等优点。

关键词:

方波发生器;AT89S51单片机;键盘;LCD1602

ABSTRACT

ThecoursedesignAT89S51microcontrollerasthecoredevice,theexternaluseofbuttonsasacontrolandLCD1602displaysaredesignedasasquarewavegenerator.Thesquarewavegeneratortoachieve0-1kHzfrequencyrange,adjustabledutycyclesquarewaveoutput.Thecoretechnologyfortheapplicationofsinglechipparallelport,SCMapplicationsanddigitaltimerinterruptASCIIcodeseparateliquidcrystaldisplaytechnology.8-independentcomponentcontrolmodulebuttons,easytooperatekeycontrolmodecanbesetthroughtheprogram;displaymoduleconstitutedbytheLCD1602,canshowreal-timeoutputfrequencyanddutycyclesquarewave,intuitiveandclear.Problemsencounteredinthedesignprocessistheoutputsquarewavefrequency,dutycycleandLCDdisplaydataerrorsexist,throughcontinuouscommissioningprocess,areasonablewriteinterruptserviceroutinetocorrecttheerrortoimproveaccuracy,tomeetthedesignrequirements.Thesquarewavegeneratorhasasimplecircuit,compact,lowcost,superiorperformanceadvantages.

Keywords:

Squarewavegenerator;AT89S51microcontroller;keyboard;liquidcrystal1602

 

5.4键盘扫描程序………………………………………………………..9

5.5定时器中断子程序……………………………………..……………11

第1章前言

单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。

单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。

单片机有两种基本结构形式:

一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,称为普林斯顿结构。

另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器,目前的单片机以采用程序存储器和数据存储器截然分开的结构为多。

本课题讨论的方波发生器的核心是目前应用极为广泛的51系列单片机。

第2章方波发生器方案设计

在电子技术领域中,实现方波发生器的方法有很多种,可以采用不同的原理及器件构成不同的电路,但可以实现相同的功能。

在此次设计中,有些地方与课题原本的具体要求有点不同。

如实现频率调节时,不是按要求利用调整变阻器的阻值来完成的,而是用按键来实现的。

2.1设计内容

本课程设计是设计一个方波发生器,用4位数码管显示方波的频率。

2.2设计的基本要求

频率可调,用一个变阻器来调整波形的频率,频率调节范围为20Hz~2000Hz;

占空比可调,采用两个按键来实现增加、减小波形的占空比作用,占空比调节步长为1%,即每按键一次,占空比增加或减少1%。

占空比用另外两位数码管显示。

系统上电时频率依变阻器的阻值设定,占空比设定为50%。

而我们在此设计的方波发生器与要求要设计的有点区别,所设计的频率调节范围为1Hz~15000Hz,以调节变阻器的阻值来实现频率的调节相对来说要麻烦些。

因此,频率也使用按键来进行调节,不同的频率及占空比可以使用不同的按键来实现,而以键盘扫描来实现各键的不同功能;显示部分可以使用ZLG7290芯片及数码管来实现。

由此即可构成一个最小单片机应用系统。

2.3方波发生器设计方案

微处理器模块AT89S52,频率与占空比信息显示模块,2×4矩阵键盘模块,74LS164移位寄存器显示驱动模块。

本设计中用到两个定时器,定时器0和定时器1,其中定时器0工作在定时方式下,  决定方波的频率;定时器1同样工作在定时方式下,用于设定占空比。

用LED显示器来显示频率与占空比,键盘的操作是通过外中断与单片机共同来控制的,键盘操作来完成按要求对频率与占空比进行调节。

2.4总体功能框图

方波发生器的原理方框图如图1所示:

第3章方波发生器的原理

由于系统的要求不高,比较单一的,再加上我们是通过定时器来调节频率的,而非电阻,因此实现起来就相对简化了。

仅用键盘、AT89S52及串行显示便可完成设计,达到所要求实现的功能。

方波发生器工作原理与功能:

简单的流程为:

主程序扫描键盘,将设置信息输入,处理后,输出到LED显示器显示。

单片机的晶振为11.0592MHz,用到了两个定时器,即定时器0与定时器1,分别进行频率与占空比的定时,两个定时器都是工作在方式1。

根据计算定时器初值的公式:

计算出定时器0与定时器1所要装入的初值。

频率及占空比的显示电路由74LS164构成的驱动电路和LED数码显示管组成,利用八个数码管来显示,有五位是用来显示频率的,有两位是显示占空比的,在频率与占空比显示管中间有一个LED数码管是用来显示“——”的,用以区分频率显示与占空比显示的。

此电路的键盘是由一个状态键,四个功能键(调节频率与占空比的增减)组成,其特殊之处在于利用外部中断实现键盘扫描。

状态键有三种状态,当其处于状态0时,则其它的键会处于无用状态,当其处于状态1时,可通过按四个调节键来调节频率,处于第三种状态时,按四个调节键中的前两个便可对占空比进行调节了。

 

第4章硬件电路设计

4.1单片机最小系统

单片机各功能部件的运行都是以时钟频率为基准的,有条不紊地进行工作。

因而时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。

常用的时钟电路方式有两种:

一种是内部时钟方式,一种是外部时钟方式,这里采用的是内部时钟方式,外接晶振。

时钟电路由片外晶体、微调电容和单片机的内部电路组成。

选取频率为11.0592MHz的晶振,微调电容是瓷片电容。

89S52单片机的P0.7口作为波形输出口,若接示波器,则可通过示波器来观察波形,是一个矩形波。

此单元电路包括时钟电路、复位电路,具体电路如图2所示:

4.2小键盘接口电路

小键盘如图3所示。

它包括8个键,系统中用到的键只有5个,分别为0号、1号、2号、3号、4号键。

其中0号键是状态键,采用外部中断控制,用它来确定其它几个键的按键功能,具体作用在前述的系统功能中已做介绍了;另外4个键为功能键,调节频率与占空比的。

小键盘中引出的6根线依次分别接单片机的P1.0、P1.1、P1.2、P1.3、P1.4、P1.5口。

图3小键盘接口电路

4.3LED显示电路

采用静态显示来实现显示功能,如图4所示。

移位寄存器74LS164,实现串行输入,并行输出。

串行数据由RXD输出,从74LS164的A、B端口输入寄存器,移位时钟由TXD提供。

在移位时钟作用下,存放显示器段码的串行发送缓冲器数据逐位由A、B端移入到74LS164中,再由Q0到Q7并行输出到显示数码管相应的LED上。

8片74LS164首尾相串,而时钟端则接在一起。

这部分的最终功能是显示频率与占空比。

 

显示部分具体电路如图4所示:

图4LED显示电路

第5章系统的软件设计

方波发生器的软件设计包括主程序、延时子程序、系统初始化程序、显示子程序、键盘扫描程序、定时器中断子程序。

其中主程序用来控制整个程序的执行,它与各子程序紧密相联,共同实现方波发生器各种功能的执行。

5.1主程序

主程序包括系统初始化及显示程序,是一个死循环系统。

其流程图如图5所示:

 

5.2系统初始化子程序

在此程序中,给所有变量赋初值,有键盘扫描口、选择串行口工作方式SCON、状态标志位flag、初始频率与占空比及其定时、定时器0与定时器1的工作方式等。

初始化时启动了定时器0与定时器1。

5.3显示子程序

利用分离频率的各位数值,将各位数值分别显示出来。

在程序中利用了频率显示的高位灭零的方法以致最高位为0时就不显示,以致显示效果美观化。

一共有五位是显示频率的,若频率小于10000时,则万位不显示;若频率小于1000时,则万位与千位都不显示,依次类推。

占空比的显示规律与频率的一样。

显示子程序流程图如图6所示:

 

5.4键盘扫描程序

键盘扫描用外中断0实现,采用的是线反法,键盘扫描码采用逐行扫描的方法。

关于键盘扫描程序的说明:

(1)频率调节:

i==0时,按键为状态键,此时flag加1,即flag==1,此时进行频率的调节。

可以进行加1Hz、减1Hz、加100Hz、减100Hz操作,分别由1号键、2号键、3号键、4号键控制。

如果按住某个键不放,便会执行连续加值或减值操作。

这里的频率的最大值为15000Hz,当频率增至最大值时,还按增值键,此时频率会自动跳到1Hz开始继续增加。

同理,频率的最小值为1Hz,当减频率减至最小值时,再按减频率键,则频率会跳到15000Hz。

(2)占空比调节:

当状态值flag==2时,此时频率保持不变,进行占空比调节。

只可进行加1与减1操作,分别由1号键、2号键控制。

要注意的是占空比的初值是50%,我们定义的ZKB为50(百分比的分子部分,为一整数),故调节占空比时,ZKB会进行加1,减1操作。

ZKB的最大值为99,当增到最大值时,便会返回到值1,如此循环。

(3)为了减轻单片机的工作量,在软件设计中采取了这样的措施,在修改参数确定后才进行定时器初值TC0、TC1的计算。

键盘中断处理子程序流程图与键处理流程图分别如图7、图8所示:

 

图7键盘中断处理子程序流

5.5定时器中断子程序

定时器中断子程序中有定时器0与定时器1中断,频率定时器0中断流程图与占空比定时器1流程图分别如图9、图10所示。

(1)定时器0遇中断执行的操作有复位,启动自身进行频率定时,同时启动定时器1,进行占空比定时,输出高电平。

(2)定时器1遇中断,停止自身的计时,输出低电平。

 

第六章程序分析与设计

6.1基于单片机方波发生器的程序清单

#include

#include

#defineucharunsignedchar

#defineuintunsignedint

#defineKEY_PORTP1//P1口为键盘扫描口

sbitOutPut=P0^7;//矩形波输出口

/*设全局变量*/

floatfosc=11059200;//系统时钟频率

floatlength=65536;//方式1计数长度

ucharflag;//状态键标志

ucharZKB;//占空比

uintPL;//频率

ucharTIMER0_L,TIMER0_H,TIMER1_L,TIMER1_H;//定时器0和1的定时初值

ucharcodetabl[12]=

{0xfc,0x60,0xda,0xf2,0x66,0xb6,0xbe,0xe0,0xfe,0xf6,0x00};//LED共阴极代码

ucharcodetabl2[18]=

{0x11,0x12,0x14,0x18,0x21,0x22,0x24,0x28,0x41,0x42,0x44,0x48,0x81,0x82,0x84,0x88};//键值表

 

/*****************************************

延时子程序

*****************************************/

voiddelay1ms(ucharn)//延时nms

{

ucharj;

while(n--)

for(j=0;j<122;j++)

{;}

}

 

/*****************************************

系统初始化

*****************************************/

voidsystem_init(void)

{

KEY_PORT=0x0f;

SCON=0x00;

flag=0;

PL=1000;

ZKB=50;

TL0=0x66;//初始频率1KHz定时1ms

TH0=0xfc;

TL1=0x33;//初始占空比50定时0.5ms

TH1=0xfe;

TMOD=0x11;//定时器1和定时器0工作在方式1,的定时模式

IT0=0;//选择INT0为低电平触发方式

EX0=1;//外部中断0允许

ET0=1;//定时器1和定时器0中断允许

ET1=1;

EA=1;//系统中断允许

TR0=1;//定时器1和定时器0开始定时

TR1=1;

}

 

/*****************************************

发送数据

*****************************************/

voidsend(uchard)

{

SBUF=d;

while(!

TI);

TI=0;

}

 

/*****************************************

显示子程序

*****************************************/

voiddisplay(uintPL,ucharZKB)

{

uchara,b,c,d,e,m,n;

a=PL/10000;//分离频率的各位数值

b=PL/1000;

b=b%10;

c=PL/100;

c=c%10;

d=PL%100;

d=d/10;

e=PL%10;

if(a==0)//频率显示的高位灭零

{

a=10;

if(b==0)

{

b=10;

if(c==0)

{

c=10;

if(d==0)

{d=10;

if(e==0)e=10;

}

}

}

}

m=ZKB/10;//分离占空比各位数值

n=ZKB%10;

if(m==0)

{m=10;//占空比显示的高位灭零

if(n==0)n=10;

}

send(tabl[a]);

send(tabl[b]);

send(tabl[c]);

send(tabl[d]);

send(tabl[e]);

send(0x02);//频率和占空比中间加一横线“-”以示区别

send(tabl[m]);

send(tabl[n]);

delay1ms(200);

delay1ms(200);//延时开键盘中断,处理好(避免又利用)连击问题

}

 

/*****************************************

键盘扫描(线反法)

*****************************************/

voidKey_Scan()interrupt0//键盘扫描用外中断0

{

ucharscancode,keycode,i;

floatTC0,TC1;

EX0=0;//关中断

delay1ms(5);

scancode=0xef;//键盘扫描码,采用逐行扫描的方法

while(scancode!

=0xff)

{

KEY_PORT=scancode;//输入扫描码,扫描P1.4对应的行

keycode=KEY_PORT;//读出数据,看是否在此行上的某列键盘被按下

if((keycode&0x0f)!

=0x0f)break;//扫描到按下的键,则退出

scancode=(keycode<<1)|0x0f;//否则,更新扫描码继续扫描

}

keycode=~keycode;

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

if(tabl2[i]==keycode)break;//取得键号

if(i==0)flag++;

if(flag==1)//状态1下对频率进行调整

{

if(i==1)//按键为1号,频率加1

{PL++;

if(PL>15000)PL=15;

}

if(i==2)//按键为2号,频率减1

{PL--;

if(PL<15)PL=15000;

}

if(i==3)//按键为3号,频率加100

{PL+=100;

if(PL>15000)PL=15;

}

if(i==4)//按键为4号,频率减100

{PL=PL-100;

if(PL<15)PL=15000;

}

}

if(flag==2)//状态2下对占空比进行调整

{

if(i==1)//按键为1号,占空比加1

{ZKB++;

if(ZKB>99)ZKB=1;

}

if(i==2)//按键为2号,占空比减1

{ZKB--;

if(ZKB<1)ZKB=99;

}

}

if(flag==3)//状态返回,正常工作

{

flag=0;//清状态标志

TC0=(length-fosc/(12*PL)+0.5);//频率定时初值

TC1=(length-(fosc*ZKB)/(12*100*PL)+0.5);//占空比定时初值

TIMER0_L=(uint)TC0/256;//计算定时器0和定时器1的初值

TIMER0_H=(uint)TC0%256;

TIMER1_L=(uint)TC1/256;

TIMER1_H=(uint)TC1%256;

}

display(PL,ZKB);

KEY_PORT=0x0f;//给键盘扫描口赋初值,以便下次按键正确读入

EX0=1;//开中断

}

 

/*****************************************

定时器中断子程序

*****************************************/

voidTimer0_PL()interrupt1//频率定时器0中断

{

TR1=1;//启动定时器1,占空比定时

TL0=TIMER0_L;

TH0=TIMER0_H;

OutPut=1;//输出高电平

}

voidTimer1_PL()interrupt3//占空比定时器1中断

{

TR1=0;//定时器1停止

TL1=TIMER1_L;

TH1=TIMER1_H;

OutPut=0;//输出高电平

}

 

/*****************************************

主函数

*****************************************/

voidmain()

{

uintPL0=0;

ucharZKB0=0;

system_init();//系统初始化

while

(1)//死循环,显示频率和占空比

{

if(flag==0)//状态0时,正常显示频率和占空比

display(PL,ZKB);

if(flag==1)//状态1时,频率调整状态,频率闪烁

{

display(PL0,ZKB);

display(PL,ZKB);

}

if(flag==2)//状态2时,占空比调整状态,占空比闪烁

{

display(PL,ZKB0);

display(PL,ZKB);

}

}

}

第7章调试与性能分析

7.1硬件调试

硬件的测试首先是检查电路的逻辑线路是否正确,如果正确再检查原理图的线路连接是否正确,电路的布局安排是否合理等等。

软件的测试只要是检查程序的语法是否正确,数据结构安排是否妥当,时序是否正确,整体流程安排是否合理。

上面两部检查妥当后,就到了系统调试最关键的一步,软硬件的协同调试,问题往往在此才能被发现。

7.2软件调试

在软硬件协同调试时,硬件问题比较少,主要体现在上拉电阻的使用,滤波电容的使用等,极少发生逻辑上的错误。

硬件的问题往往是致命的问题,其不易察觉,发现之后电路更改也不容易。

这就需要我们不断的实验,在实战中摸索出规律,吸取经验教训,在以后的电路设计中能设计出稳定的抗干扰能力强的电路。

软件问题是调试中遇到问题最多的,此系统中出现过的问题有以下几处:

1、键盘中断处理程序中中断入口后,没有关掉外部中断,出现键值读取不正确,不能正确操作键盘。

解决方法,在中断入口处关掉外中断,并在出口时再开外中断;

2、键盘扫描前没有软件延时消抖,出现键值读

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

当前位置:首页 > 高等教育 > 工学

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

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