摇摇棒实验报告

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

河南机电高等专科学校
专业技能实训报告设计题目:基于单片机的摇摇棒设计
系部:电子通信工程系
班级:。

姓名:。

学号:。

2012年11月30日
专业技能实训任务书
摘要
本设计以AT89S52单片机为中央控制器,摇摇棒摇动时显现的字符或图形由LED灯显示。

LED灯成线状排列,将需要显示的字符或图形分成64列,每个瞬间线阵只能显示字编码后的文字或图形的一列,利用人眼的视觉暂留原理,可以完整地呈现出整个图形或字符。

一般人手左右摆动的频率为儿赫兹到十几赫兹,因此,通过单片机控制LED线阵以一较低频率扫描显示字符或图形的每一列,摆动显示棒时即可因视觉暂留看出显示的字符或图;左右摆动一次即摆动的方向改变一次,通过水银开关产生中断,调用相应的显示中断子程序。

字符切换通过外部中断实现,该系统设计对程序设计的要求较硬件电路要高。

整套摇摇棒系统由中央控制模块、LED显示模块、供电模块等部分构成。

关键词:摇摇棒,LED,PCB
目录
设计任务书 (1)
摘要 (2)
绪论 (4)
第1章总体方案设计 (6)
1.1整体方案设计 (6)
1.2主要元器件的原理 (6)
第2章系统的设计和制作 (10)
2.1 硬件设计 (10)
2.2软件设计 (11)
结论 (14)
致谢 (15)
参考文献 (15)
附录A电路原理图........................................................ . (16)
附录B PCB图........................................................ .. (17)
附录C源程序........................................................ (18)
.
绪论
随着人们物质生活水平的提高,人们对精神生活的追求也愈加强烈,在娱乐方面也多元化,其中电子产品占了其中相当大的一部分。

一件好的电子产品总能给人们带来耳日一新的感受。

而现代工具务求简捷化、便携化,因此,摇动显示装置的到来,必将会给人们带来一种新的视觉冲击。

“摇动显示装置”,俗称“摇摇棒”,是基于人的视觉暂留原理的,通过分时刷新16个发光二极管来显示输出文字或图案等信息的显示装置。

输出信号频率的控制通过单片机来实现,用摇动传感器检测当前摇动状态。

当进行摇动时,由于人的视觉暂留原理,会在发光一极管摇动区域产生一个视觉平面,在视觉平面内的二极管通过不同频率的刷新,会在摇动区域内产生图像,从而达到在该视觉平面上传达信息的作用。

其结构及原理图如图:
实习目的:
1、非常重要的实践教学环节;
2、培养理论知识与生产实际相结合的能力;
3、了解单片机技术;
4、锻炼实际动手能力,掌握电子线路焊接、装配的基本技能;
5、了解并掌握本专业软硬件设计的一此基本问题;
6、提高团队合作能力。

设计功能要求:
1、静态的时候发光二极管能够正常闪烁;
2、摇动的时候可以正确显示文字或图形;
3、显示“河南机专”字样;
4、显示“中国行!”字样;
5、显示动画心跳图样;
6、按键可以切换不同画面;
7、自动转换图形,轮流显示并循环。

此次设计主要技术问题有:
1、单片机控制(汉字取模);
2、PCB制板;
3、外部中断的产生等。

问题解决的方法:
1、程序的编写
参考了网上一些资料,在完全理解后,再然后再根据自己的实际情况做出一些修改。

我们通过了解汉字取模软件的原理后,再根据实际的硬件电路,再做出适当修改后得到了自己需要汉字的代码。

2、PCB的制作
运用protel99se软件,根据板子的要求,画出原理图,在无误的情况下,在生成PCB。

其中遇到的问题主要是通过参考电子线路CAD、网上搜索和观看教学视频解决的。

3、外部中断的产生
通过网上查找资料,我们在理解其工作原理的前提下,最终确定水银开关最适合作该产品的中断产生源。

第一章总体方案设计
1.1整体方案设计
在确定制作该产品的时候。

首先要考虑的是整个棒体的制作,考虑到自己在学校里,身边有一些便捷的设备条件例如:打印机、热转印机和打孔机等设备。

我们最终确定采用PCB板,PCB板子不仅可靠、美观,也可以在制作的过程中再次熟悉keil和protel99se软件。

其次要考虑的是如何供电的问题。

开始我们想到了的是USB接口电源,虽然可以减小板子的体积,但是考虑到在摇动的过程中电源线可能有所干扰,我们想到用电池来供电。

