找回密码
 立即注册

QQ登录

只需一步,快速开始

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

DIY集MP3、电子时钟、电子音乐于一体的梦幻十字旋转屏

  [复制链接]
跳转到指定楼层
楼主
今天比较空闲,发个最近的作品到51hei论坛。先再看总体介绍图

但是,我这个DIY作品为了能跟大家分享,让更多的爱好者看到,我还是决定要发到这个版块来哈
当然,十字旋转屏不是我原创的了,这个东西很早以前就有了,但是本着弘扬DIY精神的态度,
我可不局限于只是让旋转屏滚动显示文字就罢了……所以全新的DIY开始了……
由于这个东西是今年4月份左右弄的,弄好后送给MM了,现在也拿不回来了哈~~
所以下面介绍的图片是以前留下的,所以要详细说制作过程比较难了…
刚传了视频,也先让大家看看以下留下的视频效果……看完视频后我再用保留下来的图片和原理图、程序等尽可能的向大家
介绍以前的制作过程!
其实,我最想向大家分享的是这个显示屏的程序,我写这个程序的时候,由于网上资料不全,我自己弄了几天才终于搞垫了哈



看完视频,我将开始介绍DIY过程……
1、主旋转屏底盒及电路等
我也去网上看过不少DIY高手用身边的材料做的旋转屏(有十字立体的,也有平面的),我也很是佩服。但是看来看去,他们说的材料我都不太有,而且我这个东西做出来后需要有一定的耐用性和美观性(因为要送MM嘛),所以最后主旋转屏是买了网上的套件来焊接组装。



买回到的套件是这样子的






这是原理图。
具体的安装方法等等我就不多做介绍了,因为那是别人的东西了,我再说出来,只能说我剽窃别人的,具体参考这卖套件的这个链接吧,他们上面有说明http://item.taobao点com/item.htm?spm=0.0.0.33.yS9Nym&;id=12577599101
而我下面主要说我对这个套件进行改装DIY的部分:
2、电源
电源我原来是用5V手机直充供电的,但由于是无线供电,最后到达顶部旋转屏的电压供不上(其实主要不是电压供不到,而是旋转屏点亮后,整体功率增强,就会导致输出的有效电压迅速下降,从而低于单片机的正常工作电压),导致单片机无**常工作,所以为了提高输出功率,只能提高电压。我试过用9V的开关电源,可以正常工作,但电压太高就会导致互初正反馈振荡电路(在底盒内部)的三极管温度很高,所以最终我去二手市场花了4块钱买了一个诺基亚的直充,上面标称是输出5.7V,我用万用表量过,也差不多,刚好合适哈,我再在次级线圈上多绕了几圈,次级感应出来的电压就更大,更合适了。
3、顶部旋转屏DIY
原来的套件使用的是STC89C51RC的单片机,我为了能多写点程序和添加功能,我换成了52的单片机




看上面的图片,大家会发现,我自己用洞洞板加了一个DS1302的时钟模块进去,同时还添加了一体化红外接收头用于调时间和控制显示。特别说明一下,一般51单片机有4个IO口,而这个旋转屏套件是两个(红色和绿色)16路流水灯直接加限流电阻后连到单片机的32个IO口,所以按理来说单片机的IO口已全部占用。但是这个单片机不是一般的51单片机,它还有4个P4的IO口。这多出来的4个IO口,一个我用于普通红外接收(用于编程时控制显示的),一个用于一体化红外接收头,另外两个用于接DS1302,但DS1302一共要接三根线,另外一个IO口哪里来呢?实际上另一根线我接到了其中一个绿色LED上,所以,时间的显示只能显示红色,而且看视频你会发现显示时间时上面有一绿色的灯环在亮,这是DS1302控制线控制绿色LED发出来的。具体的,各位高手看我程序就懂了。对于P4口的定义等等,可以参考我的C程序哈~~




还有,我用到的遥控器是这种常用车载MP3的遥控器,估计现在很多开发板也是附带这种红外遥控器,可以对时间和显示进行控制。



4、底盒内部电路介绍
底部的DIY才是我自己的核心哈。








下面从左到右给大家介绍一下:
(1)最左边是一些开关和接口,主要有MP3耳机接口、电源输入接口,开关主要有MP3独立总开关、旋转屏总开关、电机开关、电子音乐开关。
(2)MP3模块
MP3模块是买网上的夹子MP3


就是这种,大概10块钱左右。里面主要就是一个MP3解码芯片,把外壳去掉,在底盒合适位置凿个洞就装上去了哈,MP3模块的供电也是直接接电源接口(5.7v)。因为电源是接到MP3模块的USB接口上,本应5V供电,现在电压过高了,因此为了保险起见,串联了一个1N4007二极管才按到MP3模块的USB接口的,这样1N4007降了0.6-0.7V左右,MP3模块就可以工作了。但是实际却发现,有时给MP3供电却没反应,后面想到,平时MP3模块不工作时,两条电源线呈高阻状态,而1N4007要导通工作时,两端要有0.2V左右的压降,因此,在1N4007输出端我加了一个20K的下拉电阻哈,电路就像下面这样子


