单片机课程设计摇摇棒.docx
- 文档编号:8970950
- 上传时间:2023-05-16
- 格式:DOCX
- 页数:14
- 大小:195.20KB
单片机课程设计摇摇棒.docx
《单片机课程设计摇摇棒.docx》由会员分享,可在线阅读,更多相关《单片机课程设计摇摇棒.docx(14页珍藏版)》请在冰点文库上搜索。
单片机课程设计摇摇棒
1.绪论
随着科技的日益发展,电子技术也慢慢伸展到了生活的各个领域,娱乐类也不例外。
遥控小车、遥控飞机、街机等无不与电子技术分不开。
而这些产品在强大的电子技术支持下,在与传统玩具比较时显示出了他强大的吸引力和竞争力。
就算是很小的会发光的电子小狗也很受欢迎。
霓虹灯算是很常见的电子产品了,如果将霓虹灯拿在手上将会是什么感觉?
于是一种新的产品诞生了——摇摇棒。
它可以在产品所进过区域显示出一派字幕,流光溢彩,饶有趣味。
本设计是基于单片机制作的一款自动切换字幕的梦幻摇摇棒。
摇摇棒是利用视觉暂留效应设计出来的,物体在快速运动时,当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,这种现象被称为视觉暂留现象。
假设我们设定我们的眼睛的暂留时间是0.4秒,如果我们的16个LED来回摇摆的时间快过0.4秒,那么我们看到的图像就是这一列LED在各个位置显示的图像的叠加.16只LED发光管作为画面每一列的显示,左右摇晃起到了扫描的作用,人眼的视觉暂留现象使得看到的是一幅完整的画面。
与LED点阵的显示有几分相仿。
水银开关的作用:
棒在摇动时,只能在朝某一方向摇动时显示,否则会出现镜像字或镜像画面,所以通过接一只水银开关来控制,使摇摇棒从左向右摇动时将内容显示出来。
由此可以实现手持霓虹的功能。
设计的目的
1.进一步掌握电子产品设计方法与流程。
2.掌握单片机硬件与软件的设计。
3.加强C语言程序编写能力。
设计要求
1.由左到右单向显示四种不同的字幕。
2.每个字幕显示10次,并要求字幕每10次自动切换至下一字幕。
2.摇摇棒原理与硬件介绍
2.1.基本原理与硬件电路设计
摇摇棒是利用视觉暂留效应设计出来的,物体在快速运动时,当人眼所看到的影像消失后,人眼仍能继续保留其影像0.1-0.4秒左右的图像,这种现象被称为视觉暂留现象。
是人眼具有的一种性质。
人眼观看物体时,成像于视网膜上,并由视神经输入人脑,感觉到物体的像。
但当物体移去时,视神经对物体的印象不会立即消失,而要延续0.1-0.4秒的时间,人眼的这种性质被称为“眼睛的视觉暂留”。
假设我们设定我们的眼睛的暂留时间是0.4秒,如果我们的16个LED来回摇摆的时间快过0.4秒,那么我们看到的图像就是这一列LED在各个位置显示的图像的叠加.16只LED发光管作为画面每一列的显示,左右摇晃起到了扫描的作用,人眼的视觉暂留现象使得看到的是一幅完整的画面。
与LED点阵的显示有几分相仿。
硬件电路如图2.1。
系统电源VCC为5V,下载程序和调试时一定要保证5V电压,实际使用时用2节纽扣电池串联6V即可。
STC89C52单片机作为控制器,在它的P1、P2口接有16只以共阳的方式连接的高亮度LED,由单片机输出低电平点亮。
水银开关的作用:
棒在摇动时,只能在朝某一方向摇动时显示,否则会出现镜像字或镜像画面,所以通过接一只水银开关来控制,使摇摇棒从左向右摇动时将内容显示出来。
图2.1总电路图
2.2.单元电路设计说明
单片机控制系统:
单片机以其集成度高、功能强、可靠性高、体积小、功耗低、价格廉、使用灵活等一系列优点得到迅速的发展,渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。
导弹的导航装置,飞机上各种仪表的控制,计算机的网络通讯与数据传输,工业自动化过程的实时控制和数据处理,广泛使用的各种智能IC卡,民用豪华轿车的安全保障系统等,这些都离不开单片机。
此次设计主要采用的STC89C52RC单片机为主控单元。
如电路图1.2。
图2.2单片机系统
水银开关电路:
在水银开关断开时,由于上拉电阻R19的作用外部中断1为高电平,水银开关接通以后为低电平,产生下降沿引起中断。
水银开关的作用:
棒在摇动时,只能在朝某一方向摇动时显示,否则会出现镜像字或镜像画面,所以通过接一只水银开关来控制,使摇摇棒从左向右摇动时将内容显示出来。
电路如图1.3.
图2.3水银开关电路
LED显示电路:
16个LED来回摇摆的时间快过0.4秒,那么我们看到的图像就是这一列LED在各个位置显示的图像的叠加.16只LED发光管作为画面每一列的显示,左右摇晃起到了扫描的作用,人眼的视觉暂留现象使得看到的是一幅完整的画面。
与LED点阵的显示有几分相仿。
电路如图2.4.
图2.4LED电路
3.程序设计
3.1程序说明
先在单片机中存储好四个字幕代码数组,每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)。
中断之后中断次数pic加一,再判断pic在哪个数值区间来规定字幕出现顺序。
我规定0~20为字幕一;21~40为字幕二,以此类推。
然后延时一段时间好让字幕出现在屏幕中间。
在将字幕代码分别送给P1、P2,延时一段时间后送第2次。
如此往复在摇摇棒进过区域形成一个64*16的点阵屏。
实现显示效果。
3.2程序代码
#include
#include
/**********************************************************
程序名称:
LED摇摇棒显示64*16像素
简要说明:
外部中断方式INT0显示;取模方式:
纵向取模、字节倒序
最后更新:
11/11/08
**********************************************************/
#defineucharunsignedchar
#defineuintunsignedint//宏定义
ucharKY;//KY作用在后面说明
ucharwave;//字幕状态
ucharpic=0,num=0;//pic为按键次数;num为中断次数
ucharcodelove[]={
/*天*/
0x00,0x00,0x00,0x80,0x40,0x40,0x42,0x60,
0x42,0x30,0x42,0x1C,0x42,0x0F,0xFE,0x03,
0xFE,0x00,0xC2,0x03,0x42,0x0E,0x42,0x38,
0x43,0x70,0x62,0x60,0x40,0xC0,0x00,0x40,
/*道*/
0x00,0x00,0x21,0x40,0x26,0xC0,0xE6,0x7F,
0xF0,0x3F,0x20,0x60,0x04,0xC0,0xF5,0xDF,
0xE7,0xCF,0xBE,0xCA,0xAC,0xCA,0xA6,0xCA,
0xA7,0xCA,0xE5,0xDF,0xF6,0xCF,0x24,0x40,
/*酬*/
0x00,0x00,0xFA,0xFF,0x12,0x54,0xFE,0x57,
0x12,0x50,0xFE,0x57,0x13,0xD4,0xFA,0x7F,
0x60,0x80,0xFF,0x7F,0xFE,0x3F,0xC0,0x00,
0xFE,0x1F,0x60,0x00,0xFF,0xFF,0xFE,0x7F,
/*勤*/
0x00,0x00,0x84,0x83,0xBF,0xAB,0x9F,0xAA,
0xF4,0xFF,0xD4,0xFF,0x9F,0xAA,0xBF,0x8B,
0xC4,0x83,0x10,0x40,0xFF,0x3F,0xFE,0x5F,
0x10,0xC0,0xF0,0x7F,0xF8,0x3F,0x10,0x00
};
ucharcodeloveyou[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x78,0x00,0xFC,0x00,0xFE,0x01,0xFE,0x03,0xFE,0x07,0xFE,0x0F,0xFE,0x1F,0xFC,0x3F,
0xF8,0x7F,0xFC,0x3F,0xFE,0x1F,0xFE,0x0F,0xFE,0x07,0xFE,0x03,0xFE,0x01,0xFC,0x00,
0x78,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*心形图案*/
};
ucharcodehehe[]={
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,
0xF0,0x0F,0x08,0x10,0x04,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00,
0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x20,
0x00,0x20,0x00,0x20,0x00,0x20,0x00,0x00,0x00,0x00,0xF0,0x3F,0x08,0x00,0x04,0x00,
0x04,0x00,0x04,0x00,0x08,0x00,0xF0,0x3F,0x00,0x00,0x00,0x00,0x04,0x20,0x08,0x10,
0xF0,0x0F,0x00,0x00,0x00,0x00,0xC0,0x01,0x40,0x01,0xC0,0x01,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*呵呵o(∩_∩)o图案*/
};
unsignedcharcodehanzi[]={
/*电*/
0x00,0x00,0x00,0x00,0xF8,0x0F,0xF0,0x07,
0x90,0x04,0x90,0x04,0x90,0x04,0xFF,0x7F,
0xFE,0xFF,0x90,0xC4,0x90,0xC4,0x90,0xC4,
0xF0,0xCF,0xF8,0xC7,0x10,0xF0,0x00,0x40,
/*信*/
0x00,0x00,0x80,0x00,0x60,0x00,0xF8,0xFF,
0xEF,0x7F,0x06,0x00,0x04,0x00,0xA4,0xFE,
0xA4,0x7C,0xA7,0x44,0xA6,0x44,0xA4,0x44,
0xB4,0xFC,0xA4,0x7E,0x06,0x04,0x04,0x00,
/*09*/
0x00,0x00,0xFC,0x3F,0xFC,0x3F,0x02,0x40,
0x02,0x40,0x02,0x40,0xFC,0x3F,0xFC,0x3F,
0x00,0x00,0xFC,0x30,0xFC,0x71,0x02,0x41,
0x02,0x41,0xFC,0x41,0xFC,0x3F,0x00,0x00,
/*02*/
0x00,0x00,0xFC,0x3F,0xFC,0x3F,0x02,0x40,
0x02,0x40,0x02,0x40,0xFC,0x3F,0xFC,0x3F,
0x00,0x00,0x3C,0x70,0x3C,0x78,0x02,0x4C,
0x02,0x46,0xFC,0x43,0xFC,0x71,0x00,0x00
};
/*****函数声明*****/
voiddisplay1(void);
voiddisplay2(void);
voiddisplay3(void);
voiddisplay4(void);
/*****n(us)延时子程序*****/
voidDelayUs(uintN)
{
uintx;
for(x=0;x<=N;x++);
}
/*****中断服务程序*****/
voidintersvr0(void)interrupt0using1
{
KY=~KY;//每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)
if(KY==0)//初始值为0,每一次翻转一次,两次只相应一次
{pic++;
if(pic==80)
pic=0;
if(pic<=20)wave=0;
elseif(pic<=40)wave=1;
elseif(pic<=60)wave=2;
elseif(pic<=80)wave=3;
switch(wave)//选择画面初始值为0
{
case0:
{display1();}break;
case1:
{display2();}break;
case2:
{display3();}break;
case3:
{display4();}break;
default:
{display1();}//特殊情况显示画面一
}
}
}
/*****显示子程序1(电信0902)*****/
voiddisplay1(void)
{
uchari;
DelayUs(4000);
for(i=0;i<64;i++){
P1=~hanzi[i*2];
P2=~hanzi[i*2+1];
DelayUs(90);}
}
/*****显示子程序2(天道酬勤)*****/
voiddisplay2(void)
{
uchari;
DelayUs(4000);
for(i=0;i<64;i++)
{
P1=~love[i*2];
P2=~love[i*2+1];
DelayUs(90);;
}
}
/*****显示子程序3(心形图案)*****/
voiddisplay3(void)
{
uchari;
DelayUs(4000);
for(i=0;i<64;i++)
{
P1=~loveyou[i*2];
P2=~loveyou[i*2+1];
DelayUs(90);;
}
}
/*****显示子程序4(呵呵o(∩_∩)o图案)*****/
voiddisplay4(void)
{
uchari;
DelayUs(4000);
for(i=0;i<64;i++)
{
P1=~hehe[i*2];
P2=~hehe[i*2+1];
DelayUs(90);;
}
}
/*****主函数*****/
voidmain(void)
{
IT0=1;
EX0=1;
EA=1;//开中断,下降沿中断
KY=0;
while
(1)
{
;
}
}
/*****END*****/
4.PCB设计与实物
4.1.PCB设计
为了便于携带我们规定板材尺寸为2cm*20cm。
PCB如图4.1.
图4.1PCB设计
4.2.实物和效果图
图4.2实物图
图4.3字幕1——电信0902图4.4字幕2——天道酬勤
5.设计体会
本设计目的是对自己在大学的所学进行一次总结。
这个课题包含了模拟电路、单片机最小系统和单片机程序设计三个部分。
要求熟悉C51单片机、水银开关工作原理,分析与设计电路控制方法。
这对我们来说是一个考验,也考验说是一次挑战自己的机会,可以认清自己到底学会了多少。
虽然我的设计还不成熟,略显简单,但在整个设计过程中使我对专业知识有了更深入的学习。
在这次课程设计中我发现,理论水平的提高能够将课本知识与实践相整合,理论知识服务于教学实践,以增强自己的动手能力。
这个实训十分有意义,我获得很深刻的经验。
通过这次课程设计,我们知道了理论和实际的距离,也知道了理论和实际想结合的重要性,也从中得知了很多书本上无法得知的知识。
课程的学习要对书本上的内容和问题的解决有个方向。
理论和实际教学中的实际问题为目的,还要以实践相结合,理论问题即实践课题,解决问题即课题研究,其实自己就是一个专家,通过自己的手来解决问题比用脑子解决问题更加深刻。
学习就应该采取理论与实践结合的方式,理论的问题也就是实践性的课题。
这种做法既有助于完成理论知识的巩固,又有助于带动实践,解决实际问题,加强我们的动手能力和解决问题的能力。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 摇摇