基于单片机LED流水灯控制 (1).doc
《基于单片机LED流水灯控制 (1).doc》由会员分享,可在线阅读,更多相关《基于单片机LED流水灯控制 (1).doc(25页珍藏版)》请在冰点文库上搜索。
JDFJKDHFKAHGJHLKFHJHAKHFLJKDHFKLJASHDFKJHAKLDFHDLSFHKLDSJ
课程设计说明书
课程名称:
单片机原理及应用
设计题目:
基于单片机的LED流水灯控制
院系:
信息技术学院
专业:
计算机科学与技术
2013年1月10日
DFSGSJDFKGHERUHJKDHKLSHDKJHKSHKFHLKGHDLSFGHDSKLFHGLDKSFHGLKFGDS
基于单片机的LED流水灯控制
摘要
基于单片机的LED流水灯的应用十分广泛,由单片机作为的核心控制器,通过按键实现控制功能和数据输入是非常普遍的。
通常在所需按键数量不多时,系统常采用独立式按键。
这种按键的电路配置灵活,软件结构简单。
由于实际应用中,不同系统对按键的要求不同,因此,对按键程序的设计要考虑全面,以便更好地完成按键所设定的功能,简述了该系统中一些重要芯片的基本工作原理,着重论述了硬件线路各个模块的设计思想。
进而熟练掌握相关专业基础知识的综合应用,提高学生的实际动手和设计能力。
本系统是基于AT89C51系列单片机为核心的LED流水灯设计,实现8个LED灯变化方向和速度的可调。
关键词:
单片机独立式按键LED
DFSGSJDFKGHERUHJKDHKLSHDKJHKSHKFHLKGHDLSFGHDSKLFHGLDKSFHGLKFGDS
目录
第一章绪论 1
1.设计背景 1
1.1设计目的 1
1.2可行性分析及相关现状 1
1.3意义 2
第二章系统设计 3
2系统设计 3
2.1整体设计 3
2.2模块设计 4
第三章系统实现 7
3.1整体仿真电路图 7
3.2各部分模块原理 7
3.2.1单片机最小系统 7
3.2.2外围电路 8
第四章核心代码 11
第五章调试 14
第六章总结与致谢 15
6.1总结 15
6.2致谢 15
第七章附录 16
7.附录 16
7.1源代码 16
DFSGSJDFKGHERUHJKDHKLSHDKJHKSHKFHLKGHDLSFGHDSKLFHGLDKSFHGLKFGDS
第一章绪论
1.设计背景
1.1设计目的
通过本次课题设计,应用《单片机原理及应用》等所学相关知识及查阅资料完成简易LED流水灯系统设计,以达到理论与实践更好的结合、进一步提高综合运用所学知识和设计的能力的目的。
1.2可行性分析及相关现状
随着人们生活水平的提高,基于单片机的LED流水灯的应用越来越广泛,其中独立式键盘的扩展电路,该模块主要应用于仪器仪表、工业控制器、条形显示器、控制面板等实时性要求不太高的设备。
所以利用软件编程尽量做到硬件电路简单稳定,减小电磁干扰和其他环境干扰,减小因元器件精度不够引起的误差,还可以改进和提高如选用更精密的元器件等,在此次设计中我们将用到集成电路。
集成电路是信息产业和高新技术的核心,是推动国民经济和社会信息化的关键技术。
集成电路的产业规模和技术水平已成为国家综合国力的一个重要标志。
我国集成电路产业已经经过30多年的发展现已形成了近百家的产业规模,其中具备一定设计规模的单位有20多家,其中北京华大、大唐、深圳华威和无锡矽科四家设计公司的销售额超过了1亿元。
多家外国著名公司也纷纷在中国建立起集成电路设计公司。
中国发展集成电路的主要目标为:
达到大规模生产150mm和0.8微米的技术水平;200mm和0.5微米的制造技术的产业化;提高集成电路的设计能力以满足市场需求;跟踪0.3-0.4微米和先进封装技术的研发;开发200mm的硅片制造技术并在国内开始生产等。
未来10年是我国微电子产业发展的关键时期。
重点要推进超大规模集成电路和新技术的产业化。
综观中国集成电路的设计概况,可以看到从20世纪80年代末开始,经过90年代初的创业期,现正进入它的发展期,21世纪将是中国设计业的成熟期。
1.3意义
今天,当我们进入21世纪的时候,自动化科学技术不仅面临着挑战、也遇到了前所未有的发展机遇,而与此同时,在世界范围内掀起了高等科学工程教育的改革浪潮。
这两方面的因素必将深刻地影响大学自动化专业的发展。
本次课程设计就是为了加强学生动手能力,加强学生对电子电路技术的掌握,了解控制工程行业对当今社会的影响。
同时培养学生实践能力,并通过实践来不断的发现问题和解决问题的途径和方法,从而提高实践能力。
第二章系统设计
2系统设计
2.1整体设计
本方案主要有硬件部分和程序部分构成。
硬件部分主要由单片机最小系统和输入输出设备构成。
首先搭建单片机最小系统,包括电源电路,手动复位电路,时钟电路。
时钟电路才用内部时钟方式,手动复位电路采用按键电平复位方式。
再根据要求在P2口串接8个发光二极管作为输出设备,分别通过限流电阻接电源,在P3口串接2个独立按键,作为输入设备。
通过独立按键控制LED灯的闪烁和移动及速率变化。
同时在P1口连接一个数码管显示电路,用于自动计时,实现自动改变流水灯的样式。
程序部分设定T0为定时工作方式,T0每隔一定的时间扫描独立按键,当检测到某个键按下时,在主函数中执行相应的程序。
程序框图如图1所示:
开始
设置定时器工作方式
开中断
启动定时器
判断count1的值,强制转换灯的闪烁样式
判断count2的值确定速率
数码管计时10s之后,自动改变样式
图1
2.2模块设计
各部分模块图如下:
单片机时钟电路及自动复位电路:
外围输入电路:
外围输出二极管显示电路:
外围输出数码管显示电路:
第三章系统实现
3.1整体仿真电路图
如图2所示:
图2
3.2各部分模块原理
各模块原理介绍如下:
3.2.1单片机最小系统
首先搭建单片机最小系统,包括电源电路,手动复位电路,时钟电路。
时钟电路才用内部时钟方式,手动复位电路采用按键电平复位方式。
时钟电路用于产生AT89C51单片机工作时所必需的时钟信号。
AT89C51单片机的内部电路在时钟信号的控制下,严格地按时序执行指令进行工作。
复位是单片机的初始化操作,除了进入系统的正常初始化之外,当由于程序运行出错或操作错误使系统处于死锁状态,通过复位按键可使单片机重新启动。
如图3所示:
图3
3.2.2外围电路
外围电路主要有输入设备和输出设备。
输入设备主要由2个独立按键构成,如图4所示。
输出设备由8个二极管构成,如图5所示,及七段数码管显示电路,如图6所示。
其中s1键控制8个二极管的花样显示,s2控制8个二极管点亮的速率。
数码管用于计时10s,10s之后自动转换二极管显示样式,如果10s之内有s1按键按下,则强制执行s1按键的内容。
其中二极管的保护电阻的取值范围为220-880欧姆之间。
图4
图5
s1键按一下,二极管从上往下单向点亮,哪个送入的是0,就点亮哪个灯,然后依次使0右移,实现依次点亮;按两下,二极管双向移动点亮;按三下,二极管4个交替闪烁;按四下,二极管8个交替闪烁;按五下,8个二极管依次点亮,依次熄灭;从而实现二极管的花样显示;s2键按下,通过延时程序,可以改变二极管点亮的速率。
图6
数码管显示电路,通过往p1.0~p1.6写入0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90会显示数字0~9,自动计时10s;如果10s之内没有按键按下,则10s之后,二极管自动改变显示样式,如果10s之内有按键按下,则强制执行按键内容。
第四章核心代码
本设计主要的模块就是输出设备中的8个二极管及七段数码管显示电路,分别如上图的5、6所示。
其中控制8个二极管花样点亮的程序如下,重点以花样1为说明:
if(count1==1)//花样1:
灯单向向下移模块子程序
{if(count2==1)
{rate=rate1;}//如果s2键按一下,执行速率1
if(count2==2)
{rate=rate2;}//如果s2键按两下,执行速率2
P2=0xfe;//给p2端口送入初值,这时D1点亮
delay(rate);
temp=P2;
for(i=0;i<8;i++)//通过延时及循环,依次点亮D2~D8
{if(count1==1)
{temp=_crol_(temp,1);
P2=temp;
if(count2==1)//并随时判断是否有s2键按下
{rate=rate1;}
if(count2==2)
{rate=rate2;}
delay(rate);
if(i==7)i=0;}
}
}
七段数码管显示电路的程序如下:
unsignedcharcodetable2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//定义数码管0-9数字显示的表
voiddisplay(unsignedcharj)
{P1=table2[j/10];//通过片选使两位数码管分别显示数字,但是延时时间小,可以实现两位数码管同时显示
S3=1;
delay(10);
S3=0;
P1=table2[j%10];
S4=1;
delay(10);
S4=0;}
中断服务程序如下:
voidtimer0()interrupt1
{TH0=(65536-50000)/256;//T0重新装初值
TL0=(65536-50000)%256;
count++;
display(table2index);
if(table2index==0&&count==1)//如果数码管显示数字0时改变流水灯的样式
count1++;
if(count1==6)
count1=1;//如果五个花样显示完了之后,再按下按键S1或数码管计数到10时,再重新从花样1显示
if(count==20)//累加计数器的次数,如果到20次的话数码管数字通过查表自动加1显示
{count=0;
table2index=table2index+1;
if(table2index==11)
table2index=0;}
if(S1==0)//检测是否是S1按下
{delay(5);//软件延时消抖
if(S1==0)//再次检测S1是否确实按下
{table2index=0;
count1++;//如果s1确实按下,则执行s1内容
while(!
S1);//如果s1没有按下,继续执行原来的花样显示
if(count1==6)
count1=1;}
}
if(S2==0)//检测是否是S2按下
{delay(5);//软件延时消抖
if(S2==0)//再次检测S2是否确实按下
{count2++;
while(!
S2);//如果s2没有按下,则继续执行原来的速率
if(count2==3)
count2=1;}
}
}
第五章调试
仿真的过程中出现的主要问题是,按s2键二极管点亮速率不会改变,本来只要写入延时程序,就应该会改变速率,但是仿真之后,速率并不会改变。
后来经过各方面的查资料及研究后才知道,必须在调用延时程序前判断s2键是否被按下,并且按下的次数。
否则的话,就算s2键被按下,也只是执行原本写入的速率,并不会根据s2键的按下改变速率。
第六章总结与致谢
6.1总结
经过一段时间的努力,我们小组顺利的完成了这次单片机课程设计。
这是一个磨练意志的过程。
从课题的选择开始,硬件和软件系统的设计、到最后的设计成功,这其中经历了很多困难。
但是更重要的是在这个过程中我得到了很大的锻炼。
通过AT89C51单片机等一些器件的设计让我学习和掌握了单片机技术的基础知识和技术要点,也使以前学的很多知识都得到了运用。
通过本次课程设计,我不仅学到了关于单片机技术方面的许多专业知识,同时也让我感觉到很多方面的知识的重要性。
其实如何有效和快速的找到资料也是课程设计给我的启发。
与他人交流思想是取得成功的关键,在交流中不仅强化了自己原有的知识体系,也扩展了自己的思维。
课程设计是一个通过思考、发问、自己解惑并动手、提高的过程。
我会在以后的学习中不断学习,积累经验,完善自己。
通过这次课程设计使我懂得了理论与实际相结合是很重要的。
只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,从而提高自己的实际动手能力和独立思考的能力。
6.2致谢
在这里我感谢那些曾给我授过课的每一位老师,是你们教会我专业知识。
特别感谢教我们单片机原理及应用的某某老师,是他给我们详细讲解了单片机的结构、工作原理,以及各个引脚功能,还有程序的编写方法等。
这些都是我们这次课程设计的基础,没有某老师的讲解,我们要想完成这次课程设计,是不可能的。
我还要感谢我们小组的成员,通过大家的齐心协力,我们克服了重重阻力终于成功的完成了此次任务。
非常感谢!
第七章附录
7.附录
7.1源代码
//目的:
实现基于单片机的LED流水灯控制
//语言:
C;
//变量:
S1:
P3.4口S2:
P3.5口S3:
P3.6口S4:
P3.7口table1[]:
流水灯样式控制table2[]:
数码管-9数字
//变量:
temp:
临时变量i:
临时变量table2index:
存储table2的下标
//变量:
count:
累加计数器次数count1:
累加单击第一个按键次数count2:
累加单击第二个按键次数
//变量:
rate:
速度变量rate1:
速度变量rate2:
速度变量
#include
#include
sbitS1=P3^4;
sbitS2=P3^5;
sbitS3=P3^6;
sbitS4=P3^7;
unsignedcharcodetable1[9]={0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};//流水灯样式控制
unsignedcharcodetable2[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//数码管-9数字
unsignedchartemp,i,table2index=0;
unsignedcharcount1=0,count2=0,count=0;
unsignedcharrate=100,rate1=100,rate2=500;
//*********************************************************************************
//Begin-----延迟
voiddelay(unsignedcharz)
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=100;y>0;y--);
}
//End-----延迟
//*********************************************************************************
//Begin-----数码管数字显示
voiddisplay(unsignedcharj)
{
P1=table2[j/10];
S3=1;
delay(10);
S3=0;
P1=table2[j%10];
S4=1;
delay(10);
S4=0;
}
//End-----数码管数字显示
//*********************************************************************************
voidmain()
{
P1=0xff;
TMOD=0x01;//设置定时器T0为工作方式
TH0=(65536-50000)/256;//定时器赋初值
TL0=(65536-50000)%256;
EA=1;//开总中断
ET0=1;//开启定时器T0中断
TR0=1;//启动定时器T0
while
(1)
{
//***************************************************************************************
//Begin-----流水灯样式控制
//Begin-----花样
if(count1==1)//花样:
灯单向向下移模块子程序
{
if(count2==1)
{
rate=rate1;
}
if(count2==2)
{
rate=rate2;
}
P2=0xfe;
delay(rate);
temp=P2;
for(i=0;i<8;i++)
{
if(count1==1)
{
temp=_crol_(temp,1);
P2=temp;
if(count2==1)
{
rate=rate1;
}
if(count2==2)
{
rate=rate2;
}
delay(rate);
if(i==7)i=0;
}
}
}
//End-----花样
//*************************************************************************************
//Begin-----花样
if(count1==2)//花样:
灯双向移模块子程序
{
P2=0x7f;
if(count2==1)
{
rate=rate1;
}
if(count2==2)
{
rate=rate2;
}
delay(rate);
temp=P2;
for(i=0;i<7;i++)
{
if(count1==2)
{
temp=_cror_(temp,1);
P2=temp;
if(count2==1)
{
rate=rate1;
}
if(count2==2)
{
rate=rate2;
}
delay(rate);
}
}
for(i=0;i<7;i++)
{
if(count1==2)
{
temp=_crol_(temp,1);
P2=temp;
if(count2==1)
rate=rate1;
if(count2==2)
rate=rate2;
delay(rate);
}
}
}
//End-----花样
//*************************************************************************************
//Begin-----花样
if(count1==3)//花样:
个交替闪烁模块子程序
{
P2=0xf0;
if(count2==1)
rate=rate1;