找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7279|回复: 12
收起左侧

AT89S52单片机16LED摇摇棒设计(含pcb文件,源程序等)

  [复制链接]
ID:353519 发表于 2018-8-21 10:33 | 显示全部楼层 |阅读模式
一、作品说明    摇摇棒是如今流行的一种玩具,在各种聚会、节日中均见得到它的身影。本设计也追随着摇摇棒的原理,利用人眼的视觉暂留特性,通过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图如下:(51hei附件中可下载工程文件)
0.jpg 0.png 0.png

单片机源程序如下:
  1. #include <reg52.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int    //宏定义
  4. sbit KEY=P1^0;
  5. uchar KY;    //KY作用在后面说明     
  6. uchar disp;     //显示汉字指针
  7. uchar pic=0,num=0;     //pic为按键次数;num为中断次数


  8. uchar code love[] = {

  9. 0x80,0x40,0x40,0x40,0x30,0x42,0x1E,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0xFF,0x7F,
  10. 0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x42,0x10,0x40,0x00,0x40,0x00,0x00,/*"生",0*/
  11. /* (16 X 16 , 宋体 ) */

  12. 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFF,0x82,0x40,0x82,0x40,0x82,0x40,0x82,0x40,
  13. 0x82,0x40,0x82,0x40,0x82,0x40,0xFE,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"日",1*/
  14. /* (16 X 16 , 宋体 ) */

  15. 0x00,0x01,0xE0,0x00,0x00,0x00,0xFF,0xFF,0x10,0x00,0x20,0x81,0x08,0x41,0x08,0x31,
  16. 0x08,0x0D,0xFF,0x03,0x08,0x0D,0x08,0x31,0xF8,0x41,0x00,0x81,0x00,0x81,0x00,0x00,/*"快",2*/
  17. /* (16 X 16 , 宋体 ) */

  18. 0x00,0x00,0x00,0x20,0xE0,0x10,0x9C,0x08,0x84,0x06,0x84,0x40,0x84,0x80,0xF4,0x7F,
  19. 0x82,0x00,0x82,0x00,0x83,0x02,0x82,0x04,0x80,0x08,0x80,0x30,0x00,0x00,0x00,0x00,/*"乐",3*/
  20. /* (16 X 16 , 宋体 ) */






  21. };


  22. uchar code loveyou[] = {

  23. 0x00,0x08,0x08,0x08,0x88,0x08,0x88,0x08,0x89,0x08,0x8E,0x08,0x88,0x08,0xF8,0xFF,
  24. 0x88,0x08,0x8C,0x08,0x8B,0x08,0x88,0x08,0x88,0x08,0x08,0x08,0x00,0x08,0x00,0x00,/*"羊",0*/
  25. /* (16 X 16 , 宋体 ) */

  26. 0x00,0x04,0x20,0x04,0x18,0x04,0xC7,0x07,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,
  27. 0xFC,0xFF,0x44,0x04,0x44,0x04,0x44,0x04,0x44,0x04,0x04,0x04,0x00,0x04,0x00,0x00,/*"年",1*/
  28. /* (16 X 16 , 宋体 ) */

  29. 0x20,0x80,0x20,0x80,0x20,0x40,0x20,0x20,0x20,0x10,0x20,0x0C,0x20,0x03,0xFF,0x00,
  30. 0x20,0x03,0x20,0x0C,0x20,0x10,0x20,0x20,0x20,0x40,0x20,0x80,0x20,0x80,0x00,0x00,/*"大",2*/
  31. /* (16 X 16 , 宋体 ) */

  32. 0x08,0x00,0x08,0x00,0x88,0x00,0x88,0xFC,0x88,0x44,0x88,0x44,0x88,0x44,0xFF,0x44,
  33. 0x88,0x44,0x88,0x44,0x88,0x44,0x88,0xFC,0x88,0x00,0x08,0x00,0x08,0x00,0x00,0x00,/*"吉",3*/
  34. /* (16 X 16 , 宋体 ) */



  35. };

  36. uchar code hehe[] = {
  37. 0x40,0x80,0x48,0x7E,0x48,0x10,0xFF,0x3F,0x48,0x44,0x48,0x44,0x00,0x40,0xF8,0x4F,
  38. 0x08,0x44,0x08,0x50,0xFF,0x49,0x08,0x46,0x89,0x49,0x6A,0x5C,0x00,0x40,0x00,0x00,/*"越",0*/
  39. /* (16 X 16 , 宋体 ) */

  40. 0x00,0x21,0x08,0x21,0x08,0x11,0x28,0x11,0xC8,0x09,0x08,0x05,0x08,0x03,0xFF,0xFF,
  41. 0x08,0x03,0x08,0x05,0x88,0x09,0x68,0x11,0x08,0x11,0x08,0x21,0x00,0x21,0x00,0x00,/*"来",1*/
  42. /* (16 X 16 , 宋体 ) */

  43. 0x40,0x80,0x48,0x7E,0x48,0x10,0xFF,0x3F,0x48,0x44,0x48,0x44,0x00,0x40,0xF8,0x4F,
  44. 0x08,0x44,0x08,0x50,0xFF,0x49,0x08,0x46,0x89,0x49,0x6A,0x5C,0x00,0x40,0x00,0x00,/*"越",2*/
  45. /* (16 X 16 , 宋体 ) */

  46. 0x44,0x00,0x54,0xFF,0x54,0x15,0x7F,0x55,0x54,0x95,0x54,0x7F,0x44,0x00,0x00,0x80,
  47. 0xFE,0x63,0x02,0x1C,0xF2,0x03,0x02,0x7C,0x02,0x80,0xFE,0x83,0x00,0xE0,0x00,0x00,/*"靓",3*/
  48. /* (16 X 16 , 宋体 ) */


  49. };

  50. unsigned char code hanzi[] = {


  51. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  52. /* (8 X 16 , 宋体 ) */

  53. 0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,
  54. 0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/
  55. /* (16 X 16 , 宋体 ) */
  56. 0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,
  57. 0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/
  58. /* (16 X 16 , 宋体 ) */

  59. 0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,
  60. 0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/
  61. /* (16 X 16 , 宋体 ) */

  62. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/
  63. /* (8 X 16 , 宋体 ) */
  64. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  65. /* (8 X 16 , 宋体 ) */

  66. 0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,
  67. 0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/
  68. /* (16 X 16 , 宋体 ) */
  69. 0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,
  70. 0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/
  71. /* (16 X 16 , 宋体 ) */

  72. 0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,
  73. 0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/
  74. /* (16 X 16 , 宋体 ) */

  75. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/
  76. /* (8 X 16 , 宋体 ) */
  77. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",0*/
  78. /* (8 X 16 , 宋体 ) */

  79. 0x08,0x02,0x08,0x01,0x89,0x00,0xEE,0xFF,0x98,0x80,0x00,0x43,0x7E,0x20,0x42,0x18,
  80. 0xC2,0x07,0x42,0x00,0x42,0x00,0xC2,0x3F,0x42,0x40,0x7E,0x40,0x00,0x78,0x00,0x00,/*"祝",1*/
  81. /* (16 X 16 , 宋体 ) */
  82. 0x00,0x08,0x00,0x04,0x7F,0x02,0x55,0xFF,0xD5,0x55,0x55,0x55,0x7F,0x55,0x00,0x55,
  83. 0xFF,0x7F,0x55,0x55,0x55,0x55,0x55,0x55,0x7F,0x55,0x00,0x41,0x00,0x00,0x00,0x00,/*"瞿",2*/
  84. /* (16 X 16 , 宋体 ) */

  85. 0x82,0x00,0x62,0x00,0x2A,0xF8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xA8,0xFA,0xFB,
  86. 0x2A,0xA8,0xAA,0xAA,0xAF,0xAA,0xAA,0xAA,0x2A,0xF8,0xA2,0x00,0x62,0x00,0x00,0x00,/*"蕾",3*/
  87. /* (16 X 16 , 宋体 ) */

  88. 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*" ",4*/
  89. /* (8 X 16 , 宋体 ) */





  90. };                                                                        

  91. /*****函数声明*****/
  92. void display1_ltor(void);
  93. void display2_ltor(void);
  94. void display2_rtol(void);
  95. void display3(void);
  96. void display4(void);






  97. /*****n(us)延时子程序*****/
  98. void DelayUs(uint N)
  99. {
  100. uint x;
  101. for(x=0; x<=N;x++);
  102. }

  103. /*****中断服务程序*****/
  104. void intersvr0(void) interrupt 0
  105. {
  106. ;
  107. KY=~KY;      //每个摇动来回水银开关会在摆幅两端分别产生下降沿中断,只提取其中一次(从左向右摇才显示)
  108. if(KY==0)
  109. {
  110.    num++;     //计算中断次数
  111.    switch(pic)      //选择画面
  112.    {
  113.         case 0:{display1_ltor();}break;
  114.     case 1:{display2_ltor();}break;
  115.     case 2:{display3();}break;
  116.     case 3:{display4();}break;
  117.     default:{display1_ltor();}  
  118.    }
  119. }

  120. }
  121. /*****显示子程序1(汉字)*****/
  122. void display1_ltor(void)
  123. {
  124. uchar i;
  125. if(num>10){disp++;num=0;}     //12个汉字分为3次显示完(每次显示4个),每中断10次切换
  126. if(disp>2)disp=0;
  127.   DelayUs(5200);     //此处延时时间依各硬件差别而各不相同,试着调整使得显示内容居中即可
  128. for(i=0;i<64;i++)
  129. {
  130.      P0=~hanzi[disp*128+i*2];
  131.      P2=~hanzi[disp*128+i*2+1];
  132.      DelayUs(100);
  133. }
  134. }

  135. /*****显示子程序2(LOVE)*****/
  136. void display2_ltor(void)
  137. {
  138. uchar i;
  139. DelayUs(4000);
  140. for(i=0;i<64;i++)
  141. {
  142.      P0=~love[i*2];
  143.      P2=~love[i*2+1];
  144.      DelayUs(140);
  145. }
  146. }
  147. /*****显示子程序3(心形图案)*****/
  148. void display3(void)
  149. {
  150. uchar i;
  151.   DelayUs(4000);
  152. for(i=0;i<64;i++)
  153. {
  154.      P0=~loveyou[i*2];
  155.      P2=~loveyou[i*2+1];
  156.      DelayUs(120);
  157. }
  158. }

  159. /*****显示子程序4(呵呵o(∩_∩)o图案)*****/
  160. void display4(void)
  161. {
  162. uchar i;
  163. DelayUs(4000);
  164. for(i=0;i<64;i++)
  165. {
  166.      P0=~hehe[i*2];
  167.      P2=~hehe[i*2+1];
  168. ……………………

  169. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

0.png
所有资料51hei提供下载:
摇摇棒.rar (8.42 MB, 下载次数: 246)
回复

使用道具 举报

ID:84492 发表于 2019-1-29 17:24 | 显示全部楼层
很感谢,中断部分的说明
回复

使用道具 举报

ID:399411 发表于 2019-2-25 11:02 | 显示全部楼层
6666,正好需要这个,拿走了谢谢楼主
回复

使用道具 举报

ID:348441 发表于 2019-3-12 14:33 | 显示全部楼层
为什么下载了打不开
回复

使用道具 举报

ID:514128 发表于 2019-4-17 20:45 | 显示全部楼层
有没有仿真部分?不知怎么弄仿真
回复

使用道具 举报

ID:519743 发表于 2019-4-27 18:00 | 显示全部楼层
好东西,收藏了
回复

使用道具 举报

ID:451375 发表于 2019-11-7 22:27 | 显示全部楼层
好东西,收藏了 !!!
回复

使用道具 举报

ID:26429 发表于 2019-11-8 15:15 | 显示全部楼层
谢谢,拿走了,弄两个给孩子玩
回复

使用道具 举报

ID:653537 发表于 2019-12-1 15:03 | 显示全部楼层
上车啦谢谢老哥
回复

使用道具 举报

ID:655165 发表于 2019-12-6 13:45 | 显示全部楼层
好东西,值得看看
回复

使用道具 举报

ID:601184 发表于 2020-1-10 14:29 | 显示全部楼层
好人一生平安
回复

使用道具 举报

ID:206082 发表于 2020-3-8 21:33 | 显示全部楼层
非常感谢
回复

使用道具 举报

ID:693609 发表于 2020-3-8 21:44 | 显示全部楼层
感谢楼主
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表