51单片机课程设计 声控灯

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

课程设计报告

华中师范大学武汉传媒学院

传媒技术学院

电子信息工程2011

仅发布百度文库,版权所有.

单片机课程设计

一、设计题目、要求

题目:声控灯设计

要求:A.使用单片机实现声控灯 B.当说话声音大于一定程度时,发光二极管显示,延时大于1秒

二、设计框图

1、硬件框图

三、方案设计

如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED 的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED 灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。

四、硬件原图设计

STC 89C51

复位 电路

键 盘

震荡 电路 流水灯 电路

五、程序流程图

六、仿真图

仿真结果如下:当S2关闭

开始

根据键盘指令执行流水灯显示效果

检查是否有键按下

读取键值

执行结束

当S3关闭七、制作

八、调试

流水灯制作完成后,我们对它进行了调试,一开始灯不停地闪,无法接受到声音信号。后来,我们对PCB进行了检查,发现有放大电路的集电极连接线断路了,导致声音信号没法被芯片接收到。我们迅速的电路进行了修复。修复后,电路能够顺利的进行工作了。

九、心得体会

回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。在今后社会的发展和学习实践过程中,一定要不懈努力,不能遇到问题就想到要退缩,一定要不厌其烦的发现问题所在,然后一一进行解决,只有这样,才能成功。

在设计过程中虽然遇到了一些问题,但经过一次又一次的思考,一遍又一遍的检查终于找出了原因所在,也暴露出了前期我在这方面的知识欠缺和经验不足。比如在调试的时候,程序老是不稳定中断服务程序有时执行一次,有时又执行两次,开始我以为是板子受环境影响。后来在网上百度才知道是软件问题,是我忘了在执行中断服务程序时候把相应的中断关了,导致在执行中断服务程序时易受影响执行两次或两次以上。在这个发现问题之后,我在中断服务程序中关了相应的外中断之后。问题就解决了,下载程序到板子之后,运行就正常了。

此次课程设计让我明白了,想要把所学的东西应用于实践一定要有扎实的基本功,理论和实践是有很大的差别的。

十、源程序

#include

typedef unsigned char uchar;

typedef unsigned int uint;

#define led P1 //流水灯控制

sbit voice=P2^4;//声音输入1101 1011

uchar code tab1[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//上到下

uchar code tab2[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//下到上

uchar code tab3[]={0xe7,0xdb,0xbd,0x7e};//中间到两边

uchar code tab4[]={0x7e,0xbd,0xdb,0xe7};//两边到中间

uchar he[4]={0,0,0,0};

uchar num=0;

uchar counter=0;//定时计数

uchar counter1=0;//定时计数

bit flag=0;//切换闪烁

bit flag1=0;

void delay1m(uint x)

{

uint i,j;

for(i=0;i

for(j=0;j<120;j++); //数120 次,约1 ms

}

void time0_time1_init()

{

TMOD=0x11;

TH1=(65535-50000)/256;TL1=(65535-50000)%256;

TH0=(65535-50000)/256;TL0=(65535-50000)%256;

TR0=0;ET1=ET0=TR1=EA=1;

}

void main()

{

time0_time1_init();delay1m(2000);

while(1)

{

if(!flag1)

{

if(!voice)

{

num++;flag1=1;

he[0]=he[1]=he[2]=he[3]=0;

if(num>=5){num=0;}

TR0=1;

}

}

}

}

void time1_interrupt()interrupt 3

{

TH1=(65535-50000)/256;TL1=(65535-50000)%256;

counter++;

if(counter>=6)

{

counter=0;

switch(num)

{

case 0:if(flag==0){led=0x00;flag=1;}else {led=0xff;flag=0;}break;//闪烁

case 1:led=tab1[he[0]];he[0]++;if(he[0]>=8)he[0]=0;break;//上到下

case 2:led=tab2[he[1]];he[1]++;if(he[1]>=8)he[1]=0;break;//下到上

case 3:led=tab3[he[2]];he[2]++;if(he[2]>=4)he[2]=0;break;//中间到两边

case 4:led=tab4[he[3]];he[3]++;if(he[3]>=4)he[3]=0;break;//两边到中间

default:break;

}

}

}

void time0_interrupt()interrupt 1

{

TH0=(65535-50000)/256;TL0=(65535-50000)%256;

counter1++;

if(counter1>=20)//1s后再检测

{

counter1=0;

flag1=0;

TR0=0;

}

}

相关文档
最新文档