最近剛結束旋轉LED燈的設計,先來說說什么是POV:
視覺暫留(POV)即視覺的短暫停留。人眼觀看物體時,物體的像會成到視網膜上。視網膜上的光感細胞將光信號轉換為生物電信號通過視神經傳給大腦。然而,當物體移去后,視神經對物體的印象不會立刻消失。現代醫學已經證明,人眼看到一個物體后,在1/24秒內不會消失。這種現象叫做視覺暫留,也叫人眼的惰性。這種惰性會使人的視覺產生重疊,使物體“變靜為動”.所以,以每秒超過24幀畫面以上連續呈現靜態畫面時,我們會看到平滑連續的動態畫面。
基于視覺暫留的旋轉線陣LED顯示屏指的是利用人眼的視覺暫留效應[1],通過機械掃描的方式讓一列線陣LED在正確的位置上使特定的LED發光而形成圖形、文字等的一種顯示屏。按其機械結構,旋轉線陣LED顯示屏主要有圓形[2~3]和圓柱面兩種基本類型(另外還有球形、漏斗形等顯示屏,它們實質上只是圓柱形顯示屏的一種特例)。
設計采用2塊89C52單片機,一塊用于減速電機控制,另一塊用于LED顯示掃描,廢話不多說,先上proteusLED部分原理圖:
LED部分.PNG (197.01 KB, 下載次數: 54)
下載附件
2020-5-13 22:54 上傳
接下來是proteus電機控制部分
電機部分.PNG (95.51 KB, 下載次數: 55)
下載附件
2020-5-13 22:57 上傳
整個項目包括原理圖和程序都在壓縮包,個人認為作為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;
- }
復制代碼 |