单片机课程设计报告——智能数字频率计_第1页
单片机课程设计报告——智能数字频率计_第2页
单片机课程设计报告——智能数字频率计_第3页
单片机课程设计报告——智能数字频率计_第4页
单片机课程设计报告——智能数字频率计_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 单片机原理课程设计报告题目:智能数字频率计设计 专业: 信息工程班级:信息111学号:* 姓名:*指导教师:*北京工商大学计算机与信息工程学院1、 设计目的(1)了解和掌握一个完整的电子线路设计方法和概念; (2)通过电子线路设计、仿真、安装和调试,了解和掌握电子系统研发产品的一个基本流程。 (3)了解和掌握一些常见的单元电路设计方法和在电子系统中的应用: 包括放大器、滤波器、比较器、计数和显示电路等。 (4) 通过编写设计文档与报告,进一步提高学生撰写科技文档的能力。 2、 设计要求(1)基本要求设计指标:1. 频率测量:0250KHz;2

2、. 周期测量:4mS10S;3. 闸门时间:0.1S,1S;4. 测量分辨率:5位/0.1S,6位/1S;5. 用图形液晶显示状态、单位等。充分利用单片机软、硬件资源,在其控制和管理下,完成数据的采集、处理和显示等工作,实现频率、周期的等精度测量方案。在方案设计中,要充分估计各种误差的影响,以获得较高的测量精度。(2)扩展要求用语音装置来实现频率、周期报数。(3)误差测试调试无误后,可用数字示波器与其进行比对,记录测量结果,进行误差分析。(4)实际完成的要求及效果1. 测量范围:0.1Hz4MHz,周期、频率测量可调;2. 闸门时间:0.05s10s可调;3. 测量分辨率:5位/0.01S,6

3、位/0.1S;4. 用图形液晶显示状态、单位(Hz/KHz/MHz)等。3、 硬件电路设计(1)总体设计思路本次设计的智能数字频率计可测量矩形波、锯齿波、三角波、方波等信号的频率。系统共设计包括五大模块: 主芯片控制模块、整形模块、分频模块、档位选择模块、和显示模块。设计的总的思想是以AT89S52单片机为核心,将被测信号送到以LM324N为核心的过零比较器,被测信号转化为方波信号,然后方波经过由74LS161构成的分频模块进行分频,再由74LS153构成的四选一选择电路控制档位,各部分的控制信号以及频率的测量主要由单片机计数及控制,最终将测得的信号频率经LCD1602显示。各模块作用如下:1

4、.主芯片控制模块: 单片机AT89S52 内部具有2个16位定时/计数器T0、T1,定时/计数器的工作可以由编程来实现定时、计数和产生计数溢出时中断要求的功能。利用单片机的计数器和定时器的功能对被测信号进行计数。以AT89S52 单片机为控制核心,来完成对各种被测信号的精确计数、显示以及对分频比的控制。利用其内部的定时/计数器完成待测信号周期/频率的测量。2.整形模块:整形电路是将一些不是方波的待测信号转化成方波信号,便于测量。本设计使用运放器LM324连接成过零比较器作为整形电路。3.分频模块: 考虑单片机利用晶振计数,使用11.0592MHz 时钟时,最大计数速率将近500 kHz,因此需

5、要外部分频。分频电路用于扩展单片机频率测量范围,并实现单片机频率测量使用统一信号,可使单片机测频更易于实现,而且也降低了系统的测频误差。本设计使用的分频芯片是74LS161实现4分频及16分频。4.档位选择模块:控制74LS161不分频、4分频 或者 16分频,控制芯片是74LS153。5.显示模块:编写相应的程序可以使单片机自动调节测量的量程,并把测出的频率数据送到显示电路显示,本设计选用LCD1602。(2)测频基本设计原理所谓“频率”,就是周期性信号在单位时间(1s)内变化的次数。若在一定时间间隔T内测得这个周期性信号的重复变化次数N,则其频率可表示为f=N/T(右图3-1所示)。其中脉

