单片机课设频率计数器
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(4) 应用系统的硬件和软件的调试。
二、进度安排
第一周:
周一:集中布置课程设计任务和相关事宜,查资料确定系统总体方案。
周二~周三:完成硬件设计和电路连接
周四~周日:完成软件设计
第二周:
周一~周三:程序调试
周四~周五:设计报告撰写。周五进行答辩和设计结果检查。
三、参考资料
1、王迎旭等.单片机原理及及应用. 2版.机械工业出版社,2012
心得体会................................................................9
第1章设计任务及要求
1.1 设计任务:
本课题以单片机为核心,设计和制作一个频率计数器,来完成对输入的信号进行频率计数,计数的频率结果能够显示出来。要求能够对0-250KHz的信号频率进行准确计数,计数误差不超过±1HZ。
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
第4章系统软件设计
4.1主程序流程图
图5 程序流程图
4.2 初始化模块
void main(void)
{
unsigned char i;
TMOD=0x15; //定义定时器0为计数方式,定时器1为计时方式,均工作在方式1
TH0=0; //定时器0初值高8位为0
TL0=0; //定时器0初值低8为0
TH1=(65536-5000)/256; //定时器1初值高8位
4.6 数码管扫描模块..................................................7
5.1C程序编译.......................................................8
5.2 Proteus仿真......................................................9
x=T0count*65536+TH0*256+TL0; //获得整形的频率值
4.4数码管显示模块
for(i=0;i<8;i++)
{
temp[i]=0; //赞存缓冲区清零
}
i=0;
while(x/10) //将频率值的每一位分离出来,存进temp数组
{
temp[i]=x%10;
x=x/10;
i++;
3.3 LED数码管显示电路...............................................3
4.3 信号频率测量模块................................................5
4.5 程序中断模块....................................................6
1.2 设计要求:
(1)确定系统设计方案;
(2)进行系统的硬件设计;
(3)完成应用程序设计;
(4) 应用系统的硬件和软件的调试。
第2章 系统方案设计
2.1基本设计原理
基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。
所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。其中脉冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于被测频率fx。时间基准信号发生器提供标准的时间脉冲信号,若其周期为1s,则门控电路的输出信号持续时间亦准确地等过闸门送到计数译码显示电路。秒信号结束时闸门关闭,计数器停止计数。由于计数器计得的脉冲数N是在1秒时间内的累计数,所以被测频率fx=NHz。AT89S51 单片机内部具有 2 个 16 位的定时/计数器 T0 与 T1,其工作方法可以通过编程来实现所需的定时/计数与产生计数溢出中断要求的功能。定时/计数器 T0 与 T1 的核心都是 16 位的加 1 计数器, TH0 与 TL0构成在构成定时/计数器 T0 加 1 计数器的高 8 位和低 8 位; TH1 与 TL1构成在构成定时/计数器 T1 加 1 计数器的高 8 位和低 8 位。加 1 计数器的初值可以通过程序设定,这样就可以获得不同的计数值或定时时间。当加 1 计数器用作定时器时,每个机器周期加 1(使用 12MHz 时钟时,每 1us 加 1) ,这样以机器周期为基准可以用来测量时间间隔。当加 1 计数器用作计数器时,在相应的外部引脚发生从 1 到 0 的跳变时计数器加 1,这样在计数闸门的控制下可以用来测量待测信号的频率。外部输入每个机器周期被采样一次,这样检测一次从 1 到 0 的跳变至少需要 2 个机器周期(24个振荡周期),所以最大计数速率为时钟频率的 1/24。AT89S51 单片机的时钟频率可以在0Hz—33MHz 范围内自动调节,当使用 12MHz 时钟时,最大计数速率为 500KHz。定时/计数器的工作由相应的运行控制位 TR 控制,当 TR 置 1 时,定时/计数器开始计数;当 TR 置 0 时,停止计数。在本设计方案中,我通过程序设定 T0 工作在计数状态下,T1 工作在计时状态下。T0 计数器对输入的信号经行计数,其最大计数值为 fOSC/24,当 fOSC=12MHz 时,T0 的最大计数频率为250kHz。
课 程 设 计
课程名称
单片机原理及应用
课题名称
频率计数器
专 业
电子信息工程
班 级
1302
学 号
201301030218
姓 名
许聪
指导老师
寻大勇等
2016年3月25日
电气信息学院
课程设计任务书
课题名称
频率计数器
姓 名
许聪
专业
电子信息
班级
1302
学号
18
指导老师
寻大勇
课程设计时间
2016年3月14日-2016年3月25日
2、胡汉才.单片机原理及其接口技术.3版.清华大学出版社,2010.
3、戴灿金.51单片机及其C语言程序设计开发实例.清华大学出版社,2010
3.1 复位电路.........................................................2
3.2晶振电路.........................................................3
void t0(void) interrupt 1 using 0
{
T0count++;
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256; //重装初值
timecount++;
if(timecount==200)
{
TR0=0;//关闭定时器0,为了读出定时器0计数个数
timecount=0;//timecount清零,重新计时
flag=1;//置标志位通知主程序1s已到
}
4.6数码管扫描模块
P2=0xff; //关闭所有数码管
P0=dispcode[dispbuf[dispcount]]; //先确定相应数码管的段码,送入段码
教研室意见
意见: 审核人:
一、任务及要求
设计任务:
本课题以单片机为核心,设计和制作一个频率计数器,来完成对输入的信号进行频率计数,计数的频率结果能够显示出来。要求能够对0-250KHz的信号频率进行准确计数,计数误差不超过±1HZ。
设计要求:
(1)确定系统设计方案;
(2)进行系统的硬件设计;
(3)完成应用程序设计;
图7 较小频率显示图
选取中间频率为12000Hz时:
图8 中间频率显示图
选取较大频率为23000Hz时:
图9 较大频率显示图
心得体会
在单片机应用系统设计时,必须先确定该系统的技术要求,这是系统设计的依据和出发点,整个设计过程都必须围绕这个技术要求来工作。在设计时遵循从整体到局部也即自上而下的原则。把复杂的问题分解为若干个比较简单的、容易处理的问题,分别单个的加以解决。将总任务分解成可以独立表达的子任务,这些子任务再向下分,直到每个子任务足够简单,能够直接而容易的实现为止。在程序调试时应按各个功能模块分别调试。
显示器是微机重要的输出设备。显示器有显示监控结果、提供用户操作界面等功能。在本次设计中采用了 LED 显示器,即数码管。数码管的每一个数码段是一只发光二极管。当发光二极管导通时,相应的一个点或者一个笔画发光,控制发光二极管发光组合,可以显示出所需字符。我采用了共阴极结构。在定义其显示字形的码段时,通过 I/O 口送出七段码 。
2.2 方案整体框图
图1 系统总框图
第3章 系统硬件电路设计
3.1复位电路
复位是单片机的初始化操作。单片机系统在上电启动运行时,都需要先复位。其作用是使CPU 和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。而复位是一个很重要的操作方式,但单片机本身是不能自动经行复位的,必须配合相应的外部复位电路才能实现。本设计的复位电路采用上电复位加按键手动复位,其电路如下图所示:
TL1=(65536-5000)%256; //定时器初值低8位
TR1=1;//启动定时器1
TR0=1;//启动定时器0
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
EA=1;//开总中断
4.3信号频率测量模块
while(1)
{
if(flag==1) //如果定时时间到了1s
{
flag=0; //标志位清零
在程序设计时,正确合理的设计是非常重要的,正确的程序设计包括程序的结构是否合理,一些循环结构和循环指令的使用是否恰当,能否使用较少的循环次数或较快的指令,是否能把某些延迟等待的操作改为中断申请服务,能否把某些计算方法和查表技术适当简化等。另外程序的设计要具有可扩展性,程序的结构要标准化,便于阅读、修改和扩充。
通过本次课程设计,我更加地了解和掌握单片机的基本知识和基本的编写程序,也更加深入地了解单片机这么课程,掌握汇编语言的设计和调试方法。对于认识到自己在知识方面存在的不足,明确今后的学习方向是非常有益的。
参考文献
《单片机原理与应用》 王迎旭等编 机械工业出版社
《51系列源自文库片机设计实例》 楼然苗等编 北京航空航天大学出版社
其段码表如下:
表1 共阴数码管段选码
显示字形
0
1
2
3
4
5
6
7
8
9
共阴段选码
3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
6FH
数码管的电路图如下:
图4数码管接线电路
本设计采用了数码管的动态显示方式,即轮流点亮各数码管,对数码管进行扫描。在任何时刻只給一个数码管通电,通电一定时间后再给下一个数码管通电。只要刷新频率足够高,动态显示方式同样可以实现稳定显示。这样就可以节约I/O口。
}
temp[i]=x;
for(i=0;i<6;i++)
{
dispbuf[i]=temp[i];//将暂存数组的数据赋给显示数组
}
timecount=0; //计时清零
T0count=0; //计数清零
TH0=0;//计时器0初值清零
TL0=0;//计时器0初值清零
TR0=1;//重新启动定时器0
4.5程序中断模块
图2 上电复位电路
3.2 晶振电路
单片机工作是在统一的时钟脉冲控制下一拍一拍地进行的,这个脉冲是单片机控制器中的时序电路发出的。单片机的时序就是 CPU 在执行指令时所需控制信号的时间顺序。为了保证各部件的同步工作,单内部电路应在唯一的时钟信号下严格按时序进行工作。其电路原理图如下:
图3 晶振电路
3.3 LED数码管显示电路
P2=dispbit[dispcount]; //送入位码
dispcount++;//下一次扫描下一位数码管
if(dispcount==8)//8位数码管
{
dispcount=0;//扫描完第7个,回头扫描第0个
}
第5章系统仿真及调试
5.1 C程序编译
图6 程序编译图
5.2 Proteus仿真
选取较小频率为10Hz时:
《计算机硬件技术基础实验教程》 黄勤等编 重庆大学出版社
《微型计算机接口技术及应用》 刘乐善主编 华中科技大学出版社
《单片微型计算机原理及接口技术》陈光东等 华中科技大学出版社
附录A 仿真总图
附录B 程序清单
#include <reg51.h>
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义数码管位选码
二、进度安排
第一周:
周一:集中布置课程设计任务和相关事宜,查资料确定系统总体方案。
周二~周三:完成硬件设计和电路连接
周四~周日:完成软件设计
第二周:
周一~周三:程序调试
周四~周五:设计报告撰写。周五进行答辩和设计结果检查。
三、参考资料
1、王迎旭等.单片机原理及及应用. 2版.机械工业出版社,2012
心得体会................................................................9
第1章设计任务及要求
1.1 设计任务:
本课题以单片机为核心,设计和制作一个频率计数器,来完成对输入的信号进行频率计数,计数的频率结果能够显示出来。要求能够对0-250KHz的信号频率进行准确计数,计数误差不超过±1HZ。
unsigned char code dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,
0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40};
第4章系统软件设计
4.1主程序流程图
图5 程序流程图
4.2 初始化模块
void main(void)
{
unsigned char i;
TMOD=0x15; //定义定时器0为计数方式,定时器1为计时方式,均工作在方式1
TH0=0; //定时器0初值高8位为0
TL0=0; //定时器0初值低8为0
TH1=(65536-5000)/256; //定时器1初值高8位
4.6 数码管扫描模块..................................................7
5.1C程序编译.......................................................8
5.2 Proteus仿真......................................................9
x=T0count*65536+TH0*256+TL0; //获得整形的频率值
4.4数码管显示模块
for(i=0;i<8;i++)
{
temp[i]=0; //赞存缓冲区清零
}
i=0;
while(x/10) //将频率值的每一位分离出来,存进temp数组
{
temp[i]=x%10;
x=x/10;
i++;
3.3 LED数码管显示电路...............................................3
4.3 信号频率测量模块................................................5
4.5 程序中断模块....................................................6
1.2 设计要求:
(1)确定系统设计方案;
(2)进行系统的硬件设计;
(3)完成应用程序设计;
(4) 应用系统的硬件和软件的调试。
第2章 系统方案设计
2.1基本设计原理
基本设计原理是直接用十进制数字显示被测信号频率的一种测量装置。它以测量周期的方法对正弦波、方波、三角波的频率进行自动的测量。
所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T。其中脉冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于被测频率fx。时间基准信号发生器提供标准的时间脉冲信号,若其周期为1s,则门控电路的输出信号持续时间亦准确地等过闸门送到计数译码显示电路。秒信号结束时闸门关闭,计数器停止计数。由于计数器计得的脉冲数N是在1秒时间内的累计数,所以被测频率fx=NHz。AT89S51 单片机内部具有 2 个 16 位的定时/计数器 T0 与 T1,其工作方法可以通过编程来实现所需的定时/计数与产生计数溢出中断要求的功能。定时/计数器 T0 与 T1 的核心都是 16 位的加 1 计数器, TH0 与 TL0构成在构成定时/计数器 T0 加 1 计数器的高 8 位和低 8 位; TH1 与 TL1构成在构成定时/计数器 T1 加 1 计数器的高 8 位和低 8 位。加 1 计数器的初值可以通过程序设定,这样就可以获得不同的计数值或定时时间。当加 1 计数器用作定时器时,每个机器周期加 1(使用 12MHz 时钟时,每 1us 加 1) ,这样以机器周期为基准可以用来测量时间间隔。当加 1 计数器用作计数器时,在相应的外部引脚发生从 1 到 0 的跳变时计数器加 1,这样在计数闸门的控制下可以用来测量待测信号的频率。外部输入每个机器周期被采样一次,这样检测一次从 1 到 0 的跳变至少需要 2 个机器周期(24个振荡周期),所以最大计数速率为时钟频率的 1/24。AT89S51 单片机的时钟频率可以在0Hz—33MHz 范围内自动调节,当使用 12MHz 时钟时,最大计数速率为 500KHz。定时/计数器的工作由相应的运行控制位 TR 控制,当 TR 置 1 时,定时/计数器开始计数;当 TR 置 0 时,停止计数。在本设计方案中,我通过程序设定 T0 工作在计数状态下,T1 工作在计时状态下。T0 计数器对输入的信号经行计数,其最大计数值为 fOSC/24,当 fOSC=12MHz 时,T0 的最大计数频率为250kHz。
课 程 设 计
课程名称
单片机原理及应用
课题名称
频率计数器
专 业
电子信息工程
班 级
1302
学 号
201301030218
姓 名
许聪
指导老师
寻大勇等
2016年3月25日
电气信息学院
课程设计任务书
课题名称
频率计数器
姓 名
许聪
专业
电子信息
班级
1302
学号
18
指导老师
寻大勇
课程设计时间
2016年3月14日-2016年3月25日
2、胡汉才.单片机原理及其接口技术.3版.清华大学出版社,2010.
3、戴灿金.51单片机及其C语言程序设计开发实例.清华大学出版社,2010
3.1 复位电路.........................................................2
3.2晶振电路.........................................................3
void t0(void) interrupt 1 using 0
{
T0count++;
}
void t1(void) interrupt 3 using 0
{
TH1=(65536-5000)/256;
TL1=(65536-5000)%256; //重装初值
timecount++;
if(timecount==200)
{
TR0=0;//关闭定时器0,为了读出定时器0计数个数
timecount=0;//timecount清零,重新计时
flag=1;//置标志位通知主程序1s已到
}
4.6数码管扫描模块
P2=0xff; //关闭所有数码管
P0=dispcode[dispbuf[dispcount]]; //先确定相应数码管的段码,送入段码
教研室意见
意见: 审核人:
一、任务及要求
设计任务:
本课题以单片机为核心,设计和制作一个频率计数器,来完成对输入的信号进行频率计数,计数的频率结果能够显示出来。要求能够对0-250KHz的信号频率进行准确计数,计数误差不超过±1HZ。
设计要求:
(1)确定系统设计方案;
(2)进行系统的硬件设计;
(3)完成应用程序设计;
图7 较小频率显示图
选取中间频率为12000Hz时:
图8 中间频率显示图
选取较大频率为23000Hz时:
图9 较大频率显示图
心得体会
在单片机应用系统设计时,必须先确定该系统的技术要求,这是系统设计的依据和出发点,整个设计过程都必须围绕这个技术要求来工作。在设计时遵循从整体到局部也即自上而下的原则。把复杂的问题分解为若干个比较简单的、容易处理的问题,分别单个的加以解决。将总任务分解成可以独立表达的子任务,这些子任务再向下分,直到每个子任务足够简单,能够直接而容易的实现为止。在程序调试时应按各个功能模块分别调试。
显示器是微机重要的输出设备。显示器有显示监控结果、提供用户操作界面等功能。在本次设计中采用了 LED 显示器,即数码管。数码管的每一个数码段是一只发光二极管。当发光二极管导通时,相应的一个点或者一个笔画发光,控制发光二极管发光组合,可以显示出所需字符。我采用了共阴极结构。在定义其显示字形的码段时,通过 I/O 口送出七段码 。
2.2 方案整体框图
图1 系统总框图
第3章 系统硬件电路设计
3.1复位电路
复位是单片机的初始化操作。单片机系统在上电启动运行时,都需要先复位。其作用是使CPU 和系统中其他部件都处于一个确定的初始状态,并从这个状态开始工作。而复位是一个很重要的操作方式,但单片机本身是不能自动经行复位的,必须配合相应的外部复位电路才能实现。本设计的复位电路采用上电复位加按键手动复位,其电路如下图所示:
TL1=(65536-5000)%256; //定时器初值低8位
TR1=1;//启动定时器1
TR0=1;//启动定时器0
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
EA=1;//开总中断
4.3信号频率测量模块
while(1)
{
if(flag==1) //如果定时时间到了1s
{
flag=0; //标志位清零
在程序设计时,正确合理的设计是非常重要的,正确的程序设计包括程序的结构是否合理,一些循环结构和循环指令的使用是否恰当,能否使用较少的循环次数或较快的指令,是否能把某些延迟等待的操作改为中断申请服务,能否把某些计算方法和查表技术适当简化等。另外程序的设计要具有可扩展性,程序的结构要标准化,便于阅读、修改和扩充。
通过本次课程设计,我更加地了解和掌握单片机的基本知识和基本的编写程序,也更加深入地了解单片机这么课程,掌握汇编语言的设计和调试方法。对于认识到自己在知识方面存在的不足,明确今后的学习方向是非常有益的。
参考文献
《单片机原理与应用》 王迎旭等编 机械工业出版社
《51系列源自文库片机设计实例》 楼然苗等编 北京航空航天大学出版社
其段码表如下:
表1 共阴数码管段选码
显示字形
0
1
2
3
4
5
6
7
8
9
共阴段选码
3FH
06H
5BH
4FH
66H
6DH
7DH
07H
7FH
6FH
数码管的电路图如下:
图4数码管接线电路
本设计采用了数码管的动态显示方式,即轮流点亮各数码管,对数码管进行扫描。在任何时刻只給一个数码管通电,通电一定时间后再给下一个数码管通电。只要刷新频率足够高,动态显示方式同样可以实现稳定显示。这样就可以节约I/O口。
}
temp[i]=x;
for(i=0;i<6;i++)
{
dispbuf[i]=temp[i];//将暂存数组的数据赋给显示数组
}
timecount=0; //计时清零
T0count=0; //计数清零
TH0=0;//计时器0初值清零
TL0=0;//计时器0初值清零
TR0=1;//重新启动定时器0
4.5程序中断模块
图2 上电复位电路
3.2 晶振电路
单片机工作是在统一的时钟脉冲控制下一拍一拍地进行的,这个脉冲是单片机控制器中的时序电路发出的。单片机的时序就是 CPU 在执行指令时所需控制信号的时间顺序。为了保证各部件的同步工作,单内部电路应在唯一的时钟信号下严格按时序进行工作。其电路原理图如下:
图3 晶振电路
3.3 LED数码管显示电路
P2=dispbit[dispcount]; //送入位码
dispcount++;//下一次扫描下一位数码管
if(dispcount==8)//8位数码管
{
dispcount=0;//扫描完第7个,回头扫描第0个
}
第5章系统仿真及调试
5.1 C程序编译
图6 程序编译图
5.2 Proteus仿真
选取较小频率为10Hz时:
《计算机硬件技术基础实验教程》 黄勤等编 重庆大学出版社
《微型计算机接口技术及应用》 刘乐善主编 华中科技大学出版社
《单片微型计算机原理及接口技术》陈光东等 华中科技大学出版社
附录A 仿真总图
附录B 程序清单
#include <reg51.h>
unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义数码管位选码