历史上的今天

今天是:2024年11月08日(星期五)

正在发生

2019年11月08日 | AT89S52单片机16LED摇摇棒设计

发布者:梦回归处 来源: 51hei关键字:AT89S52  单片机  LED摇摇棒 手机看文章 扫描二维码
随时随地手机看文章

一、作品说明    摇摇棒是如今流行的一种玩具,在各种聚会、节日中均见得到它的身影。本设计也追随着摇摇棒的原理,利用人眼的视觉暂留特性,通过AT89S52单片机对16只高亮度LED发光二极管进行控制, 配合手的左右摇晃就可呈现一幅完整的画面。 该摇摇棒具有如下功能:1) 显示  “欢迎使用神奇魔幻摇摇棒!”;2) 显示  “o(∩_∩)o”微笑图案;3) 显示    心形图案;4) 显示   “LOVE”;5) 可以通过开关实现转换,轮流显示并循环。     

二、系统总体设计
1、总体方案比较与论证所谓的“摇摇棒”,其实就是一个循环的LED显示,利用人的视觉滞留产生静态显示的现象。要实现这个目标,就要求延时部分做的比较小,所以采用石英晶体振荡器。而目前能够实现这种功能的器件有很多种,不同的类型的器件也能够很好的完成。本作品本着方便、价格低廉的原则,采用单片机控制,由水银开关的闭合对单片机产生外部中断,从而对中断进行采集。到达一定数量便进行图象的转换。整个系统由单片机控制模块,开关及电源模块和输出显示模块三个部分构成。2、主要部件原理   (1)单片机控制模块    用单片机想要控制LED显示只需要定时输出就可以,但每个人摇动的速度不一样,如何准确的并稳定的变换图案呢?这就需要用到外部中断。将水银开关的两个引脚一端接VCC,一端接GND,这样的话,当摇棒向一边运动时LED按照程序编辑好的规律显示,而向另一边运动时LED全灭,此时一个周期就会产生一个下跳沿的信号,信号传递给单片机的nINT0产生中断,对中断的数量计数,当计到10时便转换显示的图案,当依次显示完后便回到初始状态进行循环。由于人的视觉滞留时间长达0.1s,所以在每显示完一列LED后加入一段合适的延时,如5ms,每个字之间加入延时如15ms,这样,我们就能看到静态的稳定的字,并且每个字之间是有空隙的。为了让字能够在空间的中部显示,在启动中断显示后延时一段合适的时间,使棒在半圆轨迹的大约1/4处开始显示,这样看到的字方向上才比较正。 (2水银开关    水银开关,又称倾侧开关,是电路开关的一种,以一接著电极的小巧容器储存著一小滴水银,容器中多数注入惰性气体或真空。      仔细观察水银开关,实际上他是一个封闭的玻璃管,里面有两个分开着的导线和一段水银球,当玻璃管的平衡位置变化时,水银球会来回移动,当水银球移动到两根导线时,因水银是金属-导体,故电路变为通路,此时接收器处于工作状态;反之,水银球远离两根导线时为断路,此时接收器处于非工作状态。本设计采用震动开关代替水银开关,试验测试发现,水银开关多次高频率的接通断开后触点会氧化,容易接触不良,因此改用下面的震动开关。 

3、系统设计    本系统包括单片机控制模块,开关及电源模块和输出显示模块三个部分。单片机控制模块由Keil C进行编写,实现起来简单,主要有三部分,主程序、中断服务部分还有字符点阵。开关及电源模块采用5V变压器并配合水银开关使用。输出显示模块采用16个LED灯,在版上一字排开。      

三、硬件设计硬件连接上用水银开关产生的电平转换引发中断,传递给单片机,再由单片机调用点阵文件输出到LED上。AT89S52单片机作为控制器,在它的P0、P2口接有16只以共阳的方式连接的高亮度LED,由单片机输出低电平点亮。P0口处接上拉电阻RA1。串在LED公共端的二极管D1会产生一定的压降,用来保护LED。K1是画面切换开关,用于切换显示不同内容;S1为水银开关。系统电源VCC为5V,实际使用时用3节干电池串联4.5V即可。16只LED发光管作为画面每一列的显示,左右摇晃起到了扫描的作用,人眼的视觉暂留现象使得看到的是一幅完整的画面。水银开关的作用:棒在摇动时,只能在朝某一方向摇动时显示,否则会出现镜像字或镜像画面,所以通过接一只水银开关来控制,使摇摇棒从左向右摇动时将内容显示出来。 

四、软件设计软件部分包括主函数程序、中断服务程序、延时子程序以及四个显示子程序。软件设计流程如下:  五、系统调试与分析主要测试单片机的工作情况,能否正常用LED显示出各图案,并且记录各图案持续的时间和稳定显示度以及一个循环周期所用的时间。并且检查LED的发光亮度,使之可以明显的分辩出来。图    案稳定程序欢迎使用神奇魔幻摇摇棒较稳定心形较稳定笑脸较稳定LOVE较稳定经过测试,当摆动的幅度和速度适当时,各个画面均可以明显的显示出来。整体来说,本方案设计比较成功。

Altium Designer画的原理图和PCB图如下:
0.jpg0.png

单片机源程序如下:

#include

#define uchar unsigned char

#define uint unsigned int    //宏定义

sbit KEY=P1^0;

uchar KY;    //KY作用在后面说明     

uchar disp;     //显示汉字指针

uchar pic=0,num=0;     //pic为按键次数;num为中断次数



uchar code love[] = {


0x80,0x40,0x40,0x40,0x30,0x42,0x1E,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0xFF,0x7F,

0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x40,0x00,0x40,0x00,0x00,/*"生",0*/

/* (16 X 16 , 宋体 ) */


0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,

0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",1*/

/* (16 X 16 , 宋体 ) */


0x00,0x01,0xE0,0x00,0x00,0x00,0xFF,0xFF,0x10,0x00,0x20,0x81,0x08,0x41,0x08,0x31,

0x08,0x0D,0xFF,0x03,0x08,0x0D,0x08,0x31,0xF8,0x41,0x00,0x81,0x00,0x81,0x00,0x00,/*"快",2*/

/* (16 X 16 , 宋体 ) */


0x00,0x00,0x00,0x20,0xE0,0x10,0x9C,0x08,0x84,0x06,0x84,0x40,0x84,0x80,0xF4,0x7F,

0x82,0x00,0x82,0x00,0x83,0x02,0x82,0x04,0x80,0x08,0x80,0x30,0x00,0x00,0x00,0x00,/*"乐",3*/

/* (16 X 16 , 宋体 ) */







};



uchar code loveyou[] = {


0x00,0x08,0x08,0x08,0x88,0x08,0x88,0x08,0x89,0x08,0x8E,0x08,0x88,0x08,0xF8,0xFF,

0x88,0x08,0x8C,0x08,0x8B,0x08,0x88,0x08,0x88,0x08,0x08,0x08,0x00,0x08,0x00,0x00,/*"羊",0*/

/* (16 X 16 , 宋体 ) */


0x00,0x04,0x20,0x04,0x18,0x04,0xC7,0x07,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,

0xFC,0xFF,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,0x04,0x04,0x00,0x04,0x00,0x00,/*"年",1*/

/* (16 X 16 , 宋体 ) */


0x20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00,

0x20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/*"大",2*/

/* (16 X 16 , 宋体 ) */


0x08,0x00,0x08,0x00,0x88,0x00,0x88,0xFC,0x88,0x44,0x88,0x44,0x88,0x44,0xFF,0x44,

0x88,0x44,0x88,0x44,0x88,0x44,0x88,0xFC,0x88,0x00,0x08,0x00,0x08,0x00,0x00,0x00,/*"吉",3*/

/* (16 X 16 , 宋体 ) */




};


uchar code hehe[] = {

0x40,0x80,0x48,0x7E,0x48,0x10,0xFF,0x3F,0x48,0x44,0x48,0x44,0x00,0x40,0xF8,0x4F,

0x08,0x44,0x08,0x50,0xFF,0x49,0x08,0x46,0x89,0x49,0x6A,0x5C,0x00,0x40,0x00,0x00,/*"越",0*/

/* (16 X 16 , 宋体 ) */


0x00,0x21,0x08,0x21,0x08,0x11,0x28,0x11,0xC8,0x09,0x08,0x05,0x08,0x03,0xFF,0xFF,

0x08,0x03,0x08,0x05,0x88,0x09,0x68,0x11,0x08,0x11,0x08,0x21,0x00,0x21,0x00,0x00,/*"来",1*/

/* (16 X 16 , 宋体 ) */


0x40,0x80,0x48,0x7E,0x48,0x10,0xFF,0x3F,0x48,0x44,0x48,0x44,0x00,0x40,0xF8,0x4F,

0x08,0x44,0x08,0x50,0xFF,0x49,0x08,0x46,0x89,0x49,0x6A,0x5C,0x00,0x40,0x00,0x00,/*"越",2*/

/* (16 X 16 , 宋体 ) */


0x44,0x00,0x54,0xFF,0x54,0x15,0x7F,0x55,0x54,0x95,0x54,0x7F,0x44,0x00,0x00,0x80,

0xFE,0x63,0x02,0x1C,0xF2,0x03,0x02,0x7C,0x02,0x80,0xFE,0x83,0x00,0xE0,0x00,0x00,/*"靓",3*/

/* (16 X 16 , 宋体 ) */



};


unsigned char code hanzi[] = {



0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/

/* (8 X 16 , 宋体 ) */


0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,

0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/

/* (16 X 16 , 宋体 ) */

0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,

0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/

/* (16 X 16 , 宋体 ) */


0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,

0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/

/* (16 X 16 , 宋体 ) */


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/

/* (8 X 16 , 宋体 ) */

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/

/* (8 X 16 , 宋体 ) */


0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,

0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/

/* (16 X 16 , 宋体 ) */

0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,

0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/

/* (16 X 16 , 宋体 ) */


0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,

0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/

/* (16 X 16 , 宋体 ) */


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/

/* (8 X 16 , 宋体 ) */

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/

/* (8 X 16 , 宋体 ) */


0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,

0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/

/* (16 X 16 , 宋体 ) */

0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,

0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/

/* (16 X 16 , 宋体 ) */


0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,

0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/

/* (16 X 16 , 宋体 ) */


0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/

/* (8 X 16 , 宋体 ) */






};                                                                        


/*****函数声明*****/

void display1_ltor(void);

void display2_ltor(void);

void display2_rtol(void);

void display3(void);

void display4(void);







/*****n(us)延时子程序*****/

void DelayUs(uint N)

{

uint x;

for(x=0; x<=N;x++);

}


/*****中断服务程序*****/

void intersvr0(void) interrupt 0 

{

;

KY=~KY;      //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)

if(KY==0)

{

   num++;     //计算中断次数

   switch(pic)      //选择画面

   {

        case 0:{display1_ltor();}break;

    case 1:{display2_ltor();}break;

    case 2:{display3();}break;

    case 3:{display4();}break;

    default:{display1_ltor();}  

   }

}


}

/*****显示子程序1(汉字)*****/

void display1_ltor(void)

{

uchar i;

if(num>10){disp++;num=0;}     //12个汉字分为3次显示完(每次显示4个),每中断10次切换

if(disp>2)disp=0;

  DelayUs(5200);     //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可

for(i=0;i<64;i++)

{

     P0=~hanzi[disp*128+i*2];

     P2=~hanzi[disp*128+i*2+1];

     DelayUs(100);

}

}


/*****显示子程序2(LOVE)*****/

void display2_ltor(void)

{

uchar i;

DelayUs(4000);

for(i=0;i<64;i++) 

{

     P0=~love[i*2];

     P2=~love[i*2+1];

     DelayUs(140);

}

}

/*****显示子程序3(心形图案)*****/

void display3(void)

{

uchar i;

  DelayUs(4000);

for(i=0;i<64;i++)

{

     P0=~loveyou[i*2];

     P2=~loveyou[i*2+1];

     DelayUs(120);

}

}


/*****显示子程序4(呵呵o(∩_∩)o图案)*****/

void display4(void)

{

uchar i;

DelayUs(4000);

for(i=0;i<64;i++)

{

     P0=~hehe[i*2];

     P2=~hehe[i*2+1];

……………………



关键字:AT89S52  单片机  LED摇摇棒 引用地址:AT89S52单片机16LED摇摇棒设计

上一篇:TTP229触摸模块的51单片机驱动程序
下一篇:基于单片机PWM的直流电机调速系统+H桥驱动电路驱动原理图

推荐阅读

英媒称,曾有分析说,男性职业比女性职业更容易被自动化技术取代,因为女性较少从事那些低收入的体力劳动以及较少用人际沟通和创造技能的工作。人工智能时代,机器人能替人类承担繁重的体力劳动,可能会消除某些职业的性别差异。据BBC中文网11月2日报道,世界许多国家都面临人口老龄化的问题,日本尤甚。BBC商务记者贝尔顿(Padraig Belton)观察了日本建筑...
11月5日,以暴力测试闻名的科技视频制作者JerryRigEverything拿到了谷歌最新旗舰Pixel 4 XL,并虐待了一番。在屏幕划痕测试汇总,Pixel 4 XL正面玻璃在6级硬度的划痕测试出现了划痕,并在7级硬度下出现大量划痕,表现正常。Pixel 4 XL金属中框在美工刀下保持了不错的坚韧性,但表面喷漆很容易被刮了下来,需要注意的是其电源键是塑料材质。至于Pixel...
诺基亚近几年来确实希望在智能手机市场上卷土重来,但它尚未打入高端的旗舰市场。尽管有关诺基亚 9.3 PureView 的传言不断,但一份新报告显示,这款存疑的设备可能称为诺基亚 10 PureView,该设备已经处于测试阶段。根据 NokiaPowerUser 的报告,有消息称该公司即将推出的旗舰产品将被称为诺基亚 10 PureView。此外,该设备已经过测试,但仍处于...
这两天,看到蜂巢量产L600磷酸铁锂短刀片电池的消息,引发行业的关注和讨论,我也来讲讲我的理解,大家有什么想法也可以在弹幕上讨论下。 提到刀片,可能大家会首先想到比亚迪,但仔细看蜂巢能源的短刀片电池,会发现其实这个产品有很多独特的创新点,有着比较巧妙的应用场景考虑。我们一起来看下。1.首先,短刀片更便于布置电芯是造出来用的,不是比谁更...

史海拾趣

问答坊 | AI 解惑

调节阀

在化工生产中,调节阀是直接接触工艺介质的控制机构,本文以工程实际为背景,讨论了调节阀选型的原则,并介绍了在聚甲醛装置中应用调节阀的情况。 工艺简介 云南云天化股份有限公司的聚甲醛装置系国内第一套同类型装置,工艺包从波兰ZAT引进, ...…

查看全部问答∨

PADS Power-PCB中文教程!

这是一本难得的中文教程,详细介绍了该软件的使用方法和过程,是学习Power-PCB软件的好教材。…

查看全部问答∨

单片机判断交流电动机是否运行

我想用单片机判断  几个220V的交流电动机是否真的运行 或是关闭了  这个电路应该怎么实现   麻烦各位发表下自己的高见。…

查看全部问答∨

最牛的摄像机被烧成这个样子了!

长话短说,仓库内,2个摄像机12V 10A开关电源与CDMA视频服务器一起集中供电,CDMA无线传输,使用半年左右,最近发现没有图像。经检查是电源被烧毁,输出只有6.5V。于是更换电源(在更换电源钱检查过市电为AC230V左右,电源输出12.2V),没过3分钟, ...…

查看全部问答∨

RockBox on mini2440

My Mini2440 board just arrived. I did copy the file rockbox.mini2440 (the Rockbox firmware which I did build before) to .rockbox folder on SD Card. After inserted the SD Card and turned power on, and waited a few seconds, I had ...…

查看全部问答∨

一个通信方面的论坛

本帖最后由 paulhyde 于 2014-9-15 09:24 编辑 http://bbs.cnttr.com/?fromuid=488120  …

查看全部问答∨

红外线遥控如何该无线遥控

请教大家一个小问题,我有一个红外线遥控MP3 音箱,红外线遥控遇到什么障碍就不听使唤、遥控距离有限,就想把遥控改成无线的,可对无线不怎么董,想请大家帮帮忙。 我在网上找到带PT2272-M4编码器的遥控收发套件,这个能改吗? …

查看全部问答∨

给大家看一些资料(飞思卡尔产品中文信息)

飞思卡尔产品中文信息: 8 位微控制器与微处理器:http://www.freescale.com.cn/products/8BitMCU/Chinese_Information.asp 16位微控制器与微处理器:http://www.freescale.com.cn/products/16BitMCU/Chinese_Information.asp 68K/ColdFire:http: ...…

查看全部问答∨

我的程序总显示黑色,请帮帮我,谢谢。

我编写一个程序显示一个蓝色的矩形,在模拟器下正常实现了,可是到了ARM开发板下就成了黑色,换其他颜色也无效,请教高手是什么原因啊?我用到了SetBkColor( 这个函数好像没有用)。…

查看全部问答∨

wince 下用evc来写串口通信。

哪位大虾能发给我个串口通信的实例呀??最好用EVC写的。。感激涕零。\\ 我的邮箱6094189ye@163.com 我看到书上有CSerial 这个类,但STANDARDSDK下面没有这个类呀。。。???…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved