基于51单片机的数字频率计设计报告.docx
《基于51单片机的数字频率计设计报告.docx》由会员分享,可在线阅读,更多相关《基于51单片机的数字频率计设计报告.docx(18页珍藏版)》请在冰豆网上搜索。
![基于51单片机的数字频率计设计报告.docx](https://file1.bdocx.com/fileroot1/2023-2/1/4311deeb-3a0c-40a8-bb67-e83f959a8af1/4311deeb-3a0c-40a8-bb67-e83f959a8af11.gif)
基于51单片机的数字频率计设计报告
目录
摘要3
关键词3
正文4
1概述4
2总体设计方案5
2.1软件5
2.2设计思路5
3系统软件设计5
3.1主板说明5
3.2芯片主要性能5
3.3功能特性描述6
3.4引脚描述6
4系统软件设计9
4.1初始定义9
4.2子程序设计9
4.3主要源程序10
5系统调试13
6课程设计体会15
7参考文献15
附录16
摘要:
数字频率计是现代科研生产中不可或缺的测量仪器,它以十进制数显示被测频率,基本功能是测量正弦信号,方波信号,及其它各种单位时间内变化的物理量。
本系统采用AT89S52单片机智能控制,结合外围电子电路,设计的频率计性能稳定。
在软件设计上采用了单片机的C语言设计,通过单片机内部定时/计数器同时动作,在测量频率时将测频率和测周期相结合,提高了频率计的测量准确性。
测量结果在四位七段式数码管上输出显示,结果精确到整数位。
频率计的软件设计,系统软件设计简单明了,适用于测量频率从1~9999Hz的脉冲信号,超频自动报警,安全可靠。
关键词:
数字频率计;AT89S52单片机;信号;AT89S52最小系统板;LG5011BSR
正文
1.概述
单片机是20世纪中期发展起来的一种面向控制的大规模集成电路模块,具有功能强、体积小、可靠性高、价格低廉等特点,在工业控制、数据采集、智能仪表、机电一体化、家用电器等领域得到了广泛的应用,极大的提高了这些领域的技术水平和自动化程度。
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在线系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
本项目以AT89S52为基本控制元件,能够对1~9999Hz频段内的正弦信号,方波信号,及其它各种单位时间内变化的物理量进行初略测量,可应用于教学实验,学生自主实验等对频率精确度要求不高的场合,也可应用于家用情况下频率的初步获取。
在科技高度发达的今天,作为一名工科的大学生,一款简易的频率测量仪器,人手必备。
2.总体设计方案
2.1软件:
采用KeiluVision3做为开发工具,进行编程设计,通过progisp2.0将程序下载到开发板芯片中。
2.2设计思路:
利用AT89S52内部的定时/计数器0,和定时/计数器1结合完成,在初化AT89S5时,把定时/计数器0设置为计数方式,计数的信号来源于单片机的引脚P3^5,定时/计数器1设置为定时方式.上电后按下按键kye1(P2^0),去抖启动,同时开始T1的定时过程和T0的计数过程,T1定时20ms,设置定时中断,当T1第20次进入中断定时结束时,停止T0的计数过程。
之后通过读取T0的计数值N,就可以知道在1s内输入信号的频率为val。
若T1定时不到1s,T0计数到65536溢出,则进入计数中断,蜂鸣器报警。
图一程序控制方框图
3.系统硬件设计
3.1主板【简要说明】
3.1.1尺寸:
长128mm宽87mm高18mm
3.1.2支持芯片:
AT89S51/S52/S53支持STC89C51/C52/C53(加转换板可使用ATMEGA8/48、ATMEGA16/32)
3.1.3工作电压:
直流4.5~5.5伏
3.1.4单片机标准十针下载接口。
(可使用并口下载线和USB下载线下载)
3.1.5特点:
(1)具有电源指示。
(2)所以I/O口以引出并有LED灯指示。
(3)四位数码管显示、四位按键输入、32位LED发光二极管显示。
(4)标准的11.0592M晶振。
(晶振可以插拔更换)
(5)具有上电复位和手动复位。
(6)四种供电接口(USB供电、端子引入供电、排针引入供电、电源头接口供电)
(7)串口通信使用MAX232接口,同时可以下载STC单片机程序。
3.2芯片主要性能:
与MCS-51单片机产品兼容
8K字节在线系统可编程Flash存储器
1000次擦写周期
4.0V-5.5V工作电压
全静态操作:
0Hz~33Hz
三级加密程序存储器
256*8字节的内部数据存储器
32个可编程I/O口线
三个16位定时器/计数器
八个中断源
全双工UART串行通道
低功耗空闲和掉电模式
掉电后中断可唤醒图二芯片管脚示意图
看门狗定时器
双数据指针
掉电标识符
快速编程周期
灵活ISP编程(字节和模式)
绿色(-免费)工作包操作
3.3功能特性描述:
AT89S52是一种低功耗、高性能CMOS8位微控制器,具有8K在线系统可编程Flash存储器。
使用Atmel公司高密度非易失性存储器技术制造,与工业80C51产品指令和引脚完全兼容。
片上Flash允许程序存储器在系统可编程,亦适于常规编程器。
在单芯片上,拥有灵巧的8位CPU和在系统可编程Flash,使得AT89S52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。
AT89S52具有以下标准功能:
8k字节Flash,256字节RAM,32位I/O口线,看门狗定时器,2个数据指针,三个16位定时器/计数器,一个6向量2级中断结构,全双工串行口,片内晶振及时钟电路。
另外,AT89S52可降至0Hz静态逻辑操作,支持2种软件可选择节电模式。
空闲模式下,CPU停止工作,允许RAM、定时器/计数器、串口、中断继续工作。
掉电保护方式下,RAM内容被保存,振荡器被冻结,单片机一切工作停止,直到下一个中断或硬件复位为止。
3.4引脚描述:
VCC:
电源
GND:
地
P0口:
P0口是一个8位漏极开路的双向I/O口。
作为输出口,每位能驱动8个TTL逻辑电平。
对P0端口写“1”时,引脚用作高阻抗输入。
当访问外部程序和数据存储器时,P0口也被作为低8位地址/数据复用。
在这种模式下,P0具有内部上拉电阻。
在flash编程时,P0口也用来接收指令字节;在程序校验时,输出指令字节。
程序校验时,需要外部上拉电阻。
P1口:
P1口是一个具有内部上拉电阻的8位双向I/O口。
P1输出缓冲器能驱动4个TTL逻辑电平。
对P1端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
此外,P1.0和P1.2分别作定时器/计数器2的外部计数输入(P1.0/T2)和时器/计数器2的触发输入(P1.1/T2EX)。
在flash编程和校验时,P1口接收低8位地址字节。
引脚号
第二功能
P1.0
T2(定时器/计数器T2的外部计数输入),时钟输出
P1.1
T2EX(定时器/计数器T2的捕捉/重载触发信号和方向控制)
P1.2
MOSI(在系统编程用)
P1.6
MISO(在系统编程用)
P1.7
SCK(在系统编程用)
表1P1口第二功能说明
P2口:
P2口是一个具有内部上拉电阻的8位双向I/O口,P2输出缓冲器能驱动4个TTL逻辑电平。
对P2端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在访问外部程序存储器或用16位地址读取外部数据存储器(例如执行MOVX@DPTR)时,P2口送出高八位地址。
在这种应用中,P2口使用很强的内部上拉发送1。
在使用8位地址(如MOVX@RI)访问外部数据存储器时,P2口输出P2锁存器的内容。
在flash编程和校验时,P2口也接收高8位地址字节和一些控制信号。
P3口:
P3口是一个具有内部上拉电阻的8位双向I/O口,p2输出缓冲器能驱动4个TTL逻辑电平。
对P3端口写“1”时,内部上拉电阻把端口拉高,此时可以作为输入口使用。
作为输入使用时,被外部拉低的引脚由于内部电阻的原因,将输出电流(IIL)。
在flash编程和校验时,P3口也接收一些控制信号。
P3口亦作为AT89S52特殊功能(第二功能)使用,如下表所示。
PortPin
AlternateFunctions
P3.0
RXD(serialinputport)
P3.1
TXD(serialoutputport)
P3.2
INT0(externalinterrupt0)
P3.3
INT1(externalinterrupt1)
P3.4
T0(timer0externalinput)
P3.5
T1(timer1externalinput)
P3.6
WR(externaldatamemorywritestrobe)
P3.7
RD(externaldatamemoryreadstrobe)
表2P3口第二功能说明
RST:
复位输入。
晶振工作时,RST脚持续2个机器周期高电平将使单片机复位。
看门狗计时完成后,RST脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
在访问外部数据存储器时,PSEN将不被激活。
定时器0和定时器1:
在AT89S52中,定时器0和定时器1的操作与AT89C51和AT89C52一样。
图三频率计系统组成图
4.系统软件设计
4.1初始定义
4.2子程序设计
a.画流程图
b.编译数码显示延时,按键去抖延时
c.数码管扫描
d.记时20ms中断(再次赋初值)
e.计数溢出中断
f.对记时,计数,中断初始化
图四流程图
4.3主要源程序
#include//库文件
#defineucharunsignedchar//宏定义无符号字符型
#defineuintunsignedint//宏定义无符号整型
/**************************初始定义********************************/
Codeuncharseg7code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82
0xf8,0x80,0x90};//显示段码不加code,默认在数据存储器256b
ucharwei[4]={0XEf,0XDf,0XBf,0X7f};//位的控制端(四位数码管)
sbitkey1=P2^0;
uinttcnt=0;//计中断
intth0,t0,val=0;
sbitsound=P3^7;//蜂鸣器
/***************************延时函数*******************************/
voiddelay(uchart)
{
uchari,j;
for(i=0;ifor(j=13;j>0;j--);}
voiddelay_2ms()
{
ucharl,k;
for(l=0;l<0;l++)
for(k=0;k<254;k++);}
/***************************显示函数******************************/
voidLed(intdate)//显示函数
{
/****************************数据转换*****************************/
uintz,x,c,v;
z=date/1000;//求千位
x=date%1000/100;//求百位
c=date%100/10;//求十位
v=date%10;//求个位
P2=0XFF;
P0=seg7code[z];
P2=wei[0];
delay(80);
P2=0XFF;
P0=seg7code[x];
P2=wei[1];
delay(80);
P2=0XFF;
P0=seg7code[c];
P2=wei[2];
delay(80);
P2=0XFF;
P0=seg7code[v];
P2=wei[3];
delay(80);
P2=0XFF;
}
/***********************定时中断服务函数**************************/
voidt1(void)interrupt3using0//定时中断服务函数p23,p46
{tcnt++;//每过50mstcnt加一
if(tcnt==20)//计满20次(1秒)时
{th0=TH0;//读计数值
t0=TL0;
val=th0*256+t0;//换算计数值
tcnt=0;//重新再计
TH0=(65535-9999)/256;
TL0=(65535-9999)%256;
}
TH1=(65535-50000)/256;//对TH1TL1赋值
TL1=(65535-50000)%256;
}
voidt00()interrupt1//计数中断
{sound=~sound;}//计数溢出中断
voidinit()
{
TMOD=0x15;//定时器1工作方式1,计数器0工作方式1
IE=0X8A;
TR1=1;//开始计时
TR0=1;//开始计数
TH1=(65535-50000)/256;//对TH1TL1赋值
TL1=(65535-50000)%256;
TH0=(65535-9999)/256;
TL0=(65535-9999)%256;
}
/*************************主函数**********************************/
voidmain()
{if(!
key1)
delay_2ms();
if(!
key1)
{init();
while
(1)
{Led(val);
}}
}
/**************************结束************************************/
/
5.系统调试
5.1程序准备:
频率计程序,脉冲源程序
5.2检测硬件芯片:
数码管,按键,蜂鸣器
5.3调试:
5.3.1下载程序到板,导线连接脉冲源一P2^0到频率计P3^4,
显示频率在91.92.83,99间跳变,复位。
5.3.2调入脉冲源二,频率显示稳定,复位。
5.3.3调整脉冲源二程序,超频,蜂鸣器报警。
5.3.4再次调入脉冲源一,塞选频段,显示稳定在91,92Hz。
5.3.5调试结束。
5.4测试结果:
可以准确测量从1到9999Hz占空比较为稳定的信号源,超过此频率范围,系统报警。
5.5问题:
开始时,未给定时器附初值,频率显示过大,用不同的板测试接果不同,频率过大时结果出错,蜂鸣器不报警。
解决方案:
(1)赋初值:
示波器检测信号源一,频率为91.3Hz,以此为标准调整程序如下:
voidt1(void)interrupt3using0
{tcnt++;
if(tcnt==20)
{th0=TH0;
t0=TL0;
val=th0*256+t0;
tcnt=0;//
TH0=(65535-9999)/256;//添加初始值
TL0=(65535-9999)%256;
}
TH1=(65535-50000)/256;//添加初始值
TL1=(65535-50000)%256;
}
}}
(2)查看晶振:
同一批的板中晶振有12M的,也有16M的,因而频率不同。
(3)蜂鸣器缺少晶振,换版后添加计数中断如下:
voidT0()interrupt1//计数中断
{sound=~sound;}//计数溢出中断
设计体会
在此次单片机项目设计的过程中,我进一步认识到全面专业知识以及逻辑思考方式对研究问题的重要性,以及成功最重要的一块敲门砖是不妥协,不放弃!
虽然这门课修过公选,但时隔一年本就不大熟的知识更加淡漠,完成整体设计颇费周折。
在这过程中书到用时方恨少,天下还是好人多——同学和老师的帮助给了我莫大的动力。
在这三周中,有时一天中翻专业书的次数比前三周理论学习时合起来翻的次数都多,对理论联系实际的重要性有了更新的领悟。
在设计过程中也从网络上获取许多宝贵的资源,每种设计都有独到之处,通过请教他人加上自己的理解,并与所学的知识紧密相结合,我相信这过程必然对我今后的学习和工作产生积极的影响。
除了获取新的知识,深感巩固旧的学问也很重要,尤其是结合了这几年学的相关的专业知识,对各门课都做一个全面的温习,才不用带着书柜跑。
这不仅对我现在的学习乃至今后的工作都会有很大的帮助。
本次选择设计的定时数字频率计,因为受材料和个人知识水平的限制只能满足满足一般的测量要求,且电路在测试复杂信号时存在一定的问题,频率只能稳定在一定范围内,虽可以通过选取特定的频段来排除频率变化较复杂区段的干扰,但这样针对不同的信号源都要重新调整程序,过于复杂。
而更精确的频率计设计,现有水平还不能达到,所以本次就未深入涉及。
希望老师给以评点和支持,我将在今后朝着这些方向学习奋斗。
7.参考文献
【1】卢胜利,郝立果,丁峰等.单片机原理与应用技术实践[M].北京:
机械工业出版社,2009.5;
【2】谢自美.电子线路设计[M].武昌:
华中科技大学出版社,2000.7;
【3】张永瑞.电子测量技术基础[M].西安:
西安电子科技大学出版社,2002.
【4】李春.数字频率计设计[D].北京:
邵阳电子厂,2011,02:
4页到7页;
【5】张杰,杨艳丽,马莉莉,张立倩.基于单片机C语言的数字频率计设计
内蒙古农业大学学报,第28卷,第二期,2007年6月。
附录1总体电路图
附录2实验板元器件分布图
附录3测频程序一
/*=======直流电机的PWM速度控制程序========*/
/*晶振采用11.0592M,产生的PWM的频率约为91Hz*/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbiten1=P2^0;/*EnableA*/
sbits1=P2^2;/*Input1*/
sbits2=P2^3;/*Input2*/
uchart=0;/*中断计数器*/
ucharm1=0;/*电机1速度值*/
uchartmp1;/*电机当前速度值*/
/*电机控制函数index-电机号(1,2);speed-电机速度(-100—100)*/
voidmotor(ucharindex,charspeed)
{
if(speed>=-100&&speed<=100)
{
if(index==1)/*电机1的处理*/
{
m1=abs(speed);/*取速度的绝对值*/
if(speed<0)/*速度值为负则反转*/
{s1=0;
s2=1;}
else/*不为负数则正转*/
{s1=1;
s2=0;}}}
}
voiddelay(uintj)/*简易延时函数*/
{for(j;j>0;j--);}
voidmain()
{
chari;
TMOD=0x02;/*设定T0的工作模式为2*/
TH0=0x9B;/*装入定时器的初值*/
TL0=0x9B;
EA=1;/*开中断*/
ET0=1;/*定时器0允许中断*/
TR0=1;/*启动定时器0*/
while
(1)/*电机实际控制演示*/
{
for(i=0;i<=100;i++)/*正转加速*/
{motor(1,i);
delay(5000);
}
for(i=100;i>0;i--)/*正转减速*/
{
motor(1,i);
delay(5000);
}
for(i=0;i<=100;i++)/*反转加速*/
{
motor(1,-i);
delay(5000);}
for(i=100;i>0;i--)/*反转减速*/
{
motor(1,-i);
delay(5000);}}}
voidtimer0()interrupt1/*T0中断服务程序*/
{
if(t==0)/*1个PWM周期完成后才会接受新数值*/
{
tmp1=m1;
}
if(tt++;
if(t>=100)t=0;/*1个PWM信号由100次中断产生*/
}
附录4:
测频程序四
#include//库文件
#defineucharunsignedchar//宏定义无符号字符型
#defineuintunsignedint//宏定义无符号整型
/*************************I/O定义*********************************/
sbitLED=P1^0;//定义单片机P1口的第0位(即P1.0)
/*************************延时函数**********************************/
voiddelay()//延时程序
{
ucharm,n,s;
for(m=20;m>0;m--)
for(n=20;n>0;n--)
for(s=248;s>0;s--);
}
/**************************主函数***********************************/
voidmain()
{
while(