当前位置:文档之家› 单片机课设——频率计的设计——C语言编程

单片机课设——频率计的设计——C语言编程

沈阳工程学院┊┊课程设计设计题目:频率计程序设计系别自控系班级测控本091学生姓名学号指导教师职称教授起止日期: 2012 年1月2日起——至2012 年1月13日止沈阳工程学院课程设计任务书课程设计题目:频率计程序设计系别自控系班级学生姓名学号 2009308119指导教师职称教授课程设计进行地点: F422任务下达时间: 2012 年 1 月 2 日起止日期:2012年1月2日起——至2012年1月13日止教研室主任 2012 年1月2日批准频率计的设计1.设计主要内容及要求;编写频率计程序。

要求:1)能够测量频率并显示。

2)能够进行闸门时间选择。

2.对设计论文撰写内容、格式、字数的要求;(1).课程设计论文是体现和总结课程设计成果的载体,一般不应少于3000字。

(2).学生应撰写的内容为:中文摘要和关键词、目录、正文、参考文献等。

课程设计论文的结构及各部分内容要求可参照《沈阳工程学院毕业设计(论文)撰写规范》执行。

应做到文理通顺,内容正确完整,书写工整,装订整齐。

(3).论文要求打印,打印时按《沈阳工程学院毕业设计(论文)撰写规范》的要求进行打印。

(4). 课程设计论文装订顺序为:封面、任务书、成绩评审意见表、中文摘要和关键词、目录、正文、参考文献。

3.时间进度安排;沈阳工程学院C8051F020单片机原理及应用课程设计成绩评定表中文摘要在人们的日常生活中,频率的测量无处不在。

随着科学技术的发展,尤其是单片机技术和半导体技术的高速发展,频率计的研究及应用越来越受到重视,这样对频率测量设备的要求也越来越高。

单片机是一门发展极快应用方式极其灵活的使用技术。

他以灵活的设计、微小的功耗、低廉的成本,在数据采集、过程控制、模糊控制、智能仪表等领域得到广泛的应用,极大的提高了这些领域的技术水平和自动化程度。

在电子技术测量中,频率是最基本的参数之一,设计一种快速准确的频率计显得尤为重要。

该数字频率计的设计主要实现用数字显示被测信号的频率,该设计是以51单片机作为核心,与传统频率计相比该设计具有更高的测量精度和速度,具有各种中断处理能力,并且具有丰富的数字输入输出口和通信口等。

该频率计的设计在软件上编写,并采用计数式测频方法,通过单片机外围电路中由振荡电路产生的闸门信号进行计时,并对整形后的被测信号进行脉冲计数以得到被测信号的频率值。

由于低频信号照成了较大的量化误差,可在测量低频信号的时候延长闸门时间信号,以提高测量精度。

数字频率计是计算机、通讯设备、音频视频等科研生产领域不可缺少的测量仪器。

它是一种用十进制数字显示被测信号频率的数字测量仪器。

它的基本功能是测量正弦信号、方波信号及其他单位时间内变化的物理量。

在设计中应用单片机的数学运算和控制功能,来实现测量量程的自动切换,既满足测量精度的要求,又满足系统反应时间的要求。

在进行模拟、数字电路的设计、安装、调试过程中,由于其使用十进制数显式、测量迅速、精确度高、显示直观、所以经常用到频率计。

51系列单片机是国内目前应用最广泛的一种8位单片机之一,随着嵌入式系统、片上系统等概念的提出和普遍接受及应用。

51系列及其衍生单片机还会在继后很长一段时间占据嵌入式系统产品的低端市场,因此,作为新世纪的大学生,在信息产业高速发展的今天,掌握单片机的基本结构、原理和使用时非常重要的。

总之,频率计的设计是进行更深层次频率测量的基石。

关键词单片机,频率测量,分频器,硬件,软件目录1 设计任务描述 (1)1.1设计题目:频率计程序设计 (1)1.2设计要求: (1)1.2.1设计目的: (1)1.2.2基本要求: (1)2 设计思路 (2)3主程序流程图 (3)4 各部分程序的设计及参数计算 (4)4.1定义程序变量 (4)4.2初始化程序设计 (4)4.3主程序设计 (6)4.4T2数据采集程序设计 (8)4.5液晶显示程序设计 (9)4.6程序的参数计算 (11)5 频率计的工作过程分析 (12)6 设计过程未解决的问题 (13)小结 (14)致谢 (15)参考文献 (16)附录源程序代码 (17)1 设计任务描述1.1设计题目:频率计程序设计1.2设计要求:1.2.1设计目的:编写能实现频率测量的汇编语言程序,即设计频率计。

