单片机课程设计.docx
- 文档编号:29226984
- 上传时间:2023-07-21
- 格式:DOCX
- 页数:26
- 大小:354.11KB
单片机课程设计.docx
《单片机课程设计.docx》由会员分享,可在线阅读,更多相关《单片机课程设计.docx(26页珍藏版)》请在冰豆网上搜索。
单片机课程设计
目录
1设计题目………………………………………………………………………………………1
2设计原理………………………………………………………………………………………1
2.1设计原理……………………………………………………………………………1
2.2设计原理……………………………………………………………………………1
3系统的硬件设计………………………………………………………………………………2
3.1系统的硬件电路图…………………………………………………………………2
3.2系统的硬件资源……………………………………………………………………3
4系统的软件设计……………………………………………………………………………6
4.1设计源程序…………………………………………………………………………6
4.2程序流程图…………………………………………………………………………16
5电路仿真……………………………………………………………………………………17
6仿真测试分析………………………………………………………………………………19
7心得体会……………………………………………………………………………………21
8参考文献……………………………………………………………………………………22
1设计题目
设计并实现频率/相位表
要求:
输入两路方波信号,测量信号的频率和两信号的相位差,能显示频率值和相位差,精度:
0.1Hz,0.10。
在满足精度的前提下分析和证实系统的测量范围。
2设计原理
2.1设计原理
利用单片机实现频率和相位表的方法我了解的有两种:
第一、利用输入信号的下降沿产生中断,对信号进行计数,然后根据计数的结果,乘以计数的周期,就是输入信号的周期了,然后求倒数,并输出值就是频率了。
而相位则是利用相似的方法,既是第一个输入信号的下降沿触发外中断INT0,T0和T1开始计数,第二个信号输入到INT1,下降沿触发,并输出计数的值,然后将计数的值与之前的计算频率的值进行计算,就可以计算出相位的值。
这种方法比较适合测量频率的值比较低的时候。
第二、可以利用计数器进行计时,在计时的时间里面统计有多少个下降沿,然后就可以通过对计数的时间和下降沿的值计算出输入信号的周期。
计算出周期之后就可以得到频率的值。
至于相位也是这样,通过统计下降沿的值,然后与之间的方式一样,就可以得到相位的值了。
这种方法比较适合测量高频的时候。
在这次的单片机的课程设计中我采用的是第一种方法,所以在测量时的频率范围很小,而且能满足要求的测量准确的频率也比较低。
至于相位满足要求的频率范围就更加的小了,而且也不是特别的准确。
2.2系统框图
设计的频率/相位表的系统框图如下图1所示。
图1
3系统的硬件设计
3.1系统的硬件电路图
系统的硬件电路图如下所示:
图2
3.2系统的硬件资源
(1)89C52单片机
如图所示为89C52单片机的引脚图
图3
P0口:
P0口为一个8位漏极开路双向I/O口,没脚可吸收8TTL门电路,当P1口的电路第一次写1时,被定义为高阻输入。
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.4T0(计时器0外部输入)
P3.5T1(计时器1外部输入)
P3.6/WR(外部数据存储器写通道)
P3.7/RD(外部数据存储器读通道)
(2)1602LCD显示器
如图所示为1602显示器的引脚图
图4
1602LCD通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线。
表11602LCD引脚说明表
引脚
符号
功能说明
1
VSS
一般接地
2
VDD
接电源(+5V)
3
V0
液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
4
RS
RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
5
R/W
R/W为读写信号线,高电平
(1)时进行读操作,低电平(0)时进行写操作。
6
E
E(或EN)端为使能(enable)端,下降沿使能。
7
DB0
低4位三态、双向数据总线0位(最低位)
8
DB1
低4位三态、双向数据总线1位
9
DB2
低4位三态、双向数据总线2位
10
DB3
低4位三态、双向数据总线3位
11
DB4
高4位三态、双向数据总线4位
12
DB5
高4位三态、双向数据总线5位
13
DB6
高4位三态、双向数据总线6位
14
DB7
高4位三态、双向数据总线7位(最高位)(也是busyflag)
15
BLA
背光电源正极
16
BLK
背光电源负极
表2寄存器选择控制表
RS
R/W
操作说明
0
0
写入指令寄存器(清除屏等)
0
1
读busyflag(DB7),以及读取位址计数器(DB0~DB6)值
1
0
写入数据寄存器(显示各字型等)
1
2
从数据寄存器读取数据
(3)异或门
异或门管脚图如下所示;
图5
其真值表如下:
表3异或门真值表
4系统的软件设计
4.1设计源程序
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/*******************/
sbitPin_RS=P2^0;
sbitPin_RW=P2^1;
sbitPin_E=P2^2;
#definePin_DataP0
/***********************/
charm=0,n=0;
charu,v;
floatt0,t1,f,p;
uinta[]={48,48,48,48,48,46,48,48};//频率数据结果保存
uintb[]={48,48,48,46,48,48};//相位数据结果保存
uinti,j;
uintx,y;
uintc,d;
voidLcd_Reset();
voidDisplay(uintx,uinty,uintdata1);
voidShortDelay(uchari);
voidLongDelay(uinti);
voidSet_RS(biti);
voidSet_RW(biti);
voidSet_E(biti);
voidSc_P0(biti);
voidWrite_Instruc(uintInstruc);
voidWrite_Data(uintdata1);
voidDisplay(uintx,uinty,uintdata1);
uintRead_BF_AC(void);
uintRead_Data(void);
bitLcd_Busy();
#defineClearScreen()Write_Instruc(0x01)
#defineCursorReturn()Write_Instruc(0x02)
#defineInputMode(temp)Write_Instruc(temp)
#defineDispControl(temp)Write_Instruc(temp)
#defineFunctionSet(temp)Write_Instruc(temp)
#defineDispShift(temp)Write_Instruc(temp)
#defineSetCGRAM_Add(Address)Write_Instruc(0x40|Address)
#defineSetDDRAM_Add(Address)Write_Instruc(0x80|Address)
/*LCD初始化*/
voidLCD_Init()
{
Lcd_Reset();
InputMode(0x06);//增量方式,不移位
DispControl(0x0c);//显示开,光标关,闪烁关
FunctionSet(0x38);//8位,2行,5×7
}
//定时计数器初始化
voidCT_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服务程序
voidITC0()interrupt0
{
u=m;//读定时计数器0溢出次数
m=0;//溢出次数清零
x=TH0*256+TL0;//读定时计数器0当前值
TH0=0;//定时计数器0清零
TL0=0;
}
//定时计数器0溢出中断
voidTIME0()interrupt1
{
m++;//溢出次数加1
}
//外部中断1服务程序
voidITC1()interrupt2
{
v=n;//读定时计数器1溢出次数
n=0;//溢出次数清零
y=TH1*256+TL1;//读定时计数器1当前值
TH1=0;//定时计数器1清零
TL1=0;
}
//定时计数器1溢出中断
voidTIME1()interrupt3
{
n++;//溢出次数加1
}
/*主函数*/
voidmain()
{
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;//计算结果逐位保存
a[7]=c%10+48;
a[6]=(c/10)%10+48;
c=f;
a[4]=c%10+48;
a[3]=(c/10)%10+48;
a[2]=(c/100)%10+48;
a[1]=(c/1000)%10+48;
a[0]=(c/10000)%10+48;
Display(0,1,'F');//将显示单元数据送液晶屏显示
Display(0,3,'=');
for(i=0,j=5;i<=7;i++,j++)
{
Display(0,j,a[i]);
}
Display(0,14,'H');
Display(0,15,'Z');
t1=v*65536+y;//计算脉冲宽度
p=(t1/(2*t0))*360;//计算相位差
d=p*100;//将计算结果逐位保存
b[5]=d%10+48;
b[4]=(d/10)%10+48;
d=p;
b[2]=d%10+48;
b[1]=(d/10)%10+48;
b[0]=(d/100)%10+48;
Display(1,1,'P');//将显示数据送液晶屏显示
Display(1,3,'=');
for(i=0,j=5;i<=5;i++,j++)
{
Display(1,j,b[i]);
}
Display(1,11,34);
}
}
//短延时函数:
ShortDelay()
voidShortDelay(uchari)
{
for(;i>0;i--);
}
//长延时函数:
LongDelay()
voidLongDelay(uinti)
{
uintj;
for(;i>0;i--)
{for(j=1000;j>0;j--);}
}
//寄存器选择信号:
Set_RS()
voidSet_RS(biti)
{
if(i==1)Pin_RS=1;
elsePin_RS=0;
}
//读写操作控制信号:
Set_RW()
voidSet_RW(biti)
{
if(i==1)Pin_RW=1;
elsePin_RW=0;
}
//使能信号:
Set_E()
voidSet_E(biti)
{
if(i==1)Pin_E=1;
elsePin_E=0;
}
//IO输入输出控制
voidSc_P0(biti)
{
if(i==1)P0=0xff;
elseP0=0x00;
}
//写指令函数:
Write_Instruc()
voidWrite_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()
uintRead_BF_AC()
{
uinttemp;
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()
voidWrite_Data(uintdata1)
{
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()
uintRead_Data(void)
{
uinttemp;
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——闲
bitLcd_Busy()
{
return((bit)(Read_BF_AC()&0x80));
}
//在指定位置显示字符函数:
Display()
//x为行号,y为列号,
//data为显示字符的码字数据
voidDisplay(uintx,uinty,uintdata1)
{
uinttemp;
while(Lcd_Busy());//若LCD控制器忙,则等待
temp=y&0x0f;
x&=0x01;
if(x)temp|=0x40;
SetDDRAM_Add(temp);//设置显示位置
Write_Data(data1);
}
//LCD复位函数:
Lcd_Reset()
voidLcd_Reset()
{
ClearScreen();
CursorReturn();
}
4.2程序流程图
图6
5电路仿真
仿真电路总图:
图7
电路输入方波信号:
图8
分别输入两路的方波的信号,通过异或门控制相位差。
单片机中断控制:
图9
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对频率和相位进行计算。
首先通过输入信号的下降沿触发中断INT0和INT1,对信号进行计数,然后根据计数的结果,乘以计数的周期,就是输入信号的周期了,然后求倒数,并输出值就是频率了。
而相位则是通过第一个输入信号的下降沿触发外中断INT0,T0和T1开始计数,第二个信号输入到INT1,下降沿触发中断INT1,并输出计数的值,然后将计数的值与之前的计算频率的值进行计算,就可以计算出相位的值。
只是在实物测试时发现,输入信号频率在比较低的时候,LCD的显示比较稳定,随着输入信号的频率的增加,误差慢慢增大,达到7kHz左右时,误差较大,而且LCD显示开始不稳定了。
7心得体会
为期一周的单片机课程设计就要结束了,在这一周内,我遇到了很多问题,也学到了很多东西。
课程设计开始时,由于没有经验,不知如何下手,所以就去图书管找了一些书看,尽管有许多的设计方案,可是总感觉自己还是有许多的东西弄不太清楚,于是就请教同学。
他常做一些设计,有一些经验。
大概知道设计的方向后,就自己上网查资料,到图书馆借阅一些相关书籍,然后自己就开始编写程序进行设计了。
开始编写程序的时候,最主要的就是要头脑清醒,并且要对大概程序的布局,和每个功能的实现方法要有个逻辑。
这样在遇到没有办法实现的功能的时候,才能快速的解决问题。
我设计的是频率/相位表,设计要求:
输入两路方波信号,测量信号的频率和两信号的相位差,能显示频率值和相位差,精度:
0.1Hz,0.10。
在满足精度的前提下分析和证实系统的测量范围。
编程设计思想为:
利用输入信号的下降沿产生中断,对信号进行计数,然后根据计数的结果,乘以计数的周期,就是输入信号的周期了,然后求倒数,并输出值就是频率值了。
而相位则是利用相似的方法,既是第一个输入信号的下降沿触发外中断INT0,T0和T1开始计数,第二个信号输入到INT1,下降沿触发,并输出计数的值,然后将计数的值与之前的计算频率的值进行计算,就可以计算出相位的值。
只是这种方法比较适合测量频率的值比较低的时候。
我根据这编程思想慢慢完成编程并实现了频率/相位表功能。
编程结束后,我进行了protues电路仿真。
仿真结束后,和同学一起进行了实物测试,虽然最终结果还是有些误差,但还是完成实现了频率/相位表功能。
每一次课程设计都是一个很好的学习过程,并且是一个很好的学会自学的过程。
在这个过程中,我们能学会遇到一些问题,先自己想办法解决,如果自己实在解决不了的,可以查阅资料和帮助性文档。
遇到问题解决不了的,不是一味的逃避和完全依靠他人,我们要学会独立的思考。
在自己的努力下,课程设计最终完成了。
尽管经历了不少的艰辛,但给我积累了一点设计的经验,最后也有点小小的成就感。
后面的路还很长,我还的努力!
8参考文献
[1]李群芳、张士军,单片微型计算机与接口技术,电子工业出版社,2008
[2]张毅刚、彭喜元、董继成,单片机原理及应用,高等教育出版社,2004
[3]赵晓安,MCS-51单片机原理及应用,天津大学出版社,2001
[4]何立民.MCS-51系列应用系统设计.北京:
北京航空航天大学出版社,1993
[5]BarryBBrey.TheIntelMicroprocessors.5thed.PearsonEducation,2001
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计