找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2080|回复: 2
收起左侧

4x4x4彩色光立方单片机例程

[复制链接]
ID:387744 发表于 2019-7-7 16:19 | 显示全部楼层 |阅读模式
  1. #include <stc12c5a60s2.h>
  2. #include <intrins.h>

  3. #define uint unsigned int
  4. #define uchar unsigned char
  5. #define MAX_Delay  8
  6. #define MIN_Delay  1

  7. sbit S_1 = P1 ^ 1;
  8. sbit S_2 = P1 ^ 2;
  9. unsigned int pwm;
  10. unsigned char TimeDelay = 10;
  11. unsigned char Mode = 1;
  12. unsigned char code tabP2[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};  //扫描
  13. uchar  s=0;

  14. void DELAY_MS (uchar i){
  15. //        unsigned int i;
  16. //        while( --a != 0){
  17. //                for(i = 0; i < 600; i++);
  18. //        }
  19.         uchar x,j;
  20.         for(j=0;j<i;j++)
  21.         for(x=0;x<=148;x++);        
  22. }

  23. void Adc_Delay (uint a){  
  24.         uint i;                                      
  25.         while( --a != 0){
  26.                 for(i = 0; i < 600; i++);
  27.                 }
  28. }

  29. void Delay(uint z)
  30. {
  31.         uint x,y;
  32.         for(x=80;x>0;x--)
  33.         for(y=z;y>0;y--);
  34. }

  35. void timer1_init()
  36. {
  37.         TMOD |= 0x10;
  38.         TH1 = 0;
  39.         TL1 = 0;
  40.         ET1 = 1;
  41.         TR1 = 1;
  42.         EA = 1;
  43. }

  44. /*******************************************************************************
  45. **********************         AD转换函数               **************/
  46. /******************************************************************************/
  47. unsigned char Read (unsigned char CHA)
  48. {
  49.         unsigned char AD_FIN=0; //存储A/D转换标志
  50.     CHA &= 0x07;            //选择ADC的8个接口中的一个(0000 0111 清0高5位)
  51.     ADC_CONTR = 0x00;                //ADC转换的速度(0XX0 0000 其中XX控制速度,请根据数据手册设置)
  52.     _nop_();
  53.     ADC_CONTR |= CHA;       //选择A/D当前通道
  54.     _nop_();
  55.     ADC_CONTR |= 0x80;      //启动A/D电源
  56.     Adc_Delay(1);            //使输入电压达到稳定(1ms即可)
  57.     ADC_CONTR |= 0x08;      //启动A/D转换(0000 1000 令ADCS = 1)
  58.         _nop_();
  59.         _nop_();
  60.         _nop_();
  61.         _nop_();
  62.     while (AD_FIN ==0)
  63.         {                                                                     //等待A/D转换结束
  64.         AD_FIN = (ADC_CONTR & 0x10); //0001 0000测试A/D转换结束否
  65.     }
  66.     ADC_CONTR &= 0xE7;      //1111 0111 清ADC_FLAG位, 关闭A/D转换,
  67. return (ADC_RES);          //返回A/D转换结果(8位)
  68. }

  69. /*******************************************************************************
  70. *************     AD电容式触摸按键检测程序        ******************/
  71. /*********************************************************************************************/

  72. //bit 1表示有感应物,0表示没有感应物 S1
  73. /**********************************************************************************************/
  74. bit S1(void)
  75. {
  76.         unsigned char R,mm=0,i,j,k;
  77.         bit aa;
  78.                 j=0;k=0;
  79.                 for(i=0;i<10;i++)
  80.                 {               //一次采集数据的数量
  81.                           Adc_Delay(3);
  82.                         R=Read(1);  //读对应的口,触发对应的触摸按键
  83.                         
  84.                         if(R<0x2f)
  85.                         {                         //此参数可调整感应灵敏度值在0x01到0x2F
  86.                                 k++;               
  87.                         }
  88.                         if(R == 0xFF)
  89.                         {
  90.                                 j++;        
  91.                         }
  92.                 }
  93.                 if(k>1 && j>1)
  94.                 {
  95.                         mm++;
  96.                 }
  97.                 else
  98.                 {
  99.                         mm=0;
  100.                 }

  101.         if(mm>0)
  102.         {
  103.                 aa =1;
  104.         }
  105.         else
  106.         {
  107.                 aa=0;
  108.         }
  109. return(aa);
  110. }

  111. /*********************************************************************************************/
  112.                         //                  S2
  113. /**********************************************************************************************/
  114. bit S2(void)
  115. {
  116.         unsigned char R,mm=0,i,j,k;
  117.         bit aa;
  118.                 j=0;k=0;
  119.                 for(i=0;i<10;i++)
  120.                 { //一次采集数据的数量
  121.                         Adc_Delay(3);
  122.                         R=Read(2);

  123.                         if(R<0x2F)
  124.                         { //此参数可调整感应灵敏度值在0x01到0x2F
  125.                                 k++;               
  126.                         }
  127.                         if(R == 0xFF)
  128.                         {
  129.                                 j++;        
  130.                         }
  131.                 }
  132.                 if(k>1 && j>1)
  133.                 {
  134.                         mm++;
  135.                 }
  136.                 else
  137.                 {
  138.                         mm=0;
  139.                 }        
  140.         
  141.         if(mm>0)
  142.         {
  143.                 aa =1;
  144.         }
  145.         else
  146.         {
  147.                 aa=0;
  148.         }
  149. return(aa);                                                                                                                        
  150.                                                                                 
  151. }

  152. //结束呼吸灯专用
  153. uchar code table[]={
  154. 0,0,1,2,3,4,5,6,7,8,9,10,
  155. 11,12,13,14,15,16,17,18,
  156. 19,20,21,22,23,24,25,26,27,
  157. 28,29,30,31,32,33,34,35,36,
  158. 37,38,39,40,41,42,43,44,45,
  159. 46,47,48,49,50,51,52,53,54,
  160. 55,56,57,58,59,60,61,62,63,
  161. 64,65,66,67,68,69,70,71,72,
  162. 73,74,75,76,77,78,79,80,81,82,
  163. 83,84,85,86,87,88,89,90,91,
  164. 92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,
  165. 110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,
  166. };

  167. void PwmUp(uint a, uchar c)
  168. {
  169.         uchar i;
  170.         if(c == 1)
  171.                 P3 = 0X00;
  172.         else
  173.                 P0 = 0X00;
  174.         P2 = 0X00;
  175.         i = table[a];
  176.         Delay(i);
  177.         if(c == 1)
  178.                 P3 = 0XFF;
  179.         else
  180.                 P0 = 0XFF;
  181.         P2 = 0X00;
  182.         Delay(150-i);
  183. }

  184. void PwmDown(uint a,uchar c)
  185. {
  186.         uchar i;
  187.         if(c == 1)
  188.                 P3 = 0XFF;
  189.         else
  190.                 P0 = 0XFF;
  191.         P2 = 0X00;
  192.         i = table[a];
  193.         Delay(i);
  194.         if(c == 1)
  195.                 P3 = 0X00;
  196.         else
  197.                 P0 = 0X00;
  198.         P2 = 0X00;
  199.         Delay(150-i);        
  200. }


  201. void PwmAllon(uchar c)
  202. {
  203.         int i;
  204.         for(i = 0; i < 150 ;i++)
  205.         {
  206.                 PwmDown(i,c);        
  207.         }
  208.         if(c == 1)
  209.                 P3 = 0X00;
  210.         else
  211.                 P0 = 0X00;
  212.         P2 = 0X00;
  213. }

  214. void PwmOff(uchar c)
  215. {
  216.         int i;
  217. //        P3 = 0XFF;
  218. //        P2 = 0X00;
  219. //        Delay(100);

  220.         for(i = 0; i < 150; i++)
  221.         {
  222.                  PwmUp(i,c);        
  223.         }
  224.         
  225.         //P3 = 0X00;
  226. }

  227. void Allfalloff(uchar c,uchar time)  //由全亮到下落关闭只剩一排
  228. {
  229.         unsigned char code tabP0[5][8]={
  230.         {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},
  231.         {0x00,0xFF,0xFF,0xFF,0x00,0xFF,0xFF,0xFF},
  232.         {0x00,0x00,0xFF,0xFF,0x00,0x00,0xFF,0xFF},
  233.         {0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0xFF},
  234.         {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
  235.         };
  236.         int j,k,i;
  237.         if(c==1)
  238.                 P3 = 0X00;
  239.         else if(c==2)
  240.                 P0 = 0X00;
  241.         else
  242.                 {
  243.                         P3 = 0XFF;
  244.                         P0 = 0XFF;
  245.                 }
  246.         for(j=0;j<5;j++)
  247.         {
  248.                 for(k=0;k<15;k++)
  249.                 {
  250.                         for(i=0;i<8;i++)
  251.                         {
  252.                         //        P0=0;
  253.                                 P2=tabP2[i];
  254.                                 if(c == 1)
  255.                                         P0=tabP0[j][i];
  256.                                 else if(c == 2)
  257.                                         P3 = tabP0[j][i];
  258.                                 else
  259.                                         P0=tabP0[j][i];
  260.                                 DELAY_MS(time);

  261.                         }
  262.                 }
  263.         }               
  264. }
复制代码

彩色光立方4源程序.zip

112.14 KB, 下载次数: 6, 下载积分: 黑币 -5

回复

使用道具 举报

ID:1 发表于 2019-7-7 22:24 | 显示全部楼层
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

ID:387744 发表于 2020-2-28 21:07 | 显示全部楼层
补充。。。。。。。。。。。。。。。。。。。。
光立方电路图图片格式.JPG
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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