资源描述
课程设计报告
课程名称:单片机课程设计
报告题目:数字频率计
学生姓名:
所在学院:
专业班级:
学生学号:
指引教师:
年 12 月 25 日
课程设计任务书
报告题目
数字频率计
完毕时间
/12/25
学生姓名
专业班级
指引教师
职称
讲师
总体设计规定和技术要点
设计一种数字频率计,规定如下:
1.完毕单脉冲测量,输入脉冲宽度范畴是100ms~0.1s。
2.使用AT89C51单片机定期器/计数器定期和计数功能,外部扩展6位LED数码管,规定合计每秒进入单片机外部脉冲个数,用LED数码管显示出来。
3.规定
(1)被测频率fx<110Hz,采用测周法,显示频率×××. ×××;
fx>110Hz,采用测频法,显示频率××××××。
(2)运用键盘分段测量和自动分段测量。
(3)完毕单脉冲测量,输入脉冲宽度范畴是100ms~0.1s。
(4)显示脉冲宽度规定如下。
Tx<1000ms,显示脉冲宽度×××。
Tx>1000ms,显示脉冲宽度××××。
工作内容及时间进度安排
1.时间及任务
17周-18周周一到周五,上午8:00-11:40,下午2:00-5:40。
(1)17周周一:学生选题,明确任务,指引教师对课题进行解说,资料检索。
(2)17周周二:硬件设计
(3)17周周三:硬件仿真
(4)17周周四:软件设计
(5)17周周五:软件设计
(6)18周周一:软件设计
(7)18周周二:综合调试
(8)18周周三:书写课程设计报告
(9)18周周四:书写课程设计报告
(10)18周周五:答辩评分
摘要
以ATMEL单片机为核心,运用单片机外部中断、定期器计数模式和定期器功能对信号发生器产生脉冲频率进行计数。且可以依照频率不同,单片机控制选取测周法或者测频法对产生脉冲波形进行计数,以进行更加精准频率测量。并且可以通过按键来进行频率测量办法选取。
核心词:数字频率计;测频发;测周法;单片机
目录
一、概述………………………………………………………………………………1
二、方案论证…………………………………………………………………………1
1.总体方案………………………………………………………………………1
2.测量方案选取…………………………………………………………………2
三、硬件设计…………………………………………………………………………2
1.系统功能描述…………………………………………………………………2
2.硬件电路设计方框……………………………………………………………3 3.单片机各某些电路……………………………………………………………3
四、软件设计…………………………………………………………………………4
1.测频发…………………………………………………………………………4
2.测周法…………………………………………………………………………4
3.主程序流程图设计……………………………………………………………5
4.程序设计……………………………………………………………14
五、课程与心得………………………………………………………………………14
六、参照文献…………………………………………………………………………15
一、概述
数字频率计是采用数字电路制成实现对周期性变化信号频率测量。
数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少测量仪器。它是一种用十进制数字,显示被测信号频率数字测量仪器。它基本功能是测量正弦信号,方波信号以及其她各种单位时间内变化物理量。在进行模仿、数字电路设计、安装、调试过程中,由于其使用十进制数显示,测量迅速,精度高,显示直观,因此经常要用到数字频率。
二、方案论证
1 总体方案
本次设计包括硬件设计与软件设计两某些,依照设计任务规定,采用AT89S52单片机,配备时钟电路,复位电路构成单片机最小系统,配备前置放大电路,人机对话通道中键盘,数码管显示,从而构成设计规定单片机应用测频系统,其构造框图如下图1-1所示:
前置放大整形
复位电路
单片机
数码管显示
时钟电路
键盘电路
图1构造框图
2.测量方案选取
方案一:直接测频法。直接测频法是把被测频率信号经脉冲形成电路后加到闸门一种输入端,只有在闸门开通时间T ( 以秒计) 内,被计数脉冲被送到十进制计数器进行计数。设计数器值为N ,由频率定义式可以计算得到被测信号频率为:f = N / T 。
方案二:高精度恒误差测频法。通过对老式测量办法研究,结合高精度恒误差测量原理,设计一种测量精度与被测频率无关硬件测频电路。本办法立足于迅速宽位数高精度浮点数字运算。
方案三:倍频法。直接测频法在高频段有着很高精度。可以把频率测量范畴提成各种频段,使用倍频技术,依照频段设立倍频系数将经整形低频信号进行倍频后再进行测量,高频段则进行直接测量。
从编程难易及单片机资源运用状况和测量误差角度考虑,选取方案一,尽管在测量低频段时相对测量误差较大。但是可以通过增大 T 来提高测量精度。
三.硬件设计
1.系统功能描述
本次课程设计重要完毕功能有:
(1)按P3^4键可选取测量频率。
(2)按P3^5键可以选取测量周期。
(3)按P3^6键可以自动选取测频率与测周期。
2.硬件电路设计框架
依照设计规定,数字频率计整个系统硬件框架图如下2-1键盘电路
AT89S52单片机
信号放大
分频电路
信号整形
信号限幅
待测信息
数码管显示
图2整机硬件电路框图
3.单片机各某些电路
(1)P0口经上拉电阻数据管显示电路
(2)P3^4-P3^6作为键盘设立端口
(3)P3^3作为被测信号输入端口
(4)P3^4被测信号接受端
图3单片机最小系统
4. 放大整形某些
待测信号通过第一级放大后,进入第二级放大限幅电路。
LM318是高数运放,工作电压±5--±20V,输入带宽15MHZ,足够解决高频信号。
放大倍数:n=RL2/RL1(RL2用50K,RL1用10K)。
限幅原理:限幅电路稳压管跨接在集成运放输出端和反相输入端之间。假设稳压管截止,则集成运放必然工作在开环状态,输出电压不是+UOM,就是-UOM。这样,必将导致稳压管击穿而工作在稳压状态,DZ构成负反馈通路,使反相输入端为“虚地”,限流电阻上电流iR等于稳压管电流iZ,输出电压u O=±UZ。
图4放大电路
四、软件设计
1.测频发
所谓“频率”,就是周期性信号在单位时间(1s)内变化次数。若在一定期间间隔T内测得这个周期性信号重复变化次数N,则其频率可表达为f=N/T右图其中脉冲形成电路作用是将被测信号变成脉冲信号,其重复频率等于被测频率fx。时间基准信号发生器 提供原则时间脉冲信号,若其周期为1s, 图 5测频原理
则门控电路输出信号持续时间亦精确地等于1s。闸门电路由原则秒信号进行控制,当秒信号来届时,闸门开通,被测脉冲信号通过闸门送到计数译码显示电路。秒信号结束时闸门关闭,计数器停止计数。
2.测周法
重要是运用单片机定期器计时,测量2个时间参数t1和t2,即如下所示:
图6测周法
计算信号一种波形周期 t=t1+t2 则可以求出频率f=1/t。
3.主程序流程图设计
开始
采集频率(1s内)
频率转换
十进制转换
数码管显示
自动测频测周
测周期
P3^4=0
P3^6=0
P3^5=0
测频率
那个按键按下
图7流程图
4.程序设计
#include <reg52.h>
#include <intrins.h>
sbit smgdl=P2^6;
sbit smgwl=P2^7;
bit LED = P3^3;
sbit key1 = P3^4; //定义按键1
sbit key2 = P3^5; //定义按键2
sbit key3 = P3^6; //定义按键3
sbit key4 = P3^7; //定义按键4
unsigned char value,smg; //保存按键接口状态
unsigned char lkey,key_time;
unsigned char mode=0;
unsigned int time=0;
unsigned char num=0;
unsigned char key=0;
unsigned char time_key=0;
unsigned int flag_f=0;
unsigned int f_temp1=0;
unsigned int f_temp2=0;
unsigned int t_temp1=0;
unsigned int t_temp2=0;
unsigned char flag_int_0=0;
/*********************************/
unsigned char tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
unsigned char tabledu[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char su[]={0,0,0,0,0,0,0,0};
/*********************************/
/*************DIS_LED*************/
void delay(unsigned int a) //延时函数
{
unsigned int b;
unsigned char c;
for(b=a;a>0;a--)
for(c=100;c>0;c--);
}
void display_smg(unsigned char smg,unsigned char value) //显示函数
{
smgwl=1;
P0=tablewe[smg];
smgwl=0;
smgdl=1;
P0=tabledu[value];
smgdl=0;
delay(6);//延长显示时间 避开视觉暂留 看数码管显示过程
}
//**************按键功能*****************
unsigned char ReadKey(void)
{
if(key1 == 0)
{
key_time++;
if(key_time == 20)
{
lkey = 1;mode=1;
}
if(key_time > 20)key_time = 100;
}
else if(key2 == 0)
{
key_time++;
if(key_time == 20)
{
lkey = 2;mode=2;
}
if(key_time > 20)key_time = 100;
}
else if(key3 == 0)
{
key_time++;
if(key_time == 20)
{
lkey = 3;mode=3;
}
if(key_time > 20)key_time = 100;
}
else
{
key_time = 0;
}
return lkey;
}
void main()
{
unsigned char k;
TMOD = 0x01; //定期器初始化
TH0 = (65536 - ) / 256;
TL0 = (65536 - ) % 256;
//EA = 1;
ET0 = 1;
TR0 = 1;
//PT0 = 1;
//EX0 = 1; //外部中断初始化
IT0 = 1;
EA = 1;
while(1)
{
display_smg(0,su[2]);//数码管显示
display_smg(1,su[3]);//数码管显示
display_smg(2,su[4]);//数码管显示
display_smg(3,su[5]);//数码管显示
display_smg(4,su[6]);//数码管显示
display_smg(5,su[7]);//数码管显示
k = ReadKey();
LED = ~LED; //脉冲发生
}
}
void time_1() interrupt 1
{
TH0 = (65536 - 1000) / 256; //定期器初始化
TL0 = (65536 - 1000) % 256;
time++;
if(time == 500)
{
time = 0;
num++;
if(num >= 10) num=0;
}
if(mode == 1) //测频法模式
{
EX0 = 1;//外部中断打开
IT0 = 1;
flag_f++;
if(flag_f >= 600)//1S钟计时
{
flag_f = 0;
mode = 0;
EX0 = 0;
su[2] = f_temp2;
su[3] = f_temp1 / 10000;
su[4] = f_temp1 / 1000 % 10;
su[5] = f_temp1 / 100 % 10;
su[6] = f_temp1 / 10 % 10;
su[7] = f_temp1 % 10;
;
f_temp1 = f_temp2 = 0;
}
}
if(mode == 2)//测周法模式
{
EX0 = 1;//外部中断打开
IT0 = 0;
PX0 = 1;
if(flag_int_0 == 1)
{
EX0 = 0;
mode = 0;
flag_int_0 = 0;
TR1 = 0;
t_temp1 = TL1;
t_temp2 = TH1;
t_temp2 = t_temp2 * 256;
t_temp1 = t_temp1 + t_temp2;
// su[2] = t_temp2 / 100;
su[3] = t_temp1 / 10000;
su[4] = t_temp1 / 1000 % 10;
su[5] = t_temp1 / 100 % 10;
su[6] = t_temp1 / 10 % 10;
su[7] = t_temp1 % 10;
TH1 = 0;
TL1 = 0;
}
}
if(mode == 3) //自动测频测周
{
EX0 = 1;//外部中断打开
IT0 = 1;
flag_f++;
if(flag_f >= 600)//1S钟计时
{
flag_f = 0;
EX0 = 0;
if(f_temp1 > 110)
{
mode = 2;
}
if(f_temp1 <= 110)
{
mode = 1;
}
}
}
su[0] = mode;
su[1] = num;
}
void INT_0() interrupt 0 //外部中断
{
if(mode == 1)
{
EX0 = 0;
f_temp1++;
if(f_temp1 >= 50000)
{
f_temp1 = 50000;
f_temp2++;
if(f_temp2 >= 5000)
{
f_temp1 = f_temp2 = 0;
}
}
EX0 = 1;
}
if(mode == 2)
{
TR1 = 1;
flag_int_0 = 1;
}
}
五、结论与心得
这次为期两周课程设计让我受益匪浅。此前只是对单片机更多只是某些感性,理论上结识,自己真正动手时候,才真正理解到其中精华所在。
频率计设计让我更好理解如何应用单片机定期器计数器模块,其中最重要是分析问题解决问题能力,在我看来,无论是在节约硬件资源,还是提高数据精确度来看,都需要下某些功夫把它做到最佳。
感谢廖亦凡博士在此寒冷天气每天指引咱们单片机设计,是您经验协助我解决诸多技术上难题。
六、参照文献
【1】 杨恢先 黄辉先 《单片机原理及应用》人民邮电出版社
【2】 大能 南光群 刘金华 《单片机课程设计指引书》 北京理工大学
【3】 谭浩强 《C语言程序设计第二版》 清华大学
教师评语及设计成绩
教师评语:
课程设计成绩:
指引教师:(签名)
日期:年月日
展开阅读全文