找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DIY梦幻十字旋转屏,MP3、电子时钟、电子音乐的综合体!附单片机源码

[复制链接]
跳转到指定楼层
楼主
电路原理图如下:


制作出来的实物图如下:


单片机源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include "LED_STRING.h"
  4. #include "DS1302.h"

  5. sfr XICON=0xc0;                                 //定义STC89C52中断特殊功能寄存器

  6. sbit PX3=XICON^7;
  7. sbit EX3=XICON^6;
  8. sbit IE3=XICON^5;
  9. sbit IT3=XICON^4;
  10. sbit PX2=XICON^3;
  11. sbit EX2=XICON^2;
  12. sbit IE2=XICON^1;
  13. sbit IT2=XICON^0;

  14. sbit IR=P4^2;                        //红外
  15. uchar a[4];                         //存储红外解出来的厂家编码和键码值及它们的反码
  16. uint LowTime,HighTime;         //存储高低电平宽度的变量
  17. uchar L_OnTime,display_flag,time_count,time_count0,time_count1,effect;
  18. uchar led_0,led_1,display_n,KeyVal;
  19. bit IR_Flag,display_time_flag,set_second_flag;
  20. uchar set_count,set_year,set_month,set_day,set_week;
  21. char set_hour,set_minute,set_second;
  22. uchar set_year_tmp,set_month_tmp,set_day_tmp,set_week_tmp,set_hour_tmp,set_minute_tmp;

  23. /*延迟机器周期级的短延迟*/
  24. void delay(uchar z)
  25. {
  26.         while (z--)
  27.         _nop_();
  28. }

  29. /*开机初始画面*/
  30. void open_display()
  31. {
  32.         uchar i;
  33.         uint led_0,led_1,count,num;
  34. L_OnTime++;
  35. num++;
  36. count=num;
  37. if(num>(16*15))
  38. {
  39. display_flag=1;
  40. TR1=1;
  41. }
  42.          if(L_OnTime>65) L_OnTime=65;

  43.         for(i=0;i<L_OnTime;i++)
  44.                 {
  45.                 count--;
  46.                 led_0=count*2+1;
  47.                 led_1=count*2;
  48.                 delay(60);
  49.                 P3=tab_open[led_0];
  50.                 P1=tab_open[led_1];
  51.                 P0=tab_open[led_0];
  52.                 P2=tab_open[led_1];
  53.                 delay(30);
  54.                 P1=0xff;
  55.                 P3=0xff;
  56.                 P0=0xff;
  57.                 P2=0xff;
  58.                 delay(3);
  59.                 }
  60. }


  61. /*LOVE画面*/
  62. void love_display()
  63. {
  64.         uchar i;
  65.         uint led_0,led_1,count,num;

  66. L_OnTime++;
  67. num++;
  68. count=num;
  69. if(num>(16*13)) num=0;
  70.          if(effect==0)
  71.         {
  72.                  if(L_OnTime>65) L_OnTime=65;
  73.         }
  74.         else
  75.         {
  76.                  if(L_OnTime>125) L_OnTime=125;
  77.         }

  78.         for(i=0;i<L_OnTime;i++)
  79.                 {
  80.                 count--;
  81.                 led_0=count*2+1;
  82.                 led_1=count*2;
  83.                 delay(60);
  84.                         if(effect==0)
  85.                         {
  86.                         P3=tab_love[led_0];
  87.                         P1=tab_love[led_1];
  88.                         P0=tab_love[led_0];
  89.                         P2=tab_love[led_1];
  90.                         }
  91.                         else if(effect==1)
  92.                         {
  93.                         P0=tab_love[led_0];
  94.                         P2=tab_love[led_1];
  95.                         }
  96.                         else
  97.                         {
  98.                         P3=tab_love[led_0];
  99.                         P1=tab_love[led_1];
  100.                         }
  101.                 delay(30);
  102.                 P1=0xff;
  103.                 P3=0xff;
  104.                 P0=0xff;
  105.                 P2=0xff;
  106.                 delay(3);               
  107.                 }
  108. }

  109. /*显示“年、月、日、星期”*/
  110. void time0_display()
  111. {
  112. uchar time_count0=8;
  113. uchar time_count1=16;
  114. int time_count=159;
  115. uchar i;
  116. uchar L_0=159;
  117.         for(i=0;i<L_0;i++)
  118.         {
  119.                 if(time_count>143&&time_count<160)                                        //星期值
  120.                 {
  121.                 led_0=((ReadSet1302(0x8b)&0x0f)-1)*32+(time_count1*2)-1;
  122.                 led_1=((ReadSet1302(0x8b)&0x0f)-1)*32+(time_count1*2)-2;
  123.                 P3=tab_xingqi[led_0];
  124.                 P1=tab_xingqi[led_1];
  125.                 if(--time_count1<1) time_count1=16;
  126.                 }
  127.                 else if(time_count>127&&time_count<144)                                        //“期“
  128.                 {                                                                        
  129.                 led_0=3*32+(time_count1*2)-1;
  130.                 led_1=3*32+(time_count1*2)-2;
  131.                 P3=tab_time[led_0];
  132.                 P1=tab_time[led_1];
  133.                 delay(65);
  134.                 if(--time_count1<1) time_count1=16;
  135.                 }

  136.                 else if(time_count>111&&time_count<128)                                        //“星“
  137.                 {                                                                        
  138.                 led_0=2*32+(time_count1*2)-1;
  139.                 led_1=2*32+(time_count1*2)-2;
  140.                 P3=tab_time[led_0];
  141.                 P1=tab_time[led_1];
  142.                 delay(65);
  143.                 if(--time_count1<1) time_count1=16;
  144.                 }


  145.                 else if(time_count>95&&time_count<112)                                        //“日“
  146.                 {                                                                        
  147.                 led_0=6*32+(time_count1*2)-1;
  148.                 led_1=6*32+(time_count1*2)-2;
  149.                 P3=tab_xingqi[led_0];
  150.                 P1=tab_xingqi[led_1];
  151.                 delay(65);
  152.                 if(--time_count1<1) time_count1=16;
  153.                 }

  154.                 else if(time_count>87&&time_count<96)                                                                  //”日“ 个位
  155.                 {
  156.                 led_0=((ReadSet1302(0x87)&0x0f)*16)+(time_count0*2)-1;
  157.                 led_1=((ReadSet1302(0x87)&0x0f)*16)+(time_count0*2)-2;
  158.                 P3=tab_num[led_0];
  159.                 P1=tab_num[led_1];
  160.                 if(--time_count0<1) time_count0=8;
  161.                 }
  162.                 else if(time_count>79&&time_count<88)                                                                 //”日“ 十位
  163.                 {
  164.                 led_0=((ReadSet1302(0x87)>>4)*16)+(time_count0*2)-1;
  165.                 led_1=((ReadSet1302(0x87)>>4)*16)+(time_count0*2)-2;
  166.                 P3=tab_num[led_0];
  167.                 P1=tab_num[led_1];
  168.                 if(--time_count0<1) time_count0=8;
  169.                 }
  170.                                 
  171.                 else if(time_count>63&&time_count<80)                                        //“月“        
  172.                 {                                                               
  173.                 led_0=1*32+(time_count1*2)-1;
  174.                 led_1=1*32+(time_count1*2)-2;
  175.                 P3=tab_time[led_0];
  176.                 P1=tab_time[led_1];
  177.                 delay(65);
  178.                 if(--time_count1<1) time_count1=16;
  179.                 }
  180.                                                                                                                                        
  181.                 else if(time_count>55&&time_count<64)                                                                  //”月“ 个位
  182.                 {
  183.                 led_0=((ReadSet1302(0x89)&0x0f)*16)+(time_count0*2)-1;
  184.                 led_1=((ReadSet1302(0x89)&0x0f)*16)+(time_count0*2)-2;
  185.                 P3=tab_num[led_0];
  186.                 P1=tab_num[led_1];
  187.                 if(--time_count0<1) time_count0=8;
  188.                 }
  189.                 else if(time_count>47&&time_count<56)                                                                 //”月“ 十位
  190.                 {
  191.                 led_0=((ReadSet1302(0x89)>>4)*16)+(time_count0*2)-1;
  192.                 led_1=((ReadSet1302(0x89)>>4)*16)+(time_count0*2)-2;
  193.                 P3=tab_num[led_0];
  194.                 P1=tab_num[led_1];
  195.                 if(--time_count0<1) time_count0=8;                                                                                                                        
  196.                 }

  197.                 else if(time_count>31&&time_count<48)                                        //“年“        
  198.                 {                                                               
  199.                 led_0=0*32+(time_count1*2)-1;
  200.                 led_1=0*32+(time_count1*2)-2;
  201.                 P3=tab_time[led_0];
  202.                 P1=tab_time[led_1];
  203.                 delay(65);
  204.                 if(--time_count1<1) time_count1=16;
  205.                 }

  206.                 else if(time_count>23&&time_count<32)                                                                  //”年“ 个位
  207.                 {
  208.                 led_0=((ReadSet1302(0x8d)&0x0f)*16)+(time_count0*2)-1;
  209.                 led_1=((ReadSet1302(0x8d)&0x0f)*16)+(time_count0*2)-2;
  210.                 P3=tab_num[led_0];
  211.                 P1=tab_num[led_1];
  212.                 if(--time_count0<1) time_count0=8;
  213.                 }
  214.                 else if(time_count>15&&time_count<24)                                                                 //”年“ 十位
  215.                 {
  216.                 led_0=((ReadSet1302(0x8d)>>4)*16)+(time_count0*2)-1;
  217.                 led_1=((ReadSet1302(0x8d)>>4)*16)+(time_count0*2)-2;
  218.                 P3=tab_num[led_0];
  219.                 P1=tab_num[led_1];
  220.                 if(--time_count0<1) time_count0=8;                                                                                                                        
  221.                 }
  222.                 else if(time_count>7&&time_count<16)                                                                 //"0"
  223.                 {
  224.                 led_0=(0*16)+(time_count0*2)-1;
  225.                 led_1=(0*16)+(time_count0*2)-2;
  226.                 P3=tab_num[led_0];
  227.                 P1=tab_num[led_1];
  228.                 delay(70);                                                                                                                                //延迟,使得在这里处理的时间与处理1302的时间相同
  229.                 if(--time_count0<1) time_count0=8;
  230.                 }
  231.                 else if(time_count>=0&&time_count<8)                                                                 //"2"
  232.                 {
  233.                 led_0=(2*16)+(time_count0*2)-1;
  234.                 led_1=(2*16)+(time_count0*2)-2;
  235.                 P3=tab_num[led_0];
  236.                 P1=tab_num[led_1];
  237.                 delay(70);                                                                                                                                //延迟,使得在这里处理的时间与处理1302的时间相同
  238.                 if(--time_count0<1) time_count0=8;
  239.                 }

  240.         if(--time_count<0)
  241.         {
  242.         time_count=159;
  243.         time_count0=8;
  244.         time_count1=16;
  245.         }

  246.         }
  247.                 delay(95);
  248.                 P3=0xff;
  249.                 P1=0xff;
  250.                 delay(5);
  251. }

  252. /*显示“时、分、秒”*/
  253. void time1_display()
  254. {
  255. uchar time_count1=8;
  256. char time_count=79;
  257. uchar i;
  258. uchar L_0=79;
  259.         for(i=0;i<L_0;i++)
  260.         {
  261.                 if(time_count>63)
  262.                 {
  263.                 delay(123);                                                                  //整屏左移
  264.                 }
  265.                 else if(time_count>55&&time_count<64)                                                                                                         //秒个位
  266.                 {
  267.                 led_0=((ReadSet1302(0x81)&0x0f)*16)+(time_count1*2)-1;
  268.                 led_1=((ReadSet1302(0x81)&0x0f)*16)+(time_count1*2)-2;
  269.                 P3=tab_num[led_0];
  270.                 P1=tab_num[led_1];
  271.                 }
  272.                 else if(time_count>47&&time_count<56)                                                                  //秒十位
  273.                 {
  274.                 led_0=((ReadSet1302(0x81)>>4)*16)+(time_count1*2)-1;
  275.                 led_1=((ReadSet1302(0x81)>>4)*16)+(time_count1*2)-2;
  276.                 P3=tab_num[led_0];
  277.                 P1=tab_num[led_1];
  278.                 }
  279.                 else if(time_count>39&&time_count<48)                                                                   //冒号
  280.                 {
  281.                 led_0=(10*16)+(time_count1*2)-1;
  282.                 led_1=(10*16)+(time_count1*2)-2;
  283.                 P3=tab_num[led_0];
  284.                 P1=tab_num[led_1];
  285.                 delay(70);                                                                                                                                //延迟,使得在这里处理的时间与处理1302的时间相同
  286.                 }
  287.                 else if(time_count>31&&time_count<40)                                                                   //分个位
  288.                 {
  289.                 led_0=((ReadSet1302(0x83)&0x0f)*16)+(time_count1*2)-1;
  290.                 led_1=((ReadSet1302(0x83)&0x0f)*16)+(time_count1*2)-2;
  291.                 P3=tab_num[led_0];
  292.                 P1=tab_num[led_1];
  293.                 }
  294.                 else if(time_count>23&&time_count<32)                                                                   //分十位
  295.                 {
  296.                 led_0=((ReadSet1302(0x83)>>4)*16)+(time_count1*2)-1;
  297.                 led_1=((ReadSet1302(0x83)>>4)*16)+(time_count1*2)-2;
  298.                 P3=tab_num[led_0];
  299.                 P1=tab_num[led_1];
  300.                 }
  301.                 else if(time_count>15&&time_count<24)                                                                   //冒号
  302.                 {
  303.                 led_0=(10*16)+(time_count1*2)-1;
  304.                 led_1=(10*16)+(time_count1*2)-2;
  305.                 P3=tab_num[led_0];
  306.                 P1=tab_num[led_1];
  307.                 delay(70);
  308.                 }
  309.                 else if(time_count>7&&time_count<16)                                                                   //时个位
  310.                 {
  311.                 led_0=((ReadSet1302(0x85)&0x0f)*16)+(time_count1*2)-1;
  312.                 led_1=((ReadSet1302(0x85)&0x0f)*16)+(time_count1*2)-2;
  313.                 P3=tab_num[led_0];
  314.                 P1=tab_num[led_1];
  315.                 }
  316.                 else if(time_count>=0&&time_count<8)                                                                   //时十位
  317.                 {
  318.                 led_0=((ReadSet1302(0x85)>>4)*16)+(time_count1*2)-1;
  319.                 led_1=((ReadSet1302(0x85)>>4)*16)+(time_count1*2)-2;
  320.                 P3=tab_num[led_0];
  321.                 P1=tab_num[led_1];
  322.                 }
  323.         if(--time_count1<1) time_count1=8;
  324.         if(--time_count<0)
  325.         {
  326.         time_count=79;
  327.         time_count1=8;
  328.         }

  329.         }
  330.                 delay(95);
  331.                 P3=0xff;
  332.                 P1=0xff;
  333.                 delay(5);


  334. }


  335. /*调“年、月、日、星期、时、分、秒”*/

  336. void set_time_display()
  337. {

  338. uchar time_count0=8;
  339. uchar time_count1=16;
  340. int time_count=71;
  341. uchar i;
  342. uchar L_0=71;
  343.                 switch(set_count)
  344.                 {
  345.                         case 1:
  346.                         {
  347.                         for(i=0;i<L_0;i++)
  348.                         {
  349.                                 if(time_count>55)
  350.                                 {
  351.                                 delay(85);                                                                  //整屏左移
  352.                                 }
  353.                                 else if(time_count>47&&time_count<56)
  354.                                 {
  355.                                 led_0=(set_year%10)*16+(time_count0*2)-1;
  356.                                 led_1=(set_year%10)*16+(time_count0*2)-2;
  357.                                 P3=tab_num[led_0];
  358.                                 P1=tab_num[led_1];
  359.                                 if(--time_count0<1) time_count0=8;
  360.                                 }
  361.                                 else if(time_count>39&&time_count<48)
  362.                                 {
  363.                                 led_0=(set_year/10)*16+(time_count0*2)-1;
  364.                                 led_1=(set_year/10)*16+(time_count0*2)-2;
  365.                                 P3=tab_num[led_0];
  366.                                 P1=tab_num[led_1];
  367.                                 if(--time_count0<1) time_count0=8;
  368.                                 }
  369.                                 else if(time_count>31&&time_count<40)                           //冒号
  370.                                 {
  371.                                 led_0=(10*16)+(time_count0*2)-1;
  372.                                 led_1=(10*16)+(time_count0*2)-2;
  373.                                 P3=tab_num[led_0];
  374.                                 P1=tab_num[led_1];
  375.                                 if(--time_count0<1) time_count0=8;               
  376.                                 }
  377.                                 else if(time_count>15&&time_count<32)                           //“年”
  378.                                 {
  379.                                 led_0=0*32+(time_count1*2)-1;
  380.                                 led_1=0*32+(time_count1*2)-2;
  381.                                 P3=tab_time[led_0];
  382.                                 P1=tab_time[led_1];
  383.                                 if(--time_count1<1) time_count1=16;
  384.                                 }
  385.                                 else if(time_count>=0&&time_count<16)                           //“调”
  386.                                 {
  387.                                 led_0=4*32+(time_count1*2)-1;
  388.                                 led_1=4*32+(time_count1*2)-2;
  389.                                 P3=tab_time[led_0];
  390.                                 P1=tab_time[led_1];
  391.                                 if(--time_count1<1) time_count1=16;
  392.                                 }                                                
  393.                                  delay(70);
  394.                                 if(--time_count<0)
  395.                                 {
  396.                                 time_count=71;
  397.                                 time_count0=8;
  398.                                 time_count1=16;
  399.                                 }
  400.                         }
  401.                 }
  402.                 break;
  403.                 case 2:
  404.                 {
  405.                         for(i=0;i<L_0;i++)
  406.                         {
  407.                                 if(time_count>55)
  408.                                 {
  409.                                 delay(85);                                                                  //整屏左移
  410.                                 }
  411.                                 else if(time_count>47&&time_count<56)
  412.                                 {
  413.                                 led_0=(set_month%10)*16+(time_count0*2)-1;
  414.                                 led_1=(set_month%10)*16+(time_count0*2)-2;
  415.                                 P3=tab_num[led_0];
  416.                                 P1=tab_num[led_1];
  417.                                 if(--time_count0<1) time_count0=8;
  418.                                 }
  419.                                 else if(time_count>39&&time_count<48)
  420.                                 {
  421.                                 led_0=(set_month/10)*16+(time_count0*2)-1;
  422.                                 led_1=(set_month/10)*16+(time_count0*2)-2;
  423.                                 P3=tab_num[led_0];
  424.                                 P1=tab_num[led_1];
  425.                                 if(--time_count0<1) time_count0=8;
  426.                                 }
  427.                                 else if(time_count>31&&time_count<40)                           //冒号
  428.                                 {
  429.                                 led_0=(10*16)+(time_count0*2)-1;
  430.                                 led_1=(10*16)+(time_count0*2)-2;
  431.                                 P3=tab_num[led_0];
  432.                                 P1=tab_num[led_1];
  433.                                 if(--time_count0<1) time_count0=8;               
  434.                                 }
  435.                                 else if(time_count>15&&time_count<32)                           //“月”
  436.                                 {
  437.                                 led_0=1*32+(time_count1*2)-1;
  438.                                 led_1=1*32+(time_count1*2)-2;
  439.                                 P3=tab_time[led_0];
  440.                                 P1=tab_time[led_1];
  441.                                 if(--time_count1<1) time_count1=16;
  442.                                 }
  443.                                 else if(time_count>=0&&time_count<16)                           //“调”
  444.                                 {
  445.                                 led_0=4*32+(time_count1*2)-1;
  446.                                 led_1=4*32+(time_count1*2)-2;
  447.                                 P3=tab_time[led_0];
  448.                                 P1=tab_time[led_1];
  449.                                 if(--time_count1<1) time_count1=16;
  450.                                 }                                                
  451.                                  delay(70);
  452.                                 if(--time_count<0)
  453.                                 {
  454.                                 time_count=71;
  455.                                 time_count0=8;
  456.                                 time_count1=16;
  457.                                 }
  458.                         }
  459.                 }
  460.                 break;
  461.                 case 3:
  462.                 {
  463.                         for(i=0;i<L_0;i++)
  464.                         {
  465.                                 if(time_count>55)
  466.                                 {
  467.                                 delay(85);                                                                  //整屏左移
  468.                                 }
  469.                                 else if(time_count>47&&time_count<56)
  470.                                 {
  471.                                 led_0=(set_day%10)*16+(time_count0*2)-1;
  472.                                 led_1=(set_day%10)*16+(time_count0*2)-2;
  473.                                 P3=tab_num[led_0];
  474.                                 P1=tab_num[led_1];
  475.                                 if(--time_count0<1) time_count0=8;
  476.                                 }
  477.                                 else if(time_count>39&&time_count<48)
  478.                                 {
  479.                                 led_0=(set_day/10)*16+(time_count0*2)-1;
  480.                                 led_1=(set_day/10)*16+(time_count0*2)-2;
  481.                                 P3=tab_num[led_0];
  482.                                 P1=tab_num[led_1];
  483.                                 if(--time_count0<1) time_count0=8;
  484.                                 }
  485.                                 else if(time_count>31&&time_count<40)                           //冒号
  486.                                 {
  487.                                 led_0=(10*16)+(time_count0*2)-1;
  488.                                 led_1=(10*16)+(time_count0*2)-2;
  489.                                 P3=tab_num[led_0];
  490.                                 P1=tab_num[led_1];
  491.                                 if(--time_count0<1) time_count0=8;               
  492.                                 }
  493.                                 else if(time_count>15&&time_count<32)                           //“日”
  494.                                 {
  495.                                 led_0=6*32+(time_count1*2)-1;
  496.                                 led_1=6*32+(time_count1*2)-2;
  497.                                 P3=tab_xingqi[led_0];
  498.                                 P1=tab_xingqi[led_1];
  499.                                 if(--time_count1<1) time_count1=16;
  500.                                 }
  501.                                 else if(time_count>=0&&time_count<16)                           //“调”
  502.                                 {
  503.                                 led_0=4*32+(time_count1*2)-1;
  504.                                 led_1=4*32+(time_count1*2)-2;
  505.                                 P3=tab_time[led_0];
  506.                                 P1=tab_time[led_1];
  507.                                 if(--time_count1<1) time_count1=16;
  508.                                 }                                                
  509.                                  delay(70);

  510.                                 if(--time_count<0)
  511.                                 {
  512.                                 time_count=71;
  513.                                 time_count0=8;
  514.                                 time_count1=16;
  515.                                 }
  516.                         }

  517.                 }
  518.                 break;
  519.                 case 4:
  520.                 {
  521.                 for(i=0;i<L_0;i++)
  522.                         {
  523.                                 if(time_count>55)
  524.                                 {
  525.                                 delay(85);                                                                  //整屏左移
  526.                                 }
  527.                                 else if(time_count>39&&time_count<56)                                         //设置星期的值
  528.                                 {
  529.                                 led_0=(set_week-1)*32+(time_count1*2)-1;
  530.                                 led_1=(set_week-1)*32+(time_count1*2)-2;
  531.                                 P3=tab_xingqi[led_0];
  532.                                 P1=tab_xingqi[led_1];
  533.                                 if(--time_count1<1) time_count1=16;
  534.                                 }
  535.                                 else if(time_count>31&&time_count<40)                                  //冒号
  536.                                 {
  537.                                 led_0=(10*16)+(time_count0*2)-1;
  538.                                 led_1=(10*16)+(time_count0*2)-2;
  539.                                 P3=tab_num[led_0];
  540.                                 P1=tab_num[led_1];
  541.                                 if(--time_count0<1) time_count0=8;
  542.                                 }

  543.                                 else if(time_count>15&&time_count<32)                           //“星”
  544.                                 {
  545.                                 led_0=2*32+(time_count1*2)-1;
  546.                                 led_1=2*32+(time_count1*2)-2;
  547.                                 P3=tab_time[led_0];
  548.                                 P1=tab_time[led_1];
  549.                                 if(--time_count1<1) time_count1=16;
  550.                                 }
  551.                                 else if(time_count>=0&&time_count<16)                           //“调”
  552.                                 {
  553.                                 led_0=4*32+(time_count1*2)-1;
  554.                                 led_1=4*32+(time_count1*2)-2;
  555.                                 P3=tab_time[led_0];
  556.                                 P1=tab_time[led_1];
  557.                                 if(--time_count1<1) time_count1=16;
  558.                                 }                                                
  559.                                  delay(70);

  560.                                 if(--time_count<0)
  561.                                 {
  562.                                 time_count=71;
  563.                                 time_count0=8;
  564.                                 time_count1=16;
  565.                                 }
  566.                         }
  567.                 }
  568.                 break;
  569.                 case 5:
  570.                 {
  571.                         for(i=0;i<L_0;i++)
  572.                         {
  573.                                 if(time_count>55)
  574.                                 {
  575.                                 delay(85);                                                                  //整屏左移
  576.                                 }
  577.                                 else if(time_count>47&&time_count<56)
  578.                                 {
  579.                                 led_0=(set_hour%10)*16+(time_count0*2)-1;
  580.                                 led_1=(set_hour%10)*16+(time_count0*2)-2;
  581.                                 P3=tab_num[led_0];
  582.                                 P1=tab_num[led_1];
  583.                                 if(--time_count0<1) time_count0=8;
  584.                                 }
  585.                                 else if(time_count>39&&time_count<48)
  586.                                 {
  587.                                 led_0=(set_hour/10)*16+(time_count0*2)-1;
  588.                                 led_1=(set_hour/10)*16+(time_count0*2)-2;
  589.                                 P3=tab_num[led_0];
  590.                                 P1=tab_num[led_1];
  591.                                 if(--time_count0<1) time_count0=8;
  592.                                 }
  593.                                 else if(time_count>31&&time_count<40)                           //冒号
  594.                                 {
  595.                                 led_0=(10*16)+(time_count0*2)-1;
  596.                                 led_1=(10*16)+(time_count0*2)-2;
  597.                                 P3=tab_num[led_0];
  598.                                 P1=tab_num[led_1];
  599.                                 if(--time_count0<1) time_count0=8;               
  600.                                 }
  601.                                 else if(time_count>15&&time_count<32)                           //“时”
  602.                                 {
  603.                                 led_0=5*32+(time_count1*2)-1;
  604.                                 led_1=5*32+(time_count1*2)-2;
  605.                                 P3=tab_time[led_0];
  606.                                 P1=tab_time[led_1];
  607.                                 if(--time_count1<1) time_count1=16;
  608.                                 }
  609.                                 else if(time_count>=0&&time_count<16)                           //“调”
  610.                                 {
  611.                                 led_0=4*32+(time_count1*2)-1;
  612.                                 led_1=4*32+(time_count1*2)-2;
  613.                                 P3=tab_time[led_0];
  614.                                 P1=tab_time[led_1];
  615.                                 if(--time_count1<1) time_count1=16;
  616.                                 }                                                
  617.                                  delay(70);

  618.                                 if(--time_count<0)
  619.                                 {
  620.                                 time_count=71;
  621.                                 time_count0=8;
  622.                                 time_count1=16;
  623.                                 }
  624.                         }

  625.                 }
  626.                 break;
  627.                 case 6:
  628.                 {
  629.                         for(i=0;i<L_0;i++)
  630.                         {
  631.                                 if(time_count>55)
  632.                                 {
  633.                                 delay(85);                                                                  //整屏左移
  634.                                 }
  635.                                 else if(time_count>47&&time_count<56)
  636.                                 {
  637.                                 led_0=(set_minute%10)*16+(time_count0*2)-1;
  638.                                 led_1=(set_minute%10)*16+(time_count0*2)-2;
  639.                                 P3=tab_num[led_0];
  640.                                 P1=tab_num[led_1];
  641.                                 if(--time_count0<1) time_count0=8;
  642.                                 }
  643.                                 else if(time_count>39&&time_count<48)
  644.                                 {
  645.                                 led_0=(set_minute/10)*16+(time_count0*2)-1;
  646.                                 led_1=(set_minute/10)*16+(time_count0*2)-2;
  647.                                 P3=tab_num[led_0];
  648.                                 P1=tab_num[led_1];
  649.                                 if(--time_count0<1) time_count0=8;
  650.                                 }
  651.                                 else if(time_count>31&&time_count<40)                           //冒号
  652.                                 {
  653.                                 led_0=(10*16)+(time_count0*2)-1;
  654.                                 led_1=(10*16)+(time_count0*2)-2;
  655.                                 P3=tab_num[led_0];
  656.                                 P1=tab_num[led_1];
  657.                                 if(--time_count0<1) time_count0=8;               
  658.                                 }
  659.                                 else if(time_count>15&&time_count<32)                           //“分”
  660.                                 {
  661.                                 led_0=6*32+(time_count1*2)-1;
  662.                                 led_1=6*32+(time_count1*2)-2;
  663.                                 P3=tab_time[led_0];
  664.                                 P1=tab_time[led_1];
  665.                                 if(--time_count1<1) time_count1=16;
  666.                                 }
  667.                                 else if(time_count>=0&&time_count<16)                           //“调”
  668.                                 {
  669.                                 led_0=4*32+(time_count1*2)-1;
  670.                                 led_1=4*32+(time_count1*2)-2;
  671.                                 P3=tab_time[led_0];
  672.                                 P1=tab_time[led_1];
  673.                                 if(--time_count1<1) time_count1=16;
  674.                                 }                                                
  675.                                  delay(70);

  676.                                 if(--time_count<0)
  677.                                 {
  678.                                 time_count=71;
  679.                                 time_count0=8;
  680.                                 time_count1=16;
  681.                                 }
  682.                         }

  683.                 }
  684.                 break;
  685.                 case 7:
  686.                 {
  687.                         for(i=0;i<L_0;i++)
  688.                         {
  689.                                 if(time_count>55)
  690.                                 {
  691.                                 delay(85);                                                                  //整屏左移
  692.                                 }
  693.                                 else if(time_count>47&&time_count<56)
  694.                                 {
  695.                                 led_0=(set_second%10)*16+(time_count0*2)-1;
  696.                                 led_1=(set_second%10)*16+(time_count0*2)-2;
  697.                                 P3=tab_num[led_0];
  698.                                 P1=tab_num[led_1];
  699.                                 if(--time_count0<1) time_count0=8;
  700.                                 }
  701.                                 else if(time_count>39&&time_count<48)
  702.                                 {
  703.                                 led_0=(set_second/10)*16+(time_count0*2)-1;
  704.                                 led_1=(set_second/10)*16+(time_count0*2)-2;
  705.                                 P3=tab_num[led_0];
  706.                                 P1=tab_num[led_1];
  707.                                 if(--time_count0<1) time_count0=8;
  708.                                 }
  709.                                 else if(time_count>31&&time_count<40)                           //冒号
  710.                                 {
  711.                                 led_0=(10*16)+(time_count0*2)-1;
  712.                                 led_1=(10*16)+(time_count0*2)-2;
  713.                                 P3=tab_num[led_0];
  714.                                 P1=tab_num[led_1];
  715.                                 if(--time_count0<1) time_count0=8;               
  716.                                 }
  717.                                 else if(time_count>15&&time_count<32)                           //“秒”
  718.                                 {
  719.                                 led_0=7*32+(time_count1*2)-1;
  720.                                 led_1=7*32+(time_count1*2)-2;
  721.                                 P3=tab_time[led_0];
  722.                                 P1=tab_time[led_1];
  723.                                 if(--time_count1<1) time_count1=16;
  724.                                 }
  725.                                 else if(time_count>=0&&time_count<16)                           //“调”
  726.                                 {
  727.                                 led_0=4*32+(time_count1*2)-1;
  728.                                 led_1=4*32+(time_count1*2)-2;
  729.                                 P3=tab_time[led_0];
  730.                                 P1=tab_time[led_1];
  731.                                 if(--time_count1<1) time_count1=16;
  732.                                 }                                                
  733.                                  delay(70);

  734.                                 if(--time_count<0)
  735.                                 {
  736.                                 time_count=71;
  737.                                 time_count0=8;
  738.                                 time_count1=16;
  739.                                 }
  740.                         }

  741.                 }
  742.         }

  743.                 P3=0xff;
  744.                 P1=0xff;
  745.                 delay(5);

  746. }


  747. /*红外解码过程函数*/
  748. bit IRWork()
  749. {
  750. uchar i,j;
  751. uchar dat;
  752. for(j=0;j<4;j++)                                                         //共四个编码
  753. {
  754. for(i=0;i<8;i++)                                                         //每个编码八位
  755.         {
  756. dat>>=1;                                                                                //先移位
  757. TH0=0;
  758. TL0=0;
  759. TR0=1;
  760. while(!IR);                                                                                //低电平等待
  761. TR0=0;
  762. LowTime=TH0*256+TL0;                                                        //将低电平宽度保存
  763. TH0=0;
  764. TL0=0;
  765. TR0=1;
  766. while(IR);                                                                                 //高电平等待
  767. TR0=0;
  768. HighTime=TH0*256+TL0;                                                         //将高电平宽度保存
  769.             if(LowTime<380||LowTime>750) return 0;           //检测得到的低电平是否在560us左右,如果不是,则返回0;说明解码失败

  770.                    if((HighTime>1500)&&(HighTime<1900)) //如果高电平时间在1690微秒左右,(1690-200=1490,1690+200=1890),则该位是1;
  771.                                    dat=dat|0x80;       //是0的情况可判断,也可以不判断了,因为不判断的话上面开始移位后高位已自动清0,在这一行不在高位置1,已说明是0
  772.         }
  773. a[j]=dat;                                                                                                          //将每次解出的编码存到a[]中
  774. }
  775. if(a[2]=~a[3]) return 1;                                                                        //再次判断键码值,如果一致,返回1,解码正确
  776. }

  777. void IR_Scan(uchar dat00)
  778. {
  779.         switch(dat00)
  780.     {
  781.           case 0x46:KeyVal=7;break;                                           //MODE
  782.           case 0x07:KeyVal=8;break;                                           //EQ
  783.           case 0x15:KeyVal=9;break;                                           //--
  784.           case 0x09:KeyVal=10;break;                                           //+
  785.           case 0x19:KeyVal=11;break;                                           //REP
  786.           case 0x0d:KeyVal=12;break;                                        //SCAN
  787.           default:break;
  788.           }                                                   
  789. }


  790. /*设置时间入口*/
  791. void KeyScan()
  792. {
  793.         if(IR_Flag&&(KeyVal==7))                                                  //切换显示时间和日期
  794.         {
  795.         IR_Flag=0;                                                                           //标志位清零,每次只进入一遍这个函数,即每按一次键加1或减1
  796.                 display_time_flag=!display_time_flag;
  797.                 TR1=1;
  798.                 TH1=(65536-50000)/256;
  799.                 TL1=(65536-50000)%256;
  800.                 time_count=0;
  801.                 time_count0=0;
  802.                 time_count1=0;
  803.                 if(display_flag!=1)
  804.                 {
  805.                  display_flag=1;
  806.                  display_time_flag=0;
  807.                 }
  808.                 if(display_time_flag==1)        time_count1=28;
  809.                         if(set_count!=0)
  810.                         {
  811.                         if(set_count==7)
  812.                         {
  813.                         WriteSet1302(0x80,(((set_second/10)<<4)|(set_second%10)));
  814.                         set_second_flag=0;
  815.                         }
  816.                         WriteSet1302(0x8e,0x80);
  817.                         display_time_flag=!display_time_flag;
  818.                         set_count=0;
  819.                         }

  820.         }

  821.         else if(IR_Flag&&(KeyVal==8))                                                  //设置时间
  822.         {
  823.         IR_Flag=0;
  824.         display_flag=1;
  825.                 if(++set_count>8) set_count=0;
  826.                 switch(set_count)
  827.                 {
  828.                         case 1:                                                                                                                          //设置年
  829.                         {
  830.                         WriteSet1302(0x8e,0x00);                                                   //去掉保护
  831.                         set_year_tmp=(ReadSet1302(0x8d)>>4)*10+((ReadSet1302(0x8d))&0x0f);                         //在当前值设置
  832.                         set_year=set_year_tmp;
  833.                         }
  834.                         break;
  835.                         case 2:                                                                                                                                  //设置月
  836.                         {
  837.                         set_month_tmp=(ReadSet1302(0x89)>>4)*10+((ReadSet1302(0x89))&0x0f);
  838.                         set_month=set_month_tmp;
  839.                         }
  840.                         break;
  841.                         case 3:                                                                                                                                         //设置日
  842.                         {
  843.                         set_day_tmp=(ReadSet1302(0x87)>>4)*10+((ReadSet1302(0x87))&0x0f);
  844.                         set_day=set_day_tmp;
  845.                         }
  846.                         break;
  847.                         case 4:                                                                                                                                         //设置星期
  848.                         {
  849.                         set_week_tmp=ReadSet1302(0x8b);
  850.                         set_week=set_week_tmp;
  851.                         }
  852.                         break;
  853.                         case 5:                                                                                                                                         //设置时
  854.                         {
  855.                         set_hour_tmp=(ReadSet1302(0x85)>>4)*10+((ReadSet1302(0x85))&0x0f);
  856.                         set_hour=set_hour_tmp;
  857.                         }
  858.                         break;
  859.                         case 6:                                                                                                                                         //设置分
  860.                         {
  861.                         set_minute_tmp=(ReadSet1302(0x83)>>4)*10+((ReadSet1302(0x83))&0x0f);
  862.                         set_minute=set_minute_tmp;
  863.                         }
  864.                         break;
  865.                         case 8:
  866.                         {
  867.                         WriteSet1302(0x80,(((set_second/10)<<4)|(set_second%10)));
  868.                         WriteSet1302(0x8e,0x80);                                                        //写保护
  869.                         set_second_flag=0;
  870.                         set_count=0;
  871.                         time_count1=0;
  872.                         }
  873.                         break;
  874.                 }
  875.         }

  876.         else if(IR_Flag&&(KeyVal==10))                                                                           //+
  877.         {        
  878.                 IR_Flag=0;
  879.                 switch(set_count)
  880.                 {
  881.                 case 1:
  882.                 {
  883.                         if(++set_year>50) set_year=10;
  884.                 }
  885.                 break;
  886.                 case 2:
  887.                 {
  888.                         if(++set_month>12) set_month=1;
  889.                 }
  890.                 break;
  891.                 case 3:
  892.                 {
  893.                         if(++set_day>31) set_day=1;
  894.                 }
  895.                 break;
  896.                 case 4:
  897.                 {
  898.                         if(++set_week>7) set_week=1;
  899.                 }
  900.                 break;
  901.                 case 5:
  902.                 {
  903.                         if(++set_hour>23) set_hour=0;
  904.                 }
  905.                 break;
  906.                 case 6:
  907.                 {
  908.                         if(++set_minute>59) set_minute=0;
  909.                 }
  910.                 break;
  911.                 case 7:
  912.                 {
  913.                         set_second_flag=1;
  914.                         if(++set_second>59) set_second=0;
  915.                 }
  916.                 break;
  917.                 }
  918.         }

  919.         else if(IR_Flag&&(KeyVal==9))                                                                 //-
  920.         {
  921.                 IR_Flag=0;
  922.                 switch(set_count)
  923.                 {
  924.                 case 1:
  925.                 {
  926.                         if(--set_year<10) set_year=50;
  927.                 }
  928.                 break;
  929.                 case 2:
  930.                 {
  931.                         if(--set_month<1) set_month=12;
  932.                 }
  933.                 break;
  934.                 case 3:
  935.                 {
  936.                         if(--set_day<1) set_day=31;
  937.                 }
  938.                 break;
  939.                 case 4:
  940.                 {
  941.                         if(--set_week<1) set_week=7;
  942.                 }
  943.                 break;
  944.                 case 5:
  945.                 {
  946.                         if(--set_hour<0) set_hour=23;
  947.                 }
  948.                 break;
  949.                 case 6:
  950.                 {
  951.                         if(--set_minute<0) set_minute=59;
  952.                 }
  953.                 break;
  954.                 case 7:
  955.                 {
  956.                         set_second_flag=1;
  957.                         if(--set_second<0) set_second=59;
  958.                 }
  959.                 }
  960.         }
  961.         else if(IR_Flag&&(KeyVal==11))                                                                 //-
  962.         {
  963.                 IR_Flag=0;
  964.                 display_flag=2;
  965.                 TH1=(65536-50000)/256;
  966.                 TL1=(65536-50000)%256;
  967.                 time_count=0;
  968.                 time_count0=0;
  969.         }
  970.         else if(IR_Flag&&(KeyVal==12))                                                                 //-
  971.         {
  972.                 IR_Flag=0;
  973.                 if(++effect>2)        effect=0;
  974.         }


  975. }


  976. void set_time()
  977. {
  978. switch(set_count)
  979. {
  980.         case 1:
  981.         {
  982.         if(set_year!=set_year_tmp) WriteSet1302(0x8c,((set_year/10)<<4)|(set_year%10));                                                 //将上个设置数据写入1302
  983.         } break;
  984.         case 2:
  985.         {
  986.         if(set_month!=set_month_tmp)  WriteSet1302(0x88,((set_month/10)<<4)|(set_month%10));
  987.         } break;
  988.         case 3:
  989.         {
  990.         if(set_day!=set_day_tmp) WriteSet1302(0x86,((set_day/10)<<4)|(set_day%10));
  991.         } break;
  992.         case 4:
  993.         {
  994.         if(set_week!=set_week_tmp) WriteSet1302(0x8a,set_week);
  995.         } break;
  996.         case 5:
  997.         {
  998.         if(set_hour!=set_hour_tmp) WriteSet1302(0x84,((set_hour/10)<<4)|(set_hour%10));
  999.         } break;
  1000.         case 6:
  1001.         {
  1002.         if(set_minute!=set_minute_tmp) WriteSet1302(0x82,((set_minute/10)<<4)|(set_minute%10));
  1003.         } break;
  1004.         case 7:
  1005.         {
  1006.                 if(set_second_flag==0)
  1007.                 {         
  1008.                 set_second=(ReadSet1302(0x81)>>4)*10+((ReadSet1302(0x81))&0x0f);
  1009.                 }
  1010.                 else
  1011.                 {
  1012.                 WriteSet1302(0x80,((((set_second/10)<<4)|(set_second%10))|0x80));                                           //秒默认为00分,且先不启动时钟
  1013.                 }

  1014.         } break;


  1015. }
  1016. }

  1017. void main()
  1018. {
  1019. //set_count=1;
  1020. P1=0xff;
  1021. P3=0xff;
  1022. EA=1;
  1023. EX2=1;
  1024. EX3=1;
  1025. ET1=1;
  1026. IT2=0;
  1027. IT3=1;        //下降沿触发
  1028. PX2=0;
  1029. PX3=1;        //最高优先级
  1030. PT1=1;
  1031. TMOD=0x11;
  1032. TH1=(65536-50000)/256;
  1033. TL1=(65536-50000)%256;
  1034. Init1302();
  1035.         while(1)
  1036.         {
  1037.                    KeyScan();
  1038.                  set_time();
  1039.                  EX2=1;

  1040.                  
  1041.         }

  1042. }



  1043. void time1() interrupt 3
  1044. {
  1045. TH1=(65536-50000)/256;
  1046. TL1=(65536-50000)%256;
  1047.         if(++time_count>=20)
  1048.         {
  1049.         time_count=0;
  1050.         if(set_count==0)
  1051.         {
  1052.                 if(++time_count0>40)
  1053.                 {
  1054.                 time_count0=0;
  1055.                 time_count1=0;
  1056.                                 if(++display_flag>2) display_flag=1;
  1057.                 }
  1058.                 time_count1++;
  1059.                 if(time_count1<28) display_time_flag=0;
  1060.                 else if(time_count1>27)
  1061.                 {
  1062.                 display_time_flag=1;
  1063.                         if(time_count1>40) time_count1=0;
  1064.                 }

  1065.         }

  1066.         }
  1067. }

  1068. void int2_led()        interrupt 6
  1069. {
  1070. EX2=0;
  1071. switch(display_flag)
  1072. {
  1073. case 0:open_display();break;
  1074. case 1:
  1075. {

  1076.          if(set_count==0)
  1077.          {
  1078.          if(display_time_flag==0)         time1_display();                                                //显示时间
  1079.         else   time0_display();                                                                                                //显示日期
  1080.          }
  1081. else set_time_display();                                                                                                 //显示设置状态
  1082. } break;
  1083. case 2:love_display();break;
  1084. }
  1085.          EX3=1;                                                                                                                                //再开外中断INT3

  1086.         
  1087. }

  1088. /*红外接收外中断INT0*/
  1089. void int3() interrupt 7
  1090. {
  1091. EX3=0;
  1092. //delay(10);
  1093. if(IR) return;                                                          //防止长按时无效尾码的干扰,这个很关键!!!!                                                                 //暂关T1中断
  1094. TL0=0x00;
  1095. TH0=0x00;
  1096. TR0=1;
  1097. while(!IR);                                                  //低电平引导码等待
  1098. TR0=0;
  1099. LowTime=TH0*256+TL0;
  1100. TL0=0x00;
  1101. TH0=0x00;
  1102. TR0=1;
  1103. while(IR);                                                     //高电平引导码等待
  1104. TR0=0;
  1105. HighTime=TH0*256+TL0;

  1106. if((LowTime>8250)&&(LowTime<9350)&&(HighTime>3950)&&(HighTime<5050))           //判断是否在合理的范围内
  1107.         {
  1108.                 if(IRWork()&&(a[0]==0x00))                                                                   //如果解码正确,且厂家编码为0x04(我的遥控器)才执行子语句,防其它遥控器干扰
  1109.                 {
  1110.                 IR_Flag=1;               
  1111.                 IR_Scan(a[2]);               
  1112.                 }
  1113.         }
  1114. }
复制代码

所有资料51hei提供下载:
代码.rar (69.28 KB, 下载次数: 33)


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

使用道具 举报

沙发
ID:399179 发表于 2018-11-25 18:40 来自手机 | 只看该作者
无线供电?
回复

使用道具 举报

板凳
ID:89286 发表于 2018-11-27 08:55 | 只看该作者
thanks for sharing
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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