设计并实现占空比可调信号发生器Word下载.docx
《设计并实现占空比可调信号发生器Word下载.docx》由会员分享,可在线阅读,更多相关《设计并实现占空比可调信号发生器Word下载.docx(21页珍藏版)》请在冰点文库上搜索。
当前常用的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<
reg52.h>
math.h>
#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:
//延时程序
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()
g1=freq/100;
g2=(freq%100)/10;
g3=(freq%100)%10;
table2[4]=g1+48;
table2[5]=g2+48;
table2[6]=g3+48;
voidcount4()
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;
//写数据函数
voidwrite_date(uchardate)
rs=1;
P0=date;
//初始化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);
write_date(table1[a]);
//延时1ms函数
voiddelayms(uintxms)
{uinti,j;
for(i=xms;
for(j=110;
j>
j--);
//中断测量输出
voidtime_2()interrupt5
if(EXF2)
if(vaule==2)
th1_out=TH1;
tl1_out=TL1;
EXF2=0;
//外部标志位需要软件清零;
Now=RCAP2H*256+RCAP2L;
vaule=0;
else
{
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;
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)
if(pvjian==0)
freq-=1;
if(freq==49)
freq=50;
pvjian);
if(zkbjia==0)
{
if(zkbjia==0)
duty_factor+=1;
if(duty_factor==101)
duty_factor=100;
zkbjia);
if(zkbjian==0)
if(zkbjian==0)
duty_factor-=1;
if(duty_factor==-1)
duty_factor=0;
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