找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机ds1302日历数字钟数码管显示程序

[复制链接]
跳转到指定楼层
楼主
ID:454508 发表于 2018-12-25 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在此附程序源码,希望帮助到由需要的小伙伴!

单片机源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit sclk = P1^2;                                                  //ds1302时钟脉冲引脚
  6. sbit dio = P1^1;                                                  //ds1302输入引脚
  7. sbit ce = P1^0;                                                          //ds1302片选引脚
  8. sbit beep = P1^7;                          //蜂鸣器引脚
  9. // 显示部分引脚定义
  10. sbit   din = P2^6;                                  // 串行数据输出,接CH451的数据输入
  11. sbit   load=P3^3;                         //串行命令加载,上升延激活
  12. sbit   dout=P2^7;                         //INT1,键盘中断和键值数据输入,接CH451的数据输出
  13. sbit   dclk = P2^5;                       //串行数据时钟上升延激活
  14. //ch452命令定义
  15. #define CH452_RESET     0x0201                          // 复位
  16. #define CH452_SYSOFF    0x0400                          // 关闭显示、关闭键盘
  17. #define CH452_SYSON1    0x0401                          // 开启显示
  18. #define CH452_SYSON2    0x0403                          // 开启显示、键盘
  19. #define CH452_DIG4      0x0c00                      // 数码管位4显示,需另加8位数据
  20. #define CH452_DIG5      0x0d00                          // 数码管位5显示,需另加8位数据
  21. #define CH452_DIG6      0x0e00                          // 数码管位6显示,需另加8位数据
  22. #define CH452_DIG7      0x0f00                      // 数码管位7显示,需另加8位数据
  23. #define  h                            12
  24. #define  m                                 0
  25. #define  s              0
  26. unsigned char code number[]={0xbd,0x18,0xd5,0xd9,0x78,0xe9,0xed,0x98,0xfd,0xf9};
  27. //键盘部分
  28. uchar keycode,b,d,z,zz;
  29. //按键延时部分
  30. void Delay200ms() //@11.0592MHz
  31. {
  32.         unsigned char i, j, k;

  33.         _nop_();
  34.         _nop_();
  35.         i = 7;
  36.         j = 78;
  37.         k = 167;
  38.         do
  39.         {
  40.                 do
  41.                 {
  42.                         while (--k);
  43.                 } while (--j);
  44.         } while (--i);
  45. }
  46. void delay(uint z)
  47. {
  48.         uint x,y;
  49.         for(x=z;x>0;x--)
  50.                 for(y=120;y>0;y--);
  51. }  
  52. void CH452_Read(void)
  53. {                uchar cmd1;
  54.                 uint i,j;
  55.                 cmd1=0x07; //读按键的命令字
  56.                 load=0;
  57.                 for(i=0;i!=4;i++) // 只需要发出高4位,多发也可以,但应该确保最后留下的4位是该命令码
  58.                 {
  59.                 din=cmd1&1;
  60.                 dclk=0;
  61.                 cmd1>>=1; //往右移一位
  62.                 dclk=1; //产生时钟上升沿锁通知CH451输入位数据
  63.                 }
  64.                 load=1; //产生加载上升沿通知CH451处理命令数据
  65.                 for(j=0;j<100;j++){ }
  66.                 keycode=0; //清除keycode
  67.                 for(i=0;i!=7;i++)
  68.                 {
  69.                 keycode<<=1; //数据移入keycode,高位在前,低位在后
  70.                 if (dout)
  71.                 { keycode++;} //从高到低读入451的数据
  72.                 // keycode|=CH452_DOUT;
  73.                 dclk=0; //产生时钟下升沿通知CH451输出下一位
  74.                 dclk=1;
  75.                 }
  76. }
  77. // ch452写程序
  78. void ch451_write(uint command)
  79. {
  80.   char i;       
  81. load=0;   
  82.     for(i=0;i<12;i++){                  //送入12位数据,低位在前
  83.     din = command&1;                               
  84.    dclk =0;
  85.     command>>=1;
  86.     dclk=1;                              //上升沿有效
  87.   }
  88.         load=1;
  89. }
  90. //显示程序
  91. void display1(uchar minute10,minute,second10,second)               
  92. {
  93.         ch451_write(CH452_DIG4 | number[minute10]);       
  94.         ch451_write(CH452_DIG5 | number[minute]|0x02);
  95.         ch451_write(CH452_DIG6 | number[second10]);       
  96.         ch451_write(CH452_DIG7 | number[second]);
  97. }
  98. //显示程序
  99. void display2(uchar z,zz,nian10,nian)               
  100. {
  101.         ch451_write(CH452_DIG4 | 0);       
  102.         ch451_write(CH452_DIG5 | 0);
  103.         ch451_write(CH452_DIG6 | number[nian10]);
  104.         ch451_write(CH452_DIG7 | number[nian]);
  105. }
  106. //显示程序
  107. void display3(uchar yue10,yue,ri10,ri)                       
  108. {
  109.         ch451_write(CH452_DIG4 | number[yue10]);       
  110.         ch451_write(CH452_DIG5 | number[yue]);
  111.         ch451_write(CH452_DIG6 | number[ri10]);
  112.         ch451_write(CH452_DIG7 | number[ri]);
  113. }
  114. //ds1302时序部分程序
  115. void write_1302(uchar add,dat)//写数据 add 是addres 地址 dat 是数据
  116. {
  117.         uchar i,temp;
  118.         temp=add; // 把add地址给 temp
  119.         ce=0;
  120.         _nop_();
  121.         sclk=0;
  122.         _nop_();
  123.         ce=1;
  124.         _nop_();
  125.         for(i=0;i<8;i++)
  126.         {
  127.                 sclk=0;
  128.                 _nop_();
  129.                 if((temp&0x01)==0x01)// 刚才把地址给了temp 现在和1与然后一位一位的给dio 前面定义了dio是引脚
  130.                         dio=1;
  131.                         else
  132.                         dio=0;
  133.                 temp>>=1;
  134.                 sclk=1;
  135.                 _nop_();
  136.         }
  137.         temp=dat;
  138.         for(i=0;i<8;i++)
  139.         {
  140.                 sclk=0;
  141.                 _nop_();
  142.                 if((temp&0x01)==0x01)
  143.                         dio=1;
  144.                         else
  145.                         dio=0;
  146.                 temp>>=1;
  147.                 sclk=1;
  148.                 _nop_();
  149.         }
  150.         ce=0;
  151.         sclk=0;
  152. }
  153. uchar read_1302(uchar add)// 读数据
  154. {
  155.         uchar dat,dat1,i,temp;
  156.         temp=add;
  157.         ce=0;
  158.         _nop_();
  159.         sclk=0;
  160.         _nop_();
  161.         ce=1;
  162.         for(i=0;i<8;i++)
  163.         {
  164.                 sclk=0;
  165.                 _nop_();
  166.                 if((temp&0x01)==0x01)
  167.                         dio=1;
  168.                         else
  169.                         dio=0;
  170.                 temp>>=1;
  171.                 sclk=1;
  172.                 _nop_();
  173.         }
  174.         for(i=0;i<8;i++)
  175.         {
  176.                 sclk=0;
  177.                 _nop_();
  178.                 if(dio)
  179.                     dat|=0x80;
  180.                 if(i<7)
  181.                         dat>>=1;
  182.                 sclk=1;
  183.         }
  184.         dat1=dat/16;
  185.         dat=dat%16;
  186.         dat=dat1*10+dat;  
  187.         ce=0;
  188.         sclk=0;
  189.         return dat;
  190. }
  191. //数字调整
  192. uint tiaozheng ( uint Q){
  193.                                 uint a;
  194.                                 a = Q;
  195.                                 if(Q>15)        {
  196.                                 a=a+6;
  197.                                 }
  198.                                 if(Q>25)        {
  199.                                 a=a+6;
  200.                                 }
  201.                                 if(Q>35)        {
  202.                                 a=a+6;
  203.                                 }
  204.                                 if(Q>45)        {
  205.                                 a=a+6;
  206.                                 }
  207.                 if(Q>55)        {
  208.                                 a=a+6;
  209.                                 }
  210.                                 return a;
  211.                                 }
  212. //主函数部分
  213. void main()
  214. {  
  215.         unsigned int minute;
  216.         unsigned int second;
  217.         unsigned int shi;
  218.          unsigned int ri;
  219.          unsigned int yue;
  220.          unsigned int nian;
  221.          b=0;
  222.          d=0;
  223.          ch451_write(CH452_RESET); // 开启显示
  224.         ch451_write(CH452_SYSON2); // 开启显示
  225.         write_1302(0x8e,0x00);     //开写保护
  226.         write_1302(0xc0,0xfe);
  227.         write_1302(0xc2,0xff);
  228.         write_1302(0x80,0x30); //秒写入 (地址+数据)
  229.         write_1302(0x82,0x59); //分写入
  230.         write_1302(0x84,0x11); //时写入
  231.         write_1302(0x86,0x11); //日写入
  232.         write_1302(0x88,0x01); //月写入
  233.         write_1302(0x8c,0x18); //年写入
  234.         write_1302(0x8e,0x80); //关写保护
  235.         display3(1,5,0,3);
  236. while(1){
  237.                 write_1302(0x8e,0x00);  //开写保护
  238.                 second=read_1302(0x81);        //读秒
  239.                 minute=read_1302(0x83); //读分钟
  240.                 shi=read_1302(0x85);        //读小时
  241.                 ri=read_1302(0x87);         //读日
  242.                 yue=read_1302(0x89);        //读月
  243.                 nian=read_1302(0x8d);        //读年
  244.                 write_1302(0x8e,0x80);  //关写保护
  245.                 CH452_Read();

  246. //功能键作用
  247.                 if(keycode==0x4c){
  248.                 Delay200ms();
  249.                 CH452_Read();
  250.                 if(keycode==0x4c){
  251.                                         b++;
  252.                                         if (b==7){
  253.                                         b=0;
  254.         }
  255. }
  256. }
  257.                 if(keycode==0x4f){
  258.                 Delay200ms();
  259.                 CH452_Read();
  260.                 if(keycode==0x4f){
  261.                                         d++;
  262.                                         if (d==7){
  263.                                         d=0;
  264.                         }
  265.                 }
  266.         }
  267.                 if (keycode==0x44){
  268.                 Delay200ms();
  269.                 CH452_Read();
  270.                 if (keycode==0x44){
  271.                 display2(0,0,nian/10,nian%10);
  272.                 b=0;
  273.                         }
  274.                 }
  275.                 if (keycode==0x45){
  276.                 Delay200ms();
  277.                 CH452_Read();
  278.                 if (keycode==0x45){
  279.                 display1(yue/10,yue%10,ri/10,ri%10);
  280.                 b=0;
  281.                         }
  282.                 }
  283.                 if (keycode==0x46){
  284.                 Delay200ms();
  285.                 CH452_Read();
  286.                 if (keycode==0x46){
  287.                 display1(shi/10,shi%10,minute/10,minute%10);
  288.                 b=0;
  289.                         }
  290.                 }
  291.                 if (keycode==0x47){
  292.                 Delay200ms();
  293.                 CH452_Read();
  294.                 if (keycode==0x47){
  295.                 display1(0,0,second/10,second%10);
  296.                 b=6;
  297.                         }
  298.                 }  
  299.         if(b==1){
  300.                 display2(0,0,nian/10,nian%10);
  301.                 }               
  302.                 if(b==2){
  303.                 display2(0,0,yue/10,yue%10);
  304.                 }
  305.                 if(b==3){
  306.                 display2(0,0,ri/10,ri%10);
  307.                 }
  308.                 if(b==4){
  309.                 display2(0,0,shi/10,shi%10);
  310.                 }
  311.                 if(b==5){
  312.                 display2(0,0,minute/10,minute%10);
  313.                 }
  314.            if(b==6){
  315.                 display2(0,0,second/10,second%10);
  316.                 }
  317. //选择加减键
  318. //加减年                               
  319.                 if(d==1){               
  320.                 CH452_Read();
  321.                 if (keycode==0x4d){
  322.                 Delay200ms();
  323.                 CH452_Read();
  324.                 if (keycode==0x4d){
  325.                             nian++;
  326.                                 nian = tiaozheng(nian);
  327.                                 write_1302(0x8e,0x00);//开写保护                                               
  328.                                 write_1302(0x8c,nian); //年写入
  329.                                 write_1302(0x8e,0x80);//关写保护
  330.                             write_1302(0x8e,0x00);//开写保护       
  331.                                 nian=read_1302(0x8d);        //读年
  332.                                 write_1302(0x8e,0x80);//关写保护
  333.                                 display2(0,0,nian/10,nian%10);        
  334.                                 b=1;
  335.                                 }
  336.                                
  337.                                 }
  338.                         if(d==1){               
  339.                         CH452_Read();
  340.                         if (keycode==0x4e){
  341.                         Delay200ms();
  342.                         CH452_Read();
  343.                         if (keycode==0x4e){
  344.                             nian--;
  345.                                 nian = tiaozheng(nian);
  346.                                 write_1302(0x8e,0x00);//开写保护                                               
  347.                                 write_1302(0x8c,nian); //年写入
  348.                                 write_1302(0x8e,0x80);//关写保护
  349.                             write_1302(0x8e,0x00);//开写保护       
  350.                                 nian=read_1302(0x8d);        //读年
  351.                                 write_1302(0x8e,0x80);//关写保护        
  352.                                 display2(0,0,nian/10,nian%10);
  353.                                 b=1;
  354.                                 }
  355.                                
  356.                                 }
  357.                         }
  358.                  
  359.           }
  360. //加减月
  361.                           if(d==2){               
  362.                         CH452_Read();
  363.                         if (keycode==0x4d){
  364.                         Delay200ms();
  365.                         CH452_Read();
  366.                         if (keycode==0x4d){
  367.                             yue++;
  368.                                 write_1302(0x8e,0x00);//开写保护                                               
  369.                                 write_1302(0x88,yue); //月写入
  370.                                 write_1302(0x8e,0x80);//关写保护
  371.                             write_1302(0x8e,0x00);//开写保护       
  372.                                 yue=read_1302(0x89);        //读月
  373.                                 write_1302(0x8e,0x80);//关写保护        
  374.                                 display2(0,0,yue/10,yue%10);
  375.                                 b=2;
  376.                                 }
  377.                                
  378.                                 }
  379.                         if(d==2){               
  380.                         CH452_Read();
  381.                         if (keycode==0x4e){
  382.                         Delay200ms();
  383.                         CH452_Read();
  384.                         if (keycode==0x4e){
  385.                             yue--;
  386.                                 yue = tiaozheng(yue);
  387.                                 write_1302(0x8e,0x00);//开写保护                                               
  388.                                 write_1302(0x88,yue); //月写入
  389.                                 write_1302(0x8e,0x80);//关写保护
  390.                             write_1302(0x8e,0x00);//开写保护       
  391.                                 yue=read_1302(0x89);        //读月
  392.                                 write_1302(0x8e,0x80);//关写保护        
  393.                                 display2(0,0,yue/10,yue%10);
  394.                                 b=2;
  395.                                 }
  396.                                
  397.                                 }
  398.                         }
  399.                  
  400.           }
  401. //加减日
  402.                             if(d==3){               
  403.                         CH452_Read();
  404.                         if (keycode==0x4d){
  405.                         Delay200ms();
  406.                         CH452_Read();
  407.                         if (keycode==0x4d){
  408.                             ri++;
  409.                                 ri = tiaozheng(ri);
  410.                                 write_1302(0x8e,0x00);//开写保护                                               
  411.                                 write_1302(0x86,ri); //日写入
  412.                                 write_1302(0x8e,0x80);//关写保护
  413.                             write_1302(0x8e,0x00);//开写保护       
  414.                                 ri=read_1302(0x87);        //读日
  415.                                 write_1302(0x8e,0x80);//关写保护        
  416.                                 display2(0,0,ri/10,ri%10);
  417.                                 b=3;
  418.                                 }
  419.                                
  420.                                 }
  421.                         if(d==3){               
  422.                         CH452_Read();
  423.                         if (keycode==0x4e){
  424.                         Delay200ms();
  425.                         CH452_Read();
  426.                         if (keycode==0x4e){
  427.                             ri--;
  428.                                 ri = tiaozheng(ri);
  429.                                 write_1302(0x8e,0x00);//开写保护                                               
  430.                                 write_1302(0x86,ri); //日写入
  431.                                 write_1302(0x8e,0x80);//关写保护
  432.                             write_1302(0x8e,0x00);//开写保护       
  433.                                 ri=read_1302(0x87);        //读日
  434.                                 write_1302(0x8e,0x80);//关写保护        
  435.                                 display2(0,0,ri/10,ri%10);
  436.                                 b=3;
  437.                                 }
  438.                                
  439.                                 }
  440.                         }
  441.                  
  442.           }
  443. //加减小时
  444.                              if(d==4){               
  445.                         CH452_Read();
  446.                         if (keycode==0x4d){
  447.                         Delay200ms();
  448.                         CH452_Read();
  449.                         if (keycode==0x4d){
  450.                             shi++;
  451.                             shi = tiaozheng(shi);
  452.                                 write_1302(0x8e,0x00);//开写保护                                               
  453.                                 write_1302(0x84,shi); //小时写入
  454.                                 write_1302(0x8e,0x80);//关写保护
  455.                             write_1302(0x8e,0x00);//开写保护       
  456.                                 shi=read_1302(0x85);        //读小时
  457.                                 write_1302(0x8e,0x80);//关写保护        
  458.                                 display2(0,0,shi/10,shi%10);
  459.                                 b=4;
  460.                                 }
  461.                                
  462.                                 }
  463.                         if(d==4){               
  464.                         CH452_Read();
  465.                         if (keycode==0x4e){
  466.                         Delay200ms();
  467.                         CH452_Read();
  468.                         if (keycode==0x4e){
  469.                             shi--;
  470.                                 shi = tiaozheng(shi);
  471.                                 write_1302(0x8e,0x00);//开写保护                                               
  472.                                 write_1302(0x84,shi); //小时写入
  473.                                 write_1302(0x8e,0x80);//关写保护
  474.                             write_1302(0x8e,0x00);//开写保护       
  475.                                 shi=read_1302(0x85);        //读小时
  476.                                 write_1302(0x8e,0x80);//关写保护        
  477.                                 display2(0,0,shi/10,shi%10);
  478.                                 b=4;
  479.                                 }
  480.                                
  481.                                 }
  482.                         }
  483.                  
  484.     }

  485. //加减分钟
  486.                              if(d==5){               
  487.                         CH452_Read();
  488.                         if (keycode==0x4d){
  489.                         Delay200ms();
  490.                         CH452_Read();
  491.                         if (keycode==0x4d){
  492.                             minute++;
  493.                             minute = tiaozheng(minute);
  494.                                 write_1302(0x8e,0x00);//开写保护                                               
  495.                                 write_1302(0x82,minute); //分写入
  496.                                 write_1302(0x8e,0x80);//关写保护
  497.                             write_1302(0x8e,0x00);//开写保护       
  498.                                 minute=read_1302(0x83);        //读分
  499.                                 write_1302(0x8e,0x80);//关写保护        
  500.                                 display2(0,0,minute/10,minute%10);
  501.                                 b=5;
  502.                         }
  503.                                
  504.                                 }
  505.                         if(d==5){               
  506.                         CH452_Read();
  507.                         if (keycode==0x4e){
  508.                         Delay200ms();
  509.                         CH452_Read();
  510.                         if (keycode==0x4e){
  511.                                 minute--;
  512.                                 minute = tiaozheng(minute);
  513.                                 write_1302(0x8e,0x00);//开写保护                                               
  514.                                 write_1302(0x82,minute); //分写入
  515.                                 write_1302(0x8e,0x80);//关写保护
  516.                             write_1302(0x8e,0x00);//开写保护       
  517.                                 minute=read_1302(0x83);        //读分
  518.                                 write_1302(0x8e,0x80);//关写保护        
  519.                                 display2(0,0,minute/10,minute%10);
  520.                                 b=5;
  521.                                         }
  522.                                 }
  523.                         }                 
  524.           }
  525. //加减秒
  526.                              if(d==5){               
  527.                         CH452_Read();
  528.                         if (keycode==0x4d){
  529.                         Delay200ms();
  530.                         CH452_Read();
  531.                         if (keycode==0x4d){
  532.                                 second++;
  533.                                 second = tiaozheng(second);
  534.                                 write_1302(0x8e,0x00);//开写保护                                               
  535.                                 write_1302(0x80,second); //秒写入
  536.                                 write_1302(0x8e,0x80);//关写保护
  537.                             write_1302(0x8e,0x00);//开写保护       
  538.                                 second=read_1302(0x81);        //读秒
  539.                                 write_1302(0x8e,0x80);//关写保护        
  540.                                 display2(0,0,second/10,second%10);
  541.                                 b=6;
  542.                                 }
  543.                                
  544.                                 }
  545.                         if(d==5){               
  546.                         CH452_Read();
  547.                         if (keycode==0x4e){
  548.                         Delay200ms();
  549.                         CH452_Read();
  550.                         if (keycode==0x4e){
  551.                                 second--;
  552.                                 second = tiaozheng(second);
  553.                                 write_1302(0x8e,0x00);//开写保护                                               
  554.                                 write_1302(0x80,second); //秒写入
  555.                                 write_1302(0x8e,0x80);//关写保护
  556.                             write_1302(0x8e,0x00);//开写保护       
  557.                                 second=read_1302(0x81);        //读秒
  558.                                 write_1302(0x8e,0x80);//关写保护        
  559.                                 display2(0,0,second/10,second%10);
  560.                                 b=6;
  561.                         }                                                       
  562.                 }
  563.         }                  
  564. }  
  565. //蜂鸣器部分
  566.                         if(h==shi){
  567.                         if (m==minute){
  568.                         if (second==s){
  569.                         beep = 0;
  570.                          Delay200ms();
  571.                         beep = 1;
  572.                                 }                                                       
  573.                         }                       
  574.                         }
  575.                                
  576.         }//while结束
  577. }//main结束
  578.          
复制代码

所有资料51hei提供下载:
A最终程序.rar (41.94 KB, 下载次数: 23)


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

使用道具 举报

沙发
ID:1 发表于 2018-12-25 18:20 | 只看该作者
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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