找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5480|回复: 6
收起左侧

LED双色单元板+STC12C5A60S2+DS1302制作电子钟

  [复制链接]
ID:258695 发表于 2018-1-9 16:12 | 显示全部楼层 |阅读模式
单位淘汰下的双色LED单元板,大部分都能正常使用,拿来研究了一下,结合网上的一些程序,制作了一个电子钟,初次发贴,见笑。。。
成品图

亚克力板

粘合

打孔,安装

合体


几点说明:
1、单片机必须用STC12C5A60S2,不能用89C51,要用推挽输出才能正常显示。
2、温度没用18B20,用的是10K感温头。
3、单元板比较费电,5W左右,单独供电,所以用了两5V电源(用一个电源时DS1302不能正常工作)。

单片机源程序如下:
  1. #include"STC12C5A60S2.h"               /*头文件的包含*/
  2. #include"zimo.h"
  3. #include <intrins.h>
  4. #include <ADC.H>
  5. #include"led_595.h"
  6. #include"DS1302.h"            



  7. sbit K1=P3^0;
  8. sbit K2=P3^1;
  9. sbit K3=P3^2;
  10. sbit K4=P3^3;

  11. unsigned char SetState,SetPlace=0;
  12. void Int0Configuration();

  13. unsigned char code temp_table[]={67, 70, 72, 74, 76, 78, 81, 83, 85, 87,
  14.                                                                  89, 90, 91, 93, 95, 97, 100,103,106,110,
  15.                                                                  113,116,119,122,125,128,131,133,136,139,
  16.                                                                  141,143,146,148,150,152,154,157,159,161,
  17.                                                                  163,165,167,169,171,173,175,176,178,180,
  18.                                                                  182,184,186,187,189,191,193,194,196,198,
  19.                                                                  199,200,201,202};
  20. unsigned int temp_change(unsigned char temp1)
  21. {
  22.         unsigned int i;
  23.         for(i=0;i<=63;i++)
  24.         {
  25.                 if(temp_table[i]>temp1) break;        
  26.         }
  27.         if(temp_table[i]==0) return 0;
  28.                 else if(temp_table[i]==63) return 640;
  29.                         else
  30.                         {
  31.                                 return (unsigned int)((temp1-temp_table[i-1])*10/(temp_table[i]-temp_table[i-1])+(i-1)*10+5);
  32.                         }


  33. }


  34. void SendTime(void)
  35. {
  36.         unsigned int TempData;
  37.         GetTime();
  38.         TempData=GetADCResult(2);
  39.         TempData=temp_change(TempData);
  40.         line1_num[2]=TableDs1302[6]/10;
  41.         line1_num[3]=TableDs1302[6]%10;
  42.         line1_num[5]=TempData/100;
  43.         line1_num[6]=TempData%100/10;
  44.         line2_num[0]=TableDs1302[4]/10;
  45.         line2_num[1]=TableDs1302[4]%10;
  46.         line2_num[3]=TableDs1302[3]/10;
  47.         line2_num[4]=TableDs1302[3]%10;
  48.         line2_num[7]=TableDs1302[5]+10;
  49.         line3_num[0]=TableDs1302[2]/10;
  50.         line3_num[1]=TableDs1302[2]%10;
  51.         line3_num[3]=TableDs1302[1]/10;
  52.         line3_num[4]=TableDs1302[1]%10;
  53.         line3_num[6]=TableDs1302[0]/10;
  54.         line3_num[7]=TableDs1302[0]%10;
  55. }


  56. void main()
  57. {
  58.         unsigned int i;
  59.         LED_Init();       
  60.         DelayMS(100);
  61.         InitADC();
  62.         DelayMS(1000);
  63.         Int0Configuration();

  64.         if(K2==0)
  65.         {
  66.                  DelayMS(1000);

  67.                  InitDS1302();
  68.        
  69.        
  70.        
  71.         }



  72.         while(1)
  73.         {
  74.                 if(SetState==0)
  75.                 {
  76.                         SendTime();
  77.                         for(i=0;i<10;i++)        LED_Display();
  78.                 }
  79.                 else
  80.                 {
  81.                         SendTime();
  82.                         for(i=0;i<20;i++)        LED_Display();
  83.                         for(i=0;i<2;i++)
  84.                         {
  85.                                 if(SetPlace==0)        {line3_num[6]=11;line3_num[7]=11;}
  86.                                 if(SetPlace==1)        {line3_num[3]=11;line3_num[4]=11;}
  87.                                 if(SetPlace==2)        {line3_num[0]=11;line3_num[1]=11;}
  88.                                 if(SetPlace==3)        {line2_num[3]=10;line2_num[4]=10;}
  89.                                 if(SetPlace==4)        {line2_num[0]=10;line2_num[1]=10;}
  90.                                 if(SetPlace==5)        {line2_num[7]=10;}
  91.                                 if(SetPlace==6)        {line1_num[2]=10;line1_num[3]=10;}
  92.                                 LED_Display();
  93.                         }
  94.                        
  95.                         if(K1==0)                //检测按键K1是否按下
  96.                         {
  97.                                 LED_Display();        //消除抖动
  98.                                 if(K1==0)
  99.                                 {
  100.                                         SetPlace++;
  101.                                         if(SetPlace>=7)
  102.                                                 SetPlace=0;                                       
  103.                                 }

  104.                                 while((i<50)&&(K1==0))         //检测按键是否松开
  105.                                 {
  106.                                         LED_Display();
  107.                                         i++;
  108.                                 }
  109.                                 i=0;
  110.                         }          
  111.                         if(K2==0)                //检测按键K2是否按下
  112.                         {
  113.                                 LED_Display();        //消除抖动
  114.                                 if(K2==0)
  115.                                 {
  116.                                         TableDs1302[SetPlace]++;
  117.                                         if((TableDs1302[SetPlace]>=60)&&(SetPlace<2))                //分秒只能到59
  118.                                         {
  119.                                                 TableDs1302[SetPlace]=0;
  120.                                         }
  121.                                         if((TableDs1302[SetPlace]>=24)&&(SetPlace==2))                //小时只能到23
  122.                                         {
  123.                                                 TableDs1302[SetPlace]=0;
  124.                                         }
  125.                                         if((TableDs1302[SetPlace]>=32)&&(SetPlace==3))                //日只能到31
  126.                                         {
  127.                                                 TableDs1302[SetPlace]=1;       
  128.                                         }
  129.                                         if((TableDs1302[SetPlace]>=13)&&(SetPlace==4))                //月只能到12
  130.                                         {
  131.                                                 TableDs1302[SetPlace]=1;
  132.                                         }       
  133.                                         if((TableDs1302[SetPlace]>=8)&&(SetPlace==5))                //周只能到7
  134.                                         {
  135.                                                 TableDs1302[SetPlace]=1;
  136.                                         }               
  137.                                         if((TableDs1302[SetPlace]>=31)&&(SetPlace==6))                //年暂时到2030
  138.                                         {
  139.                                                 TableDs1302[SetPlace]=0;
  140.                                         }               


  141.                                         InitDS1302();
  142.                                 }
  143.                                
  144.                                 while((i<50)&&(K2==0))         //检测按键是否松开
  145.                                 {
  146.                                         LED_Display();
  147.                                         i++;
  148.                                 }
  149.                                 i=0;
  150.                                
  151.                         }                                               
  152.                 }
  153.         }
  154. }


  155. void Int0Configuration()
  156. ……………………

  157. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
0.png
所有资料51hei提供下载:
LED_595_1302.rar (43.65 KB, 下载次数: 97)
回复

使用道具 举报

ID:87149 发表于 2018-1-13 06:33 | 显示全部楼层
厉害牛人啊
回复

使用道具 举报

ID:277136 发表于 2018-1-18 09:18 | 显示全部楼层
感谢楼主分享!!!
回复

使用道具 举报

ID:101726 发表于 2018-6-21 02:16 | 显示全部楼层
感谢 热心分享
回复

使用道具 举报

ID:496315 发表于 2019-4-15 10:12 | 显示全部楼层
感谢 热心分享
回复

使用道具 举报

ID:356562 发表于 2021-2-12 08:12 | 显示全部楼层
STC 1T的单片机速度快,读写DS1302和DS18B20需要调整时序。
回复

使用道具 举报

ID:977804 发表于 2022-3-17 23:16 来自手机 | 显示全部楼层
很历害,楼主用心了
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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