设计并实现占空比可调的信号发生器.docx
《设计并实现占空比可调的信号发生器.docx》由会员分享,可在线阅读,更多相关《设计并实现占空比可调的信号发生器.docx(20页珍藏版)》请在冰豆网上搜索。
设计并实现占空比可调的信号发生器
目录
1仿真软件介绍1
1.1Proteus软件介绍1
1.2Keil软件介绍1
2设计原理和方案1
2.1方案的选择和设计1
2.2设计原理2
2.3系统硬件线路图设计图3
2.3.151单片机介绍3
2.3.2LCD1602简介4
2.3.3系统硬件电路简介5
3系统软件设计6
3.1主程序6
3.2系统初始化子程序6
3.3键盘扫描程序7
3.4系统的资源分配表7
3.5源程序8
4系统软件仿真13
5性能分析15
5.1定时器中断分析15
5.2系统性能分析15
5.3误差分析15
6心得体会16
7参考文献17
1仿真软件介绍
1.1Proteus软件介绍
Proteus软件是英国Labcenterelectronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。
它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。
它是目前最好的仿真单片机及外围器件的工具。
虽然目前国内推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。
Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。
是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,2010年又增加了Cortex和DSP系列处理器,并持续增加其他系列处理器模型。
在编译方面,它也支持IAR、Keil和MPLAB等多种编译器。
1.2Keil软件介绍
KeilC51是美国KeilSoftware公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部分组合在一起。
运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。
如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事半功倍。
2设计原理和方案
2.1方案的选择和设计
方案一:
采用分立器件实现非稳态的多谐振荡器,然后根据具体需要加入积分电路等构成矩形等波形发生器。
这种信号发生器输出频率范围窄而且电路参数设定较繁琐,其频率大小的测量往往需要通过硬件电路的切换来实现,操作不方便。
方案二:
用集成芯片实现函数信号发生器。
这种信号发生器。
这种信号发生器能产生多种波形信号,可以达到较高频率,但电路复杂并且不易调试。
方案三:
采用单片机编程的方法实现。
该方法可以通过编程,来控制方波信号输出的频率和幅度,并且只要改变程序的相关参数,便可以改变输出波形的频率和占空比。
由于编程的方法产生的是数字信号,所以信号的精度可以做到很高。
并且电路简单。
方案四:
利用专用直接数字合成DDS芯片实现函数信号发生器。
这种信号发生器能产生任意波形并且达到很高的频率,但成本较高。
综合成本和性能等多方面因素,本例采用第三种方法,即采用单片机编程的方法实现占空比可调,频率可调的方波信号发生器。
2.2设计原理
在此次课程设计中,利用AT89C51单片机,软硬件结合,实现占空比和频率可调,案件的操作是通过数字电路跟外部中断0来控制的。
可以输出占空比在1%到99%可调,精度为1%,频率范围在50HZ到500HZ可调,精度为10HZ的方波。
AT89C51单片机是整个波形信号发生器的核心,通过程序的编写和执行,可以产生可以调节的方波,并受到按键的控制,增减频率和占空比。
并且在液晶上显示出来。
定时器0工作再方式1下,决定输出信号的频率,定时器1工作再方式1下,决定输出信号的占空比。
按键1和2决定信号的输出频率,按键1用于增大信号的频率,按一下就增加10HZ,当增减大500HZ时,就归为50HZ。
按键2用于减小输出信号的频率,按一次键,输出信号的频率减少10HZ,当减少到50HZ时,频率就归于500.按键3和4决定信号的占空比,按键3用于增加信号的占空比,按下一次键,占空比就增加1,上限值为99,当在此按键是,就让占空比归1.按键4用于减小信号的占空比,按下一次键,占空比就减1,下限值为1,当再次按键时,就让占空比回归到99.通过上面的步骤,可以实现占空比和频率的可调。
液晶则选用LCD032L,可直观的看到频率和占空比。
信号发生器原理框图如图1:
单片机AT89C51
LCD显示
按键或按钮
频率与占空比数据频率与占空比数据
图1信号发生器原理框图
2.3系统硬件线路图设计图
2.3.151单片机介绍
51单片机是对目前所有兼容Intel8031指令系统的单片机的统称。
该系列单片机的始祖是Intel的8031单片机,后来随着Flashrom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。
目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。
51单片机是基础入门的一个单片机,还是应用最广泛的一种。
需要注意的是52系列的单片机一般不具备自编程能力。
当前常用的51系列单片机主要产品有:
*Intel的:
80C31、80C51、87C51,80C32、80C52、87C52等;
*ATMEL的:
89C51、89C52、89C2051等;
*Philips、华邦、Dallas、Siemens(Infineon)等公司的许多产品
目前,国产宏晶STC单片机以其低功耗、廉价、稳定性能,占据着国内51单片机较大市场。
主要功能有:
8位CPU·4kbytes程序存储器(ROM)(52为8K) 图251单片机的引脚图
256bytes的数据存储器(RAM)(52有384bytes的RAM)
32条I/O口线
111条指令,大部分为单字节指令
21个专用寄存器
2个可编程定时/计数器
5个中断源,2个优先级(52有6个)
一个全双工串行通信口
外部数据存储器寻址空间为64kB
外部程序存储器寻址空间为64kB
逻辑操作位寻址功能·双列直插40PinDIP封装
单一+5V电源供电
CPU:
由运算和控制逻辑组成,同时还包括中断系统和部分外部特殊功能寄存器;
RAM:
用以存放可以读写的数据,如运算的中间结果、最终结果以及欲显示的数据;
ROM:
用以存放程序、一些原始数据和表格;
I/O口:
四个8位并行I/O口,既可用作输入,也可用作输出;
T/C:
两个定时/记数器,既可以工作在定时模式,也可以工作在记数模式; 五个中断源的中断控制系统;
一个全双工UART(通用异步接收发送器)的串行I/O口,用于实现单片机之间或单片机与微机之间的串行通信;
片内振荡器和时钟产生电路,石英晶体和微调电容需要外接。
最高振荡频率为12M。
2.3.2LCD1602简介
工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行)1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
图3LCD1602引脚图
1602采用标准的16脚接口,其中:
第1脚:
VSS为电源地
第2脚:
VDD接5V电源正极
第3脚:
V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:
RW为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
第6脚:
E(或EN)端为使能(enable)端。
第7~14脚:
D0~D7为8位双向数据端。
第15~16脚:
空脚或背灯电源。
15脚背光正极,16脚背光负极
1602LCD的特性:
+5V电压,对比度可调,内含复位电路提供各种控制命令,如:
清屏、字符闪烁、光标闪烁、显示移位等多种功能。
有80字节显示数据存储器DDRAM,内建有192个5X7点阵的字型的字符发生器CGROM,8个可由用户自定义的5X7的字符发生器CGRAM。
2.3.3系统硬件电路简介
系统硬件电路原理图如下图2所示:
四个独立按键分别与单片机P1.0,P1.1,P1.2,P1.3相连接,并且通过一个四输入的与门,将与门的输出当做单片机外部中断0的触发信号。
当有按键按下时,就会进入外部中断程序。
P1.4口输出信号连接到示波器,检测输出波形。
通过单片机的PO口连接到LCD016L的数据段,用以显示波形信号发生器的频率和占空比。
图4系统硬件电路原理图
3系统软件设计
软件是该LCD显示控制系统的重要组成部分,在软件的设计中,我们采用了模块了设计,将各部分功能编写为子模块的形式,这样增加了程序的可读性。
3.1主程序
主程序用于控制整个系统,先对系统初始化,然后通过一个空循环等待中断程序,当中断到来时候,就进入中断程序,执行中断程序。
中断程序执行完成之后,就返回主程序,继续等待。
3.2系统初始化子程序
在此程序中,给所有变量赋初值,特别是T0,T1的初始值使产生方波的频率为50Hz,占空比为50%,且在LCD016L上显示出来。
3.3键盘扫描程序
键盘扫描用外部中断0实现,用以分析是哪个键盘被按下,然后在实现所要的功能。
关于键盘扫描程序的说明:
频率可调时,占空比保持原状不变,反之亦然。
(1)频率调节
当按下键1的时候,会转到外部中断0子程序,判断之后,会改变其中变量fre的值,然后分别将T0,T1按要求重新赋初始值,然后再在液晶上实时刷新。
即可改变即加10Hz,当加到最大值500Hz时,继续按下键1,将会回到最小值50Hz上。
同理按下键2,频率值将会减10Hz,当减到最小值50Hz,会回到最大值500Hz上。
(2)占空比调节
当按下键3,进入到外部中断0子程序,判断却是按下后,改变zkb(即占空比),然后改变定时器的初值。
实时刷新,同频率调节,占空比也需要进行限制。
要注意的是频率和占空比的初始值都为50,我们定义的占空比为百分比的分子部分。
键盘处理子程序,当有按键按下时,进入到外部中断,然后暂时关闭外部中断,启动延时程序,以消除抖动。
然后检测是哪个按键被按下,然后对频率跟占空比的变量做出相应的赋值,并且将占空比的值送到数码管显示。
并且对定时器0和定时器1分别赋新的初值,开启外部中断,定时器0和1中断,中断程序结束。
3.4系统的资源分配表
系统的资源分配表如表1所示:
表1系统资源分配
P0
P1.0~P1.3
P1.4
P3.2
液晶数据线
按键接口
方波信号输出口
外部中断0触发引脚
3.5源程序
#include
#defineucharunsignedchar
#defineuintunsignedint
floatfosc=12000000;//系统时钟频率
sbitkey1=P1^0;//控制频率的增加
sbitkey2=P1^1;//控制频率的减少
sbitkey3=P1^2;//控制占空比的增加
sbitkey4=P1^3;//控制占空比的减少
sbitLCDEN=P3^4;
sbitRS=P3^5;
sbitclk=P1^4;
ucharnum;
ucharcodetable1[]="FRE(Hz):
";
ucharcodetable2[]={"DUT(%):
"};
uintzkb=50;//占空比初值,取值范围为0到100
uintfre=50;//频率初值,取值范围为50到500
uinttime0_H,time0_L,time1_H,time1_L;
voiddelay(uintz)
{uinti,j;
for(i=z;i--;i>0)
for(j=110;j--;j>0);
}
voidwrite_com(ucharcom)
{
RS=0;
P0=com;
delay(5);
LCDEN=1;
delay(5);
LCDEN=0;
}
voidwrite_data(uchardate)
{
RS=1;
P0=date;
delay(5);
LCDEN=1;
delay(5);
LCDEN=0;
}
voidinit()//方波产生
{
TMOD=0x11;//定时器0和1都工作在方式1(高8位与低8位)
time0_H=0xB1;
time0_L=0xE0;
time1_H=0xD8;
time1_L=0xF0;
TH0=0xB1;//定时器0装入初值,计数器计数20000次,20ms
TL0=0xE0;
TH1=0xD8;//定时器1装入初值,计数器计数10000次,10ms
TL1=0xF0;
IT0=1;//外部中断1为低电平触发
EX0=1;//开外部中断1
ET0=1;//定时器T0中断允许
ET1=1;//定时器T1中断允许
EA=1;//开启总中断
TR0=1;//开启定时器0
TR1=1;//开启定时器1
LCDEN=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
voidmain()
{
init();
write_com(0x80);
for(num=0;num<8;num++)
{
write_data(table1[num]);
delay(5);
}
write_data(0x30+5);
delay(5);
write_data(0x30+0);
delay(5);
write_com(0x80+0x40);
for(num=0;num<7;num++)
{
write_data(table2[num]);
delay(5);
}
delay(5);
write_data(0x30+5);
delay(5);
write_data(0x30+0);
while
(1);
}
voidT0_time()interrupt1
{
TR1=1;//开定时器1
TH0=time0_H;
TL0=time0_L;
clk=1;
}
voidT1_time()interrupt3
{
TR1=0;//关定时器1
TH1=time1_H;
TL1=time1_L;
clk=0;
}
voidkeyscan()interrupt0//外部中断0
{
ucharfre_bai,fre_shi,fre_ge,zkb_shi,zkb_ge;
floatTX,TZ;
EX0=0;//关中断
delay(10);//延时消抖
if(P1!
=0x0F)
if(key1==0)
{
fre=fre+10;
if(fre>500)
fre=50;
}
if(key2==0)
{
fre=fre-10;
if(fre<50)
fre=500;
}
if(key3==0)
{
zkb=zkb+1;
if(zkb>99)
zkb=1;
}
if(key4==0)
{
zkb=zkb-1;
if(zkb<1)
zkb=99;
}
TX=(65536-fosc/(12.0*fre));
TZ=(65536-(fosc*zkb))/(12.0*100*fre);
time0_H=(uint)TX/256;//十进制转化为十六进制高八位
time0_L=(uint)TX%256;
time1_H=(uint)TZ/256;
time1_L=(uint)TZ%256;
P1=0x0f;
EX0=1;
TR0=1;
TR1=1;
fre_bai=fre/100;
fre_shi=fre/10%10;
fre_ge=fre%10;
write_com(0x80+0x08);
write_data(0x30+fre_bai);
delay(5);
write_data(0x30+fre_shi);
delay(5);
write_data(0x30+fre_ge);
delay(5);
zkb_shi=zkb/10;
zkb_ge=zkb%10;
write_com(0x80+0x07+0x40);
write_data(0x30+zkb_shi);
delay(5);
write_data(0x30+zkb_ge);
delay(5);
}
4系统软件仿真
下载KEIL的HEX文件在单片机中。
仿真如下图。
图5初始仿真图
调节频率后仿真图如图6示:
图6调频后仿真图
再调占空比后仿真如图7所示:
图7调占空比后仿真图
5性能分析
5.1定时器中断分析
本次占空比可调的信号发生器的设计采用了定时器0和定时器1中断,定时器0中断用于控制信号的频率,定时器1用于控制信号的占空比。
当调节输出信号的占空比时,信号的频率就不变;如果调节信号的频率,占空比就不变。
设fre表示输出的频率,zkb表示输出的占空比,TX为定时器0的计数次数,TZ为定时器1的计数次数。
给TX装入初值为:
TX=(65536-fosc/(12.0*fre));给TZ装入初值为TZ=(65536-(fosc*zkb))/(12.0*100*fre);当定时器0计数到时,开启定时器1,定时器1开始计数,并且P1.4口输出高电平。
当经过一个周期中高电平持续的时间后,定时器1计数时间就到了,程序进入到定时器1中断执行,然后关掉定时器1,并且输出低电平。
因为定时器0中断是一直开着的,当经过一个周期中低电平持续的时间后,定时器0计数又到了,进入定时器0中断执行,如此循环。
当改变fre或者zkb的时候,就可以相应改变输出信号的占空比跟频率。
5.2系统性能分析
该系统实现占空比跟频率可调的信号发生器。
占空比的调节范围是1%到99%,精度是1%,当达到上限值时,再次增加时,占空比归于1%,达到下限时,再次减少,占空比自动归于99%。
频率的调节范围是50HZ到500HZ,精度是10HZ,当达到上限值时,再次增加时,频率自动归于50HZ,当达到下限值时,再次减少时,频率自动归于500HZ。
5.3误差分析
本设计中主要的参数有设定的频率值和占空比,示波器上测得的频率值和占空比,以及LCD显示的频率值和占空比,可以看到设定的占空比和频率值总是和LCD上显示的一样,出现误差的只有示波器上测得的,这是因为虽然设定的频率值和占空比总是整数,但是换算为定时器的初始值时,会出现小数部分,而程序直接将小数部分省略,由此便出现了误差。
6心得体会
在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。
为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。
我们是在做单片机课程设计,但我们不是艺术家,他们可以抛开实际尽情在幻想的世界里翱翔,而我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。
其次,在这次课程设计中,我们运用到了以前所学的专业课知识。
虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。
后,要做好一个课程设计,就必须做到:
在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。
发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。
7参考文献
李群芳张士军黄建《单片微型计算机与接口技术(第三版)》北京:
电子工业出版社,2008.5
张毅刚《新编MCS-51单片机应用设计》哈尔滨:
哈尔滨工业大学出版社,2003
谭浩强《C程序设计》北京:
清华大学出版社,2005
刘坤赵红波张宪栋《51单片机C语言应用开发技术大全(第二版)》北京:
人民邮电出版社2012.3
郭天祥《51单片机C语言教程-入门,提高,开发,拓展全攻略》北京:
电子工业出版社2008