6、冲形成电路的作用是将被测信号变成脉冲信号,其重复频率等于被测频率fx。利用单片机的定时/计数T0、T1的定时、计数功能产生周期为1s的时间脉冲信号,则门控电路的输出信号持 图3-1续时间亦准确地等于1s。闸门电路由标准的秒脉冲信号进行控制,当秒脉冲信号来到时,闸门开通,被测脉冲信号通过闸门送到计数译码显示电路。秒脉冲信号结束时闸门关闭,计数器停止计数。由于计数器计得的脉冲数N是在1秒时间内的累计数,所以被测频率fx=NHz。 (2)系统框图本智能数字频率计系统框图如图3-2所示图3-2智能数字频率计系统框图(3)单片机部分P0口经上拉后做LCD数据接口P2.1P2.3作为LCD控制端口P2.4

7、P2.5作为分频选择端口P3.5作为被测信号输入端口P3.2P3.4作为开关控制端口(对应电路图中K1,K2,SET)图3-3 89D52单片机部分电路(4)分频部分74HC161与74ls161功能兼容,是常用的四位二进制可预置的同步加法计数器,他可以灵活的运用在各种数字电路,以及单片机系统中实现分频器等很多重要的功能。其管脚图如图3-4所示: 图3-4 74HC161 图3-5 74HC153管脚图74HC153是一个双4选1数据选择器,其管脚图如图3-5所示:74LS161对整形后的防波信号进行分频,Q1为四分频输出,Q3为16分频输出。未经分频、经过四分频和经过16分频的三路信号作为7

8、4LS153的一个4选1数据选择器低三位输入,由单片机控制选择分频数,然后再送单片机内部计数器T1(如图3-6)。图3-6 分频、选择分频档位电路图(5)LCD显示部分LCD显示,1602的八位数据I/O口与单片机的P0口相连,读写控制端接P2.0-P2.2口。三个按键中,设置键接P3.2单片机按外部中断0接口,当按键按下后,置P3.2口低电平,单片机中断。S1、S2为频率/周期、闸门时间加/减选择按键(如图3-7)。图3-7 LCD显示部分电路图4、 软件设计(1) 主程序流程图设计本次程序设计采用的是C语言程序设计,其设计流程图4-1所示:图4-1主程序流程图(2) 子程序流程图设计<

9、;1>显示程序: LCD显示程序设计流程如图4-2所示:图4-2显示程序流程图<2>频率测量程序框图:频率测量程序的整体架构如图4-3所示:图4-3频率测量框架图(3)中断服务流程图 INT0中断流程图如图4-4所示:图4-4INT0中断流程图(4)程序代码#include <AT89x52.h>#include <stdio.h>#include <math.h>#include <intrins.h>float f; /频率float p; /周期float sj; /闸门时间char idata buff20;char f

10、lag=0; /频率、周期选择标志位char xs=0; /设置闸门时间结束后是否显示结果的标志位unsigned char m=0,n=0,yichu=0,fenpin; /m定时中断次数 n计数中断次数 yichu判断是定时/器还是计数器溢出#define Key_Set P3#define K1 0xf7 /11110111 P33#define K2 0xef/11101111 P34#define NO_Set 0xff#define Freq 0#define Peri 1sbit B153=P24;sbit A153=P23;sbit P17=P34;sbit P16=P33;s

11、bit P35=P35;sbit Set=P32;unsigned char LCD_Wait(void);void LCD_Write(bit style, unsigned char input);void LCD_SetDisplay(unsigned char DisplayMode);void LCD_SetInput(unsigned char InputMode);void LCD_Initial();void GotoXY(unsigned char x, unsigned char y);void Print(unsigned char *str);void C52_Init

12、ial();void Delay(unsigned int t);void display(float f);void cepin();void panduan();void timedisplay(float sj);void Time_Set1();void Time_Set2();void t0();void t1();/*模块名称 LCD1602显示程序*/*端口定义 */sbit LcdRs= P20;sbit LcdRw= P21;sbit LcdEn= P22;sfr DBPort= 0x80; /P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口/*内部等

13、待函数*/unsigned char LCD_Wait(void) LcdRs=0; /寄存器选择输入端 1:数据 0:指令 LcdRw=1; _nop_(); /RW:为0:写状态;为1:读状态; LcdEn=1; _nop_(); /使能输入端,读状态,高电平有效;写状态,下降沿有效 LcdEn=0; return DBPort; /*向LCD写入命令或数据*/#define LCD_COMMAND 0 / Command#define LCD_DATA 1 / Data#define LCD_CLEAR_SCREEN 0x01 / 清屏#define LCD_HOMING 0x02 /

