《单片微型计算机与接口技术》课程设计说明书-设计并实现频率,相位表.doc

上传人:韩长文 文档编号:5091561 上传时间:2020-02-01 格式:DOC 页数:23 大小:337.50KB
返回 下载 相关 举报
《单片微型计算机与接口技术》课程设计说明书-设计并实现频率,相位表.doc_第1页
第1页 / 共23页
《单片微型计算机与接口技术》课程设计说明书-设计并实现频率,相位表.doc_第2页
第2页 / 共23页
《单片微型计算机与接口技术》课程设计说明书-设计并实现频率,相位表.doc_第3页
第3页 / 共23页
《单片微型计算机与接口技术》课程设计说明书-设计并实现频率,相位表.doc_第4页
第4页 / 共23页
《单片微型计算机与接口技术》课程设计说明书-设计并实现频率,相位表.doc_第5页
第5页 / 共23页
点击查看更多>>
资源描述

《《单片微型计算机与接口技术》课程设计说明书-设计并实现频率,相位表.doc》由会员分享,可在线阅读,更多相关《《单片微型计算机与接口技术》课程设计说明书-设计并实现频率,相位表.doc(23页珍藏版)》请在三一文库上搜索。

1、武汉理工大学单片微型计算机与接口技术课程设计说明书目录1 设计题目12 设计原理12.1 设计原理12.2 设计原理13 系统的硬件设计23.1 系统的硬件电路图23.2 系统的硬件资源34 系统的软件设计 64.1设计源程序 64.2程序流程图165 电路仿真 176 仿真测试分析 197 心得体会 218 参考文献 221设计题目设计并实现频率/相位表要求:输入两路方波信号,测量信号的频率和两信号的相位差,能显示频率值和相位差,精度:0.1Hz,0.10。在满足精度的前提下分析和证实系统的测量范围。2设计原理2.1 设计原理利用单片机实现频率和相位表的方法我了解的有两种:第一、利用输入信号

2、的下降沿产生中断,对信号进行计数,然后根据计数的结果,乘以计数的周期,就是输入信号的周期了,然后求倒数,并输出值就是频率了。而相位则是利用相似的方法,既是第一个输入信号的下降沿触发外中断INT0,T0和T1开始计数,第二个信号输入到INT1,下降沿触发,并输出计数的值,然后将计数的值与之前的计算频率的值进行计算,就可以计算出相位的值。这种方法比较适合测量频率的值比较低的时候。第二、可以利用计数器进行计时,在计时的时间里面统计有多少个下降沿,然后就可以通过对计数的时间和下降沿的值计算出输入信号的周期。计算出周期之后就可以得到频率的值。至于相位也是这样,通过统计下降沿的值,然后与之间的方式一样,就

3、可以得到相位的值了。这种方法比较适合测量高频的时候。在这次的单片机的课程设计中我采用的是第一种方法,所以在测量时的频率范围很小,而且能满足要求的测量准确的频率也比较低。至于相位满足要求的频率范围就更加的小了,而且也不是特别的准确。2.2 系统框图设计的频率/相位表的系统框图如下图1所示。图13 系统的硬件设计3.1 系统的硬件电路图系统的硬件电路图如下所示:图23.2 系统的硬件资源(1)89C52单片机如图所示为89C52单片机的引脚图图3P0口:P0口为一个8位漏极开路双向I/O口,没脚可吸收8TTL门电路,当P1口的电路第一次写时,被定义为高阻输入。P0能够用于外部数据存储器,它被定义数

4、据/地址的第八位在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

5、,多出来的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位三态、 双向数据总

6、线 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设计源

7、程序#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_Re

8、set();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 Rea

9、d_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_Ad