1.2.2基本要求:编写频率计程序。

要求:1)能够测量频率并显示。

2)能够进行闸门时间选择。

2 设计思路一.频率计计算方法的设计思路我们有多种方法可以进行频率的测量:本次课设我使用了两种方法来测量频率 (1) 直接计数法这种计算方法就是以基准时间nT 0 闸门时间来测量未知频率的f x 的周期T x 的个数,其计算公式如下:00/x x x N T T T f ==由上式可得所测频率为:00xx x N f N f T ==但是测量的时候T 0 和T x6不可避免的会有误差的存在最大的误差也就是被测 号的一个脉冲,其最大误差为00111/x x x w N T T T f =±=±=±从公式上面知道当被测频率越大则误差越小所以此部分用来测量高频信号最为合适, (2) 间接计数法间接计数法是用被测信号的时间间隔nT x 作为闸门时间,通过计算时钟脉冲的个数来计算来测量被测信号的频率,计算公式如下:00//x x x N nT T nf f ==(其中f x 是所测频率)由上式可得所测频率为:0/x x f nf N =和直接测量的一样间接计数法也存在误差其形成原因在于基准频率的脉冲个数实际上不为整数,其最大误差是基准脉冲的一个脉冲,这个误差为: 011/xxx f w N nT T nf =±=±=±由此可知他可以用来测量频率较为低一些的信号这样就会产生更小的误差 二.频率计程序的设计思路首先我使用T2定时器用来采集信号,我选择T2定时器就是因为它可以利用系统时钟定时同时又可以采集外面输入信号的信息,可谓是一举两得,接下来我设计了自动档位选择程序可以根据输入信号的频率来自动决定选择合适的档位,判断使用哪种方法来计算更为精确,频率计算完成之后就是将其输入到液晶显示程序将所测到的频率值显示出来3主程序流程图4 各部分程序的设计及参数计算4.1 定义程序变量在程序执行前,定义是非常有必要的。

