找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机+SL041MG VFD显示屏时钟制作资料 源码与电路图都有

  [复制链接]
跳转到指定楼层
楼主
主控用的STC15W408AS,时钟芯片用带温度补偿功能的R8025T,以前用了不少精度也还不错。VFD用SL041MG,驱动用了比较常见的PT6312。电源直接用MicroUSB数据线连接手机充电器等供电。
遥控手动调节,一组闹钟,亮度自动手动控制,掉电记忆等,由于时间关系暂未加入年月日温度等轮回显示

用SL041MG 制作VFD显示屏时钟


电路原理图如下:


SL041MG VFD R8025单片机源程序如下:
  1. //SL041MG VFD 小琼数码 2018-2-6 V1.0 无温度
  2. //PT6312+STC15W408AS+R8025T
  3. #include<STC15.h>
  4. #include<intrins.h>
  5. #define uint  unsigned int
  6. #define uchar unsigned char
  7. #include"IIC.h"                                //IIC驱动
  8. #include"PT6312.H"                        //VFD驱动
  9. #include"NEC6121.h"                        //遥控解码
  10. #include"STC_ADC.h"                        //内部ADC
  11. #include"STC_EEPROM1T.h"        //内部EEPROM

  12.                                 //           0        1         2    3    4    5     6   7     8   9    a          b           c    d    e    f           -        空         H          L            P         U
  13. uchar code table[] = {0x7d,0x05,0x6e,0x4f,0x17,0x5b,0x7b,0x0d,0x7f,0x5f,0x3f,0x73,0x78,0x67,0x7a,0x3a,0x02,0x00,0x37,0x70,0x3a,0x75}; //0~9显示代码

  14. sbit beep    = P5^5;   //蜂鸣器  
  15. sbit kaiping = P3^2;   //开关屏

  16. sbit k1      = P1^5;   //按键1
  17. sbit k2      = P1^3;   //按键2
  18. bit kk1=0,kk2;                   //按键标志

  19. uchar tiao;           //调整
  20. uint fan;           //自动返回
  21. uint liangcai; //光控采集间隔
  22. uchar shan;           //秒点闪
  23. uchar beeshu;  //beep计时用
  24. bit nao=0;           //闹钟标志 0 不响  1 响
  25. char naoshi=0,naofen=0; //闹钟时间
  26. uchar naoji=0;                 //闹钟计数
  27. uchar guanji=0;                 //待机
  28. uchar naokaiguan=0;         //闹钟开关
  29. uchar zishou=0;                 //自动手动亮度
  30. char shoushu=0;          //手动亮度数值 0-7
  31. char liangdu=5;                 //亮度实际数值

  32. char hour,minute,second;     //时间
  33. uchar disp[5]={0,0,0,0,0};   //显示缓存

  34. uchar liangshu;    //亮度ADC
  35. #define liang1 50  //可以修改亮度数据
  36. #define liang2 70
  37. #define liang3 100
  38. #define liang4 120
  39. #define liang5 150
  40. #define liang6 170
  41. #define liang7 200

  42. void delay(uint z)           //延时子程序 约1MS
  43. {
  44.    uint x,y;
  45.    for(x=z;x>0;x--)
  46.    for(y=1000;y>0;y--);
  47. }

  48. void init()          //初使化
  49. {   
  50.    delay(100);
  51.    P3M0=0x04;    //P3.2强上拉
  52.    P3M1=0x00;
  53.    init_IIC();   //IIC初使化       

  54.    
  55.     AUXR |=        0x80;//Timer0 1T Timer1 12T
  56.         EA=1;        //开总中断
  57.     ET0=1;       //开定时器0中断
  58.         TMOD=0x00;         //定时器0,1模式0 自动重装
  59.         TL0                =        T125US;                        //Initial timer0 low byte
  60.         TH0                =        T125US>>8;                //Initial timer0 high byte
  61.     TR0=1;                //开定时器0运行       

  62.         AUXR &= 0xFB;        //定时器时钟12T模式
  63.         T2L = 0x00;                //设置定时初值
  64.         T2H = 0xB8;                //设置定时初值
  65.         AUXR |= 0x10;        //定时器2开始计时
  66.         IE2|=0x04;                //开定时器2中断

  67.         PT6312_1(); //设置显示方式 8位20段
  68.     PT6312_2(); //数据设定 写显存 固定地址 正常模式
  69.         beep=0;
  70.         delay(100);
  71.         beep=0;

  72.            guanji=STC_read(0x0000);
  73.            if(guanji>1)
  74.            {
  75.                     guanji=1;
  76.                  STC_del(0x0000);
  77.                  STC_write(0x0000,guanji);
  78.            }
  79.        
  80.                    naokaiguan=STC_read(0x0200);
  81.            if(naokaiguan>1)
  82.            {
  83.                     naokaiguan=0;
  84.                  STC_del(0x0200);
  85.                  STC_write(0x0200,naokaiguan);
  86.            }
  87.        
  88.                 naoshi=STC_read(0x0400);
  89.            if(naoshi>23)
  90.            {
  91.                     naoshi=8;
  92.                  STC_del(0x0400);
  93.                  STC_write(0x0400,naoshi);
  94.            }
  95.        
  96.                 naofen=STC_read(0x0600);
  97.            if(naofen>59)
  98.            {
  99.                     naofen=0;
  100.                  STC_del(0x0600);
  101.                  STC_write(0x0600,naofen);
  102.            }
  103.        
  104.                    zishou=STC_read(0x0800);
  105.            if(zishou>1)
  106.            {
  107.                     zishou=0;
  108.                  STC_del(0x0800);
  109.                  STC_write(0x0800,zishou);
  110.            }
  111.        
  112.                 shoushu=STC_read(0x0A00);
  113.            if(shoushu>7)
  114.            {
  115.                     shoushu=5;
  116.                  STC_del(0x0A00);
  117.                  STC_write(0x0A00,shoushu);
  118.            }
  119. }

  120. void read_RX8025()          //读时期和时间
  121. {
  122.        uchar dat1,dat2,number;
  123.        number=read_IIC(RX8025,0);
  124.        dat1=number&0x7f;
  125.        dat2=dat1/16;                           //数据进制转换
  126.        dat1=dat1%16;                         //十六进制转十进制
  127.        dat1=dat1+dat2*10;
  128.        second=dat1;

  129.        number=read_IIC(RX8025,1);
  130.        dat1=number&0x7f;
  131.        dat2=dat1/16;                           //数据进制转换
  132.        dat1=dat1%16;                         //十六进制转十进制
  133.        dat1=dat1+dat2*10;
  134.        minute=dat1;

  135.        number=read_IIC(RX8025,2);
  136.        dat1=number&0x3f;
  137.        dat2=dat1/16;                           //数据进制转换
  138.        dat1=dat1%16;                         //十六进制转十进制
  139.        dat1=dat1+dat2*10;
  140.        hour=dat1;
  141. }

  142. void huancun()           //显示数据送入缓存
  143. {                                
  144.   switch(tiao)
  145.            {
  146.             case 0:           //平时显示
  147.             if((hour/10)==0)
  148.                 disp[0]=17;
  149.                 else
  150.                   disp[0]=hour/10;
  151.                 disp[1]=hour%10;
  152.                 if(shan<25)
  153.                 disp[2]=0x44;
  154.                 else
  155.                 disp[2]=0x00;
  156.                 disp[3]=minute/10;
  157.                 disp[4]=minute%10;
  158.        
  159.                 break;
  160.                    case 1:           //调整小时
  161.                 if(shan<25)
  162.                 {
  163.                   disp[0]=hour/10;
  164.                 disp[1]=hour%10;
  165.                 disp[2]=0x44;
  166.                 }
  167.                 else
  168.                 {
  169.                   disp[0]=17;
  170.                 disp[1]=17;
  171.                 disp[2]=0;
  172.                 }
  173.                 disp[3]=minute/10;
  174.                 disp[4]=minute%10;
  175.                 break;           //调整分钟
  176.             case 2:
  177.                   disp[0]=hour/10;
  178.                 disp[1]=hour%10;
  179.                 if(shan<25)
  180.                 {
  181.                 disp[2]=0x44;
  182.                 disp[3]=minute/10;
  183.                 disp[4]=minute%10;
  184.                 }
  185.                 else
  186.                 {
  187.                 disp[2]=0;
  188.                 disp[3]=17;
  189.                 disp[4]=17;
  190.                 }
  191.                 break;
  192.                 case 3:          //调整秒
  193.                 disp[0]=17;
  194.                 disp[1]=17;
  195.                 if(shan<25)
  196.                 disp[2]=0x44;
  197.                 else
  198.                 disp[2]=0x00;
  199.                 disp[3]=second/10;
  200.                 disp[4]=second%10;
  201.                 break;
  202.                 case 4:                //闹钟开关
  203.                   disp[0]=10;
  204.                 disp[1]=19;
  205.                 disp[2]=0x40;
  206.                 if(shan<25)
  207.                 {
  208.                         if(naokaiguan)
  209.                         {
  210.                         disp[3]=1;
  211.                         disp[4]=1;
  212.                         }
  213.                         else
  214.                         {
  215.                         disp[3]=0;
  216.                         disp[4]=15;
  217.                         }
  218.                 }
  219.                 else
  220.                 {
  221.                 disp[3]=17;
  222.                 disp[4]=17;
  223.                 }
  224.                 break;
  225.                    case 5:                //闹钟小时
  226.                 if(shan<25)
  227.                 {
  228.                   disp[0]=naoshi/10;
  229.                 disp[1]=naoshi%10;
  230.                 }                       
  231.                 else
  232.                 {
  233.                   disp[0]=17;
  234.                 disp[1]=17;
  235.                 }
  236.                 disp[2]=0x04;
  237.                 disp[3]=naofen/10;
  238.                 disp[4]=naofen%10;
  239.                 break;
  240.             case 6:            //闹钟分钟
  241.                   disp[0]=naoshi/10;
  242.                 disp[1]=naoshi%10;
  243.                 disp[2]=0x04;
  244.                 if(shan<25)
  245.                 {
  246.                 disp[3]=naofen/10;
  247.                 disp[4]=naofen%10;
  248.                 }
  249.                 else
  250.                 {
  251.                 disp[3]=17;
  252.                 disp[4]=17;
  253.                 }
  254.                 break;
  255.                 case 7:                //自动手动亮度
  256.                 disp[0]=19;
  257.                 disp[1]=19;
  258.                 disp[2]=0x40;
  259.                 if(shan<25)
  260.                 {
  261.                         if(zishou)
  262.                         {
  263.                         disp[3]=5;
  264.                         disp[4]=13;
  265.                         }
  266.                         else
  267.                            {
  268.                         disp[3]=10;
  269.                         disp[4]=21;
  270.                         }
  271.                 }
  272.                 else
  273.                 {
  274.                 disp[3]=17;
  275.                 disp[4]=17;
  276.                 }
  277.                 break;
  278.                 case 8:                //手动亮度数
  279.                   disp[0]=5;
  280.                 disp[1]=13;
  281.                 disp[2]=0x40;
  282.                 if(shan<25)
  283.                 {
  284.                 disp[3]=0;
  285.                 disp[4]=shoushu;
  286.                 }
  287.                 else
  288.                 {
  289.                 disp[3]=17;
  290.                 disp[4]=17;
  291.                 }
  292.                 break;          
  293.            }
  294. }

  295. void display()                //送显示数据
  296. {          
  297.                   PT6312_3();
  298.             write_PT6312(table[disp[4]]);      
  299.             write_PT6312(0x00);      
  300.           
  301.             write_PT6312(table[disp[3]]);      
  302.             write_PT6312(0x00);      

  303.               write_PT6312(disp[2]);
  304.             write_PT6312(0x00);      

  305.             write_PT6312(table[disp[1]]);      
  306.             write_PT6312(0x00);      

  307.             write_PT6312(table[disp[0]]);        
  308.             write_PT6312(0x00);      
  309.          
  310.                    PT6312_4(liangdu);     
  311. }

  312. void yaokong()          //遥控功能
  313. {
  314.                  if(IR_code==daiji)
  315.                 {
  316.                           if(guanji==0) guanji=1;
  317.                           else if(guanji==1)
  318.                                   {
  319.                                   guanji=0;
  320.                                   tiao=0;
  321.                                   }
  322.                           STC_del(0x0000);
  323.                           STC_write(0x0000,guanji);
  324.                   beep=0;
  325.                 }
  326.                 if(guanji)
  327.                 {
  328.                          if(IR_code==xiaoshi)
  329.                         {
  330.                           tiao++;
  331.                           if(tiao>=9)
  332.                           {
  333.                           tiao=0;
  334.                           beep=0;
  335.                           delay(100);
  336.                           }
  337.                           beep=0;
  338.                           fan=0;
  339.                         }
  340.                          if(IR_code==jing)
  341.                         {
  342.                           nao=0;
  343.                           naoji=0;
  344.                           beep=0;                 
  345.                         }
  346.                         if(tiao!=0)
  347.                         {
  348.                          if(IR_code==jia)
  349.                                 {
  350.                                   switch(tiao)
  351.                                           {
  352.                                             case 1:
  353.                                           hour++;
  354.                                           if(hour>=24)
  355.                                           hour=0;
  356.                                           write_IIC(RX8025,2,(hour/10)<<4|(hour%10));
  357.                                           break;
  358.                                             case 2:
  359.                                           minute++;
  360.                                           if(minute>=60)
  361.                                           minute=0;
  362.                                           write_IIC(RX8025,1,(minute/10)<<4|(minute%10));
  363.                                           break;
  364.                                           case 3:
  365.                                           second++;
  366.                                           if(second>=60)
  367.                                           second=0;
  368.                                           write_IIC(RX8025,0,(second/10)<<4|(second%10));
  369.                                           break;
  370.                                           case 4:
  371.                                           if(naokaiguan==0) naokaiguan=1;
  372.                                           else if(naokaiguan==1) naokaiguan=0;
  373.                                           STC_del(0x0200);
  374.                                           STC_write(0x0200,naokaiguan);
  375.                                           break;
  376.                                           case 5:
  377.                                           naoshi++;
  378.                                           if(naoshi>23)
  379.                                           naoshi=0;
  380.                                           STC_del(0x0400);
  381.                                           STC_write(0x0400,naoshi);
  382.                                           break;
  383.                                           case 6:
  384.                                           naofen++;
  385.                                           if(naofen>59)
  386.                                           naofen=0;
  387.                                           STC_del(0x0600);
  388.                                           STC_write(0x0600,naofen);
  389.                                           break;
  390.                                           case 7:
  391.                                           if(zishou==0) zishou=1;
  392.                                           else if(zishou==1) zishou=0;
  393.                                           STC_del(0x0800);
  394.                                           STC_write(0x0800,zishou);
  395.                                           break;
  396.                                           case 8:
  397.                                           shoushu++;
  398.                                           if(shoushu>=8)
  399.                                           shoushu=0;
  400.                                           STC_del(0x0A00);
  401.                                       STC_write(0x0A00,shoushu);
  402.                                           break;
  403.                                   }
  404.                                  beep=0;
  405.                                   fan=0;
  406.                                 }
  407.        
  408.                            if(IR_code==jian)
  409.                                 {
  410.                                   switch(tiao)
  411.                                           {
  412.                                            case 1:
  413.                                           hour--;
  414.                                           if(hour<0)
  415.                                           hour=23;
  416.                                           write_IIC(RX8025,2,(hour/10)<<4|(hour%10));
  417.                                           break;
  418.                                             case 2:
  419.                                           minute--;
  420.                                           if(minute<0)
  421.                                           minute=59;
  422.                                           write_IIC(RX8025,1,(minute/10)<<4|(minute%10));
  423.                                           break;
  424.                                           case 3:
  425.                                           second--;
  426.                                           if(second<0)
  427.                                           second=59;
  428.                                           write_IIC(RX8025,0,(second/10)<<4|(second%10));
  429.                                           break;
  430.                                           case 4:
  431.                                           if(naokaiguan==0) naokaiguan=1;
  432.                                           else if(naokaiguan==1) naokaiguan=0;
  433.                                           STC_del(0x0200);
  434.                                           STC_write(0x0200,naokaiguan);
  435.                                           break;
  436.                                           case 5:
  437.                                           naoshi--;
  438.                                           if(naoshi<0)
  439.                                           naoshi=23;
  440.                                           STC_del(0x0400);
  441.                                           STC_write(0x0400,naoshi);
  442.                                           break;
  443.                                           case 6:
  444.                                           naofen--;
  445.                                           if(naofen<0)
  446.                                           naofen=59;
  447.                                           STC_del(0x0600);
  448.                                           STC_write(0x0600,naofen);
  449.                                           break;
  450.                                           case 7:
  451.                                           if(zishou==0) zishou=1;
  452.                                           else if(zishou==1) zishou=0;
  453.                                           STC_del(0x0800);
  454.                                           STC_write(0x0800,zishou);
  455.                                           break;
  456.                                           case 8:
  457.                                           shoushu--;
  458.                                           if(shoushu<0)
  459.                                           shoushu=7;
  460.                                           STC_del(0x0A00);
  461.                                       STC_write(0x0A00,shoushu);
  462.                                           break;
  463.                                               }
  464.                                   beep=0;
  465.                                   fan=0;
  466.                                 }
  467.                         }
  468.                 }
  469. }       
  470.           
  471. void keyscan()
  472. {
  473.   
  474.      if(!k1)
  475.      kk1=1;
  476.      if(kk1&&k1)
  477.          {
  478.                   if(guanji==0)
  479.                   {
  480.                     tiao=0;
  481.                     guanji=1;
  482.                         beep=0;
  483.                         STC_del(0x0000);
  484.                         STC_write(0x0000,guanji);
  485.                   }
  486.                   else if(nao==1)
  487.                                   {
  488.                                           naoji=0;
  489.                                         nao=0;
  490.                                   }
  491.                           else
  492.                                   {
  493.                                   tiao++;
  494.                                           if(tiao>=9)
  495.                                           {
  496.                                                  tiao=0;
  497.                                                  beep=0;
  498.                                                  delay(100);
  499.                                           }
  500.                                   }
  501.                           beep=0;
  502.                           kk1=0;
  503.                           fan=0;
  504.                          
  505.          }

  506.          if(guanji==1)
  507.          {
  508.          if(!k2)
  509.      kk2=1;
  510.      if(kk2&&k2)
  511.          {
  512.                      if(nao==1)
  513.                   {
  514.                           naoji=0;
  515.                         nao=0;
  516.                   }
  517.           else
  518.           {
  519.               switch(tiao)
  520.                   {
  521.                     case 1:
  522.                   hour++;
  523.                   if(hour>=24)
  524.                   hour=0;
  525.                   write_IIC(RX8025,2,(hour/10)<<4|(hour%10));
  526.                   break;
  527.                     case 2:
  528.                   minute++;
  529.                   if(minute>=60)
  530.                   minute=0;
  531.                   write_IIC(RX8025,1,(minute/10)<<4|(minute%10));
  532.                   break;
  533.                   case 3:
  534.                   second++;
  535.                   if(second>=60)
  536.                   second=0;
  537.                   write_IIC(RX8025,0,(second/10)<<4|(second%10));
  538.                   break;
  539.                   case 4:
  540.                   if(naokaiguan==0) naokaiguan=1;
  541.                   else if(naokaiguan==1) naokaiguan=0;
  542.                   STC_del(0x0200);
  543.                   STC_write(0x0200,naokaiguan);
  544.                   break;
  545.                   case 5:
  546.                   naoshi++;
  547.                   if(naoshi>23)
  548.                   naoshi=0;
  549.                   STC_del(0x0400);
  550.                   STC_write(0x0400,naoshi);
  551.                   break;
  552.                   case 6:
  553.                   naofen++;
  554.                   if(naofen>59)
  555.                   naofen=0;
  556.                   STC_del(0x0600);
  557.                   STC_write(0x0600,naofen);
  558.                   break;
  559.                   case 7:
  560.                   if(zishou==0) zishou=1;
  561.                   else if(zishou==1) zishou=0;
  562.                   STC_del(0x0800);
  563.                   STC_write(0x0800,zishou);
  564.                   break;
  565.                   case 8:
  566.                   shoushu++;
  567.                   if(shoushu>=8)
  568.                   shoushu=0;
  569.                   STC_del(0x0A00);
  570.               STC_write(0x0A00,shoushu);
  571.                   break;
  572.               }
  573.           }
  574.           beep=0;
  575.           kk2=0;
  576.           fan=0;
  577.           }
  578.          }
  579. }  
  580.   
  581. void main()
  582. {
  583.           init();         //初使化
  584.         init_ADC();         //ADC初使化
  585.                                             
  586.         while(1)
  587.         {       
  588.            if(tiao!=0)                 //自动返回
  589.            {
  590.                fan++;
  591.                    if(fan>400)
  592.                    {
  593.                     fan=0;
  594.                         tiao=0;
  595.                         beep=0;
  596.                         delay(100);
  597.                         beep=0;
  598.                    }
  599.            }

  600.                   keyscan(); //按键扫描
  601.                     
  602.                 if(jie)        //红外线遥控数据解码
  603.                 {
  604.                 yaokong();                       
  605.                     jie        =0;
  606.                 }

  607.     liangcai++;
  608.         if(liangcai>300)
  609. ……………………

  610. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
用51单片机制作VFD显示屏时钟.rar (1.16 MB, 下载次数: 142)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:436165 发表于 2018-11-29 23:43 | 只看该作者
怎么这么好的帖子竟然没有顶 的
楼主高手,希望多多分享有关资料
回复

使用道具 举报

板凳
ID:436724 发表于 2018-11-30 18:49 | 只看该作者
顶一下楼主,非常赞!
回复

使用道具 举报

地板
ID:106627 发表于 2019-1-23 16:25 | 只看该作者
谢谢分享!!!!!
回复

使用道具 举报

5#
ID:612348 发表于 2019-9-17 01:23 | 只看该作者
这么好的贴子定起来了
回复

使用道具 举报

6#
ID:693571 发表于 2020-3-9 10:22 | 只看该作者

这么好的贴子顶起来了
回复

使用道具 举报

7#
ID:834201 发表于 2020-10-25 08:51 | 只看该作者
这帖子真好
回复

使用道具 举报

8#
ID:901512 发表于 2021-4-7 20:09 | 只看该作者
VFD如何点亮?需要怎样供电?
回复

使用道具 举报

9#
ID:882946 发表于 2021-10-27 11:22 | 只看该作者
非常需要,现在已经很少见了
回复

使用道具 举报

10#
ID:476623 发表于 2022-11-13 14:57 | 只看该作者
好资料下载了,谢谢楼主了!
回复

使用道具 举报

11#
ID:58986 发表于 2023-4-3 17:42 | 只看该作者
正想学习怎么点亮VFD屏,就看到这资料了,感谢大佬
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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