10、d(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;

11、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; /溢出次数清零

12、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%

13、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=

14、(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

15、(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 =

16、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);S

17、et_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_

18、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 D

19、isplay(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();4.2程序流程图图65 电路仿真仿真电路总图:图7电路输入方波信号:图8分别输入两路的方波的信号,通过异或门控制相位差。单片机中断控制:图9

20、INT0和INT1分别输入两路的方波的信号,有相位差LCD显示:图10利用P0口输出数据,而P2.0、P2.1、P2.2控制LCD显示器,从而得到频率及相位差的显示结果。6仿真测试分析仿真测试分析:(1) 输入信号频率:图11仿真时输入信号频率可调,并可通过数码管测试得到输入信号的频率,通过异或门控制两个输入信号的相位差。(2) 输入信号波形两个输入信号的波形及相位差如图所示。图12(3) 输出信号频率及相位差图13当两个输入信号同频率为220Hz时,LCD输出所示。其中,F为频率,P为相位差。性能分析:这是利用单片机的内部的计数器T0和T1对频率和相位进行计算。首先通过输入信号的下降沿触发中

21、断INT0和INT1,对信号进行计数,然后根据计数的结果,乘以计数的周期,就是输入信号的周期了,然后求倒数,并输出值就是频率了。而相位则是通过第一个输入信号的下降沿触发外中断INT0,T0和T1开始计数,第二个信号输入到INT1,下降沿触发中断INT1,并输出计数的值,然后将计数的值与之前的计算频率的值进行计算,就可以计算出相位的值。只是在实物测试时发现,输入信号频率在比较低的时候,LCD的显示比较稳定,随着输入信号的频率的增加,误差慢慢增大,达到7kHz左右时,误差较大,而且LCD显示开始不稳定了。7心得体会为期一周的单片机课程设计就要结束了,在这一周内,我遇到了很多问题,也学到了很多东西。

22、课程设计开始时,由于没有经验,不知如何下手,所以就去图书管找了一些书看,尽管有许多的设计方案,可是总感觉自己还是有许多的东西弄不太清楚,于是就请教同学。他常做一些设计,有一些经验。大概知道设计的方向后,就自己上网查资料,到图书馆借阅一些相关书籍,然后自己就开始编写程序进行设计了。开始编写程序的时候,最主要的就是要头脑清醒,并且要对大概程序的布局,和每个功能的实现方法要有个逻辑。这样在遇到没有办法实现的功能的时候,才能快速的解决问题。我设计的是频率/相位表,设计要求:输入两路方波信号,测量信号的频率和两信号的相位差,能显示频率值和相位差,精度:0.1Hz,0.10。在满足精度的前提下分析和证实系

23、统的测量范围。编程设计思想为:利用输入信号的下降沿产生中断,对信号进行计数,然后根据计数的结果,乘以计数的周期,就是输入信号的周期了,然后求倒数,并输出值就是频率值了。而相位则是利用相似的方法,既是第一个输入信号的下降沿触发外中断INT0,T0和T1开始计数,第二个信号输入到INT1,下降沿触发,并输出计数的值,然后将计数的值与之前的计算频率的值进行计算,就可以计算出相位的值。只是这种方法比较适合测量频率的值比较低的时候。我根据这编程思想慢慢完成编程并实现了频率/相位表功能。编程结束后,我进行了protues电路仿真。仿真结束后,和同学一起进行了实物测试,虽然最终结果还是有些误差,但还是完成实

24、现了频率/相位表功能。每一次课程设计都是一个很好的学习过程,并且是一个很好的学会自学的过程。在这个过程中,我们能学会遇到一些问题,先自己想办法解决,如果自己实在解决不了的,可以查阅资料和帮助性文档。遇到问题解决不了的,不是一味的逃避和完全依靠他人,我们要学会独立的思考。在自己的努力下,课程设计最终完成了。尽管经历了不少的艰辛,但给我积累了一点设计的经验,最后也有点小小的成就感。后面的路还很长,我还的努力! 8 参考文献1 李群芳、 张士军,单片微型计算机与接口技术, 电子工业出版社,20082 张毅刚、彭喜元、董继成,单片机原理及应用,高等教育出版社,20043 赵晓安,MCS-51单片机原理及应用,天津大学出版社,20014 何立民MCS-51系列应用系统设计北京:北京航空航天大学出版社,19935Barry B Brey. The Intel Microprocessors. 5th ed. Pearson Education,2001

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 绩效管理


经营许可证编号:宁ICP备18001539号-1