基于单片机的方波信号发生器设计文档格式.docx
- 文档编号:17944790
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:10
- 大小:60.53KB
基于单片机的方波信号发生器设计文档格式.docx
《基于单片机的方波信号发生器设计文档格式.docx》由会员分享,可在线阅读,更多相关《基于单片机的方波信号发生器设计文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
方案三:
采用单片机编程的方法来实现.该方法可以通过编程的方法来控制信号波形的频率和幅度,而且在硬件电路不变的情况下,通过改变程序来实现频率的变换.此外,由于通过编程方法产生的是数字信号,所以信号的精度可以做的很高.。
鉴于方案一的信号频率不够稳定和方案二的电路复杂,频率覆盖系数难以达标等缺点,所以决定采用方案三的设计方法.它不仅采用软硬件结合,软件控制硬件的方法来实现,使得信号频率的稳定性和精度的准确性得以保证,而且它使用的几种元器件都是常用的元器件,容易得到,且价格便宜,使得硬件的开销达到最省。
在此次设计中,利用AT89C51单片机,软硬件结合,实现频率和占空比调节。
按键的操作是通过外中断与单片机共同来控制的,按键操作完成按要求对频率与占空比进行调节。
可输出占空比为1%—99%,精度为1%,频率范围为50Hz—500Hz,精度为10Hz的方波。
本设计用到一个AT89C51微处理器,4个按键,一个四与门。
AT89C51用到两个定时器,定时器0和定时器1,其中定时器0工作在定时方式1下,
决定方波的频率;
定时器1同样工作在定时方式1下,用来设定占空比。
两个按键1和2控制方波信号的频率。
当按键1或按键2按下时,此时进行频率的调节,占空比不变。
1键按下时,频率进行增加100Hz,若2键按下时,频率进行增加10Hz。
频率的最大值为500Hz,当频率大于最大值时,重新赋值为50Hz。
另外两个按键3和4控制方波信号的占空比。
当按键3或按键4按下时,此时进行占空比的调节,频率不变。
3键按下时,占空比进行增加10%,若4键按下时,占空比进行增加1%。
频率的最大值为99%,当占空比大于99%时,重新赋值为1%。
2.2设计原理
AT89C51单片机本身就是一个完整的微型计算机,具有组成微型计算机的各部分部件:
中央处理器CPU,随机存取存储器RAM,I/O定时器/计数器以及串行通讯接口等,只要将AT89C51只读存储器ROM,接口电路,再配置键盘及其接口,显示器及其接口,数模转换及波形输出,指示灯及其接口等四部分,即可构成所需的波形发生器,其信号发生器构成原理框图如图1所示。
由于输出为方波,不需要接口电路,D/A转换器等,可直接输出。
89C51是整个波形发生器的核心部分,通过程序的编写和执行,产生各种各样的信号,并从键盘接收数据,进行频率的转换和占空比的调节。
可直接输出波形并用示波器观察。
在信号发生器中,只用到片内中断请求,即是在AT89C51输出一个波形采样点信号后,接着启动定时器,在定时器未产生中断之前,AT89C51等待,直到定时器计时结束,产生中断请求,AT89C51响应中断,接着输出下一个信号波形,如此循环产生所需要的信号。
当有按键按下时,产生外部中断请求信号,CPU暂停当前的工作,处理中断请求,重新装入定时初值,开始定时。
单片机的频率为12MHz,用到了两个定时器,利用中断进行定时。
定时器有有四种工作方式。
本设计中都选用工作方式1,计数值为十六位。
根据计算定时器初值的公式
计算出定时器0与定时器1所要装入的初值。
定时器0与定时器1采用定时方式1。
定时器0初值为C1=(65536-fosc/(12.0*freq))
定时器1初值为C2=(65536-(fosc*zkb)/(12.0*100*freq))
其中freq表示输出方波频率,zkb表示方波占空比。
三、系统的硬件设计
系统的硬件原理图如图2。
单片机常用的时钟电路方式有两种:
一种是内部时钟方式,一种是外部时钟方式,这里采用的是内部时钟方式。
AT89C51单片机的P1.0P1.1P1.2P1.3口分别连接四个按键,对输出方波的频率,占空比进行控制。
P2.0口作为方波输出口,可通过示波器来观察波形。
四个键盘口连接一个四与门,与INTO口相连接,将键盘中断请求信号送入CPU。
图2原理图
四.软件设计
方波发生器的软件设计包括主程序、延时子程序、系统初始化程序、、键盘中断子程序、定时器中断子程序。
其中主程序用来控制整个程序的执行,它与各子程序紧密相联,共同实现方波发生器各种功能的执行。
4.1、主程序
主程序包括系统初始化,和一个死循环系统。
当有中断请求信号产生时,跳出循环,执行中断程序。
其流程图如图3所示
4.2、系统初始化子程序
在此程序中,给所有变量赋初值,有键盘扫描口、初始频率与占空比及其定时、开中断、定时器0与定时器1的工作方式等。
初始化时启动了定时器0与定时器1。
其中初始频率为50Hz,占空比为50%。
4.3键盘中断子程序
键盘用外中断0实现。
当有键按下时,产生低电平送入INTO口,形成中断请求信号,CPU转去执行键盘中断子程序,进行频率调节或占空比调节。
(1)频率调节:
当按键1或按键1按下时,此时进行频率的调节,占空比不变。
(2)占空比调节:
键盘中断处理子程序流程图如图3所示:
图3键盘中断处理子程序流程图
定时器中断子程序中有定时器0与定时器1中断,频率定时器0中断流程图与占空比定时器1流程图分别如图4、图5所示。
(1)定时器0中断执行的操作有复位,启动自身进行频率定时,同时启动定时器1,进行占空比定时,输出高电平。
(2)定时器1中断,停止自身的计时,输出低电平。
这次编程用的是C语言。
虽然以前学过C语言,但c51编程比较少,所以在编程时还是遇到了一些问题。
软件问题是调试中遇到问题最多的,此系统中出现过的问题有以下几处:
1、键盘中断处理程序中中断入口后,没有关掉外部中断,出现键值读取不正确,不能正确操作键盘。
解决方法,在中断入口处关掉外中断,并在出口时再开外中断;
2、键盘扫描前没有软件延时消抖,出现键值读取不准确。
解决方法,在键盘中断入口后在键值扫描前软件延时5-10ms,消去键盘抖动所带来的误操作,或者使用硬件延时;
3、键盘中断开始采用低电平触发中断,仿真时发现按一次3键,占空比确实减少10%,频率调节也不够准确,通过检查程序后来终于发现了问题,将其改为下降沿触发中断。
5.2硬件调试
硬件的测试首先是检查电路的逻辑线路是否正确,如果正确再检查原理图的线路连接是否正确,电路的布局安排是否合理等等。
软件的测试只要是检查程序的语法是否正确,数据结构安排是否妥当,时序是否正确,整体流程安排是否合理。
上面两部检查妥当后,就到了系统调试最关键的一步,软硬件的协同调试,问题往往在此才能被发现。
5.3性能分析
此次设计的方波信号发生器频率和占空比都独立可调,可输出占空比为1%—99%,调节精度为1%,频率范围为50Hz—500Hz,调节精度为10Hz的方波。
当改变频率时,占空比不变,当改变占空比时,频率不变。
初始输出的方波频率为50Hz,占空比为50%。
进行频率调节时,每次可增加100Hz或10Hz,超出500Hz重新输出为50Hz的方波。
进行占空比调节时,每次可增加10%或1%,超出99%时输出占空比为1%的方波。
设计要求用4个按键分别控制输出信号的占空比和频率,兼顾输出方波的调节精度和调节的方便性,要输出更宽频率变化范围,调节精度更高的方波就要使用更多的按键。
总之,此次设计达到了设计要求。
输出的方波具有较高的调节精度,误差小,调节方便,工作稳定,结构简单。
六、源程序
#include<
reg51.h>
#defineucharunsignedchar
#defineuintunsignedint
floatfosc=;
//系统时钟频率
sbitKEY1=P1^0;
//控制频率百位;
sbitKEY2=P1^1;
//控制频率十位;
sbitKEY3=P1^2;
//控制占空比十位;
sbitKEY4=P1^3;
//控制占空比个位;
sbitOUTPUT=P2^0;
//方波输出端口;
ucharzkb;
uintfreq;
ucharTIMER0_L,TIMER0_H,TIMER1_L,TIMER1_H;
//定时器0和1的定时初值
/*****************************************
延时子程序
*****************************************/
voiddelay(ucharn)//延时
{
uchari;
while(n--)
{for(i=255;
i>
0;
i--)
{}
}}
系统初始化
voidchushihua(void)
P1=0x0f;
freq=50;
zkb=50;
TIMER0_L=0xe0;
TIMER0_H=0xb1;
TIMER1_L=0xf0;
TIMER1_H=0xd8;
TL0=0xe0;
//初始频率50Hz定时20ms
TH0=0xb1;
TL1=0xf0;
//初始占空比50%定时10ms
TH1=0xd8;
TMOD=0x11;
//定时器1和定时器0工作在方式1
IT0=1;
//选择INT0为下降沿触发方式
EX0=1;
//外部中断0允许
ET0=1;
//定时器1和定时器0中断允许
ET1=1;
EA=1;
//系统中断允许
TR0=1;
//定时器1和定时器0开始定时
TR1=1;
}
主函数
voidmain(void)
chushihua();
//系统初始化
while
(1)
}
定时器中断子程序
voidTimer0_freq()interrupt1//频率定时器0中断
//启动定时器1,占空比定时
TL0=TIMER0_L;
TH0=TIMER0_H;
OUTPUT=1;
//输出高电平
voidTimer1_zkb()interrupt3//占空比定时器1中断
TR1=0;
//定时器1停止
TL1=TIMER1_L;
TH1=TIMER1_H;
OUTPUT=0;
//输出低电平
键盘扫描子程序
voidkeyscan()interrupt0using1//外部中断0
{floatTF0,TZ1;
EX0=0;
//关中断
delay(10);
//延时消抖
if(P1!
=0x0f)//判断是否有键按下
{if(KEY1==0)freq+=100;
//按键为1号,频率加100
if(KEY2==0)freq+=10;
//按键为2号,频率加10
if(freq>
500)freq=50;
//频率大于500Hz,重新赋值为50Hz
if(KEY3==0)zkb+=10;
//按键为3号,占空比加10
if(KEY4==0)zkb++;
//按键为4号,占空比加1
if(zkb>
99)zkb=1;
//占空比大于99,重新赋值为1
TF0=(65536-fosc/(12.0*freq));
//频率定时初值
TZ1=(65536-(fosc*zkb)/(12.0*100*freq));
//占空比定时初值
TIMER0_H=(uint)TF0/256;
//计算定时器0和定时器1的初值
TIMER0_L=(uint)TF0%256;
TIMER1_H=(uint)TZ1/256;
TIMER1_L=(uint)TZ1%256;
}
//给键盘扫描口赋初值
//开中断
TR1=1}
七、心得体会
这次单片机课程设计我收获很多。
开始的时候感觉很简单。
以前做数电课程设计的时候也是类似的题目。
但这次和上次有很大的不同。
上次用的是555定时器,这次使用单片机的两个定时器进行定时,还需要有软件设计。
由于没有经验,不知如何下手,特别是按键功能的设计。
题目要求用四个按键控制方波的频率和占空,按键设计有很多方法,不知道如何选择。
最后经过一番比较,觉的现在的方案比较好。
用两个按键控制方波的频率,另外两个按键控制方波的占空比。
当按键1或按键1按下时,此时进行频率的调节,占空比不变。
当按键3键按下时,占空比进行增加10%,若4键按下时,占空比进行增加1%。
具有较高的调节精度,调节起来也比较方便。
方案设计好后,接下来就是程序设计。
这次我用的是C语言。
平时都是用汇编写单片机程序。
我觉得这是一次挑战,也能学习更多的东西。
我以为这些做好了,构思也有了,写程序应该是相对容易的。
谁知道,写起程序来,才想到功能键要有扫描程序才行呀。
虽然扫描程序的实现的功能比较简单,单写起来还是比较麻烦的。
于是在自己的努力下,程序很快就写好了。
也没有发现什么错误。
但是在进行仿真的问题就出现了。
当按下按键的时候,波形始终不对。
经过多次检查觉得键盘扫描程序也没有问题。
于是又向同学请教。
最后终于发现了问题关键所在。
原来在进行初始化的时候,按键中断用的是低电平触发中断,最后改为下降沿触发中断。
在进行仿真,终于成功了,波形也很完美。
感觉很有成就感。
通过这次课程设计我也发现了自身存在的不足之处,虽然感觉理论上已经掌握,但在运用到实践的过程中仍有意想不到的困惑,经过一番努力才得以解决。
尽管经历了不少的艰辛,但给我积累了一点设计的经验,最后也有点小小的成就感。
后面的路还很长,我还的努力!
这也激发了我今后努力学习的兴趣,我想这将对我以后的学习产生积极的影响。
我懂得了学习的重要性,了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。
八、参考文献
1.周明德.微型计算机系统原理及应用北京:
清华大学出版社2002
2.李群芳单片微型计算机与接口技术北京电子工业出版社2008
3.李叶紫MCS-51单片机应用教程北京:
清华大学出版社2004
4.何立民MCS51单片机应用系统设计北京:
北京航空航天大学出版社2003
5.段晨东单片机原理与接口技术北京:
清华大学出版社2008
附件6:
本科生课程设计成绩评定表
姓名
性别
专业、班级
课程设计题目:
课程设计答辩或质疑记录:
成绩评定依据:
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 方波 信号发生器 设计