14、光标返回原点void LCD_Write(bit style, unsigned char input) LcdEn=0; LcdRs=style; LcdRw=0; _nop_(); DBPort=input; _nop_();/注意顺序 LcdEn=1; _nop_();/注意顺序 LcdEn=0; _nop_(); LCD_Wait();/*设置显示模式*/#define LCD_SHOW 0x04 /显示开#define LCD_HIDE 0x00 /显示关 #define LCD_CURSOR 0x02 /显示光标#define LCD_NO_CURSOR 0x00 /无光标 #de

15、fine LCD_FLASH 0x01 /光标闪动#define LCD_NO_FLASH 0x00 /光标不闪动void LCD_SetDisplay(unsigned char DisplayMode) LCD_Write(LCD_COMMAND, 0x08|DisplayMode); /*设置输入模式*/#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 / default#define LCD_MOVE 0x01 / 画面可平移#define LCD_NO_MOVE 0x00 /defaultvoid LCD_SetInput(unsigned

16、 char InputMode) LCD_Write(LCD_COMMAND, 0x04|InputMode);/*初始化LCD*/void LCD_Initial() LcdEn=0; LCD_Write(LCD_COMMAND,0x38); /8位数据端口,2行显示,5*7点阵 LCD_Write(LCD_COMMAND,0x38); LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); /开启显示, 无光标 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); /清屏 LCD_SetInput(LCD_AC_UP|LCD_NO_MOV

17、E); /AC递增, 画面不动/*/void GotoXY(unsigned char x, unsigned char y)if(y=0) LCD_Write(LCD_COMMAND,0x80|x);if(y=1) LCD_Write(LCD_COMMAND,0x80|(x-0x40);void Print(unsigned char *str) while(*str!='0') LCD_Write(LCD_DATA,*str); str+; /* 模块名称: 频率测量程序 * 测量范围:0.1Hz4MHz,闸门时间:0.05s10s可调。 */*89c52初始化*/void

18、 C52_Initial() sj=1000000.00; Key_Set=0xff; TMOD=0x51; / 01010001 T1为计数器,T0为定时器 EA=1; ET0=1; ET1=1; EX0=1; PX0=1; /外部中断0设置为高优先级 IT0=0; /电平触发方式/*延时子程序*/void Delay(unsigned int t) /t随着数值越大,误差趋于平衡.unsigned char i; while(t-) for(i=0;i<123;i+); /*计数中*/void t1(void) interrupt 3 /计数器1溢出,yichu=1n+;yichu=

