设计并实现两路相位可调方波信号发生器.docx
《设计并实现两路相位可调方波信号发生器.docx》由会员分享,可在线阅读,更多相关《设计并实现两路相位可调方波信号发生器.docx(26页珍藏版)》请在冰点文库上搜索。
设计并实现两路相位可调方波信号发生器
2011年至2012年第1学期
《单片机原理与应用》课程设计
班级___1006402____
指导教师_涂立旎_
学生人数___3____
设计份数___1___
2011年12月23日
设计并实现两路相位可调方波信号发生器
1006402-02朱旭东1006402-43兰平1006402-47立清
一.设计时间
2011年12月19日-2011年12月23日
二.设计地点
城市学院一实验楼计算机401机房
三.设计目的
1.掌握51单片机系列的外围电路控制
2.熟练使用Protel电路制图软件绘画电路图
3.学会使用Visio绘制工程的程序流程图
4.通过课程设计了解方波信号发生器的功能并应用
5.通过课程设计使学生能熟练掌握数据的查询(图书、网络),单片机课程所学知识在工程设计工作中综合地加以应用,使理论知识和实践结合起来。
四.设计小组成员
朱旭东1006402-02编写程序
兰平1006402-43资料整理及写实验报告
立清1006402-47制作流程图及原理图制作
五.指导老师
涂立(副教授)、旎(讲师)
六.设计课题
设计并实现两路相位可调方波信号发生器
要求:
输出两路方波信号,键盘控制频率和两信号的相位差,频率围和变化步长值自定,相位0~3600,相位差变化步长值自定。
用双踪示波器观察。
(*能做到频率和相位差两参数独立变化更好)
七.基本思路及关键问题的解决方法
输出两路方波信号,键盘控制频率和两信号的相位差,频率围和变化步长值自定,相位0~3600,相位差变化步长值自定。
用双踪示波器观察。
(能做到频率和相位差两参数独立变化更好)。
具体完成以下任务:
1.完成系统的方案设计,给出系统框图。
2.完成系统的硬件设计,给出硬件电路图和系统资源分配表。
3.完成系统的软件设计,给出程序流程图和程序清单。
4.运用Proteus仿真软件对所设计的系统进行调试和仿真,直到预定的功能全部仿真通过,给出仿真结果;如果条件允许,将程序下载到XL1000综合仿真试验仪,验证系统功能。
5.对所设计的系统进行性能分析(精度、实用性、成本等)。
6.完成课程设计报告。
需求分析:
本次课设所设计出的两路相位可调方波信号发生器,能够调频的围为1~200HZ相位,相位最小步长为1度。
长按频率键2s频率进行加10或减10操作,按一下进行加一或减一操作。
两路相位可调方波信号发生器中可以有两种思路来产生方波信号,其一是利用延时来实现,其二是利用51单片机自带的定时器来实现。
如果使用延时来控制,一是容易产生误差;二是相位调节会有诸多不变。
而利用51单片机自带的定时器不仅可以产生精确的定时而且还可以通过控制定时器的工作来产生相位差。
基于此,此次课程设计选用方案二,即利用定时器来实现方波输出,相位变化。
51单片机最小系统需要一个时钟电路和一个复位电路,如果P0口用作I/O口的话,还需要在P0口加上10K的上拉电阻。
复位电路与时钟电路见图a,最小系统图见图b。
图1.常见的复位与时钟电路
图2.最小系统图
八.算法及流程图
用visio软件画出流程图,如图3:
图3.设计并实现两路相位可调方波信号发生器流程图
实验步骤:
1.打开入Keil软件后,建立一个新工程,单击【Project】下拉菜单中的【Newproject...】选项,如截图图4所示:
图4.建立新工程截图
2.选择工程要保存的路径,输入工程名。
然后单击【Save】按钮。
工程建立后,此工程名变为024.uvproj。
如图5所示:
图5.保存工程截图
3.单击保存按钮后,会弹出一个对话框,要求用户选择单片机的型号,可以根据用户使用的单片机来选择。
KeilC51几乎支持所有的51核的单片机,在这里选择Atmel的AT89C52,如下图6所示,选择后单击保存。
图6.选择单片机型号截图
4.完成上一步骤后,窗口界面如图7所示:
图7.添加单片机后的窗口界面截图
到此为止,还没有建立好一个完整的工程,虽然工程名有了,但工程当中还没有任何文件及代码,接下来添加文件及代码。
5.单击【File】菜单中的【New】菜单项,或单击界面上的快捷图标。
如下图8、9所示:
图8.添加文件截图
图9.添加文件后的窗口界面截图
此时光标在编辑窗口闪烁,可以输入用户的应用程序,但此时这个新建文件与刚才建立的工程还没有直接的联系,单击图标
,窗口界面如图10所示:
图10.保存文件截图
6.回到编辑界面,单击【Target1】前面的“+“号,然后在【SourceGroup1】选项上单击右键,弹出如图11所示菜单。
然后选择【AddFilestoGroup‘SourceGroup1’】菜单项,对话框如图12所示:
图11.将文件加入工程的菜单截图
图12.选中文件后的对话框截图
选中【024.c】,单击【Add】按钮,再单击【Close】按钮,然后再单击【SourseGroup1】前面的“+“号,屏幕窗口如图13所示:
图13.将文件加入工程后的屏幕截图
7.接着是在编辑窗口中编写程序。
编写好程序就要进行程序的编译,单击工具栏上的
进行出现错误,修改程序直到没有错误为止,然后在依次点击
和
,在此过程中出现错误的,也要修改程序直到没有错误为止,编译过程中出现警告一般可以不必考虑,但特殊时也要通过修改程序消除警告。
屏幕窗口如图14所示:
图14.将程序编写及编译的屏幕截图
8.把文件转化成十六进制文件,点击【Project】在下拉菜单里找到【OptionsforTarget‘target1】,屏幕窗口如图15所示:
图15.【OptionsforTarget‘target1’】的屏幕截图
单击【OptionsforTarget‘target1’】会弹出对话框,屏幕窗口如图16所示:
图16.弹出对话框的屏幕截图
用鼠标左键单击CreatHEXFi:
前面的方框,这时方框里会用一个对号,屏幕窗口如图17所示:
图17.单击CreatHEXFi:
前面的方框的屏幕截图
然后点击确定对话框就会消失,这样刚刚所建立的文件就转化成十六进制的文件。
9.用40针排线把DP-51PRO试验仪(如下图)上的A1区J76接口与A2区J79接口相连,然后使用导线把A2区的J61接口与D1区的J52接口相连。
再用导线把A2区的J58的RXD,TXD与A2区的J53的KEY1,KEY2相连,最后用导线把A2区的J58的INTO与D4区的J8的任意一接口相连。
10.对DP-51PRO试验仪上电。
打开DPFlash软件,点击栏中的【文件】在下拉菜单里找到【装载】,将生成的hex文件装载,屏幕窗口如图18所示:
图18.装载hex文件的屏幕截图
然后单击
,单击编程后,软件开始把程序烧入试验仪,烧片的过程,屏幕窗口截图如图19、20所示:
图19.烧片的过程的屏幕截图
图20.烧片的过程的屏幕截图
当烧片完成后,点击退出就行了。
11.关闭DPFalsh软件。
把DP-51PRO单片机仿真试验仪A1区的工作模式选择开关(MOD_sw1)切换到RUN处,然后按一下复位键(RST),MON51程序即开始运行。
12.观察实验运行的情况是不是符合设想。
元件清单见表1:
表1元件清单
名称
大小/型号
数量
PC机
Lenovo
一台
单片机
ATC89C51
一片
示波器
\
一台
电容
30μF
两个
电容
10pF
一个
晶振
11.0592MHz
一个
按键
独立按键
六个
电阻
1KΩ
两个
导线
\
若干
电路原理图见图21:
图21.设计并实现两路相位可调方波信号发生器电路图
九.调试过程中出现的问题及相应解决办法
1.在这次课程设计中,我们遇到了许多的问题,甚至也遇到了较难跨越的瓶颈,比如说,由于相位在我们单片机课程教学中没有涉及过多,所以在处理方波相位这里我们花费了较多的时间,经过查阅资料,请教别人等,才顺利解决了所遇问题。
2.程序不能烧到实验板上?
方法:
开关没有按下,实验板不能正常工作,线接触不良,程序出现了逻辑错误,需进一步的调试。
3.实验现象不跟预期相同?
原因:
程序编写有问题,可能是算法出现错误,或者板上的某些功能出现了问题
十.课程设计心得体会
这次课程设计过程中,我们组成员尽心尽力地去做实验设计,通过分工合作,慢慢地把此次课程设计顺利地完成了。
此次课程设计给我很多专业知识以及专业技能上的提升,同时给了我许多道,给了我很多思考,给了我莫大的空间。
同时,设计让我感触很深。
使我对抽象的理论有了具体的认识。
通过这次课程设计,我掌握了用单片机来实现两路相位可调方波信号发生器的设计实现。
在编程方面,我又学会了一种编程方法,即如何进行键盘长按的检测,这样能方便的对键盘实行复用,节省了外部资源及更加人性化。
最重要的一点就是:
学习要实践。
我们不能只了解理论的知识而忽视实践的重要性。
“实践是检验真理的唯一标准”,只有通过实践,才能发现其中的错误。
从这次课程设计来看,我就深有体会,本来觉得很正确的,通过一实验就发现了一些问题,而且其中一些都是很简单的知识。
所以在学习过程中我们要勇于去实践,将理论知识应用于实际,从实际中找出问题,解决问题,从而升华自我。
在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功的做成想做的事,才能在今后的道路上劈荆斩棘,而不是知难而退,那样永远不可能收获成功,收获喜悦,也永远不可能得到社会及他人对你的认可!
我认为,在这学期的实验中,不仅培养了独立思考、动手操作的能力,在各种其它能力上也都有了提高。
更重要的是,在此次课设中,我们学会了很多学习的方法而这是日后最实用的,真的是受益匪浅。
要面对社会的挑战,只有不断的学习、实践,再学习、再实践。
这对于我们的将来也有很大的帮助。
以后,不管有多苦,我想我们都能变苦为乐,找寻有趣的事情,发现其中珍贵的事情。
就像中国提倡的艰苦奋斗一样,我们都可以在实验结束之后变的更加成熟,会面对需要面对的事情。
十一.源程序
#include
#include
sbitpulse_out=P3^0;
sbitpulse_out1=P3^1;
unsignedchardatahz_shu,second,key_val,key_val_old,yanshi=1,flag;
unsignedintdatasec_over_num,xw_show;
doubleN=0.000000001;
intdataT1_cnt,T1_over_num,T2_cnt,T2_over_num;
unsignedchardatastate_val;
voidled_show();
voiddelay(unsignedinti)//延时
{unsignedintj,k;
for(k=i;k>0;--k)
for(j=110;j>0;--j);}
unsignedcharscan_key()
{unsignedchari,k;
i=P1;
if(i==0xff)
{k=255;}//无键按下
else//有键按下
{led_show();//延时去抖动
if(i!
=P1)
{k=255;}
else
{switch(i)
{case0xfe:
k=0;break;
case0xfd:
k=1;break;
case0xfb:
k=2;break;
case0xf7:
k=3;break;
case0xef:
k=4;break;
case0xdf:
k=5;break;
}
if(k==2||k==3||k==4||k==5)
while(P1!
=0xff)
led_show;//只有按下复位和相位移动式进行松手检测
}
}
returnk;
}
unsignedintget_T2_over_num(unsignedcharp)//p为频率数
{int*s,h;
doublel;
l=(double)p;//转化为浮点数
l=N*0.5/l;//延时四分之一个周期的时间
l=l/0.000055;
h=l;//取整,四舍五入
if(modf(l,s)>=0.5)
{h=h+1;}
returnh;
}
unsignedintget_T1_over_num(unsignedcharp)//p为频率数
{unsignedint*k,h;
doublef;
f=(double)p;//转化为浮点数
f=0.5/f;//半个周期的时间
f=f/0.0002;//中断溢出数=f/0.00025;
h=f;//取整,四舍五入
if(modf(f,k)>=0.5)
{h=h+1;}
returnh;
}
voidtimer1()interrupt3//T1中断
{
T1_cnt++;
if(T1_cnt>T1_over_num)//半周期的计数到达
{T1_cnt=0;
pulse_out=~pulse_out;//反复取反,产生方波
ET0=1;
TR0=1;
}
if(state_val==1)//连续按键
{if(sec_over_num<5000)//计时未到1s
{sec_over_num++;}
else//计时到1s时,执行else的代码
{
if(second<2)//当超过2秒,second一直为2,直到松开按键
{second++;}//连续按下键少于2秒时,second继续增1。
}
}
}
voidinit()
{
pulse_out=0;//初始化各变量
pulse_out1=0;
N=0.000001;
flag=0;
hz_shu=5;
xw_show=0;
T1_cnt=0;
T2_cnt=0;
state_val=0;
second=0;
sec_over_num=0;
T1_over_num=get_T1_over_num(hz_shu);//初始化51的寄存器
TMOD=0x22;//用T1,T0计时T1,T0为8位自动重装方式。
~
TH1=0x38;
TL1=0x38;
TH0=0xc9;//0.7ms55=(256-x)*12/12->x=c9
TL0=0xc9;
EA=1;//开中断
ET1=1;
TR0=1;
TR1=1;//定时器T1
}
voidmain()
{
init();
while
(1)
{
key_val=scan_key();//扫描按键
if(key_val==2)
init();
else
{
if(key_val==3)
{
N=N+0.00555;
if(N>=1&&flag==1)
{
flag=0;
N=0.000001;
}
elseif(N>1)
{
flag=1;
N=N-1;
}
xw_show=xw_show+1;
if(xw_show>360)
xw_show=0;
}
elseif(key_val==4)
{
N=N+0.05555;
if(N>=1&&flag==1)
{
flag=0;
N=0.0000001;
}
elseif(N>=1)
{
flag=1;
N=N-1;
}
}
elseif(key_val==5)
{
if(N<0.26&&flag==0)
{
N=0.000000001;
xw_show=0;
}
else
if(N<1&&flag==0)
{
N=N-0.25;
xw_show=xw_show-45;
}
if(N<0.25&&flag==1)
{
flag=0;
N=1.000000001-(0.25-N);
xw_show=xw_show-45;
}
if(N<1&&flag==1)
{
N=N-0.25;
xw_show=xw_show-45;
}
}
elseif(key_val!
=key_val_old)
{//说明有键按下或弹起
key_val_old=key_val;
if(key_val!
=255)
{//说明键按下
state_val=0;//清除连续按键标志
sec_over_num=0;
switch(key_val)
{case0:
//增1键
if(hz_shu<200)
hz_shu++;
else
hz_shu=200;
T1_over_num=get_T1_over_num(hz_shu);
break;
case1:
//减1键
if(hz_shu>=2)
{hz_shu--;}
else
{hz_shu=1;}
T1_over_num=get_T1_over_num(hz_shu);
break;
}
}
else//说明键弹起
{state_val=0;second=0;}
}
else//一直按下或弹起
{if(key_val!
=255)
{state_val=1;}//连续按键
else
{state_val=0;}//没有按键按下,一直处于弹起状态
}
if(state_val==1&&second>=2&&sec_over_num>=5000)//连续按键
{
sec_over_num=0;
switch(key_val)
{case0:
if(hz_shu<190)
{hz_shu=hz_shu+10;}//增10Hz/秒
else
{hz_shu=200;}
T1_over_num=get_T1_over_num(hz_shu);
break;
case1:
if(hz_shu>10)
{hz_shu=hz_shu-10;}//减10/秒
else
{hz_shu=1;}
T1_over_num=get_T1_over_num(hz_shu);
break;
}
}
}
}
}
voidtimer0()interrupt1
{
T2_cnt++;
if(T2_cnt>T2_over_num)
{
T2_cnt=0;
if(flag==0)
pulse_out1=pulse_out;
else
pulse_out1=~pulse_out;
ET0=0;
TR0=0;
}
}
课程设计指导书及参考教材
[1].闫玉德等编.MCS-51单片机原理与应用.:
机械工业.2002.7
[2].梁合庆等编.从C到嵌入式C编程语言.:
航空航天大学.2000.12
[3].永雄.新编单片机原理与应用(第二版).:
电子科技大学.2007.6
[4].华.MCS-51系列单片机实用接口技术.:
航空航天大学.2000.8
[5].郭天翔.新概念51单片机C语言教程.:
电子工业,2008.10
[6].郭天祥.新概念51单片机C语言教程--入门、提高、开发、拓展全攻略[M].电子工业.2009.11
[7].楼然苗光飞.单片机课程设计指导.航空航天大学.2007.4
[8].珊.徐承深.星一种经济型嵌入式工业网关的设计与实现[期刊论文]-现代电子技术2006.21
[9].盛文利.单片机C语言的精确延时程序设计[J].单片机与嵌入式系统应用,2004,.10
[10].冰怡.单片机C语言应用程序的开发[J].电力,1997.5