找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3966|回复: 7
打印 上一主题 下一主题
收起左侧

基于单片机POV的旋转LED灯程序

[复制链接]
跳转到指定楼层
楼主
最近刚结束旋转LED灯的设计,先来说说什么是POV:
视觉暂留(POV)即视觉的短暂停留。人眼观看物体时,物体的像会成到视网膜上。视网膜上的光感细胞将光信号转换为生物电信号通过视神经传给大脑。然而,当物体移去后,视神经对物体的印象不会立刻消失。现代医学已经证明,人眼看到一个物体后,在1/24秒内不会消失。这种现象叫做视觉暂留,也叫人眼的惰性。这种惰性会使人的视觉产生重叠,使物体“变静为动”.所以,以每秒超过24帧画面以上连续呈现静态画面时,我们会看到平滑连续的动态画面。

基于视觉暂留的旋转线阵LED显示屏指的是利用人眼的视觉暂留效应[1],通过机械扫描的方式让一列线阵LED在正确的位置上使特定的LED发光而形成图形、文字等的一种显示屏。按其机械结构,旋转线阵LED显示屏主要有圆形[2~3]和圆柱面两种基本类型(另外还有球形、漏斗形等显示屏,它们实质上只是圆柱形显示屏的一种特例)。
设计采用2块89C52单片机,一块用于减速电机控制,另一块用于LED显示扫描,废话不多说,先上proteusLED部分原理图:


接下来是proteus电机控制部分

整个项目包括原理图和程序都在压缩包,个人认为作为51单片机练手项目挺合适,希望大家指正。
贴一部分程序:

1、接线说明
sbit HR_Sensor  = P3^2;   //接一个固定脉冲(原本是霍尔传感器)
sbit Beep = P2^0;         //蜂鸣器 NPN三极管开关电路
sbit Key_Wake = P2^1;     //停止开启切开关换  按键以这个命名
sbit Led_H = P0;          //P0、P1口各接8个LED灯(记得串接1K分压电阻)
sbit Led_L = P1;

