单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

新年制作——激光投影POV

查看数: 1950 | 评论数: 16 | 收藏 11
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2019-2-4 21:26

正文摘要:

激光投影POV——不炫酷送黑币啊……记得是2017年的一时兴起开了这个坑,当时做出来了显示效果,然后因为学习就一直搁置。过了2年又是我的一时兴起,这次总算是把它做完了。 这个制作用的材料:1.   &nb ...

回复

王朗的诱惑 发表于 2019-8-11 22:45
youlianning 发表于 2019-8-4 10:20
还是有点不太理解原理呀,反光镜是如何做到将激光反射到正前方的墙上的呢?还是说是反射到激光背后的墙上。 ...

60度左右吧,不是正前,也不是正后。这个东西不能360度全显示的,确实会被挡住一部分竖线。
youlianning 发表于 2019-8-4 10:20
还是有点不太理解原理呀,反光镜是如何做到将激光反射到正前方的墙上的呢?还是说是反射到激光背后的墙上。但如果是背后的墙,则必有一条竖线无法显示。若正前方的墙,则无法理解光路。才疏学浅,请不吝赐教
565929732 发表于 2019-8-4 09:05
864168613 发表于 2019-3-2 13:06
能不能吧电路图画玩

可以的
864168613 发表于 2019-3-2 13:06
能不能吧电路图画玩
864168613 发表于 2019-3-1 20:56
Rebuild target 'Target 1'
compiling main.c...
D:\Keil_v5\C51\Inc\STC\STC15.h(16): error C231: 'ACC': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(17): error C231: 'B': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(18): error C231: 'PSW': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(19): error C231: 'CY': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(20): error C231: 'AC': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(21): error C231: 'F0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(22): error C231: 'RS1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(23): error C231: 'RS0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(24): error C231: 'OV': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(25): error C231: 'P': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(26): error C231: 'SP': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(27): error C231: 'DPL': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(28): error C231: 'DPH': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(31): error C231: 'P0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(40): error C231: 'P1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(49): error C231: 'P2': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(58): error C231: 'P3': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(121): error C231: 'PCON': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(131): error C231: 'IE': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(132): error C231: 'EA': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(135): error C231: 'ES': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(136): error C231: 'ET1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(137): error C231: 'EX1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(138): error C231: 'ET0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(139): error C231: 'EX0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(140): error C231: 'IP': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(144): error C231: 'PS': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(145): error C231: 'PT1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(146): error C231: 'PX1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(147): error C231: 'PT0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(148): error C231: 'PX0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(154): error C231: 'TCON': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(155): error C231: 'TF1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(156): error C231: 'TR1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(157): error C231: 'TF0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(158): error C231: 'TR0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(159): error C231: 'IE1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(160): error C231: 'IT1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(161): error C231: 'IE0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(162): error C231: 'IT0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(163): error C231: 'TMOD': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(164): error C231: 'TL0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(165): error C231: 'TL1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(166): error C231: 'TH0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(167): error C231: 'TH1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(181): error C231: 'SCON': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(182): error C231: 'SM0': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(183): error C231: 'SM1': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(184): error C231: 'SM2': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(185): error C231: 'REN': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(186): error C231: 'TB8': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(187): error C231: 'RB8': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(188): error C231: 'TI': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(189): error C231: 'RI': redefinition
D:\Keil_v5\C51\Inc\STC\STC15.h(190): error C231: 'SBUF': redefinition
compiling U8_PWM.c...
compiling display.c...
compiling Uart.c...
compiling eeprom.c...
Target not created.
Build Time Elapsed:  00:00:00


一运行就错误
王朗的诱惑 发表于 2019-2-21 11:20

对,能动的只有反光镜,光源不动。
快乐眼泪 发表于 2019-2-20 21:31
只有反光镜旋转吗
快乐眼泪 发表于 2019-2-20 21:26
感谢楼主分享!
王朗的诱惑 发表于 2019-2-17 09:35
Arvin0011 发表于 2019-2-15 17:16
东西感觉不错,不过我想说你真的很皮

