设计并实现占空比可调信号发生器.docx

上传人:b****2 文档编号:2062362 上传时间:2023-05-02 格式:DOCX 页数:21 大小:417.13KB
下载 相关 举报
设计并实现占空比可调信号发生器.docx_第1页
第1页 / 共21页
设计并实现占空比可调信号发生器.docx_第2页
第2页 / 共21页
设计并实现占空比可调信号发生器.docx_第3页
第3页 / 共21页
设计并实现占空比可调信号发生器.docx_第4页
第4页 / 共21页
设计并实现占空比可调信号发生器.docx_第5页
第5页 / 共21页
设计并实现占空比可调信号发生器.docx_第6页
第6页 / 共21页
设计并实现占空比可调信号发生器.docx_第7页
第7页 / 共21页
设计并实现占空比可调信号发生器.docx_第8页
第8页 / 共21页
设计并实现占空比可调信号发生器.docx_第9页
第9页 / 共21页
设计并实现占空比可调信号发生器.docx_第10页
第10页 / 共21页
设计并实现占空比可调信号发生器.docx_第11页
第11页 / 共21页
设计并实现占空比可调信号发生器.docx_第12页
第12页 / 共21页
设计并实现占空比可调信号发生器.docx_第13页
第13页 / 共21页
设计并实现占空比可调信号发生器.docx_第14页
第14页 / 共21页
设计并实现占空比可调信号发生器.docx_第15页
第15页 / 共21页
设计并实现占空比可调信号发生器.docx_第16页
第16页 / 共21页
设计并实现占空比可调信号发生器.docx_第17页
第17页 / 共21页
设计并实现占空比可调信号发生器.docx_第18页
第18页 / 共21页
设计并实现占空比可调信号发生器.docx_第19页
第19页 / 共21页
设计并实现占空比可调信号发生器.docx_第20页
第20页 / 共21页
亲,该文档总共21页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

设计并实现占空比可调信号发生器.docx

《设计并实现占空比可调信号发生器.docx》由会员分享,可在线阅读,更多相关《设计并实现占空比可调信号发生器.docx(21页珍藏版)》请在冰点文库上搜索。

设计并实现占空比可调信号发生器.docx

设计并实现占空比可调信号发生器

目录

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

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

当前位置:首页 > 临时分类 > 批量上传

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2