占空比可调方波发生器.docx
《占空比可调方波发生器.docx》由会员分享,可在线阅读,更多相关《占空比可调方波发生器.docx(15页珍藏版)》请在冰豆网上搜索。
![占空比可调方波发生器.docx](https://file1.bdocx.com/fileroot1/2022-11/25/a5d7e0d1-c4bb-4d52-bdf5-d540406edbbc/a5d7e0d1-c4bb-4d52-bdf5-d540406edbbc1.gif)
占空比可调方波发生器
东北石油大学
课程设计
课程单片机课程设计
题目占空比可调的方波发生器
院系电气信息工程学院测控系
专业班级测控
学生姓名
学生学号
指导教师
2012年3月19日
东北石油大学课程设计任务书
课程单片机课程设计
题目占空比可调的方波发生器
专业测控技术与仪器姓名学号
一、任务
使用集成运算放大器、稳压二极管、二极管、电阻等器件设计方波函数发生器。
二、设计要求
[1]根据技术要求和现有开发环境,分析课设题目。
[2]设计系统实现方案。
[3]频率可调,用一个变阻器来调整波形的频率,频率调节范围为20Hz~2000Hz
[3]写出详细的设计报告。
[4]给出全部电路和源程序
三、参考资料
[1]何立民.MCS51单片机应用系统设计[M].北京:
北京航空航天大学出版社,2003.
[2]徐君毅.单片微型机原理与应用[M].上海:
上海科技出版社,1995
[3]公茂法.单片机人机接口实例集[M].北京:
航空航天大学出版社,1998.
[4]沈红卫.基于单片机的智能系统设计与实现[M].北京:
电子工业出版社,2005.
[5]李广弟,朱月秀等.单片机基础[M].北京:
北京航空航天大学出版社,2003.
完成期限2012.3.19至2012.3.30
指导教师
专业负责人
2012年3月19日
第1章绪论
单片机集成度高、功能强、可靠性高、体积小、功耗地、使用方便、价格低廉等一系列优点,目前已经渗入到人们工作和生活的方方面面,几乎“无处不在,无所不为”。
单片机的应用领域已从面向工业控制、通讯、交通、智能仪表等迅速发展到家用消费产品、办公自动化、汽车电子、PC机外围以及网络通讯等广大领域。
单片机有两种基本结构形式:
一种是在通用微型计算机中广泛采用的,将程序存储器和数据存储器合用一个存储器空间的结构,称为普林斯顿结构。
另一种是将程序存储器和数据存储器截然分开,分别寻址的结构,一般需要较大的程序存储器,目前的单片机以采用程序存储器和数据存储器截然分开的结构为多。
本课题讨论的方波发生器的核心是目前应用极为广泛的51系列单片机。
1.1设计内容
本课程设计是设计一个方波发生器,用4位数码管显示方波的频率。
1.2设计基本要求
频率可调,用一个变阻器来调整波形的频率,频率调节范围为20Hz~2000Hz;
占空比可调,采用两个按键来实现增加、减小波形的占空比作用,占空比调节步长为1%,即每按键一次,占空比增加或减少1%。
占空比用另外两位数码管显示。
系统上电时频率依变阻器的阻值设定,占空比设定为50%。
而我们在此设计的方波发生器与要求要设计的有点区别,所设计的频率调节范围为1Hz~15000Hz,以调节变阻器的阻值来实现频率的调节相对来说要麻烦些。
因此,频率也使用按键来进行调节,不同的频率及占空比可以使用不同的按键来实现,而以键盘扫描来实现各键的不同功能;显示部分可以使用ZLG7290芯片及数码管来实现。
由此即可构成一个最小单片机应用系统。
第2章总体方案论证与设计
在电子技术领域中,实现方波发生器的方法有很多种,可以采用不同的原理及器件构成不同的电路,但可以实现相同的功能。
在此次设计中,有些地方与课题原本的具体要求有点不同。
如实现频率调节时,不是按要求利用调整变阻器的阻值来完成的,而是用按键来实现的。
2.1方案论述
微处理器模块AT89S52,频率与占空比信息显示模块,2×4矩阵键盘模块,74LS164移位寄存器显示驱动模块。
本设计中用到两个定时器,定时器0和定时器1,其中定时器0工作在定时方式下, 决定方波的频率;定时器1同样工作在定时方式下,用于设定占空比。
用LED显示器来显示频率与占空比,键盘的操作是通过外中断与单片机共同来控制的,键盘操作来完成按要求对频率与占空比进行调节。
2.2方波发生器的总体硬件组成框图
第3章系统硬件设计
3.1最小单片机系统
单片机各功能部件的运行都是以时钟频率为基准的,有条不紊地进行工作。
因而时钟频率直接影响单片机的速度,时钟电路的质量也直接影响单片机系统的稳定性。
常用的时钟电路方式有两种:
一种是内部时钟方式,一种是外部时钟方式,这里采用的是内部时钟方式,外接晶振。
时钟电路由片外晶体、微调电容和单片机的内部电路组成。
选取频率为11.0592MHz的晶振,微调电容是瓷片电容。
89S52单片机的P0.7口作为波形输出口,若接示波器,则可通过示波器来观察波形,是一个矩形波。
此单元电路包括时钟电路、复位电路,具体电路如图所示:
3.2小键盘接口电路
小键盘如图3-2所示。
它包括8个键,系统中用到的键只有5个,分别为0号、1号、2号、3号、4号键。
其中0号键是状态键,采用外部中断控制,用它来确定其它几个键的按键功能,具体作用在前述的系统功能中已做介绍了;另外4个键为功能键,调节频率与占空比的。
小键盘中引出的6根线依次分别接单片机的P1.0、P1.1、P1.2、P1.3、P1.4、P1.5口。
图3-2小键盘接口电路
3.3LED显示电路
采用静态显示来实现显示功能,如图4所示。
移位寄存器74LS164,实现串行输入,并行输出。
串行数据由RXD输出,从74LS164的A、B端口输入寄存器,移位时钟由TXD提供。
在移位时钟作用下,存放显示器段码的串行发送缓冲器数据逐位由A、B端移入到74LS164中,再由Q0到Q7并行输出到显示数码管相应的LED上。
8片74LS164首尾相串,而时钟端则接在一起。
这部分的最终功能是显示频率与占空比。
显示部分具体电路如图3-3所示:
图3-3LED显示电路
由于系统的要求不高,比较单一的,再加上我们是通过定时器来调节频率的,而非电阻,因此实现起来就相对简化了。
仅用键盘、AT89S52及串行显示便可完成设计,达到所要求实现的功能。
方波发生器工作原理与功能:
简单的流程为:
主程序扫描键盘,将设置信息输入,处理后,输出到LED显示器显示。
单片机的晶振为11.0592MHz,用到了两个定时器,即定时器0与定时器1,分别进行频率与占空比的定时,两个定时器都是工作在方式1。
根据计算定时器初值的公式:
计算出定时器0与定时器1所要装入的初值。
此电路的键盘是由一个状态键,四个功能键(调节频率与占空比的增减)组成,其特殊之处在于利用外部中断实现键盘扫描。
状态键有三种状态,当其处于状态0时,则其它的键会处于无用状态,当其处于状态1时,可通过按四个调节键来调节频率,处于第三种状态时,按四个调节键中的前两个便可对占空比进行调节了。
第4章系统的软件设计
软件是该LED显示屏控制系统的重要组成部分,在系统的软件设计中我们也才用了模块化设计,将系统的各部分功能编写成子模块的形式,这样增强了系统软件的可读性和可移植性。
4.1主程序
主程序包括系统初始化及显示程序,是一个死循环系统。
其流程图如图所示:
4.2系统初始化子程序
在此程序中,给所有变量赋初值,有键盘扫描口、选择串行口工作方式SCON、状态标志位flag、初始频率与占空比及其定时、定时器0与定时器1的工作方式等。
初始化时启动了定时器0与定时器1。
4.3显示子程序
利用分离频率的各位数值,将各位数值分别显示出来。
在程序中利用了频率显示的高位灭零的方法以致最高位为0时就不显示,以致显示效果美观化。
一共有五位是显示频率的,若频率小于10000时,则万位不显示;若频率小于1000时,则万位与千位都不显示,依次类推。
占空比的显示规律与频率的一样。
显示子程序流程图如图4-2所示:
4.4键盘扫描程序
键盘扫描用外中断0实现,采用的是线反法,键盘扫描码采用逐行扫描的方法。
关于键盘扫描程序的说明:
频率可调时,占空比保持原状不变,反之亦然,只能进行单一变量的调节,状态标志flag的初始值为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的计算。
键盘中断处理子程序流程图与键处理流程图分别如图4-3、图4-4所示:
4.4定时中断子程序
定时器中断子程序中有定时器0与定时器1中断,频率定时器0中断流程图与占空比定时器1流程图分别如图4-5、图4-6所示。
(1)定时器0遇中断执行的操作有复位,启动自身进行频率定时,同时启动定时器1,进行占空比定时,输出高电平。
(2)定时器1遇中断,停止自身的计时,输出低电平。
第5章系统调试与测试结果分析
5.1硬件调试
硬件的测试首先是检查电路的逻辑线路是否正确,如果正确再检查原理图的线路连接是否正确,电路的布局安排是否合理等等。
软件的测试只要是检查程序的语法是否正确,数据结构安排是否妥当,时序是否正确,整体流程安排是否合理。
上面两部检查妥当后,就到了系统调试最关键的一步,软硬件的协同调试,问题往往在此才能被发现。
5.2软件调试
在软硬件协同调试时,硬件问题比较少,主要体现在上拉电阻的使用,滤波电容的使用等,极少发生逻辑上的错误。
硬件的问题往往是致命的问题,其不易察觉,发现之后电路更改也不容易。
这就需要我们不断的实验,在实战中摸索出规律,吸取经验教训,在以后的电路设计中能设计出稳定的抗干扰能力强的电路。
软件问题是调试中遇到问题最多的,此系统中出现过的问题有以下几处:
1、键盘中断处理程序中中断入口后,没有关掉外部中断,出现键值读取不正确,不能正确操作键盘。
解决方法,在中断入口处关掉外中断,并在出口时再开外中断;
2、键盘扫描前没有软件延时消抖,出现键值读取不准确。
解决方法,在键盘中断入口后在键值扫描前软件延时5ms,消去键盘抖动所带来的误操作;
3、程序中有个别地方将“=”与“==”混淆,造成结果不准确,解决办法,仔细查找,将混淆出更正。
再把到计时设定时子程序加进来,看是否能通过菜单正确调用,返回。
能否修改到计时。
整个调试完毕。
结论
在单片机课程设计中,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。
更重要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
设计过程,也好比是我们人类成长的历程,常有一些不如意,也许这就是在对我们提出了挑战,勇敢过,也战胜了,胜利的钟声也就一定会为我们而敲响。
但是,由于平时对单片机知识学习得不够扎实,理解得不够透彻、一知半解,致使在运用是不能贯通,导致在设计过程中困难重重,往往无从下手,但是通过和同组的同学一起探讨,最后还是一步一步的把所有的问题给一一解决了。
在这次设计过程中,我也对word、protel、画图板等软件有了更进一步的了解,这使我在以后的学习中更加熟练。
参考文献
[1]谢嘉奎《电子线路》(线性部分)(第四版)高等教育出版社2002年6月
[2]康华光《电子技术基础》(数字部分)高等教育出版社2006年1月
[3]兰吉昌《运算放大器集成电路手册》化学工业出版社2008年8月
[4]钱培怡杨柏林《电子电路实验与课程设计》北京地震出版社2002
[5]李川,汪秋蒙.ISP技术的原理及实现方法[J].科技资讯.2007,35期:
93-94.
[6]万光毅.单片机实验与实践教程[M].北京航空航天大学出版社.2005.1.
[7]张毅刚.单片机原理及应用[M].高等教育出版社.2003:
160-190.
[8]Philips.74HC595.datasheet.PhilipsSemiconductors.2003Jun25
[9]胡烨,姚鹏翼,陈明.Protel99SE原理图与PCB设计教程[M].机械工业出版社.2005:
23-99.
[10]马忠梅.单片机的C语言应用程序设计[M].北京:
北京航空航天大学出版社.2006
附录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++)
{;}
}
/*****************************************
显示子程序
*****************************************/
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;
m=ZKB/10;//分离占空比各位数值
n=ZKB%10;
if(m==0)
{m=10;//占空比显示的高位灭零
if(n==0)n=10;
}
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++)
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;//开中断
}
/*****************************************