基于51单片机频率计的设计与实现.docx
- 文档编号:12652826
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:20
- 大小:264.56KB
基于51单片机频率计的设计与实现.docx
《基于51单片机频率计的设计与实现.docx》由会员分享,可在线阅读,更多相关《基于51单片机频率计的设计与实现.docx(20页珍藏版)》请在冰点文库上搜索。
基于51单片机频率计的设计与实现
2.1单片机最小系统设计3
附录二:
19
本科生课程设计成绩评定表19
摘 要
本设计提出了一种基于AT89C52单片机开发的数字频率、相位测量仪的设计。
系统以单片机AT89C52及异或器件为核心,构成完备的测量系统。
可以对信号进行频率、相位等参数的精确测量,测频绝对误差不大于0.1HZ,测相位差绝对误差不大于0.1°。
采用液晶LCD1602显示被测信号的频率、相位差。
与传统的电路系统相比,其有处理速度快、稳定性高、性价比高、硬件结构简单的优点。
关键词:
单片机;低频;绝对误差
1、设计方案
此次课程设计采用间接测量法来测量。
此次设计涉及到相位差,即两列波形异或得到的波形只需要测高电平,要用到GATE信号,GATE=1时,TR0=1,INTO=1才能启动计数器,而计数器0是通过外部中断INTO的下降沿开始触发的,计时器从0开始计时,计数器只能测高电平,因此测得的时间为半个周期。
当计数器0计时溢出,执行m加1的操作。
则测量时间为:
t1=TH0*256+TL0+m*65536,所求频率F=1000000/(2*t1)
测量两方波的相位差时,先将两方波信号异或,得到的新波形输入外部中断1的入口,在信号的第n个下跳沿时,进入外部中断的程序,开启计数器1。
第n+1个下跳沿到来时,则关闭计数器1,当GATE=1时,只有在INT1=1时,TR1=1时,计数器T1才开始计数,当计数器0计时溢出,执行m加1的操作,所以读的的时间只为高电平的持续时间,即为两方波的相隔时间t2,相位差可计算如下:
t2=TH1*256+TLI+N*65536;则相位差P=t2/(2*t1)*360
1.1设计基本原理
1.1.1测量频率的原理
定时/计数器工作在方式1,每产生一次定时器0中断,计数65536个脉冲,此时的脉冲来自振荡器的12分频后的脉冲,其周期为1uS。
根据产生外部中断0时,定时器0中断的次数u,以及此时定时/计数器0计数寄存器的数值X,即可求得待测方波的周期为:
T=(65536*u+X)us,取其倒数即可求得待测方波的频率,小数点后保留两位,即可使得频率精度为0.1HZ。
1.1.2相位差的测量原理
将两路同频不同相的方波信号进过鉴相器(即异或)后得到的脉冲宽度t与方波信号的周期T的比值(占空比),即对应为两信号的相位差,此时相位差
。
其中,脉冲宽度的测量方法与方波周期的测量方法相同。
相位差测量的原理图如下:
图1相位差测量原理图
1.2系统设计框图
经过方案论证和比较后,最终确定的系统框图如图1所示,主要由AT89C52单片机、异或器件、LCD1602、电源等组成。
图2系统设计框图
2、系统硬件线路设计图
2.1单片机最小系统设计
单片机最小系统是能补足单片机工作的最简单电路,它由单片机、电源、晶体振荡器、复位电路等构成。
它是本系统的处理单元也是控制单元,负责处理信号、外设的接口与控制,同时它也是所有软件的载体。
本系统采用AT89C52是美国Atmel公司生产的低电压、高性能CMOS8位单片机,片内含8KB的可反复檫写的程序存储器和12B的随机存取数据存储器(RAM),器件采用Atmel公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内配置通用8位中央处理器(CPU)和Flash存储单元,功能强大的AT89C52单片机可灵活应用于各种控制领域。
AT89C52单片机属于AT89C51单片机的增强型,与Intel公司的80C52在引脚排列、硬件组成、工作特点和指令系统等方面兼容。
主要管脚有:
XTAL1(19脚)和XTAL2(18脚)为振荡器输入输出端口,外接12MHz晶振。
RST/Vpd(9脚)为复位输入端口,外接电阻电容组成的复位电路。
VCC(40脚)和VSS(20脚)为供电端口,分别接+5V电源的正负端。
P0~P3为可编程通用I/O脚,其功能用途由软件定义。
其管脚如下图所示:
图3AT89C52单片机管脚图
本设计中,P0端口(32~39脚)被定义为N1功能控制端口,分别与N1的相应功能管脚相连接。
单片机正常工作时,都需要有一个时钟电路和一个复位电路。
本设计
中选择了内部时钟方式和按键电平复位电路,来构成单片机的最小电路。
如图3所示。
图4单片机最小系统
2.2液晶LCD1602显示电路
字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。
LCD1602分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别。
LCD1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如下表1所示:
表1LCD1602引脚接口说明
编号
符号
引脚说明
编号
符号
引脚说明
1
VSS
电源地
9
D2
数据
2
VDD
电源正极
10
D3
数据
3
VL
液晶显示偏压
11
D4
数据
4
RS
数据/命令选择
12
D5
数据
5
R/W
读/写选择
13
D6
数据
6
E
使能信号
14
D7
数据
7
D0
数据
15
BLA
背光源正极
8
D1
数据
16
BLK
背光源负极
1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。
1602液晶模块内部的控制器共有11条控制指令,如下表2所示,其中1为高电平、0为低电平。
表2LCD1602控制指令
序号
指令
RS
R/W
D7
D6
D5
D4
D3
D2
D1
D0
1
清显示
0
0
0
0
0
0
0
0
0
1
2
光标返回
0
0
0
0
0
0
0
0
1
*
3
置输入模式
0
0
0
0
0
0
0
1
I/D
S
4
显示开/关控制
0
0
0
0
0
0
1
D
C
B
5
光标或字符移位
0
0
0
0
0
1
S/C
R/L
*
*
6
置功能
0
0
0
0
1
DL
N
F
*
*
7
置字符发生存贮器地址
0
0
0
1
字符发生存贮器地址
8
置数据存贮器地址
0
0
1
显示数据存贮器地址
9
读忙标志或地址
0
1
BF
计数器地址
10
写数到CGRAM或DDRAM)
1
0
要写的数据内容
指令1:
清显示,指令码01H,光标复位到地址00H位置。
指令2:
光标复位,光标返回到地址00H。
指令3:
光标和显示模式设置I/D:
光标移动方向,高电平右移,低电平左移S:
屏幕上所有文字是否左移或者右移。
高电平表示有效,低电平则无效。
指令4:
显示开关控制。
D:
控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:
控制光标的开与关,高电平表示有光标,低电平表示无光标B:
控制光标是否闪烁,高电平闪烁,低电平不闪烁。
指令5:
光标或显示移位S/C:
高电平时移动显示的文字,低电平时移动光标。
指令6:
功能设置命令DL:
高电平时为4位总线,低电平时为8位总线N:
低电平时为单行显示,高电平时双行显示F:
低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符。
指令7:
字符发生器RAM地址设置。
指令8:
DDRAM地址设置。
指令9:
读忙信号和光标地址BF:
为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。
指令10:
写数据。
与HD44780相兼容的芯片时序如下表3所示:
表3基本操作时序表
读状态
输入
RS=L,R/W=H,E=H
输出
D0—D7=状态字
写指令
输入
RS=L,R/W=L,
D0—D7=指令码,E=高脉冲
输出
无
读数据
输入
RS=H,R/W=H,E=H
输出
D0—D7=数据
写数据
输入
RS=H,R/W=L,
D0—D7=数据,E=高脉冲
输出
无
其操作时序图如下所示:
图5读操作时序图
图6写操作时序图
本设计中采用液晶LCD1602显示输入方波A和B的频率和相位差,其D0~D7与单片机的P0端口连接,使能端E、RS、RW分别与单片机P2.4、P1.7、P1.6连接,此电路原理简单,电路连接方便,如图7所示。
图7液晶LCD1602显示电路
2.3频率、相位差测量电路
本设计中将方波A输入,采用定时中断测量其频率,同时将方波A和方波B经过异或门74LS86异或后输入即可测量出两路方波的相位差。
如图7所示。
图8频率、相位差测量电路
异或门74LS86真值表如表4所示:
表474LS86真值表
A
B
C
0
0
0
0
1
1
1
0
1
1
1
0
综上所述,频率、相位表的总体电路图如图9所示:
图9频率相位表的总体电路图
3程序设计
3.1资源分配表
表5资源分配表
I/O口
作用
P0
LCD1602数据接口
P1.6
LCD1602RW接口
P1.7
LCD1602RS接口
P2.4
LCD1602E接口
P3.2
频率测量接口
P3.3
相位差测量接口
3.2程序流程框图
频率、相位表的程序流程图如图9所示:
图10程序流程图
4.系统仿真和测试结果
在仿真软件PROTUES中按照电路图连接好电路。
输入两待测方波信号波形,当测试频率时,先依次设置好方波A和B的频率,进行仿真测得数据;当测试相位差,先将方波A和B频率设置为500HZ,然后依次设置相位差,测试波形和结果如图11所示:
图11仿真波形
表6仿真频率测试结果
输入频率/HZ
0
5
10
50
100
150
200
250
测得频率/HZ
0.99
5.00
10.00
50.00
100.00
150.01
200.00
250.00
输入频率/HZ
300
350
400
450
500
550
600
650
测得频率/HZ
299.94
349.95
400.00
450.04
500.00
550.05
600.24
650.19
输入频率/HZ
700
750
800
850
900
950
1000
1050
测得频率/HZ
699.94
750.26
800.64
850.98
899.92
950.21
1000.64
1050.06
表7仿真相位差测试结果
输入相位差/度
0
30
45
60
90
120
135
150
测得相位差/度
0
30.06
45.00
59.94
90.00
120.06
135.00
149.94
5、性能分析
根据表6测试所得结果可以看出:
当输入频率0-550HZ时,频率误差大约为0.05HZ,小于0.1HZ;当输入频率大于600HZ时,频率误差大于0.1HZ,并且随着输入频率增大,频率误差均大于0.1HZ,故输入频率为0-550HZ时满足要求。
根据表7测试所得结果可以看出:
当输入的两路方波的相位差0-180度时,测试相位差大约为0度,小于0.1度,测试所得相位差性能比较好。
由此可得如下结论:
本次所设计的频率/相位差表适合测试低频信号,最佳频率范围为0-550HZ,输入方波相位差任意均可。
6、心得与体会
7、参考文献
附录一:
源程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharm=0,n=0;
ucharu,v;
uinti,j;
uintx,y;
uintc,d;//相位数据结果保存
floatt0,t1,f,p;
uinta[]={70,61,48,48,48,48,48,46,48,48,72,90};//频率数据结果保存
//F,=,0,0,0,0,0,.,0,0,H,Z
uintb[]={80,61,48,48,48,46,48,48,34};//相位数据结果保存
//P,=,0,0,0,.,0,0,"//相位数据结果保存
sbitlcdrw=P1^6;
sbitlcdrs=P1^7;
sbitlcden=P2^4;
/////////////////LCD1602的设置//////////////////////////////////
voiddelay(uints)//延时1MS
{
uintr,g;
for(r=s;r>0;r--)
for(g=110;g>0;g--);
}
voidwrite_com(ucharcom)//写指令
{
lcdrs=0;
P0=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_data(uchardate)//写数据
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinitlcd()//初始化
{
lcdrw=0;
lcden=0;
//write_com(0x01);//显示清屏
write_com(0x38);//显示模式设置
write_com(0x0c);//显示开,开游标,不闪烁
write_com(0x06);//字符时整体不移动
}
////////////LCD1602设置///////////////
///////////定时器的设置//////////////
voidCT_init()//定时计数器初始化
{TMOD=0x99;//GATE=1,T1、T0工作在方式1,定时方式
TH0=0;//定时计数器初值清零
TL0=0;
TH1=0;
TL1=0;
TR0=1;//TR0,TR1置位,此时定时计数器的启动有INT0,INT1引脚电平决定
TR1=1;
ET0=1;//开中断
ET1=1;
}
voidITC0()interrupt0//外部中断0服务程序
{
u=m;//读定时计数器0溢出次数
m=0;//溢出次数清零
x=TH0*256+TL0;//读定时计数器0当前值
TH0=0;//定时计数器0清零
TL0=0;
}
voidTIME0()interrupt1//定时计数器0溢出中断
{
m++;//溢出次数加1
}
voidITC1()interrupt2//外部中断1服务程序
{
v=n;//读定时计数器1溢出次数
n=0;//溢出次数清零
y=TH1*256+TL1;//读定时计数器1当前值
TH1=0;//定时计数器1清零
TL1=0;
}
voidTIME1()interrupt3//定时计数器1溢出中断
{
n++;//溢出次数加1
}
////////////定时器的设置//////////////
voidmain()
{
initlcd();//液晶显示初始化
CT_init();//定时计数器初始化
EA=1;//开总中断
EX0=1;//允许外部中断
EX1=1;
IT0=1;//设置外部中断方式为下降沿触发
IT1=1;
P3=0xff;
while
(1)
{
t0=u*65536+x;//计算脉冲时间宽度
f=1000000/(2*t0);//计算频率
c=f*100;//计算结果逐位保存
a[9]=c%10+48;
a[8]=(c/10)%10+48;
c=f;
a[6]=c%10+48;
a[5]=(c/10)%10+48;
a[4]=(c/100)%10+48;
a[3]=(c/1000)%10+48;
a[2]=(c/10000)%10+48;
write_com(0x80);
for(i=0;i<=11;i++)
{
write_data(a[i]);
delay(10);
}
t1=v*65536+y;//计算脉冲宽度
p=(t1/(2*t0))*360;//计算相位差
d=p*100;//将计算结果逐位保存
b[7]=d%10+48;
b[6]=(d/10)%10+48;
d=p;
b[4]=d%10+48;
b[3]=(d/10)%10+48;
b[2]=(d/100)%10+48;
write_com(0x80+0X40);
for(j=0;j<=8;j++)
{
write_data(b[j]);
delay(10);
}
}
}
附录二:
本科生课程设计成绩评定表
姓名
性别
专业、班级
课程设计题目:
课程设计答辩或质疑记录:
成绩评定依据:
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字:
年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 51 单片机 频率计 设计 实现