51单片机+TM1638+DS3231驱动数码管按键切换显示时间和日期

51单片机+TM1638+DS3231驱动数码管按键切换显示时间和日期


在这里插入图片描述

  • Proteus仿真
  • AT89C52、8位共阴数码管、DS3231

注意事项

  • 在仿真前,需要将文件夹下的动态链接库TM1638.dll拷贝到Proteus安装目录下的D:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\DATA\MODELS里面,注意自己Proteus安装路径,我这里的粘贴的路径只是示范。
  • LIBRARY文件目录下的USERDVC.IDXUSERDVC.LIB拷贝到D:\Program Files (x86)\Labcenter Electronics\Proteus 8 Professional\DATA\LIBRARY里面。

实例代码

#include
  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是51单片机+DS1302+MAX7219驱动8位共阳数码管显示时间的代码: ```c #include <reg51.h> #include <intrins.h> #define uchar unsigned char #define uint unsigned int sbit DSPORT=P2^0; sbit DSIO=P2^1; sbit RCLK=P2^2; sbit SRCLK=P2^3; uchar code table[17]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x00}; uchar second,minute,hour,week,day,month,year; uchar time[8]; uchar disp_buf[8]; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void ds1302_writebyte(uchar dat) { uchar i; for(i=0;i<8;i++) { DSIO=dat&0x01; dat>>=1; _nop_(); SRCLK=0; _nop_(); SRCLK=1; } } uchar ds1302_readbyte(void) { uchar i,dat; for(i=0;i<8;i++) { dat>>=1; if(DSIO) dat|=0x80; SRCLK=0; _nop_(); SRCLK=1; } return dat; } void ds1302_write(uchar address,uchar dat) { DSPORT=0; _nop_(); DS1302_writebyte(address); DS1302_writebyte(dat); DSPORT=1; } uchar ds1302_read(uchar address) { uchar dat; DSPORT=0; _nop_(); DS1302_writebyte(address); dat=DS1302_readbyte(); DSPORT=1; return dat; } void read_time(void) { uchar i; second=ds1302_read(0x81); minute=ds1302_read(0x83); hour=ds1302_read(0x85); day=ds1302_read(0x87); month=ds1302_read(0x89); week=ds1302_read(0x8B); year=ds1302_read(0x8D); time[0]=year; time[1]=month; time[2]=day; time[3]=week; time[4]=hour; time[5]=minute; time[6]=second; for(i=0;i<7;i++) disp_buf[i+1]=table[time[i]&0x0F]; } void init_ds1302(void) { ds1302_write(0x8e,0x00); ds1302_write(0x80,0x00); } void init_max7219(void) { ds1302_write(0x0C,0x01); ds1302_write(0x0B,0x07); ds1302_write(0x09,0xFF); ds1302_write(0x0F,0x00); } void write_max7219(uchar address,uchar dat) { uchar i; DSPORT=0; _nop_(); for(i=1;i<=8;i++) { if(i==address) { DS1302_writebyte(dat); } else { DS1302_writebyte(0x00); } } DSPORT=1; } void main() { init_ds1302(); init_max7219(); while(1) { read_time(); write_max7219(1,disp_buf[1]); write_max7219(2,disp_buf[2]); write_max7219(3,disp_buf[3]); write_max7219(4,disp_buf[4]); write_max7219(5,disp_buf[5]); write_max7219(6,disp_buf[6]); write_max7219(7,disp_buf[7]); delay(500); } } ``` 该代码主要分为以下几个部分: 1. 定义了一些常量和变量,包括DS1302、MAX7219的IO口,数码管显示所需的表格等; 2. 定义了延时函数delay(); 3. 定义了DS1302操作函数ds1302_writebyte()、ds1302_readbyte()、ds1302_write()、ds1302_read(),用于读取和设置DS1302的时间; 4. 定义了读取时间的函数read_time(),将DS1302中读取到的时间存储到数组time中,并将时间转换为数码管显示所需的格式存储到数组disp_buf中; 5. 定义了初始化DS1302和MAX7219的函数init_ds1302()和init_max7219(); 6. 定义了向MAX7219写数据的函数write_max7219(); 7. 在主函数中循环读取时间显示数码管上。 需要注意的是,该代码中使用了51单片机的IO口操作,因此需要根据具体硬件连接情况对代码进行修改。另外,需要将该代码烧录到51单片机中才能够正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值