找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机 DS1302时钟+MAX7219驱动数码管显示时间

[复制链接]
跳转到指定楼层
楼主
初始时间设定为23-59-50蜂鸣器接P2^3脚,到00-00-00时,蜂鸣器响一秒
MAX7219用SPI总线和8*8静态RAM控制数码管,数码管不用循环扫描动态显示,数码管不闪烁,无残影。
避免了因数码管动态扫描可能导致DS1302计时错误MAX7219自带BCD译码,驱动数码管显示无需段码和位码表
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. sbit Max7219_pinDIN = P2^2;
  6. sbit Max7219_pinCS  = P2^1;
  7. sbit Max7219_pinCLK = P2^0;
  8. sbit TSCLK = P1^0;
  9. sbit TIO = P1^1;
  10. sbit TRST = P1^2;
  11. sbit beep = P2^3;
复制代码

(如用74HC573驱动的数码管)


51hei图片_20210126225553.jpg (145.24 KB, 下载次数: 48)

实物图

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

使用道具 举报

沙发
ID:328014 发表于 2021-1-27 01:25 | 只看该作者
完整程序能分享下吗?
回复

使用道具 举报

板凳
ID:669393 发表于 2021-1-27 09:44 | 只看该作者
51hei团团 发表于 2021-1-27 01:25
完整程序能分享下吗?
  1. #include <reg52.h>
  2. #include <intrins.h>

  3. typedef unsigned char uchar;
  4. typedef unsigned int uint;

  5. sbit Max7219_pinDIN = P2^2;
  6. sbit Max7219_pinCS  = P2^1;
  7. sbit Max7219_pinCLK = P2^0;
  8. sbit TSCLK = P1^0;
  9. sbit TIO = P1^1;
  10. sbit TRST = P1^2;
  11. sbit beep = P2^3;
  12. void delay(uint z)
  13. {
  14.         uint x,y;
  15.         for(x = z; x > 0; x--)
  16.                 for(y = 114; y > 0 ; y--);                
  17. }
  18. void Write_Max7219_byte(uchar DATA)         
  19. {
  20.         uchar i;                   
  21.         for(i=8;i>=1;i--)
  22.         {       
  23.                 Max7219_pinCLK=0;                                       
  24.                 Max7219_pinDIN=DATA&0x80;
  25.                 DATA=DATA<<1;
  26.                 Max7219_pinCLK=1;
  27.         }                                 
  28. }
  29. void Write_Max7219(uchar address,uchar dat)
  30. {
  31.      Max7219_pinCS=0;
  32.          Write_Max7219_byte(address);           //写入地址,即数码管编号
  33.      Write_Max7219_byte(dat);               //写入数据,即数码管显示数字
  34.          Max7219_pinCS=1;                        
  35. }

  36. void Init_MAX7219(void)
  37. {
  38.         Write_Max7219(0x09, 0xff);       //译码方式:BCD码
  39.         Write_Max7219(0x0a, 0x03);       //亮度
  40.         Write_Max7219(0x0b, 0x07);       //扫描界限;4个数码管显示
  41.         Write_Max7219(0x0c, 0x01);       //掉电模式:0,普通模式:1
  42.         Write_Max7219(0x0f, 0x01);       //显示测试:1;测试结束,正常显示:0
  43. }

  44. void display(uchar hour, uchar min, uchar sec )
  45. {
  46.         uchar hour1, hour2, min1, min2, sec1, sec2;

  47.         hour1 =  hour / 10 % 10;
  48.         hour2 = hour % 10;

  49.         min1 =  min / 10 % 10;
  50.         min2 = min % 10;

  51.         sec1 =  sec / 10 % 10;
  52.         sec2 = sec % 10;

  53.         Write_Max7219(1,sec2);
  54.         Write_Max7219(2,sec1);
  55.         Write_Max7219(3,0x0A);          //显示-
  56.         Write_Max7219(4,min2);
  57.         Write_Max7219(5,min1);
  58.         Write_Max7219(6,0x0A);
  59.         Write_Max7219(7,hour2);
  60.         Write_Max7219(8,hour1);
  61. }
  62. //写DS1302数据
  63. void Write_DS1302_Data(uchar cmd, uchar dat)
  64. {
  65.         uchar i;
  66.         TRST = 0;
  67.         TSCLK = 0;
  68.         TRST = 1;
  69.         for(i=0;i<8;i++)
  70.         {
  71.                 TSCLK = 0;
  72.                 TIO = cmd & 0x01;        //从低到高写数据
  73.                 TSCLK = 1;
  74.                 cmd >>= 1;
  75.         }
  76.         for(i=0;i<8;i++)
  77.         {
  78.                 TSCLK = 0;
  79.                 TIO = dat & 0x01;
  80.                 TSCLK = 1;
  81.                 dat >>= 1;
  82.         }               
  83. }
  84. //读DS1302数据
  85. uchar Read_DS1302_Data(uchar cmd)
  86. {
  87.         uchar i, dat;
  88.         TRST = 0;
  89.         TSCLK = 0;
  90.         TRST = 1;
  91.         for(i=0;i<8;i++)
  92.         {
  93.                 TSCLK = 0;
  94.                 TIO = cmd & 0x01;
  95.                 TSCLK = 1;
  96.                 cmd >>= 1;       
  97.         }
  98.         for(i=0;i<8;i++)
  99.         {
  100.                 TSCLK = 0;
  101.                 dat >>= 1;
  102.                 if(TIO) dat |= 0x80;
  103.                 TSCLK = 1;
  104.         }       
  105.         return dat;
  106. }

  107. uchar BCD_Chg_Data(uchar dat)
  108. {
  109.         uchar dat1, dat2;
  110.         dat1 = dat / 16;
  111.         dat2 = dat % 16;
  112.         dat2 = dat2 + dat1*10;       
  113.         return dat2;
  114. }
  115. void Init_DS1302()
  116. {
  117.         Write_DS1302_Data(0x8e, 0);                    //清除写保护
  118.         Write_DS1302_Data(0x80, 0x50);        //秒
  119.         Write_DS1302_Data(0x82, 0x59);        //分
  120.         Write_DS1302_Data(0x84, 0x23);        //时
  121.         Write_DS1302_Data(0x8e, 0x80);                //打开写保护
  122. }
  123. void main()
  124. {
  125.         uchar sec, min, hour;
  126.         Init_MAX7219();
  127.         delay(1000);
  128.         Write_Max7219(0x0f, 0x00);
  129.         Init_DS1302();
  130.         while(1)
  131.         {
  132.                 Write_DS1302_Data(0x8e, 0);       
  133.                 sec = BCD_Chg_Data(Read_DS1302_Data(0x81));         //读寄存器
  134.                 min = BCD_Chg_Data(Read_DS1302_Data(0x83));
  135.                 hour = BCD_Chg_Data(Read_DS1302_Data(0x85));
  136.                 Write_DS1302_Data(0x8e, 0x80);
  137.                 display(hour, min, sec);
  138.                 if(hour==0 && min==0 && sec==0)
  139.                 {
  140.                         beep = 0;
  141.                         delay(1000);
  142.                         beep = 1;
  143.                 }
  144.         }
  145. }





复制代码

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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