单片机课设 函数发生器.docx
《单片机课设 函数发生器.docx》由会员分享,可在线阅读,更多相关《单片机课设 函数发生器.docx(18页珍藏版)》请在冰豆网上搜索。
单片机课设函数发生器
单片机课程设计
题目:
函数发生器
姓名:
学号:
系别:
专业:
年级:
起讫日期:
2010.10.21~2010.11.19
指导教师:
目录
1.课程设计目的1
2.课程设计题目和实现目标1
3.设计方案1
4.Proteus仿真原理图2
5.程序流程3
6.程序代码4
7.调试总结15
8.设计心得体会17
9.参考文献18
1.课程设计目的
《MCS-51单片机课程设计》是与《MCS-51单片机》课程相配套的实践教学环节。
《MCS-51单片机》是一门实践性很强的专业基础课,通过课程设计,达到进一步理解单片机的硬件、软件和综合应用方面的知识,培养实践能力和综合应用能力,开拓学习积极性、主动性,学会灵活运用已经学过的知识,并能不断接受新的知识。
培养大胆发明创造的设计理念,为今后就业打下良好的基础。
通过课程设计,掌握以下知识和技能:
1).单片机应用系统的总体方案的设计;
2).单片机应用系统的硬件设计;
3).单片机应用系统的软件程序设计;
4).单片机开发系统的应用和调试能力
2.课程设计题目和实现目标
课程设计题目:
函数发生器
实现目标:
1.键盘输入产生需要的波形,包括三角波,正弦波,矩形波等
2.频率和幅值可调,并显示频率和幅值的档位。
3.设计方案
为实现设计的目标,设计方案的总体思路是这样的:
用三个按键1、2、3,4分别用来波形选择,变量增加,变量减少,选择改变幅值或者频率。
按键“1”有按下之后来选择输出波形键。
只有在按下“4”号键后才能通过按“2”键或“3”键来实现幅值或者频率的改变。
在有波形输出的过程中,实现所按下键对应的功能,改变幅值、频率或进行波形选择。
所有的按键都在按下并且放开后才能实现相应的功能。
4.Proteus仿真原理图
5.程序流程
6.程序代码
#include
#include
sbitscl=P2^0;
sbitsda=P2^1;
sbitk1=P2^4;
sbitk2=P2^5;
sbitk3=P2^6;
sbitk4=P1^0;
charflag=0;
charb=0;
bita=1;
intv=20;
intt=20;
ints=1;
#definedelayNOP();{_nop_();_nop_();_nop_();_nop_();};
voidqiebo();
voidkey(void);
voidkey1(void);
voidkey2(void);
voidkey3(void);
voidtiaozheng(void);
voidstart(void);
voiddelays(void);
voiddelay_ms(unsignedchart);
voidtack(void);
voiddizhi(void);
voidkongzhi(void);
unsignedcharcodesin[256]={0x80,0x83,0x86,0x89,0x8d,0x90,0x93,0x96,0x99,0x9c,0x9f,0xa2,0xa5,0xa8,0xab,0xae,0xb1,0xb4,0xb7,0xba,0xbc,0xbf,0xc2,0xc5
0xc7,0xca,0xcc,0xcf,0xd1,0xd4,0xd6,0xd8,0xda,0xdd,0xdf,0xe1,0xe3,0xe5,0xe7,0xe9,0xea,0xec,0xee,0xef,0xf1,0xf2,0xf4,0xf5
0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd
0xfd,0xfc,0xfb,0xfa,0xf9,0xf8,0xf7,0xf6,0xf5,0xf4,0xf2,0xf1,0xef,0xee,0xec,0xea,0xe9,0xe7,0xe5,0xe3,0xe1,0xde,0xdd,0xda
0xd8,0xd6,0xd4,0xd1,0xcf,0xcc,0xca,0xc7,0xc5,0xc2,0xbf,0xbc,0xba,0xb7,0xb4,0xb1,0xae,0xab,0xa8,0xa5,0xa2,0x9f,0x9c,0x99
0x96,0x93,0x90,0x8d,0x89,0x86,0x83,0x80,0x80,0x7c,0x79,0x76,0x72,0x6f,0x6c,0x69,0x66,0x63,0x60,0x5d,0x5a,0x57,0x55,0x51
0x4e,0x4c,0x48,0x45,0x43,0x40,0x3d,0x3a,0x38,0x35,0x33,0x30,0x2e,0x2b,0x29,0x27,0x25,0x22,0x20,0x1e,0x1c,0x1a,0x18,0x16
0x15,0x13,0x11,0x10,0x0e,0x0d,0x0b,0x0a,0x09,0x08,0x07,0x06,0x05,0x04,0x03,0x02,0x02,0x01,0x00,0x00,0x00,0x00,0x00,0x00
0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0d,0x0e,0x10,0x11,0x13,0x15
0x16,0x18,0x1a,0x1c,0x1e,0x20,0x22,0x25,0x27,0x29,0x2b,0x2e,0x30,0x33,0x35,0x38,0x3a,0x3d,0x40,0x43,0x45,0x48,0x4c,0x4e
0x51,0x55,0x57,0x5a,0x5d,0x60,0x63,0x66,0x69,0x6c,0x6f,0x72,0x76,0x79,0x7c,0x80};
voiddizhi(void)
{unsignedinti;
unsignedchard;
d=0x90;
for(i=0;i<8;i++)
{if(d&0x80)sda=1;
elsesda=0;
scl=1;
delayNOP();
scl=0;
sda=0;
d=d<<1;
_nop_();
_nop_();
}
}
voidkongzhi(void)
{unsignedinti;
unsignedchard;
d=0x40;
for(i=0;i<8;i++)
{if(d&0x80)sda=1;
elsesda=0;
scl=1;
delayNOP();
scl=0;
sda=0;
d=d<<1;
_nop_();
_nop_();
}
}
voidstart(void)
{
sda=1;
scl=1;
delayNOP();
sda=0;
delayNOP();
scl=0;
}
voidtack(void)
{
sda=1;
scl=1;
_nop_();
_nop_();
a=sda;
scl=0;
sda=0;
_nop_();
}
voiddelays(void)
{
unsignedchari,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
voiddelay_ms(unsignedchart)
{
unsignedchari=0;
while(t--)for(i=0;i<120;i++);
}
voidkey()
{k4=1;
if(k4==1)
return;
delays();
k4=1;
if(k4==1)
return;
qiebo();
while(b)
{
if(b==1)
{
key1();
}
if(b==2)
{
key2();
}
if(b==3)
{
key3();
}
}
}
voidqiebo()
{
if(k4==0)
{
delay_ms(5);
if(k4==0)
{
while(!
k4);
b++;
delay_ms(5);
}
}
if(b>3)
{
b=1;
}
}
voidtiaozheng()
{
if(k3==0)
{
delay_ms(5);
if(k3==0)
{
while(!
k3);
flag++;
delay_ms(5);
}
}
if(flag>2)
{
flag=1;
}
if(k1==0)
{
delay_ms(5);
if(k1==0)
{
while(!
k1);
if(flag==1)
{
t=t+10;
s++;
s=1/s;
}
if(flag==2)
{
v=v+10;
}
}
}
if(k2==0)
{
delay_ms(5);
if(k2==0)
{
while(!
k2);
if(flag==1)
{
t=t-10;
s++;
}
if(flag==2)
{
v=v-10;
}
}
}
}
voidkey1(void)
{unsignedinti,j;
unsignedcharhh;
start();
do
{
dizhi();
tack();
}while(a==1);
do
{
kongzhi();
tack();
}while(a==0);
do{qiebo();
tiaozheng();
for(i=0;i<256;i++)
{hh=sin[i]/s;
for(j=0;j<8;j++)
{scl=0;
if(hh&0x80)sda=1;
elsesda=0;
scl=1;
_nop_();
_nop_();
_nop_();
scl=0;
sda=0;
_nop_();
hh=hh<<1;
_nop_();
_nop_();
_nop_();
}
tack();
}
}while(b==1);
}
voidkey2(void)
{
unsignedintd=0,j;
unsignedcharfang;
start();
dizhi();
tack();
kongzhi();
tack();
P3=1;
do{qiebo();
tiaozheng();
for(d=0;d{fang=0x00;
for(j=0;j<8;j++)
{scl=0;
if(fang&0x80)sda=1;
elsesda=0;
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
sda=0;
_nop_();
_nop_();
fang=fang<<1;
_nop_();
}
tack();
}
for(d=t/2;d{
fang=v;
for(j=0;j<8;j++)
{scl=0;
if(fang&0x80)sda=1;
elsesda=0;
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
sda=0;
_nop_();
_nop_();
fang=fang<<1;
_nop_();
}
tack();
}
}while(b==2);
}
voidkey3(void)
{
unsignedintd=0,j,n;
unsignedintfang,c=128;
start();
dizhi();
tack();
kongzhi();
tack();
for(n=0;ndo
{qiebo();
tiaozheng();
if(d==1)c++;
if(c==v)d=0;
fang=c*2;
for(j=0;j<8;j++)
{
scl=0;
if(fang&0x80)sda=1;
elsesda=0;
scl=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
scl=0;
sda=0;
_nop_();
_nop_();
fang=fang<<1;
_nop_();
}
tack();
for(n=0;nif(d==0)c--;
if(c==0){d=1;c++;}
}
while(b==3);
}
voidmain()
{
while
(1)
{key();
}
}
7.调试总结
这次的课程设计,我们要设计的是函数发生器,能够产生三角波、矩形波和正弦波,并且要求幅值和频率可调。
在设计过程中,主要做了以下工作:
1)、原理框图的设计
2)、根据框图连接硬件图
3)、由框图和硬件图编写程序代码
4)、调试工作
在老师的耐心指导下,经过长时间紧张而艰苦的奋斗,最终达到了预期想要实现的目标。
能过连续产生想要的波形,并且幅值和频率有三个档次,分别通过按键来改变,正在输出波形的幅值、频率档位则由数码管显示出来。
调试产生的三角波:
矩形波:
正弦波:
8.设计心得体会
在本次课设过程中,首先是对于硬件的了解。
对于PCF8591我们都是新接触的。
我们就开始查找相关资料,最后在我们几个人的努力下,终于知道它的各管脚的作用,及其内部结构有了一定的了解。
其中我们的通信方式用到了IIC,其中的通信原则我们也只是懂的不多,但在我们深入了解后还是知道其中的规则了。
在对硬件工作原理理解的基础上,我们开始编程,我们选用了C语言来编程。
并且我们作出了我们的程序仿真图。
在仿真的时候,我们并没有刚开始想的那么顺利,很多地方还是非常的粗心。
终于我们实现了我们的波形仿真。
最后,我们在完成老师提供的板后,我们的原有程序并不是很适应这块板的工作。
我们只好再一次耐心的更改我们的程序,使我们的程序适应板。
终于我们完成了本次的课设全部内容。
看到用我们的程序而产生的波形时,我们都为我们的这两周辛苦而感到非常的值得。
这次课设我作了个人总结如下几点:
1.在设计程序之前,务必要对所用单片机的内部结构有一个系统的了解,知道该单片机片内有哪些资源.
2.设计程序采用什么编程语言并不是非常重要,关键要有一个清晰的思路和一个完整的软件流程图.
3.在设计程序时,不能妄想一次就将整个程序设计好,"反复修改,不断改进"是程序设计的必经之路.
4.要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便.
5.在设计程序过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题.
9.参考文献
[1].网络资源
[2]李光才.单片机课程设计实例指导.北京:
北京航空航天大学出版社2004.
[3]李群芳,肖看.单片机原理、接口及应用——嵌入式系统技术基础.北京:
清华大学出版社,2005.3