,这样就保证每次都可以上电启动MP3了。
还有耳机的接口啊什么的,在底盒左侧我都重新单独弄出来,接法就不说了,大家都懂的。
MP3我弄有单独的总开关,在左上角位置,同时MP3的五个按键我也全部引出来了,那几个按键大家参考一下插卡MP3的原理图就会发现,那是模拟按键,而不是数字按键。因此,好像五个按键我一共引出了八条线出来,有三条是公共的,还是五条是分别控制五个按键。而且节省体积,我引出的引线是用烂耳机里面的漆包线作为导线的,同时上面连DS1302模块也是用那种线。下面是最终安装好的MP3效果图






(3)无线供电模块
这个就不用多做介绍了,我是用洞洞板做的,电路图参考上面主旋转屏的原理图,我加了散热,并固定好,同时,在该模块下面还是一个红外发射LED,是配合顶部旋转屏编程显示的。
(4)电子音乐
我使用的是普通的固化了语音内容的音乐IC,增加了一点电子韵味哈,这个模块也是在51电子淘宝来的,


,参考电路也是上面这个,但是我没用扬声器,节省体积我用了有源蜂鸣器代替(注意一定要用有源的蜂鸣器,无源的声音很小),同时该模块工作电压比较小,我直接加了100欧左右的电阻分压就可以了。这个模块我也加了独立的开关,因为电机的工作有很大的干扰,因此在这个音乐IC的电源输入端我加了100UF的滤波电容。
(5)MP3外扬电路
为实现MP3外扬,有使用了TDA2822功放芯片,并加大了输入电源的滤波(220UF,尽量大,因为电机干扰),出来的声音勉强可以了哈。如果从MP3音频插口直接输入到TDA2822的声音过大失真严重的话,可以在输入线按一个10-20K左右的电阻下拉到地线,这样声音就柔和适合多了。电路原理图参考下面



同时,刚才的耳机接口要用那种五个脚带开关的音频插座,这样就可以实现插入耳机后断开送入TDA2822的音源。在该模块下面有一个0.5W的小喇叭,通过上面的红外说明上面的洞洞发出声音。如下



(6)电机调速
按照原来的套件,电机是直接接到一个1N4007的两端通过1N4007两端的压降供电的(大概0.6-0.7V),但这样的供电在实际中,电机会转得很慢。又因为我在顶部加了时钟模块和其它的,不加大电机电压,转速跟不上,显示时会非常闪烁的,所以我用了CW317可调稳压IC对电机进行调压。可能有些朋友就说了,干嘛不直接串联一个电阻到电机就可以了,干嘛那么麻烦。首先,电阻串联是可以的,但电阻阻值会随着产热发生改变,加上直流电机本身的阻值不是很高,要串联的电阻是也是比较低的,电阻产热会很高,就导致到电机的电压不稳定,即影响转速,又不稳定了。所以最后还是用CW317进行稳压调速。其电路很简单,大家参考CW317芯片的经典接法就是了。
(7)其他
还买了个七彩LED,在底盒顶部用电钻打了一些小洞组成一个“心”形,在心形中间把这个七彩LED装上,这些小洞既可以来给底盒的互初正反馈振荡电路散热,又有其他的意思哈




~~还有其他的旋转屏显示效果,只是真正见识到了我这人DIY作品才能感受得到的哈。
到现在,DIY过程也介绍得差不多了,因为制作过程中没留有相片,只能靠现在的口述了……
感兴趣的朋友,制作过程中有什么问题的都可以向我交流探讨哈
最后,分享我的程序,这个程序可是原创的哦,有什么建议或问题再交流了哈…………
程序发下: 十字旋转LED红外时钟程序.rar (69.28 KB, 下载次数: 33)


最后,算算我这个东西大概一共花了七八十块钱左右哈,但功能很多,也够炫了哈~~
最后还有一点相片分享哈~~









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

使用道具 举报

沙发
ID:1 发表于 2014-12-20 01:16 | 只看该作者
作品很牛,以下是主程序方便大家预览:
  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. }
复制代码
回复

使用道具 举报

板凳
ID:72901 发表于 2015-1-28 12:33 | 只看该作者
不错,值得学习
回复

使用道具 举报

地板
ID:72995 发表于 2015-1-31 12:02 | 只看该作者
楼主,好厉害啊,赞赞赞赞赞
回复

使用道具 举报

5#
ID:72611 发表于 2015-4-4 17:31 | 只看该作者
高手呀
回复

使用道具 举报

6#
ID:76142 发表于 2015-4-4 23:13 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
ID:76142 发表于 2015-4-4 23:13 | 只看该作者
谢谢分享
回复

使用道具 举报

8#
ID:111276 发表于 2016-7-4 10:00 来自手机 | 只看该作者
厉害,我也要学习做一个当生日礼物送
回复

使用道具 举报

9#
ID:140943 发表于 2016-9-30 00:39 来自手机 | 只看该作者
楼主可以发下完整的教程和说明吗。。新手想尝试下
回复

使用道具 举报

10#
ID:190426 发表于 2017-4-17 14:25 | 只看该作者
今天刚刚来到51黑电子论坛 希望 能够和大家相处的愉快
回复

使用道具 举报

11#
ID:81140 发表于 2017-9-16 16:31 | 只看该作者
太棒了                     
回复

使用道具 举报

12#
ID:81140 发表于 2017-9-16 16:31 | 只看该作者
太棒了!!!!!!!!!!!!
回复

使用道具 举报

13#
ID:251422 发表于 2017-11-27 14:03 | 只看该作者
小白学习
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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