红绿双色彩灯设计讲解.docx
《红绿双色彩灯设计讲解.docx》由会员分享,可在线阅读,更多相关《红绿双色彩灯设计讲解.docx(11页珍藏版)》请在冰豆网上搜索。
![红绿双色彩灯设计讲解.docx](https://file1.bdocx.com/fileroot1/2023-7/14/7234a168-0251-4e38-a9e3-7e70aba8d189/7234a168-0251-4e38-a9e3-7e70aba8d1891.gif)
红绿双色彩灯设计讲解
郑州科技学院
单片机课程设计
题目红绿双色彩灯的控制
学生姓名---------
专业班级11级电科二班
学号=========
院(系)电气工学院
指导教师90090900
完成时间2015年1月9日
1课程设计的目的、要求及思想
1.1设计目的
近年来随着科技的发展,单片机的应用正在不断走向深入,同时带动传统控制检测日新月异更新,在实时检测和自动控制的单片机应用系统中,单片机往往是作为一个核心部件来使用,单片机方面知识是不够的,还应根据具体硬件结构,以及针对具体应用对象点的软件结合,加以完善。
流水灯,可以更简单、方便的使用。
通过本课程设计使学生进一步巩固单片机原理及应用的基本概念、基本理论,分析问题的基本方法,增强系统地运用已学的理论知识解决实际问题的能力和查阅资料的能力。
培养一定的自学能力和独立分析问题、解决问题的能力,能通过独立思考、查阅工具书、参考文献,寻找解决方案。
1.2设计要求
设计流水灯的基本要求:
设计一个流水灯,应用AT89C51试验系统,电路开启后红、绿两种颜色的灯在时钟信号作用下按一定规律转换状态。
1.3设计思想
整个系统工作由软件程序控制运行,根据需要,可以上电后系统经过初始化,进入用户设定模式状态。
基于AT89C51单片机的彩灯控制方案,实现对LED彩灯的控制。
本方案以AT89C51单片机作为主控核心,与驱动等模块组成核心主控制模块。
在主控模块上设有晶振电路和16个LED显示二极管,根据需要编写若干种亮灯模式,根据各种亮灯时间的不同需要,在不同时刻输出灯亮或灯灭的控制信号。
2硬件设计与焊接调试
2.1硬件结构
由图2-1可以看出,单片机内部主要包含下列几个部件:
一个8位CPU;一个时钟电路;4Kbyte程序存储器;128byte数据存储器;两个16位定时/计数器;64Kbyte扩展总线控制电路;四个8-bit并行I/O端口;一个可编程串行接口;五个中断源,其中两个优先级嵌套中断。
图2-1AT89C51硬件结构框图
2.2硬件设计
51单片机是整个彩灯循环系统的核心是控制彩灯循环闪烁等等一切功能的部件;其中内部有ROM、有RAM、有并行I/O口等,在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。
电路中C1、R2……组成复位电路,它的作用是将单片机内部特殊功能寄存器和端口寄存器恢复到初始状态,从内部FLASH存储器的初始状态开始执行。
单片机本身如同一个复杂的同步时序电路,为了保证同步工作,电路应在唯一的时钟信号控制下,严格地按规定时序工作。
而时钟电路就用于产生单片机工作所需要的时钟信号。
利用单片机的P口控制:
LED的发光闪烁,再利用编程实现流水灯的电路,用软件来实现对LED的控制,每个LED接一个限流电阻,来控制流入LED发光管的电流。
2.3硬件连接图
图2-2硬件连接图
2.4电路的焊接
(1)对所有元件进行检测,确保每个元件的质量。
(2)在万能板上依据单片机最小应用系统原理图设计电路图,进行规划振荡电路、复位电路、电源电路、外围电路、单片机芯片的布局时要疏密合理。
(3)依据电路图,先焊接振荡电路,在焊接外围电路,复位电路,电源电路,焊接的时候要注意晶振电路应尽量靠近单片机芯片,性能会更稳定。
2.5电路的调试
(1)用万用表检测电源是否接通,主要是看看40脚和20脚之间是否有5V电压。
(2)检测第31引脚,是否有5V电压,目的是确保使用了片内存储器。
(3)检测P3口或P2口的空闲电压是否有5V电压,如果没有,说明单片机系统没有工作。
(4)用万用表检测复位电路,通过复位按键,检测第9脚的电压是否为变化,如果按键没有按下,电压为0V,按键按下后,电压立刻变为5V,之后很快的降为0V,则表示复位电路正常。
(5)用示波器检测振荡电路,主要是检测第18、19脚,检测是否有震荡波产生,如果有,表示震荡电路正常。
(6)最后,检测电路板上的焊接走线是否有短路、断路、虚焊等焊接故障。
3软件设计
3.1软件总体设计
用查表的方法控制点亮流水灯,即移位的思想
0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff;//左边单个点亮
0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00;//右边逐个点亮
0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff;//左边逐个熄灭
0x7f,0x8f,0xdf,0xef,0xf7,0xf8,0xfd,0xfe,0xff;//右边单个点亮
0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00;//左边逐个点亮
0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff;//右边逐个熄灭
0xfc,0xf9,0xf3,0xef,0xcf,0x9f,0x3f,0xff;//左边逐两个点亮
0x3f,0x9f,0xcf,0xe7,0xf3,0xf9,0xfc,0xff;//右边逐两个点亮
0xf8,0xf1,0xe3,0x07,0x8f,0x1f,0xff;//左边逐三个亮
0x1f,0x8f,0x07,0xe3,0xf1,0xf8,0xff;//右边逐三个亮
3.2主程序设计
voidmain()
{
uchari;//定义一个无符号字符型局部变量i
while
(1)
{//从数组中读取数据送至P0和P2口显示
for(i=0;i<136;i++)//加入for循环,共136个流水灯控制码,大括号中的程序循环执行136次
{
P0=Pattern_P0[i];//数组控制流水灯亮暗
P2=Pattern_P2[i];
DelayMS(100);//延时以便能观察到灯亮移动,自己可以调整时间,由晶振和实参决定
}
}
3.3子程序设计
//延时
voidDelayMS(uintx)
{
uchari;
while(x--)
{
for(i=0;i<120;i++);
}
}
3.4码程序设计
设计两个数组分别存储红灯和绿灯的流水灯控制码,让后用查表的方式点亮流水灯,主要代码如下:
ucharcodePattern_P0[]=
{
0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff//流水灯控制码
};
ucharcodePattern_P2[]=
{
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff,0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff,0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f,0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff
};
在仿真中可以看到led灯有规律的一个一个的点亮如此循环。
3.5程序流程图
图3-1程序流程图
4软件调试与仿真说明
4.1仿真过程
Proteus仿真时,单片机需要加载程序,加载程序为.HEX文件。
本设计利用KeilμVision3,在新建Keil项目时选择AT89C51单片机作为CPU,将C语言源程序导入,在“OptionsForTarget”对话窗口中,选中“Output”选项中的“CreateHEXFile”,编译链接后就可以生成.HEX文件。
在ProteusISIS中,选中AT89C52并单击鼠标左键,对AT89C52进行设置,设置单片机时钟频率为12MHz,按照正确的文件路径加载.HEX文件。
对单片机设置完毕后就可以开始仿真了。
4.2仿真结果
图4-1Proteus仿真环境
5结束语
通过这次课程设计我学到了很多东西,我更加体会到理论知识与动手能力相结合的重要性,而且设计过程中使我懂得在设计程序之前,务必要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源:
懂得设计的关键是要有一个清晰的思路和一个完整的软件流程图。
在设计程序时,不能妄想一次就将整个程序设计好,“反复修改,不断改进”是程序设计的必经之路。
要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你思路,这样也为资料的保存和交流提供了方便。
整个设计的过程中,还是碰到了一些问题。
比如,对于键盘的延时防抖问题不能较好的解决;对于编程的顺序及各模块程序调用掌握得还不够好;对于一些相关的应用软件没能熟练掌握。
通过这几天的反复思考,以及参考网上的程序,最终还是完成了设计。
设计中我最大的收获就是自己的动手能力和独立解决问题的能力得到了很大的提高,在动手的过程中,不仅能增强实践能力,而且在理论上可以有更深的认识
参考文献
[1]胡汉才.单片机原理及其接口技术(第2版)[M].北京:
清华大学出版社.2004.49~77.
[2]蓝厚荣.单片机的PWM控制技术[J].工业控制计算机,2010,23(3):
97~98
[3]郭天祥.新概念51单片机C语言教程[M].北京:
电子工业出版社.2009.342~344
[4]李学龙.使用单片机控制的智能遥控电风扇控制器[J].电子电路制作,2003,9:
13~15.
[5]胡全.51单片机的数码管动态显示技术[J].信息技术,2009,13:
25~26
[6]马云峰.单片机与数字温度传感器DS18B20的接口设计[J].计算机测量与控制,2007,10(4):
278~280
附录1:
总体电路原理图
附录2:
元器件清单
名称型号
个数
AT89C51
1
22pF电容
2
10uF电解电容(16V)
1
10k电阻
17
晶振12HZ
1
绿色发光二极管
8
红色发光二极管
8
连接线
若干
附录3:
实物图