为了16个高亮度LED能正常工作,考虑到电池供电时间及电压匹配的问题,我们最终确定使用四节七号(七号更节省空间)干电池。

这样一来将电池盒放在电路板下方,顺便可以将电池盒部分作为手持部分。

最后考虑的是LED显示的问题。

由于棒体通过往复摆动来显示字符、图案,所以必须准确的在棒体每次开始摆动的瞬间让单片机运行程序。

我们选择了单片机的外部0中断方式,所要运行的程序作为中断服务程序出现。

我们选择了水银开关作为触发开关,来提供中断源。

为了能控制显示不同的字符、图案,我们特地增加了一个按钮开关,这样一来操作者就可自行切换所显示字符和图案,增强了作品的可玩性。

其模块图如下:
1.2主要元器件的原理
1.2.1单片机最小系统
AT89S52单片机最小系统是使单片机正常工作所需的最基本的环境,其主要由单片机芯片、晶振和电容组成。

其图示如下:
1.2.2复位电路
为确保单片机系统中电路稳定可靠工作,复位电路是必不可少的一部分。

本设计复位电路采用常见的手动复位和上电自动复位。

手动按钮复位需要人为在复位输入端RST上加入高电平。

上电自动复位是利用电解电容在上电后,电容两端电压不能突变的原理,对电路起到一个保护的作用。

其图示如下:
1.2.3水银开关的原理
水银是一种液态的金属,水银开关就是利用了水银的流动性和导电性。

水银开关剖析图
因为重力的关系,水银水珠会随容器中较低的地方流去,如果同时接触到两个电极的话,开关便会将电路闭合,开启开关。

我们将水银开关放在棒体的顶端,在摇动棒提的过程中由于离心力的关系,水银珠会离开两个电极,当方向改变时,由于速度的下降会是水银珠落到管体的底端然后就会闭合电路。

注意:水银对人体及环境均有毒害,因此使用水银开关时,请务必小心谨慎,以免破出;在不再使用时,也应该妥善处理。

1.2.4LED模块
由于摇摇棒在摇动过程中闪烁非常快,普通亮度的发光二极管己经不能满足本设计的要求。

因此,为保证其能够清晰显示文字和图像,所用的LED发光二极管必须是高亮的。

在本设计中,我们通过两种手段来提高亮度,首相是我们使用4节7号电池,能够提供足够的电量,其次就是发光二极管采用共阳接法,提高了点亮时通过LED的电流。

其图示如下:
第二章系统的设计和制作
本系统包括单片机控制模块,开关及电源模块和LED输出显示模块三个部分。

单片机控制模块由Kei1 C进行编写,实现起来简单,主要有两部分,一个是巾断服务部分一个是字符点阵。

开关及电源模块采用4节7号电池供电并配合水银开关使用。

输出显示模块采用16个LEB灯,在版上一字排开。

2.1硬件设计
硬件连接上用水银开关产生的电平转换引发中断,传递给单片机,再由单片机调用中断服务程序,定时点亮特定的LED发光二极管。

下图是电路图
( protel99se原理图和PCB板图) :
电路板原理图
PCB电路板图
2.2软件设计
在摇动LED棒的时候单片机必须单程传送数据否.则显示的图形会产生重影,影响视觉效果。

因此当系统开始通过判断水银开关中断的次数来使单片机实现一单程送数据给LED。

在送数据时,数据送完后应该延时一段时间来使摇摇棒显示的每个字不会太拥挤。

软件设计的流程如下:
汉字取模软件是一款对字符进行处理的软件,他可以方便的提取出所需要的数组信息。

在使用该软件的时候,需要根据自己制作的板子中LED的连接方式来对软件进行一些设置。

图示如下:
结论
本次设计的趣味摇摇棒,完成了设计任务书中的基本要求。

本设计在对电路基本参数进行合理计算的基础上达到了较好的设计效果。

在这次的趣味摇摇棒的课程设计当中,开始的时候遇到了很多的问题和麻烦,比如protel99se软件的使用的一些细节,再比如程序的编写。

当最先看到这个题目的时侯觉得挺简单的,但是真正做的时候才发现,需要考虑和解决很多的问题。

由此可见理论与实践还是有很大的差别的。

电子设计过程是一个考验人耐心的过程,不能有丝毫的急躁,马虎。

在板子上面调试更要一步一步来,不能急躁,要学会灵活处理问题。

这次的课程设计不仅使我获取了很多平常学习生活当中所接触不到的知识和经验,也使我认识到课堂所学的知识不仅要掌握熟练,会做题目,更要将其应用在实际电路的设计当中。

