单片机课程设计报告-设计并实现频率相位表.doc_第1页
单片机课程设计报告-设计并实现频率相位表.doc_第2页
单片机课程设计报告-设计并实现频率相位表.doc_第3页
单片机课程设计报告-设计并实现频率相位表.doc_第4页
单片机课程设计报告-设计并实现频率相位表.doc_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

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

文档简介

武汉理工大学单片机原理与应用课程设计说明书1 课设题目及简要分析题目:设计并实现频率/相位表要求:输入两路方波信号,测量信号的频率和两信号的相位差,能显示频率值和相位差,精度:0.1hz,0.10。在满足精度的前提下分析和证实系统的测量范围。简要分析:题目要求测量两路同频率信号的频率和相位差,初步分析,测量频率有两种方法,定时计数法,测量周期求倒数的方法,可以根据具体情况选用不同的方法;测量相位差可以通过用领先的相位信号控制定时器开启,用落后的相位信号控制定时器停止,计算出两个信号的延时,然后除以信号的周期,再乘以3600就可以得到两个信号的相位差。2设计原理2.1 设计原理测量频率有两种方法,直接测量法和间接测量法。直接测量法即直接用计数器测出频率,将单片机的t1设置为计数方式,方波输入至单片机的计数器1的入口,对输入的方波计数,定时器0设置时长为1s。由于这种方法误差在1s计时到时,并非一定是整数个波形,而计数器计到的只能是整数个波形,所以有不大于一个波的误差存在,如果是高频信号,这个误差就非常小,但是如果是低频信号,就可能会导致误差较大。间接测量法即通过测周期来求出频率,可以通过外部中断来控制,当方波的第n个下升沿启动计时器,第n+1个下升沿关闭计时器,计数器所记录的时间即为方波的周期。在通过周期来计算出所求的频率。由于直接测量法对低频信号的误差较大,故此次课程设计采用间接测量法来测量。此次设计涉及到相位差,即两列波形异或得到的波形只需要测高电平,要用到gate信号,gate=1时,tr0=1,into=1才能启动计数器,而计数器0是通过外部中断into的下降沿开始触发的,计时器从0开始计时,计数器只能测高电平,因此测得的时间为半个周期。当计数器0计时溢出,执行m加1的操作。则测量时间为:t1=th0*256+tl0+m*65536 ,所求频率f=1000000/(2*t1) 测量两方波的相位差时,先将两方波信号异或,得到的新波形输入外部中断1的入口,在信号的第n个下跳沿时,进入外部中断的程序,开启计数器1。第n+1个下跳沿到来时,则关闭计数器1,当gate=1时,只有在int1=1 时,tr1=1时,计数器t1才开始计数,当计数器0计时溢出,执行m加1的操作,所以读的的时间只为高电平的持续时间,即为两方波的相隔时间t2,相位差可计算如下:t2=th1*256+tli+n*65536 ;则相位差p=t2/(2*t1)*3602.2 系统框图设计的频率/相位表的系统框图如下图1所示。图12.3资源分配表i/o口分配具体分配内容p0液晶的数据与命令传输口p1.0液晶数据/命令断p1.1液晶读/写端p1.2液晶使能端p3.2(外部中断0)方波1输入端p3.3(外部中断1)异或后方波输入端3 系统的硬件设计3.1 系统的硬件电路图系统的硬件电路图如下所示: 图23.2 系统的硬件资源(1)89c52单片机如图所示为89c52单片机的引脚图图3p0口:p0口为一个8位漏极开路双向i/o口,没脚可吸收8ttl门电路,当p1口的电路第一次写时,被定义为高阻输入。p0能够用于外部数据存储器,它被定义数据/地址的第八位在flash编程时,p0口作为原码输入口,当flash进行校验时,p0口输出原码,此时p0口外部必须拉高。p2口在设计中,p2.0设置为lcd的寄存器rs控制端,p2.1设置为lcd的rw控制端,p2.2设置为lcd的使能e控制端。p3口管脚 备选功能p3.2 /int0(外部中断0)p3.3 /int1(外部中断1)p3.4 t0(计时器0外部输入)p3.5 t1(计时器1外部输入)p3.6 /wr(外部数据存储器写通道)p3.7 /rd(外部数据存储器读通道)(2)1602lcd显示器如图所示为1602显示器的引脚图图41602lcd通常有14条引脚线或16条引脚线的lcd,多出来的2条线是背光电源线。 表1 1602lcd引脚说明表引脚符号功能说明1vss一般接地2vdd接电源(+5v)3v0液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10k的电位器调整对比度)。4rsrs为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。5r/wr/w为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。6ee(或en)端为使能(enable)端,下降沿使能。7db0低4位三态、 双向数据总线 0位(最低位)8db1低4位三态、 双向数据总线 1位9db2低4位三态、 双向数据总线 2位10db3低4位三态、 双向数据总线 3位11db4高4位三态、 双向数据总线 4位12db5高4位三态、 双向数据总线 5位13db6高4位三态、 双向数据总线 6位14db7高4位三态、 双向数据总线 7位(最高位)(也是busy flag)15bla背光电源正极16blk背光 电源负极表2 寄存器选择控制表rsr/w操作说明00写入指令寄存器(清除屏等)01读busy flag(db7),以及读取位址计数器(db0db6)值10写入数据寄存器(显示各字型等)12从数据寄存器读取数据(3)异或门异或门管脚图如下所示;图5其真值表如下:表3 异或门真值表4 系统的软件设计4.1程序流程图图64.2设计源程序#include#include#define uchar unsigned char#define uint unsigned int/*/sbit pin_rs = p20;sbit pin_rw = p21;sbit pin_e = p22;#define pin_data p0/*/char m=0,n=0;char u,v;float t0,t1,f,p;uint a=48,48,48,48,48,46,48,48; /频率数据结果保存uint b=48,48,48,46,48,48; /相位数据结果保存uint i,j;uint x,y;uint c,d;void lcd_reset();void display(uint x, uint y, uint data1);void shortdelay(uchar i);void longdelay(uint i);void set_rs(bit i);void set_rw(bit i);void set_e(bit i);void sc_p0(bit i);void write_instruc(uintinstruc);void write_data(uint data1);void display(uint x, uint y, uint data1);uint read_bf_ac(void);uint read_data(void);bit lcd_busy();#define clearscreen()write_instruc(0x01)#define cursorreturn()write_instruc(0x02)#define inputmode(temp)write_instruc(temp)#define dispcontrol(temp)write_instruc(temp)#define functionset(temp)write_instruc(temp)#define dispshift(temp)write_instruc(temp)#define setcgram_add(address)write_instruc(0x40 | address)#define setddram_add(address)write_instruc(0x80 | address)/* lcd初始化 */void lcd_init()lcd_reset();inputmode(0x06); /增量方式,不移位dispcontrol(0x0c);/显示开,光标关,闪烁关functionset(0x38);/8位,2行,57/定时计数器初始化void ct_init()tmod=0x99; /gate=1,t1、t0工作在方式1,定时方式th0=0; /定时计数器初值清零tl0=0;th1=0;tl1=0;tr0=1; /tr0,tr1置位,此时定时计数器的启动有int0,int1引脚电平决定tr1=1;et0=1; /开中断et1=1;/外部中断0服务程序void itc0() interrupt 0 u=m; /读定时计数器0溢出次数m=0; /溢出次数清零x=th0*256+tl0; /读定时计数器0当前值th0=0; /定时计数器0清零tl0=0;/定时计数器0溢出中断void time0() interrupt 1 m+; /溢出次数加1/外部中断1服务程序void itc1() interrupt 2 v=n; /读定时计数器1溢出次数n=0; /溢出次数清零y=th1*256+tl1; /读定时计数器1当前值th1=0; /定时计数器1清零tl1=0;/定时计数器1溢出中断void time1() interrupt 3 n+; /溢出次数加1/* 主函数 */ void main()lcd_init(); /液晶显示初始化ct_init(); /定时计数器初始化ea=1; /开总中断ex0=1; /允许外部中断ex1=1;it0=1; /设置外部中断方式为下降沿触发it1=1;p3=0xff;while(1)t0=u*65536+x; /计算脉冲时间宽度f=1000000/(2*t0); /计算频率c=f*100; /计算结果逐位保存a7=c%10+48;a6=(c/10)%10+48;c=f;a4=c%10+48;a3=(c/10)%10+48;a2=(c/100)%10+48;a1=(c/1000)%10+48;a0=(c/10000)%10+48;display(0,1,f); /将显示单元数据送液晶屏显示display(0,3,=);for(i=0,j=5;i=7;i+,j+)display(0,j,ai);display(0,14,h);display(0,15,z);t1=v*65536+y; /计算脉冲宽度p=(t1/(2*t0)*360; /计算相位差d=p*100; /将计算结果逐位保存b5=d%10+48;b4=(d/10)%10+48;d=p;b2=d%10+48;b1=(d/10)%10+48;b0=(d/100)%10+48;display(1,1,p); /将显示数据送液晶屏显示display(1,3,=);for(i=0,j=5;i0;i-) ;/长延时函数:longdelay()void longdelay(uint i)uint j;for(;i0;i-) for(j=1000;j0;j-);/寄存器选择信号:set_rs()void set_rs(bit i)if(i=1) pin_rs = 1;else pin_rs = 0;/读写操作控制信号:set_rw()void set_rw(bit i)if(i=1) pin_rw = 1;else pin_rw = 0;/使能信号:set_e()void set_e(bit i)if(i=1) pin_e = 1;else pin_e = 0;/io输入输出控制void sc_p0(bit i) if(i=1) p0 = 0xff;else p0 = 0x00; /写指令函数:write_instruc()void write_instruc(uintinstruc)while(lcd_busy();sc_p0(0);set_rs(0);set_rw(0);/shortdelay(1);set_e(0);pin_data = instruc;/shortdelay(1);set_e(1);shortdelay(10);set_e(0);/shortdelay(1);set_rw(1);set_rs(1);/读bf以及ac的值函数:read_bf_ac()uint read_bf_ac()uint temp;sc_p0(1);set_rs(0);set_rw(1);/shortdelay(1);set_e(0);/shortdelay(1);set_e(1);shortdelay(1);temp = pin_data;shortdelay(10);set_e(0);/shortdelay(1);set_rw(0);set_rs(1);return(temp);/写数据到ram函数:write_data()void write_data(uint data1)sc_p0(0);set_rs(1);set_rw(0);/shortdelay(1);set_e(0);pin_data = data1;/shortdelay(1);set_e(1);shortdelay(10);set_e(0);/shortdelay(1);set_rw(1);set_rs(0);/从ram读数据函数:read_data()uint read_data(void)uint temp;sc_p0(1);set_rs(1);set_rw(1);/shortdelay(1);set_e(0);/shortdelay(1);set_e(1);shortdelay(1);temp = pin_data;shortdelay(10);set_e(0);/shortdelay(1);set_rw(0);set_rs(0);return(temp);/检测lcd控制器状态函数:lcd_busy()/返回一bit数:1 忙;0 闲bit lcd_busy()return(bit)(read_bf_ac() & 0x80);/在指定位置显示字符函数: display()/ x为行号,y为列号,/ data为显示字符的码字数据void display(uint x, uint y, uint data1)uint temp; while(lcd_busy(); /若lcd控制器忙,则等待temp = y & 0x0f;x&= 0x01;if(x) temp |= 0x40;setddram_add(temp); /设置显示位置write_data(data1);/lcd复位函数:lcd_reset()void lcd_reset()clearscreen();cursorreturn();5 电路仿真设计仿真电路总图:图7电路输入方波信号:图8分别输入两路的方波的信号,通过异或门控制相位差。单片机中断控制:图9int0和int1分别输入两路的方波的信号,有相位差lcd显示:图10利用p0口输出数据,而p2.0、p2.1、p2.2控制lcd显示器,从而得到频率及相位差的显示结果。6仿真结果分析仿真测试分析:(1) 输入信号频率:图11仿真时输入信号频率可调,并可通过数码管测试得到输入信号的频率,通过异或门控制两个输入信号的相位差。(2) 输入信号波形两个输入信号的波形及相位差如图所示。图12(3) 输出信号频率及相位差图137性能分析将测量的频率和相位差列成表格,如下图5-1所示实际频率(hz)时间差(ms)测量频率(hz)测量相位()频率误差(hz)相位误差()10.52000.436.00.1025204.935.90.10.1350250.036.00041001100.036.00055000.2500.036.00068000.125800.636.00.60710000.11000.636.00.60820000.052000.936.00.90949000.024901.435.21.40.6 图5-1如图所示,当方波信号频率在0.5-5hz时,频率误差大约0.1hz,相位误差大约0.1”;频率在5-500hz时,频率和相位误差大约为0;当频率大于500hz,频率误差较大,随着频率的升高,误差也越大,相位误差相对比较稳定,一直比较小。由此可以得到如下结论:本次所设计的频率/相位表适合测低频信号,最佳频率范围为5-500hz。8心得体会为期一周的单片机课程设计就要结束了,在这一周内,我遇到了很多问题,也学到了很多东西。课程设计开始时,由于没有经验,不知如何下手,所以就去图书管找了一些书看,尽管有许多的设计方案,可是总感觉自己还是有许多的东西弄不太清楚,于是就请教同学。他常做一些设计,有一些经验。大概知道设计的方向后,就自己上网查资料,到图书馆借阅一些相关书籍,然后自己就开始编写程序进行设计了。开始编写程序的时候,最主要的就是要头脑清醒,并且要对大概程序的布局,和每个功能的实现方法要有个逻辑。这样在遇到没有办法实现的功能的时候,才能快速的解决问题。我设计的是频率/相位表,设计要求:输入两路方波信号,测量

温馨提示

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

评论

0/150

提交评论