19、1;TH1=0;TL1=0;/*定时中断*/void t0(void) interrupt 1 m+;yichu=2; /定时器0溢出,yichu=2TH0=0x3c; /定时50msTL0=0xb0;/*频率显示*/void Fdisplay(float f) if(f>999400.00) if(f<4000400.00) sprintf(buff," F=%2.4fmHz ",(f/1000000.00); else if(f>1040.00) sprintf(buff," F=%4.2fkHz ",(f/1000.00); el

20、se if(f>0.06) sprintf(buff," F=%3.2fHz ",f); GotoXY(0,1); Print(buff);/*周期显示*/void Pdisplay(float p) if(p>999400.00) if(p<10004000.00) sprintf(buff," Cycle:%2.4fs ",(p/1000000.00); else sprintf(buff,"error(Time or F)",p); else if(p>9950.00) sprintf(buff,&quo

21、t; Cycle:%4.2fms ",(p/1000.00); else if(p>0.248) sprintf(buff," Cycle:%3.3fus ",p); else sprintf(buff,"error(Time or F)",p); GotoXY(0,1); Print(buff); /*测试频率*/void cepin()unsigned char a;unsigned long js;m=0;n=0;TMOD=0x51;TH0=0x3c; /定时50msTL0=0xb0;TH1=0;TL1=0;a=sj/50000.0

22、0;TCON=0x50; /启动定时器和计数器while(m!=a);TCON=0;js=TH1*256+n*65536+TL1;f=(js/(sj/1000000.00)*fenpin;p=sj/(js*fenpin);if(xs=0) /设置结束后第一次不显示结果if(flag=Freq) Fdisplay(f);else Pdisplay(p); /*判断频率*/void panduan()xs=0; /设置结束后第二次循环显示结果B153=1; /选择16分频A153=0;yichu=0;TMOD=0x51; TH0=0xff; /定时器0 200usTL0=0x38;TH1=0xff

23、; /计数器1 100脉冲TL1=0x9c;TR0=1; /启动定时器0和计数器1TR1=1;while(yichu=0); /如果没有溢出一直循环TR0=0; /已经溢出关闭定时器0和计数器1TR1=0; if(yichu=1) /计数器先溢出:在200ms内测得的脉冲过多,说明频率较高(f>500khz) fenpin=16; /转为测16分频后的频率 cepin();else /定时器先溢出:100个脉冲的时间比较短,即频率较低,可以减少分频数 yichu=0; B153=0; A153=1; TH0=0xfc; /定时器0 1ms TL0=0x18; TH1=0xff; /计数器

24、1 100个脉冲 TL1=0x9c; TR0=1; /启动定时器0和计数器1 TR1=1; while(yichu=0); /如果没溢出一直循环 TR0=0; /已经溢出关闭定时器0和计数器1 TR1=0; if(yichu=1) /计数器先溢出:在1ms内测得的脉冲过多,说明频率较高(1khz<f<500khz) fenpin=4; /转为测4分频后测频率 cepin(); else /定时器先溢出:100个脉冲的时间比较短,即频率较低 fenpin=1; B153=0; A153=0; cepin(); /*显示闸门时间*/ void timedisplay(float GTi

25、me)sprintf(buff,"GTime=%7.0fus ",GTime);GotoXY(0,1);Print(buff);Delay(50);/*减按键*/void Time_Set2()Delay(1000);if(P17=1) sj=sj-50000.00; if(sj>50000.00) timedisplay(sj); else sj=50000.00; timedisplay(sj); elsewhile(P17=0) Delay(500); sj=sj-500000.00; if(sj>50000.00) timedisplay(sj); el

26、se sj=50000.00; timedisplay(sj); /*加按键*/ void Time_Set1()Delay(1000)if(P16=1) sj=sj+50000.00; if(sj<10000000.00) timedisplay(sj); else sj=10000000.00; timedisplay(sj); elsewhile(P16=0) Delay(500); sj=sj+500000.00; if(sj<10000000.00) timedisplay(sj); else sj=10000000.00; timedisplay(sj); /按住1s快

27、加0.5s /*闸门时间设置*/void Time_Set() interrupt 0 EA=0; /防止无限中断 Delay(100); if(Set=0) Delay(1000); /判断处于哪种设置状态 if(Set=1) GotoXY(0,1); Print(" Press Button "); GotoXY(0,0); Print(" T Settings "); while(Set=1) switch(Key_Set) case K1: Time_Set1();break; case K2: Time_Set2();break; defaul

28、t: break; else /选择测试频率或周期 GotoXY(0,1); Print(" 1.Freq 2.Cycle"); GotoXY(0,0); Print(" Select "); while(Set=0); /等待设置按键松开 while(Set=1) switch(Key_Set) case K1: flag=Freq; GotoXY(0,1); Print(" -Freq- "); break; case K2: flag=Peri; GotoXY(0,1); Print(" -Cycle- ")

29、; break; default: break; GotoXY(0,0); Print(" -Cymometer-"); GotoXY(0,1); Print(" Waiting. "); while(Set=0); /防止再次进入中断 EA=1; xs=1; /不显示此次结果./*主程序*/void main()LCD_Initial(); /LCD初始化GotoXY(0,0);Print(" -Cymometer-");GotoXY(0,1);Print(" Huixi && Xia");Del

30、ay(1000);GotoXY(0,1);Print(" Waiting. ");C52_Initial(); /89c52初始化while(1) panduan(); 5、 调试过程程序的设计及调试过程中离不开89C52的开发系统板电路图,起初忽视了开发板上的K3键用到的P35引脚也是定时器T1的信号输入引脚。后来在其他管脚的分配也曾出现错误,不过通过调试、修改都一一改正。仿真的时候默认晶振是12MHz,故程序编写的时候按12MHz设计的定时,以至于在实体时候测量不是很准确,后通过重新计算、修改程序达到了较高的准确率。但最终在实体系统演示中犯了一个极其幼稚的错误,未拿掉短接帽,以至于起初LCD未任何显示,浪费了不少时间去找程序的问题,还是自己不够认真细心。6、 实验结果(1) 最终实物图最终实体电路系统如图6-1。图6-1最终实物图该课程设计验收时结果符合设计要求,可测量矩形波,方波,三角波,锯齿波等信号的频率

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论