致谢
经过三个星期的努力,在受到,,和周围同学的细心指点和热情帮助,我们的电子产品终于得以顺利完成,并且最终把实际电路做了出来,并达到了良好的效果。

我们在这些天尽了最大的努力去设计和研究这个电路,从收集大量的有关本设计的文献资料到电路中每个模块的设计和和制作。

再到实际电路上调试程序,我接触到了设计一个电子产品的基本过程并从中积累了很多课堂上学不到的知识和经验。

参考文献
【1】《电子线路CAD》主编殷庆纵李福勤北京大学出版社
【2】《单片机原理及应用》主编夏路易电子工业出版社
【3】《C程序设计(第三版)》主编谭浩强清华大学出版社
附录A电路原理图
附录B PCB图附录C源程序
#include <AT89X52.h>
#define uchar unsigned char
#define uint unsigned int //宏定义
#define KEY P3^0 //定义画面切换按键
uchar ZD,YS,AJ=0,ZDS=0; //ZD指向中断次数;YS指向主数组中数组块;AJ指向画面切换;ZDS指向画面显示的次数
/***帅呆了***/
uchar code sdl[] = {
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, 0xFF,0xFE,0xE0,0x1D,0xFF,0xFB,0xFF,0xE7,0x00,0x1F,0xFF,0xFF,0xE0,0x07,0xEF,0xFF, 0xEF,0xFF,0xEF,0xFF,0x00,0x00,0xEF,0xFF,0xEF,0xEF,0xEF,0xE7,0xE0,0x0F,0xFF,0xFF, // 帅
0xFF,0xFB,0xFF,0x7B,0xFF,0x77,0x81,0x77,0xBB,0x6F,0xBB,0x5F,0xBB,0x3F,0xB8,0x00, 0xBB,0x3F,0xBB,0x5F,0xBB,0x6F,0x81,0x77,0xFF,0x73,0xFE,0x79,0xFF,0x7B,0xFF,0xFF, // 呆
0xFF,0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xFF,0xBF,0xFD,0xBF,0xFE,0xB0,0x01, 0xB7,0xFF,0xAF,0xFF,0xAF,0xFF,0x9F,0xFF,0x9F,0xFF,0xBF,0xFF,0xFF,0xFF,0xFF,0xFF, // 了
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
};
/***勇敢坚强***/
uchar code ygjq[] = {
0xFF,0xFF,0xFF,0xDF,0x60,0x5E,0x6A,0xDD,0x6A,0xDB,0x6A,0xD7,0x2A,0x8F,0x40,0x5F, 0x4A,0xDF,0x2A,0xDF,0x2A,0xDD,0x6A,0xDE,0xE0,0x41,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, // 勇
0xF7,0xF7,0xB7,0xF7,0xB0,0x07,0xB5,0x6F,0xB5,0x6F,0x80,0x00,0xF6,0xDD,0xFD,0xDD, 0xF0,0xFB,0x07,0x37,0xB7,0xCF,0xF7,0x27,0xF0,0xF3,0xF7,0xF9,0xF7,0xFB,0xFF,0xFF, // 敢
0xFF,0xFD,0xC0,0xFD,0xFF,0xDD,0xFF,0xDD,0x00,0x1D,0xFF,0xDD,0xBF,0x5D,0x8E,0x81, 0xB5,0xDD,0xBB,0xDD,0xB5,0xDD,0xAD,0xDD,0x9E,0xDD,0xBE,0x7D,0xFE,0xFD,0xFF,0xFF, // 坚
0xFF,0xFF,0xB0,0x7F,0xB7,0x7D,0xB7,0x7E,0x87,0x01,0xFF,0xFF,0xFC,0x1E,0x85,0xDE, 0xB5,0xDE,0xB0,0x00,0xB5,0xDD,0xB5,0xDD,0x85,0xD5,0xFC,0x18,0xFF,0xFD,0xFF,0xFF, // 强
};
/***热爱祖国***/
uchar code razg[] = {
0xDD,0xFC,0xDC,0xB9,0xDD,0xD3,0x00,0x3F,0xDB,0xD7,0xDF,0xB9,0xD7,0x7F,0xDA,0xEF, 0x01,0xF3,0xDC,0xF9,0xDE,0x7F,0xC1,0xEF,0xDE,0x33,0xFF,0xD9,0xFF,0x1F,0xFF,0xFF, // 热
0xFF,0xFD,0xFD,0xFB,0xB2,0xFA,0x96,0xF6,0xA6,0xCD,0xB6,0x1D,0x90,0xAB,0xA6,0xAB, 0x36,0xB7,0x76,0xA7,0x66,0x9B,0x16,0xBB,0x76,0xFD,0xF6,0xFC,0xF3,0xFD,0xFF,0xFF, // 爱
0xEF,0xBF,0xEF,0x7F,0x6E,0xFF,0x8C,0x00,0xEA,0xFF,0xE7,0x3D,0xFF,0xFD,0x80,0x01, 0xBB,0xBD,0xBB,0xBD,0xBB,0xBD,0xBB,0xBD,0x80,0x01,0xFF,0xFD,0xFF,0xFD,0xFF,0xFF, // 祖
0xFF,0xFF,0x80,0x00,0xBF,0xFD,0xAF,0xED,0xAE,0xED,0xAE,0xED,0xAE,0xED,0xA0,0x0D, 0xAE,0xED,0xAE,0x6D,0xAE,0x8D,0xAF,0xED,0xBF,0xFD,0x80,0x00,0xFF,0xFF,0xFF,0xFF, // 国
};
/***主数组***/
uchar code zsz[] = {
0xF7,0xDF,0xF9,0xDF,0x7F,0x00,0x9C,0xFF,0xF3,0xFF,0xBF,0xFF,0xB8,0x1F,0xBB,0xBF,
0xBB,0xBF,0xB8,0x1F,0xBF,0xFD,0xBF,0xFE,0x80,0x01,0xBF,0xFF,0xBF,0xFF,0xFF,0xFF, //河
0xDF,0xFF,0xDF,0xFF,0xD8,0x01,0xDB,0xDF,0xDB,0x5F,0xD9,0x5F,0xD2,0x5F,0x0B,0x01, 0xDB,0x5F,0xDA,0x5F,0xD9,0x5F,0xDB,0x5B,0xDB,0xDD,0x98,0x03,0xDF,0xFF,0xFF,0xFF, //南
0xEF,0xDF,0xEF,0x3F,0xEC,0xFF,0x00,0x00,0xED,0xFF,0xEE,0x7D,0xEF,0xF3,0xFF,0xCF, 0x80,0x3F,0xBF,0xFF,0xBF,0xFF,0xBF,0xFF,0x80,0x03,0xFF,0xFD,0xFF,0xE1,0xFF,0xFF, //机
0xFB,0xFF,0xFB,0xFF,0xDB,0xFF,0xDB,0xFF,0xDA,0x7F,0xD9,0x7F,0xC3,0x6F,0x1B,0x77, 0xDB,0x6B,0xDB,0x5D,0xDA,0x3F,0xDB,0x7F,0xDB,0xFF,0xFB,0xFF,0xFB,0xFF,0xFF,0xFF, //电
0xFB,0xFF,0xFB,0xFE,0xFB,0xFD,0xFB,0xFB,0xFB,0xF7,0xFB,0xCF,0xFA,0x3F,0x01,0xFF, 0xFA,0x7F,0xFB,0x9F,0xFB,0xEF,0xFB,0xF3,0xFB,0xF9,0xFB,0xFC,0xFB,0xFD,0xFF,0xFF, // 大
0xFD,0xFF,0xF3,0xBF,0xF7,0xBF,0xB7,0xBF,0xC5,0xBF,0xD5,0xBF,0xF5,0xBD,0x75,0xBE, 0x85,0x01,0xD4,0xBF,0xF5,0xBF,0xE7,0xBF,0x15,0xBF,0xB3,0xBF,0xF7,0xBF,0xFF,0xFF, // 学
0xFF,0xFF,0xFF,0xFF,0xE0,0x0F,0xED,0xDF,0xED,0xDF,0xED,0xDF,0xED,0xDF,0x00,0x03, 0xED,0xDD,0xED,0xDD,0xED,0xDD,0xED,0xDD,0xE0,0x0D,0xFF,0xFD,0xFF,0xF1,0xFF,0xFF, // 电
0xFF,0x7F,0xFF,0x7F,0xBF,0x7F,0xBF,0x7F,0xBF,0x7F,0xBF,0x7D,0xBF,0x7E,0xB8,0x01, 0xB7,0x7F,0xAF,0x7F,0x9F,0x7F,0xBF,0x7F,0xFF,0x7F,0xFE,0x7F,0xFF,0x7F,0xFF,0xFF, // 子
0xE7,0xFF,0xEF,0xFF,0xEF,0xFB,0xE0,0x03,0xEF,0xFB,0xEF,0xFF,0xE7,0xFF,0xFF,0xFF, // T
0xFF,0xFF,0xFF,0x67,0xFE,0xDB,0xFE,0xBB,0xFE,0xBB,0xFE,0xBB,0xFF,0x03,0xFF,0xFB, // a
0xFE,0xFB,0xFE,0x03,0xFF,0x7B,0xFE,0xFF,0xFE,0xFF,0xFE,0xFB,0xFF,0x03,0xFF,0xFB, // n
0xEF,0xFB,0xE0,0x03,0xFF,0xDB,0xFF,0xBF,0xFE,0x4B,0xFE,0xF3,0xFE,0xFB,0xFF,0xFF,
// k
0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, //
0xEF,0xFF,0xE3,0xFF,0xEC,0xFB,0xFF,0x03,0xEC,0xFB,0xE3,0xFF,0xEF,0xFF,0xFF,0xFF, // Y
0xFF,0xFF,0xFF,0x07,0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,0xFE,0xFB,0xFF,0x07,0xFF,0xFF, // o
0xFE,0xFF,0xFE,0x07,0xFF,0xFB,0xFF,0xFB,0xFF,0xFB,0xFE,0xF7,0xFE,0x03,0xFF,0xFB, // u
0xE1,0xFF,0xC0,0x3F,0xC0,0x0F,0x80,0x07,0x80,0x03,0x80,0x03,0xC0,0x01,0xF0,0x00, 0xF0,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x80,0x07,0xC0,0x0F,0xC0,0x3F,0xE1,0xFF, // 心图案
0xE1,0xFF,0xC0,0x3F,0xC0,0x0F,0x80,0x07,0x80,0x03,0x80,0x03,0xC0,0x01,0xF0,0x00, 0xF0,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x80,0x07,0xC0,0x0F,0xC0,0x3F,0xE1,0xFF, // 心图案
0xE1,0xFF,0xC0,0x3F,0xC0,0x0F,0x80,0x07,0x80,0x03,0x80,0x03,0xC0,0x01,0xF0,0x00, 0xF0,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x80,0x07,0xC0,0x0F,0xC0,0x3F,0xE1,0xFF, // 心图案
0xE1,0xFF,0xC0,0x3F,0xC0,0x0F,0x80,0x07,0x80,0x03,0x80,0x03,0xC0,0x01,0xF0,0x00, 0xF0,0x00,0xC0,0x01,0x80,0x03,0x80,0x03,0x80,0x07,0xC0,0x0F,0xC0,0x3F,0xE1,0xFF, // 心图案
};
/***显示程序声明***/
void display1(void);
void display2(void);
void display3(void);
void display4(void);
/***延时程序***/
void Delay(int N)
{
uint x;
for(x=0; x<=N;x++);
}
/***主显示程序***/
void display1(void) //在不触动换面切换按键时
{
uint i;
if(ZDS>3){YS++;ZDS=0;}//ZDS指向显示次数。

一组数显示4次后,将自动切换主数组下一个数组块
if(YS>3)YS=0; //主数组中共有4个数组块 YS指向数组块
Delay(5200);
for(i=0;i<64;i++)
{
P0=zsz[YS*128+i*2];
P1=zsz[YS*128+i*2+1];
Delay(100);
}
}
/***次要显示程序***/
/***帅呆了***/
void display2(void)
{
uint i;
Delay(4000);
for(i=0;i<64;i++)
{
P0=sdl[i*2];
P1=sdl[i*2+1];
Delay(120);
}
}
/***勇敢坚强***/
void display3(void)
{
uint i;
Delay(4000);
for(i=0;i<64;i++)
{
P0=ygjq[i*2];
P1=ygjq[i*2+1];
Delay(120);
}
}
/***热爱祖国***/
void display4(void)
{
uint i;
Delay(4000);
for(i=0;i<64;i++)
{
P0=razg[i*2];
P1=razg[i*2+1];
Delay(120);
}
}
void main(void)
{
IT0=1;//下降沿触发中断
EX0=1; //允许中断0 外部中断
EA=1; //中断总开关
ZD=0;
P2=0xFF;
while(1)
{
P0=0XFF; //确保熄灭
P1=0XFF;
if(KEY==0)//按键检测
{
Delay(10000);
if(KEY==0);
AJ++;
}
if(AJ>3)AJ=0;
}
}
/***中断执行程序***/
void E0in() interrupt 0
{
ZD=~ZD;
if(ZD==0)
{
ZDS++;
switch(AJ)
{
case 0:{display1();}break;
case 1:{display2();}break;
case 2:{display3();}break;
case 3:{display4();}break;
default:{display1();}
}
}
}。

相关文档
最新文档