最近刚结束旋转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按下会切换运行状态
- /**************************************************************************************
- *Name:旋转LED
- *Version:1.0
- *Date:
- *BY:C
- ***************************************************************************************/
- #include <reg52.h> //此文件中定义了单片机的一些特殊功能寄存器
- typedef unsigned int uint; //对数据类型进行声明定义
- typedef unsigned char uchar;
- sbit HR_Sensor = P3^2; //霍尔传感器
- sbit Beep = P2^0; //蜂鸣器
- sbit Key_Wake = P2^1; //唤醒按键
- sbit Led_H = P0; //所有Led正极接一起接VCC
- sbit Led_L = P1;
- uchar Select = 0;
- //阳码
- uchar code ASCII0[32] = {0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x00,0xFE,0xFD,0xFE,0x7B,0xFA,
- 0xB7,0xF6,0xDF,0xEE,0xEF,0xDE,0xF7,0xBE,0xFB,0xFE,0xFB,0xFE,0xFD,0xFE,0xFD,
- 0xFF,0xFF}; //“长”
- uchar code ASCII1[32] = {0xFD,0xDF,0xDD,0xDF,0xD5,0xBF,0xD5,0x7F,0xD4,0x80,0xD5,0xB6,0xD1,0xB6,0x05,
- 0xB6,0xD5,0xB6,0xD5,0xB6,0xD4,0x80,0xD5,0x7F,0xD5,0xBF,0xDD,0xDF,0xFD,0xDF,
- 0xFF,0xFF}; // “春”
- uchar code ASCII2[32] = {0xDF,0xFB,0xDE,0xF9,0xDE,0xFB,0xC0,0x07,0xDE,0xF7,0xDE,0xF7,0xFF,0xFD,0x80,
- 0xDD,0xB6,0xDD,0xB6,0xDD,0x80,0x01,0xB6,0xDD,0xB6,0xDD,0x80,0xDD,0xFF,0xFD,
- 0xFF,0xFF}; //“理”
- uchar code ASCII3[32] = {0xFF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xC0,
- 0x03,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xFF,0xFB,
- 0xFF,0xFF}; //“工”
- uchar code ASCII4[32] = {0xFB,0xFE,0xFB,0xFE,0xFB,0xFD,0xFB,0xFB,0xFB,0xF7,0xFB,0xCF,0xFB,0x3F,0x00,
- 0xFF,0xFB,0x3F,0xFB,0xCF,0xFB,0xF7,0xFB,0xFB,0xFB,0xFD,0xFB,0xFE,0xFB,0xFE,
- 0xFF,0xFF}; //“大”
- uchar code ASCII5[32] = {0xFD,0xDF,0xF3,0xDF,0x77,0xDF,0x96,0xDF,0xF6,0xDF,0xF6,0xDD,0x76,0xDE,0x96,
- 0x81,0xF6,0x9F,0xF6,0x5F,0xE6,0xDF,0xD7,0xDF,0x37,0xDF,0xF5,0xDF,0xF3,0xDF,
- 0xFF,0xFF}; //“学”
- /*******************************************************************************
- * 函 数 名 : delayxms
- * 函数功能 : 延时函数
- * 输入 :
- * 输出 :
- *******************************************************************************/
- void Delayxms(uint xms)
- {
- uchar a = 0,b = 0;
- uint i = 0;
-
- for(i=xms;i>0;i--)
- {
- for(b=199;b>0;b--)
- for(a=1;a>0;a--)
- ;
- }
- }
- /*******************************************************************************
- * 函 数 名 : delayxms
- * 函数功能 : 延时函数
- * 输入 :
- * 输出 :
- *******************************************************************************/
- void Beep_Test(uint xms)
- {
- Beep = 1;
- Delayxms(xms);
- Beep = 0;
- }
- /*******************************************************************************
- * 函 数 名 : Key_Scan
- * 函数功能 : 延时函数
- * 输入 :
- * 输出 :
- *******************************************************************************/
- void Key_Scan()
- {
- if(Key_Wake==0)
- {
- Delayxms(12);
- if(Key_Wake==0)
- {
- Beep_Test(200);
- Select++;
- if(Select>1)
- {
- Select = 0; //清零
- }
- }
- }
- }
-
- /*******************************************************************************
- * 函 数 名 : Int0_Init()
- * 函数功能 : 设置外部中断0
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Int0_Init()
- {
- IT0 = 1;//跳变沿出发方式(下降沿)
- EX0 = 1;//打开INT0的中断允许。
- EA = 1;//打开总中断
- }
- void main()
- {
- uchar i,j;
-
- Int0_Init(); //打开外部中断0
- Beep_Test(1000); //启动测试
- P0 = 0X00; //全亮测试
- P1 = 0X00;
- Delayxms(3000);
-
- while(1)
- {
- Key_Scan();
- if(Select==0)//显示字符
- {
- for(i=0;i<6;i++)
- {
- switch(i)
- {
- case 0: //第一个字
- {
- for(j=0;j<31;j++)
- {
- P0 = ASCII0[j];
- P1 = ASCII0[j+1];
- }
- break;
- }
-
- case 1: //第二个字
- {
- for(j=0;j<31;j++)
- {
- P0 = ASCII1[j];
- P1 = ASCII1[j+1];
- }
- break;
- }
-
- case 2:
- {
- for(j=0;j<31;j++)
- {
- P0 = ASCII2[j];
- P1 = ASCII2[j+1];
- }
- break;
- }
-
- case 3:
- {
- for(j=0;j<31;j++)
- {
- P0 = ASCII3[j];
- P1 = ASCII3[j+1];
- }
- break;
- }
-
- case 4:
- {
- for(j=0;j<31;j++)
- {
- P0 = ASCII4[j];
- P1 = ASCII4[j+1];
- }
- break;
- }
-
- case 5:
- {
- for(j=0;j<31;j++)
- {
- P0 = ASCII5[j];
- P1 = ASCII5[j+1];
- }
- break;
- }
- }
- }
- }
-
- if(Select==1) //待机模式
- {
- P0 = 0;
- P1 = 0;
- }
-
- }
-
- }
- /*******************************************************************************
- * 函 数 名 : Int0() interrupt 0
- * 函数功能 : 外部中断0的中断函数
- * 输 入 : 无
- * 输 出 : 无
- *******************************************************************************/
- void Int0() interrupt 0 //外部中断0的中断函数
- {
- P0 = 0XFF; //消影
- P1 = 0XFF;
- }
复制代码 |