设计并实现占空比可调信号发生器.docx
- 文档编号:16920881
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:21
- 大小:417.13KB
设计并实现占空比可调信号发生器.docx
《设计并实现占空比可调信号发生器.docx》由会员分享,可在线阅读,更多相关《设计并实现占空比可调信号发生器.docx(21页珍藏版)》请在冰豆网上搜索。
设计并实现占空比可调信号发生器
目录
1相关软件介绍1
1.1Proteus简介1
1.2keil简介1
2硬件介绍2
2.151单片机介绍2
2.2LCD1602简介3
3原理介绍5
3.1产生频率和占空比可调的方波5
3.2信号的频率和占空比的测量5
4电路原理图6
5程序框图7
6资源分配表8
7源程序8
8仿真实现19
9实物实现21
10小结体会23
11参考文献24
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.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)
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.2LCD1602简介
工业字符型液晶,能够同时显示16x02即32个字符。
(16列2行)1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔每行之间也有间隔起到了字符间距和行间距的作用,正因为如此所以他不能显示图形。
1602LCD是指显示的内容为16X2,即可以显示两行,每行16个字符液晶模块(显示字符和数字)。
目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于市面上大部分的字符型液晶。
管脚功能
LCD1602引脚图
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。
3原理介绍
3.1产生频率和占空比可调的方波
本方案通过用4个按键分别控制输出信号的占空比和频率,分别是频率“+”,频率“-”,占空比“+”,占空比“-”。
通过查询方式扫描按键的状态,从而得知需要产生的信号的频率和占空比。
得知频率和占空比以后就需要算出高电平的持续时间和低电平的持续时间,根据周期和频率的关系,可知周期T=1/频率F,本系统用的是12MHZ晶振,一个机器周期是1us,可知产生高电平计数初值=1000000*占空比/100,即TH0=(1000000*占空比/100)/256,TL0=
(1000000*占空比/100)%256,从而可知低电平持续时间为周期减去高电平持续时间,从而可算出相应的计数初值。
实现时,通过设计一个标志位,当信号开始变为高电平时,把相应的高电平计数初值赋给T0,当产生T0溢出中断时,把信号变为低电平,同时把低电平相应的计数初值赋给T0,通过标志位的0和1循环,从而产生持续交替的高低电平,一个频率和占空比可调的方波就出来了。
3.2信号的频率和占空比的测量
定时器的门控位的作用,在TMOD中有个GATE位,以T1的GATE位为例,当GATE=0,定时器的启停与INT1无关,在这种情况下,定时器的启停只取决于TR1;当GATE=1时,定时计数器的启停不仅取决于TR1,而且还受到INT1的控制,只有当TR1=1,且INT1=1时,定时计数器才能工作,本次设计用的就是GATE=1的情况。
再讲一下T2的捕捉方式,就是把16位瞬时计数值同时记录在特殊功能寄存器的RCAP2L和RCAP2H中,这样CPU在读计数值时,就避免了在读高字节时低字节的变化引起读数误差。
T2CON中有个EXF2,当外部使能位EXEN2=1,且T2EX(P1.1引脚)有一个下降沿时,EXF2被置1,如果中断允许将一引起中断,EXF2必须软件清零。
本次设计通过T1测量高电平持续时间,T2用来测量信号周期,当第一个下降沿到来时,把T1,T2,的计数初值都设为0,同时使TR2=1,TR1=1,当有一个下降沿到来时,捕捉此时T2的计数值,同时T1只有在外部信号为高电平时,才加一计数,所以此时T1记录的是高电平的时间,从而可算出相应的周期和占空比送数码管显示。
4电路原理图
5程序框图
6资源分配表
P口
描述
P0
数据输出
P1.2
频率加
P1.3
频率减
P1.4
占空比加
P1.5
占空比减
P2.0
输出波形
P2.6
段码
P2.7
位码
P3.4
LCD使能端
P3.5
LCD读
P3.6
LCD写
7源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sfrT2MOD=0xC9;
sbitout=P2^0;
sbitpvjia=P1^2;
sbitpvjian=P1^3;
sbitzkbjia=P1^4;
sbitzkbjian=P1^5;
sbitrs=P3^5;
sbitlcden=P3^4;
sbitdula=P2^6;
sbitwr=P3^6;
sbitwela=P2^7;
ucharvaule=1;
charth0_low,tl0_low,th0_high,tl0_high,th1_out,tl1_out;
floattime0,freq_test,duty_test;
intfreq=50,duty_factor=50,flag=1,time0_high,time0_low;
uintVTH2,VTL2,Now,freq_test1=50,duty_test1=50;
uchartable1[]="out:
Hz%";
uchartable2[]="set:
Hz%";
//延时程序
voiddelay(ucharn)
{
uchari;
while(n--)
{
for(i=255;i>0;i--)
{
}
}
}
//计算频率显示
voidcount1()
{
uintg1,g2,g3;
g1=freq_test1/100;
g2=(freq_test1%100)/10;
g3=(freq_test1%100)%10;
table1[4]=g1+48;
table1[5]=g2+48;
table1[6]=g3+48;
}
//计算占空比显示
voidcount2()
{
intf1,f2,f3;
f1=duty_test1/100;
f2=(duty_test1%100)/10;
f3=(duty_test1%100)%10;
table1[10]=f1+48;
table1[11]=f2+48;
table1[12]=f3+48;
}
//计算频率显示
voidcount3()
{
uintg1,g2,g3;
g1=freq/100;
g2=(freq%100)/10;
g3=(freq%100)%10;
table2[4]=g1+48;
table2[5]=g2+48;
table2[6]=g3+48;
}
//计算占空比显示
voidcount4()
{
intf1,f2,f3;
f1=duty_factor/100;
f2=(duty_factor%100)/10;
f3=(duty_factor%100)%10;
table2[10]=f1+48;
table2[11]=f2+48;
table2[12]=f3+48;
}
//1602
//写控制函数
voidwrite_com(ucharcom)
{
rs=0;
P0=com;
lcden=0;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
//写数据函数
voidwrite_date(uchardate)
{
rs=1;
P0=date;
lcden=0;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
//初始化1602
voidinitlcd()
{
wr=0;
dula=0;
wela=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
//1602显示程序
voiddisplay()
{
uchara;
write_com(0x80);
for(a=0;a<14;a++)
{
write_date(table2[a]);
}
write_com(0x80+0x40);
for(a=0;a<14;a++)
{
write_date(table1[a]);
}
}
//延时1ms函数
voiddelayms(uintxms)
{uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
//中断测量输出
voidtime_2()interrupt5
{
if(EXF2)
{
if(vaule==2)
{
th1_out=TH1;
tl1_out=TL1;
EXF2=0;//外部标志位需要软件清零;
Now=RCAP2H*256+RCAP2L;
vaule=0;
}
else
{
EXF2=0;
vaule++;
TH2=TH1=0;
TL2=TL1=0;
}
}
else
{
TF2=0;
}
}
//产生输出
voidtime_0()interrupt1
{
if(flag==0)
{
TH0=th0_low;
TL0=tl0_low;
flag=1;
out=0;
}
else
{
TH0=th0_high;
TL0=tl0_high;
flag=0;
out=1;
}
}
voidinit()//初始化
{
display();
//定时器0初始化
time0=1000000/freq;//求出周期,不求time0直接求高低电平,可能精度高些
time0_high=time0/100*duty_factor;//高电平时间。
time0_low=time0-time0_high;//低电平
TMOD=0x91;//设置工作方式GATE1C/TM1M0=1001;工作方式GATE0C/TM1M0=0001
th0_high=(65536-time0_high)/256;//高低电平的定时器初值
tl0_high=(65536-time0_high)%256;
th0_low=(65536-time0_low)/256;//
tl0_low=(65536-time0_low)%256;
EA=1;
ET0=1;
TR0=1;//开中断
//定时器2初始化,用于测频
ET2=1;//开T2中断
T2MOD=0X00;//禁止定时时钟从p1.0输出,采用加计数
T2CON=0x09;//16位捕获模式,定时,外部使能
TH2=0;
TL2=0;
TR2=1;
//定时器1初始化
ET1=0;
TR1=1;
TH1=0;
TL1=0;
}
//键盘扫描
voidkeyscan()
{
if(pvjia==0)
{
delayms(5);
if(pvjia==0)
{
freq+=1;
if(freq==501)
freq=500;
while(!
pvjia);
}
}
if(pvjian==0)
{
delayms(5);
if(pvjian==0)
{
freq-=1;
if(freq==49)
freq=50;
while(!
pvjian);
}
}
if(zkbjia==0)
{
delayms(5);
if(zkbjia==0)
{
duty_factor+=1;
if(duty_factor==101)
duty_factor=100;
while(!
zkbjia);
}
}
if(zkbjian==0)
{
delayms(5);
if(zkbjian==0)
{
duty_factor-=1;
if(duty_factor==-1)
duty_factor=0;
while(!
zkbjian);
}
}
}
//主函数
voidmain()
{
init();//调用初始化函数
initlcd();
while
(1)
{
keyscan();
time0=1000000/freq;//不求time0直接求高低电平,可能精度高些
time0_high=time0/100*duty_factor;//高电平时间
time0_low=time0-time0_high;//低电平
th0_high=(65536-time0_high)/256;//高低电平的定时器初值
tl0_high=(65536-time0_high)%256;
th0_low=(65536-time0_low)/256;
tl0_low=(65536-time0_low)%256;
//T2频率测量处理
freq_test=1000000/Now;//计算出频率值
freq_test1=(uint)freq_test;
//T1占空比测量处理
duty_test=th1_out*256+tl1_out;//计算T1计数值
duty_test=duty_test*100/Now;//求百分比
duty_test1=(uint)duty_test;
count1();
count2();
count3();
count4();
display();
}
}
8仿真实现
初始状态
调整后
9实物实现
10小结体会
11参考文献
李群芳、张士军,单片微型计算机与接口技术,电子工业出版社,2008
张毅刚、彭喜元、董继成,单片机原理及应用,高等教育出版社,2004
赵晓安,MCS-51单片机原理及应用,天津大学出版社,2001
李全利,单片机原理及接口技术,北京:
高等教育出版社,2001
徐仁贵,微型计算机接口技术及应用,北京:
机械工业出版社,2007
诸昌钤,LED显示屏系统原理及工程技术,成都:
电子科技大学出版社,2005
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 设计 实现 可调 信号发生器