啊哈哈哈哈哈哈~~~
qzyhlf 发表于 2019-2-16 17:01
感谢分享!
Arvin0011 发表于 2019-2-15 17:16
东西感觉不错,不过我想说你真的很皮
Tiansu_cxs 发表于 2019-2-8 17:40
感谢分享!
无效楼层,该帖已经被删除
starwaver 发表于 2019-2-5 14:04
不错,很好,精彩。
admin 发表于 2019-2-5 01:29
楼主的主程序如下:
  1. #include <STC15.h>
  2. #include <intrins.h>
  3. #include "main.h"
  4. #include "Uart.h"
  5. #include "U8_PWM.h"
  6. #include "display.h"
  7. #include "eeprom.h"

  8. typedef union
  9. {
  10.         u8 time8[2];
  11.         u16 time16;
  12. }TIME;

  13. volatile TIME t_speed;                //记录定时器值
  14. volatile u16 speed;                //反光镜转速 (调试用数据)
  15. volatile char t_count=0;//,d_count=0;                //转速, 显示 定时器溢出计数
  16. volatile u16 d_time = 25000;                        //点亮激光延时 初始化值用于第一次写EEPROM
  17. u8 speed_pwm = 80;                        //反光镜转速 用于控制PWM占空比 初始化值用于第一次写EEPROM

  18. void  delay_ms(unsigned char ms)
  19. {
  20.      unsigned int i;
  21.      do{
  22.           i = MAIN_Fosc / 13000;
  23.           while(--i)    ;
  24.      }while(--ms);
  25. }


  26. void Int0_Init(void)
  27. {
  28. //        EA = 1;
  29.         IT0 = 1;
  30.         EX0 = 1;
  31. }

  32. void Timer0_Init(void)                        //计算转速作为延时参考
  33. {
  34.     TMOD |= 0x01;                  
  35.     TL0 = (65536-1000)%256;               
  36.     TH0 = (65536-1000) >> 8;
  37. //    EA = 1;       
  38.     ET0 = 1;                  
  39. //        TR0 = 1;                    
  40. }

  41. void Timer1_Init(void)                        //外部中断后点亮激光延时
  42. {
  43.     TMOD |= 0x10;                  
  44.     TL1 = (65536-1000)%256;               
  45.     TH1 = (65536-1000) >> 8;
  46. //    EA = 1;       
  47.     ET1 = 1;                  
  48. //        TR1 = 1;                    
  49. }

  50. u8 Verify_Sum(u8 *DataInput, u16 len)//累加校验计算
  51. {
  52.         u8 sum=0;
  53.         u16 i;
  54.         for(i=0; i<len; i++)     //数据累加
  55.                 sum += DataInput[i];
  56.         return sum;
  57. }

  58. //整帧串口数据保存在UartRecvBuf[UARTRECVBUFSIZE]中
  59. //建议复制出来数据使用 防止处理过程中进串口接收中断丢失原始数据
  60. void UartDataRecv_Event(void)
  61. {
  62.         u8 i,j;
  63.         u16 Length;
  64.         xdata u8 datBuf[UARTRECVBUFSIZE];                //临时数据存储
  65.         xdata typePackage recvPackage;                                //接收数据包结构体
  66.         code s8 AckBuf[] = {0x01, 0x10, 0x00, 0x00, 0x00, 0x00};        //Ack数据包
  67.         s8 DatBuf[10] = {0x01, 0x03, 0x00, 0x00, 0x04};                //还有5个数据在下面赋值
  68.        
  69. //        Uart_SendByte(UartBytesToRead);
  70. //        Uart_SendByte(0x49);
  71.         for(Length=0; Length<UartBytesToRead; Length++)                //复制数据
  72.         {
  73.                 datBuf[Length] = UartRecvBuf[Length];
  74.         }
  75.        
  76.         if(datBuf[0] != 0x01) return;
  77.         Length = 6 + (u16)(datBuf[3]<<8 | datBuf[4]);   //计算数据总长度
  78.         if(Length != UartBytesToRead)                    //长度不对放弃数据
  79.         {
  80.                 return;
  81.         }

  82.         //装载数据
  83.         recvPackage.DeviceAddr = datBuf[0];
  84.         recvPackage.Function = datBuf[1];
  85.         recvPackage.Sequence = datBuf[2];
  86.         recvPackage.DataLength = (u16)(datBuf[3]<<8 | datBuf[4]);
  87.         recvPackage.Data = &datBuf[5];
  88.         recvPackage.Sum = datBuf[5 + recvPackage.DataLength];
  89.         if(recvPackage.Sum != Verify_Sum(recvPackage.Data, recvPackage.DataLength))        //数据校验
  90.                 return;

  91.         //SendAck
  92.         Uart_SendBuf(AckBuf, CountOfArray(AckBuf));
  93.        
  94. //        Uart_SendByte(recvPackage.Function);
  95.         switch(recvPackage.Function)               //帧功能判断
  96.         {
  97.                 case 0x01:
  98.                         //Dis_WriteBuf("DataReceived!");
  99.                         for(i=0; i<STRINGLEN; i++)                        //写显存
  100.                                 for(j=0; j<16; j++)
  101.                                         DisBuf[i][j] = recvPackage.Data[j + i*16];
  102.                         break;
  103.                 case 0x02:      //从机接收数据
  104.                         Dis_WriteBuf("Recv-Func-0x02");
  105.                         if(speed_pwm != recvPackage.Data[1])
  106.                         {
  107.                                 speed_pwm = recvPackage.Data[1];
  108.                                 Load_U8_PWM(speed_pwm);                //转速
  109.                                 IapEraseSector(IAP_ADDRESS_SPEED);                //EEPROM存储数据
  110.                                 IapProgramByte(IAP_ADDRESS_SPEED, speed_pwm);
  111.                         }
  112.                         if(d_time != (u16)(recvPackage.Data[2]<<8 | recvPackage.Data[3]))        //点亮延时
  113.                         {
  114.                                 d_time = (u16)(recvPackage.Data[2]<<8 | recvPackage.Data[3]);
  115.                                 IapEraseSector(IAP_ADDRESS_DELAY);                //EEPROM存储数据
  116.                                 IapProgramByte(IAP_ADDRESS_DELAY, recvPackage.Data[2]);
  117.                                 IapProgramByte(IAP_ADDRESS_DELAY+1, recvPackage.Data[3]);
  118.                         }
  119. //                        Uart_SendByte(0x33);
  120.                         break;
  121.                 case 0x03:      //主机请求数据
  122.                         Dis_WriteBuf("Recv-Func-0x03");
  123.                         delay_ms(15);                //隔断Ack和Dat两个数据包 避免上位机混淆
  124.                         DatBuf[5] = 0x00;        //装载数据
  125.                         DatBuf[6] = speed_pwm;
  126.                         DatBuf[7] = (u8)(d_time>>8);
  127.                         DatBuf[8] = (u8)d_time;
  128.                         DatBuf[9] = Verify_Sum(&DatBuf[5], 4);
  129.                         Uart_SendBuf(DatBuf, CountOfArray(DatBuf));
  130. //                        Uart_SendByte(0x49);
  131.                         break;
  132.                 default:        //未知功能帧
  133.                         return;
  134.         }
  135. }

  136. void main(void)
  137. {
  138.         u8 i;
  139.        
  140.         P1M0 = 0x00;
  141.         P1M1 = 0x00;
  142.         P2M0 = 0x00;
  143.         P2M1 = 0x00;
  144. //        UartFuncPtr = UartDataRecv_Event;                //注册串口数据处理函数
  145.        
  146.         EA = 1;
  147.        
  148. //第一次写EEPROM时使用此代码
  149. //        IapEraseSector(IAP_ADDRESS_SPEED);                //EEPROM存储数据
  150. //        IapProgramByte(IAP_ADDRESS_SPEED, speed_pwm);
  151. //        IapEraseSector(IAP_ADDRESS_DELAY);                //EEPROM存储数据
  152. //        IapProgramByte(IAP_ADDRESS_DELAY, d_time>>8);
  153. //        IapProgramByte(IAP_ADDRESS_DELAY+1, d_time);

  154.         speed_pwm = IapReadByte(IAP_ADDRESS_SPEED);                //EEPROM数据读取
  155.         d_time = (u16)(IapReadByte(IAP_ADDRESS_DELAY)<<8 | IapReadByte(IAP_ADDRESS_DELAY+1));
  156.        
  157.         U8_PWM_Init();
  158.         for(i=5; i<=speed_pwm; i++)        //电机加速
  159.         {
  160.                 delay_ms(5);
  161.                 Load_U8_PWM(i);
  162.         }
  163. //        Load_U8_PWM(0);
  164.         delay_ms(200);                        //等待转速稳定
  165.        
  166.         Int0_Init();
  167.         Timer0_Init();                        //计算转速作为延时参考
  168.         Timer1_Init();                        //外部中断后点亮激光延时
  169.         Uart_Init();
  170.         delay_ms(50);
  171.         Uart_SendByte(0x98);        //发送复位标识

  172.         Dis_WriteBuf("蘑菇~");        //开机默认字幕
  173.         WDT_CONTR = 0x07;
  174.         WDT_CONTR |= 0x20;                //EN_WDT
  175.         while(1)
  176.         {
  177.                 WDT_CONTR |= 0x10;        //CLR_WDT
  178.                 if(DataProcFlag)
  179.                 {
  180.                         DataProcFlag = 0;
  181.                         //不知道为什么 调整串口优先级最高以后还是需要关闭外部中断
  182.                         EX0 = 0;                                //处理时间很长 关闭外部中断 不然会死机
  183.                         TR0 = 0;
  184.                         TR1 = 0;

  185.                         UartDataRecv_Event();

  186.                         EX0 = 1;
  187.                         TR0 = 1;
  188.                         TR1 = 1;

  189.                 }
  190. //                delay_ms(200);
  191. //                P40 = ~P40;
  192. //                Uart_SendByte(0x49);
  193.         }
  194. }

  195. void Int_Int0(void) interrupt 0               
  196. {
  197.         static char trig = 0;
  198.         if(trig)                //镜面不绝对对称 只使用其中一面
  199.         {
  200.                 t_speed.time8[1] = TL0;                        //读取当前定时器值作为速度
  201.                 t_speed.time8[0] = TH0;
  202.                 TL0 = 0;                                       //定时器重装
  203.                 TH0 = 0;
  204.                 TR0 = 1;
  205.                 speed = t_speed.time16;// + t_count*65536;                //计算速度
  206.                 t_count = 0;                                                                //定时器溢出计数清零

  207.         //        d_time = 34000;                                                                //点亮激光延时
  208.                 TL1 = (65536-d_time)%256;               
  209.                 TH1 = (65536-d_time) >> 8;
  210.                 TR1 = 1;
  211.         }
  212.         trig = ~trig;
  213. }

  214. void Int_Timer0(void) interrupt 1                        //计算转速作为延时参考
  215. {
  216.         t_count++;                                //定时器溢出计数
  217. }

  218. void Int_Timer1(void) interrupt 3                        //外部中断后点亮激光延时
  219. {
  220.                 TR1 = 0;                //停止计时
  221.                 EX0 = 0;
  222. //                Display(0xFF, 0xFF);
  223. //                Dis_WriteBuf("2019新年快乐!!!~");
  224.                 Dis_String();
  225.                 EX0 = 1;
  226. }
复制代码

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机 联系QQ:125739409;技术交流QQ群582644647

Powered by 单片机教程网

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