2、Key_Wake按下会切换运行状态
  1. /**************************************************************************************
  2. *Name:旋转LED
  3. *Version:1.0
  4. *Date:
  5. *BY:C
  6. ***************************************************************************************/
  7. #include <reg52.h>                            //此文件中定义了单片机的一些特殊功能寄存器

  8. typedef unsigned int uint;           //对数据类型进行声明定义
  9. typedef unsigned char uchar;

  10. sbit HR_Sensor  = P3^2;   //霍尔传感器
  11. sbit Beep = P2^0;         //蜂鸣器
  12. sbit Key_Wake = P2^1;     //唤醒按键
  13. sbit Led_H = P0;          //所有Led正极接一起接VCC
  14. sbit Led_L = P1;

  15. uchar Select = 0;

  16. //阳码
  17. uchar code ASCII0[32] = {0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x00,0xFE,0xFD,0xFE,0x7B,0xFA,
  18.                          0xB7,0xF6,0xDF,0xEE,0xEF,0xDE,0xF7,0xBE,0xFB,0xFE,0xFB,0xFE,0xFD,0xFE,0xFD,
  19.                          0xFF,0xFF};   //“长”

  20. uchar code ASCII1[32] = {0xFD,0xDF,0xDD,0xDF,0xD5,0xBF,0xD5,0x7F,0xD4,0x80,0xD5,0xB6,0xD1,0xB6,0x05,
  21.                          0xB6,0xD5,0xB6,0xD5,0xB6,0xD4,0x80,0xD5,0x7F,0xD5,0xBF,0xDD,0xDF,0xFD,0xDF,
  22.                          0xFF,0xFF};    // “春”

  23. uchar code ASCII2[32] = {0xDF,0xFB,0xDE,0xF9,0xDE,0xFB,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,0xFF,0xFD,0x80,
  24.                          0xDD,0xB6,0xDD,0xB6,0xDD,0x80,0x01,0xB6,0xDD,0xB6,0xDD,0x80,0xDD,0xFF,0xFD,
  25.                          0xFF,0xFF};   //“理”

  26. uchar code ASCII3[32] = {0xFF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xC0,
  27.                          0x03,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xFF,0xFB,
  28.                          0xFF,0xFF};   //“工”

  29. uchar code ASCII4[32] = {0xFB,0xFE,0xFB,0xFE,0xFB,0xFD,0xFB,0xFB,0xFB,0xF7,0xFB,0xCF,0xFB,0x3F,0x00,
  30.                          0xFF,0xFB,0x3F,0xFB,0xCF,0xFB,0xF7,0xFB,0xFB,0xFB,0xFD,0xFB,0xFE,0xFB,0xFE,
  31.                          0xFF,0xFF};   //“大”

  32. uchar code ASCII5[32] = {0xFD,0xDF,0xF3,0xDF,0x77,0xDF,0x96,0xDF,0xF6,0xDF,0xF6,0xDD,0x76,0xDE,0x96,
  33.                          0x81,0xF6,0x9F,0xF6,0x5F,0xE6,0xDF,0xD7,0xDF,0x37,0xDF,0xF5,0xDF,0xF3,0xDF,
  34.                          0xFF,0xFF};   //“学”



  35. /*******************************************************************************
  36. * 函 数 名         : delayxms
  37. * 函数功能                     : 延时函数
  38. * 输入             :
  39. * 输出             :
  40. *******************************************************************************/
  41. void Delayxms(uint xms)
  42. {
  43.          uchar a = 0,b = 0;
  44.          uint i = 0;
  45.         
  46.    for(i=xms;i>0;i--)
  47.         {
  48.                  for(b=199;b>0;b--)
  49.                                         for(a=1;a>0;a--)
  50.                                     ;
  51.         }
  52. }

  53. /*******************************************************************************
  54. * 函 数 名         : delayxms
  55. * 函数功能                     : 延时函数
  56. * 输入             :
  57. * 输出             :
  58. *******************************************************************************/
  59. void Beep_Test(uint xms)
  60. {
  61.         Beep = 1;
  62.         Delayxms(xms);
  63.         Beep = 0;
  64. }

  65. /*******************************************************************************
  66. * 函 数 名         : Key_Scan
  67. * 函数功能                     : 延时函数
  68. * 输入             :
  69. * 输出             :
  70. *******************************************************************************/
  71. void Key_Scan()
  72. {
  73.         if(Key_Wake==0)
  74.         {
  75.                 Delayxms(12);
  76.                 if(Key_Wake==0)
  77.                 {
  78.                         Beep_Test(200);
  79.                   Select++;
  80.                         if(Select>1)
  81.                         {
  82.                                 Select = 0;     //清零
  83.                         }
  84.                 }
  85.         }
  86. }

  87. /*******************************************************************************
  88. * 函 数 名         : Int0_Init()
  89. * 函数功能                     : 设置外部中断0
  90. * 输    入         : 无
  91. * 输    出         : 无
  92. *******************************************************************************/
  93. void Int0_Init()
  94. {
  95.         IT0 = 1;//跳变沿出发方式(下降沿)
  96.         EX0 = 1;//打开INT0的中断允许。        
  97.         EA = 1;//打开总中断        
  98. }


  99. void main()
  100. {        
  101.         uchar i,j;
  102.         
  103.         Int0_Init();    //打开外部中断0
  104.         Beep_Test(1000); //启动测试
  105.         P0 = 0X00;      //全亮测试
  106.         P1 = 0X00;
  107.         Delayxms(3000);
  108.         
  109.         while(1)
  110.         {
  111.                  Key_Scan();
  112.                  if(Select==0)//显示字符
  113.                 {
  114.                         for(i=0;i<6;i++)
  115.                         {
  116.                                 switch(i)
  117.                                 {
  118.                                         case 0:    //第一个字
  119.                                         {
  120.                                                 for(j=0;j<31;j++)
  121.                                                 {
  122.                                                         P0 = ASCII0[j];
  123.                                                         P1 = ASCII0[j+1];
  124.                                                 }
  125.                                                 break;
  126.                                         }
  127.                                        
  128.                                         case 1:    //第二个字
  129.                                         {
  130.                                                 for(j=0;j<31;j++)
  131.                                                 {
  132.                                                         P0 = ASCII1[j];
  133.                                                         P1 = ASCII1[j+1];
  134.                                                 }
  135.                                                 break;
  136.                                         }
  137.                                 
  138.                                         case 2:   
  139.                                         {
  140.                                                 for(j=0;j<31;j++)
  141.                                                 {
  142.                                                         P0 = ASCII2[j];
  143.                                                         P1 = ASCII2[j+1];
  144.                                                 }
  145.                                                 break;
  146.                                         }
  147.                                        
  148.                                         case 3:   
  149.                                         {
  150.                                                 for(j=0;j<31;j++)
  151.                                                 {
  152.                                                         P0 = ASCII3[j];
  153.                                                         P1 = ASCII3[j+1];
  154.                                                 }
  155.                                                 break;
  156.                                         }
  157.                                        
  158.                                         case 4:   
  159.                                         {
  160.                                                 for(j=0;j<31;j++)
  161.                                                 {
  162.                                                         P0 = ASCII4[j];
  163.                                                         P1 = ASCII4[j+1];
  164.                                                 }
  165.                                                 break;
  166.                                         }
  167.                                        
  168.                                         case 5:   
  169.                                         {
  170.                                                 for(j=0;j<31;j++)
  171.                                                 {
  172.                                                         P0 = ASCII5[j];
  173.                                                         P1 = ASCII5[j+1];
  174.                                                 }
  175.                                                 break;
  176.                                         }
  177.                                 }
  178.                         }
  179.                 }
  180.                         
  181.                 if(Select==1)      //待机模式
  182.                 {
  183.                         P0 = 0;     
  184.                         P1 = 0;               
  185.                 }
  186.                                        
  187.         }
  188.                
  189. }

  190. /*******************************************************************************
  191. * 函 数 名         : Int0()        interrupt 0
  192. * 函数功能                     : 外部中断0的中断函数
  193. * 输    入         : 无
  194. * 输    出         : 无
  195. *******************************************************************************/

  196. void Int0()        interrupt 0                //外部中断0的中断函数
  197. {
  198.         P0 = 0XFF;     //消影
  199.         P1 = 0XFF;
  200. }
复制代码

POV___LED.zip

2.69 MB, 下载次数: 31, 下载积分: 黑币 -5

里面只有源程序哦

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:328014 发表于 2020-5-14 03:41 | 只看该作者
好东东  仿真工程能分享一下吗?压缩包里面没有呢
回复

使用道具 举报

板凳
ID:752645 发表于 2020-5-15 15:53 | 只看该作者
包含proteus原理图么
回复

使用道具 举报

地板
ID:752645 发表于 2020-5-15 17:21 | 只看该作者
有仿真么,求大佬分享
回复

使用道具 举报

5#
ID:752645 发表于 2020-5-15 17:25 | 只看该作者
求分享仿真
回复

使用道具 举报

6#
ID:752645 发表于 2020-5-15 23:06 | 只看该作者
求助楼主呀,能给我个联系方式吗
回复

使用道具 举报

7#
ID:752645 发表于 2020-5-16 19:32 | 只看该作者
51hei团团 发表于 2020-5-14 03:41
好东东  仿真工程能分享一下吗?压缩包里面没有呢

我也想要仿真图,虽然不能进行仿真
回复

使用道具 举报

8#
ID:752645 发表于 2020-5-16 22:24 | 只看该作者
这个仿真的截图不太完整啊,求指导
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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