北京交大单片机课程设计声控灯_单片机课程设计声控灯
北京交大单片机课程设计声控灯由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“单片机课程设计声控灯”。
单片机课程设计报告
一. 设计说明
声控灯
目前的照明灯调节一般都是单一亮度的,通过S51和声音传感器调节LED亮的个数实现亮度的调节。
二. 总体设计
系统总体设计
三. 硬件电路设计
整体电路如图所示
(声音传感器用按钮开关代替)
声音传感器
烧写电路: 由于AT89S51支持ISP,所以可以直接使用USBISP下载线下载,十分方便。
四. 软件设计
单片机程序设计使用C语言,在Keil uVision3环境下调试完成;
调试中使用的ISIS 7 Profeional USBISP使用progisp1.68下载。
主程序流程:该程序逻辑比较复杂,使用了5个变量作为标志,分别用作外部中断计数,定时器0、1计数,所处模式标志。单片机复位后灯全灭,程序运行在模式0,当有声音作为外部中断进入程序后,开始计时2S,记录2S内声音响起的次数,同时有0.4S的消抖延时。2S后进入中断服务程序中模式0的分支,之后再通过声音次数重新选择模式。这时按照不同的模式亮灯,同时再次有中断后进入相应的模式分支中。
五. 问题与解决
管脚的预定义:设计中使用的头文件为ATmel提供的AT89X51的标准头文件,刚开始编程时没有注意到该头文件中是如何定义端口的,以为是P0^2,编译后通过查找错误,并到头文件中找相关定义才知道应该是P0_2.模式切换的问题:刚开始编程时把程序想的太简单,有很多问题没有考虑清楚,流程不完整,导致仿真时不出结果,经过2天的思考,把各个模式都想清楚了,再用几个标志变量,整个流程得以完整实现。
芯片的选择:由于灯用于照亮,选用的高亮LED,电流较大,不能用IO口直接驱动,经过查找资料,最终选用8路达林顿管ULN2803作为驱动电路,效果比较理想。
消抖:在编程前我用示波器观察过声音传感器的输出,有声音时会有一个尖脉冲,波形比较稳定,所以我以为这个程序不需要消抖,但是当最终板子出来后实验发现还是会有抖动干扰。所以加了0.4S的消抖。
六. 设计成果
板子上电后进入待机状态,以拍手为例,2S内拍1下,亮2个灯(亮度等级1),拍2下亮4个灯(亮度等级2),拍3下亮6个灯(亮度等级3),拍4下亮8个灯(亮度等级4)。之后再拍1下是降1个亮度等级,拍2下是升1个亮度等级。
七. 设计感想
这次单片机课程设计中,虽然使用到的器件非常简单,程序涉及的知识也不多,但是整个程序在逻辑上要求比较高,在编程初期思考了很久。在整个设计过程中,硬件电路的焊接比较顺利,在调试中也只遇到了消抖的问题。在整个实验中熟悉了C语言在单片机编程中的应用,感觉高级语言有很大优势,如果逻辑比较复杂的程序用汇编来做的话无法想象。
附件:程序代码#include #define LED1 P2_1 #define LED2 P2_2 #define LED3 P2_3 #define LED4 P2_4 /*子函数、变量定义*/ void sound_int(void);void t0(void);void t1(void);void t0_0(void);void t0_1(void);void t0_2(void);void t0_3(void);void t0_4(void);void bright0(void);void bright1(void);void bright2(void);void bright3(void);void bright4(void);unsigned int i;unsigned int j;unsigned int t;unsigned int k;/*主函数*/ void main(void){
i=0;
j=0;
t=0;
k=0;
LED1 = 0;
LED2 = 0;
LED3 = 0;
LED4 = 0;
PX0=1;
PT0=0;
PT1=0;
EX0=1;
ET0=1;
ET1=1;
IT0=0;
EA=1;
while(1);}
//变量初始化
//IO口初始化
//外部中断优先级高
//定时器中断优先级低
//外部中断允许
//定时器中断允许
//边沿触发
//总中断允许 4
/****************************************/ /*函数名:外部中断***********************/ /*功能:定时器初始化、外部中断标志数累加*/ /****************************************/ void sound_int(void)interrupt 0 {
EX0=0;
//关外部中断
k=0;
//定时器1中断计数清0
j=j+1;
//外部中断计数
TMOD=0x22;
//定时器0工作方式2 ,定时器1作方式2
TH0=56;
//定时中断1次200us
TL0=56;
TF0=0;
//定时器0清0
TR0=1;
//启动T0
TH1=56;
TL1=56;
TF1=0;
TR1=1;
} /**********************************************/ /*函数名:定时器中断0**************************/ /*功能:从第一次外部中断开始计时,2S后选择分支*/ /**********************************************/ void t0(void)interrupt 1 { t=t+1;
//进中断次数累加,使定时时间为200us*10000=2S if(t==10000)
//从第一次外部中断开始计时,2S后选择分支
{
switch(i)
{
case 0:t0_0();break;
case 1:t0_1();break;
case 2:t0_2();break;
case 3:t0_3();break;
case 4:t0_4();break;
}
} } /**********************************************/ /*函数名:定时器中断1**************************/ /*功能:400ms消抖******************************/ /**********************************************/ void t1(void)interrupt 3 { k=k+1;if(k==2000)
EX0=1;} /**********************************************/ /*功能:不同状态下对外部中断的不同响应*********/ /**********************************************/ //----------------void t0_0(void)
{ TR0=0;TR1=0;EA=0;switch(j){
case 0:bright0();break;
case 1:bright1();break;
case 2:bright2();break;
case 3:bright3();break;
default:bright4();break;} } //----------------void t0_1(void){ TR0=0;TR1=0;EA=0;switch(j){
case 0:bright1();break;
case 1:bright0();break;
default:bright2();break;} } //----------------void t0_2(void){ TR0=0;TR1=0;EA=0;switch(j){
case 0:bright2();break;
case 1:bright1();break;
default:bright3();break;} } //----------------void t0_3(void){ TR0=0;TR1=0;EA=0;switch(j){
case 0:bright3();break;
case 1:bright2();break;
default:bright4();break;} } //----------------void t0_4(void){ TR0=0;TR1=0;EA=0;switch(j){
case 1:bright3();break;
default:bright4();break;} } /**********************************************/ /*功能:灯的四个显示状态***********************/ /**********************************************/ void bright0(void){ LED1=0;LED2=0;LED3=0;LED4=0;i=0;j=0;t=0;k=0;EA=1;}//----------------
void bright1(void){ LED1=0;LED2=0;LED3=0;LED4=0;i=1;j=0;t=0;k=0;LED1=1;EA=1;}
//----------------void bright2(void){ TR0=0;LED1=0;LED2=0;LED3=0;LED4=0;i=2;j=0;t=0;k=0;LED1=1;LED2=1;EA=1;
} //----------------void bright3(void){ LED1=0;LED2=0;LED3=0;LED4=0;i=3;j=0;t=0;k=0;LED1=1;LED2=1;LED3=1;EA=1;}
//----------------void bright4(void){
LED1=0;LED2=0;LED3=0;LED4=0;i=4;j=0;t=0;k=0;LED1=1;LED2=1;LED3=1;LED4=1;EA=1;}
//----------------