定义如下:#include<c8051f020.h>#define SYSCLK 11059200.0 //定义系统时钟SYSCLK为11059200.0HZ double Timer0=0; //定义Timer0为双精度浮点型并赋初值为0 unsigned int PCL,PCH; //定义PCL,PCH为无符号整型数据unsigned int tang=0,tang1=0; //定义tang=tang1=0且为无符号整型数据unsigned int shao,shao1; //定义shao,shao1为无符号整型数据unsigned int T=0,T1=0; //定义T=0,T1=0且为无符号整型数据unsigned int count=0,count1=0;//定义count=0,count1=0为无符号整型数据double fre=0; //定义fre为双精度浮点型并赋初值为0bit st3=0; bit st1=0; //定义st3,st1为位类型的变量unsigned char xdata LCDdata[11]={48,49,50,51,52,53,54,55,56,57,46};//定义一个11列的数组unsigned char xdata liangcheng[5][10]={{97,48,49,60,53,48,72,122,0x20,0x20},{98,53,48,60,49,48,48,72,122,0x20},{99,49,48,48,60,49,75,72,122,0x{100,49,75,60,50,53,75,72,122,0x20},{101,50,53,75,60,53,48,75,72,122}};//定义一个5行10列的数组4.2 初始化程序设计void T2_Init(void);//定时器T2的初始化{T2CON=0x09;//T2工作在定时方式允许定时器T2进行捕捉TL2=0;TH2=0; //定时器赋初值00;RCAP2L=0;RCAP2H=0; // RCAP2H ,RCAP2L寄存器赋初值00;XBR1|=0x40; //T2EX0连接端口引脚IE|=0xA0; //总中断使能,并且允许定时器T2中断CKCON|=0x20;//定时器T2按系统时钟频率计数}void PORT_Init(void)//端口初始化{XBR2|=0x40;//交叉开关使能P0=0;//端口寄存器赋初值为00;}void LCD_Init(void)//液晶初始化{unsigned int x;P6=0x09; //写命令for(x=0;x<5000;x++);//延时程序P7=0x38;//两行显示,5X7点阵P6=0x08;//结束写命令P6=0x09;//写命令for(x=0;x<1000;x++);//延时程序P7=0x38;//两行显示,5X7点阵P6=0x08;//结束写命令P6=0x09;//写命令for(x=0;x<1000;x++);//延时程序P7=0x0e;//开显示,开光标,字符不闪烁P6=0x08;//结束写命令P6=0x09; //写命令for(x=0;x<1000;x++);//延时程序P7=0x06;//I/D=1,AC自动增加1;S=0,整体显示不移动P6=0x08;//结束写命令P6=0x09; //写命令for(x=0;x<5000;x++);//延时程序P7=0x01;//清除DDRAM,置AC=0;P6=0x08; //结束写命令P6=0x09;//写命令for(x=0;x<5000;x++);//延时程序}void SYSCLK_Init(void)//系统时钟初始化{int i; /*延时计数器*/OSCXCN = 0x67; /*启动外部11.0592MHz晶振*/ for (i=0; i < 255; i++) ; /*等待外部晶体起振*/while ((OSCXCN & 0x80)==0x00) ; /*查询标志位*/OSCICN = 0x88; /*选择外部晶体作为系统时钟并使能时钟丢失检测*/ }4.3 主程序设计这部分是我设计的主程序,它涉及频率测量的档位选择以及频率运算等核心部分所以我会详细的做这部分的设计介绍:main(){WDTCN=0xde;WDTCN=0xad;//关看门狗T2_Init();//定时器T2初始化PORT_Init();//端口初始化LCD_Init();//液晶初始化SYSCLK_Init();//系统时钟初始化,11MHzwhile(1)//死循环{switch(tang){case 0:shao=3;//a档,计算3个被测脉冲break;case 1:shao=200;//b档,计算200个被测脉冲break;case 2:shao=800;//c档,计算800个被测脉冲break;case 3:shao1=400;//d档,计算400*65536个基准脉冲break;case 4:shao1=10;//e档,计算10*65536个基准脉冲break;default:break;//跳出switch循环}if(tang1!=tang)//档位选择{ EXEN2=0;//禁止T2捕捉tang1=tang;//换档结束count1=0;// 基准频率计时归零count=0;// 基准频率计时归零T=0; T1=0;// 被测脉冲计数归零TL2=0; TH2=0;//定时器T2清零EXEN2=1;//允许T2捕捉中断}if(st1==1) //低频档{Timer0=(double)((PCH*256+PCL+65536*(count+count1*80000))/SYSCLK); fre=(double)((shao-1)/Timer0); //间接计数法算频率T=0; T1=0; //被测脉冲计数归零count=0; count1=0; //基准频率计时归零TL2=0; TH2=0; //基准频率计时归零RCAP2L=0; // RCAP2H寄存器归零RCAP2H=0; // RCAP2L寄存器归零PCL=0; // PCL归零PCH=0; // PCH归零st1=0;//清除低频标志位EXEN2=1; //允许T2捕捉中断}if(st3==1) //高频档{fre=(double)((T-1+T1*80000)*SYSCLK/(shao1*65535)); //直接计数法算频率TL2=0; TH2=0; //基准频率计时归零T=0; T1=0; 被测脉冲计数归零count=0;count1=0; //基准频率计时归零st3=0; //清除高频标志位EXEN2=1; //允许T2捕捉中断}if(fre<=50)tang=0; //频率小于50Hz换a档if((fre>50)&&(fre<=100))tang=1; //频率50~100Hz换b档if((fre>100)&&(fre<=1000))tang=2; //频率100~1000Hz换c档if((fre>1000)&&(fre<=25000))tang=3; //频率1000~25000Hz换d档if(fre>25000)tang=4; //频率大于25000Hz换e档LCD_show(fre);}}4.4 T2数据采集程序设计T2定时器具有边沿触发的捕捉方式,每来一个下降沿,进一次中断并计一个数,直接计数法和间接计数法都需要这个功能。

相关主题