51单片机驱动DS1302与DM12864实现万年历显示

需积分: 9 0 下载量 173 浏览量 更新于2024-09-12 收藏 10KB TXT 举报
本文档主要介绍了如何使用51单片机作为控制核心,配合DS1302实时时钟芯片和DM12864液晶显示模块实现一个万年历功能。DS1302是一种低功耗、紧凑型的实时时钟芯片,提供日历、计时和闹钟等功能,而DM12864则是一款128x64点阵液晶显示器,用于显示日期、时间等信息。 首先,我们看到在程序的开始部分,包括了一些必要的头文件,如<reg51.h>、<absacc.h>和<INTRINS.H>,这些是C语言库中的函数定义,用于处理内存访问、中断管理和基本指令集。`#define uint unsigned int` 和 `#define uchar unsigned char` 是数据类型定义,分别表示无符号整型和字符型。 接下来定义了一些端口寄存器位,例如ACC_7、SCLK、DIO、CE、SID、CLK和CS,这些是与DS1302和DM12864交互的信号线。`Write1302()` 和 `Read1302()` 函数用于与DS1302进行数据读写操作,`DS1302Initial()` 初始化DS1302以获取时间和日期信息。 LCD相关的函数如`LCD_Year()`、`LCD_Month()`、`LCD_Week()`、`LCD_Daytime()`、`LCD_Hour()`、`LCD_Minute()` 和 `LCD_Second()` 分别负责显示不同部分的时间和日期,比如年份、月份、星期、小时、分钟和秒。 程序的主函数中,首先对DS1302进行初始化,接着初始化DM12864,设置LCD的模式和显示区域。然后进入一个无限循环,通过`Write_DS1302()`函数(可能是自定义的)更新DS1302的配置或数据,之后调用LCD相关函数来动态显示当前的日期和时间。这个过程不断重复,以保持万年历的实时更新。 在代码中,`void lcd_hanzi1()` 和 `void lcd_display()` 可能是用于处理汉字显示和两行数据显示的函数,`void lcd_date()` 和 `void lcd_order()` 分别用于处理日期和命令行的设置。`void lcd_byte()` 用于发送单个字节到液晶屏,而`void lcd_init()` 应该是液晶屏的初始化函数。 这个程序涉及到了单片机的硬件接口设计、数据通信协议、时钟驱动、液晶显示控制以及日期时间的获取和显示等多个关键知识点。它展示了如何利用51单片机控制DS1302和DM12864实现一个实用的万年历系统,对于学习嵌入式开发和理解液晶显示技术具有很好的参考价值。

#include<reg51.h> #include<intrins.h> #define dm P0 #define uchar unsigned char #define uint unsigned int sbit DQ=P1^6; sbit w0=P2^0; sbit w1=P2^1; sbit w2=P2^2; sbit w3=P2^3; sbit beep=P3^7; int temp1=0; uint h; uint temp; uchar r; uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; uchar code table_dm[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40}; uchar code table_dml[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; uchar data temp_data[2]={0x00,0x00}; uchar data display[5]={0x00,0x00,0x00,0x00,0x00}; void delay(uint t) { for(;t>0;t--); } void xianshi() { int j; for(j=0;j<4;j++) { switch(j) { case 0: dm=table_dm[display[0]]; w0=0; delay(300); w0=1; case 1: dm=table_dml[display[1]]; w1=0; delay(300); w1=1; case 2: dm=table_dm[display[2]]; w2=0; delay(300); w2=1; case 3: dm=table_dm[display[3]]; w3=0; delay(300); w3=1; } } } ow_reset(void) { char presence=1; while(presence) { while(presence) { DQ=1;_nop_();_nop_(); DQ=0; delay(50); DQ=1; delay(6); presence=~DQ; } delay(45); presence=~DQ; } DQ=1; return presence; } void write_byte(uchar val) { uchar i; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); DQ=0;_nop_();_nop_();_nop_();_nop_(); DQ=val&0x01; delay(6); val=val>>1; } DQ=1; delay(1); } uchar read_byte(void) { uchar i; uchar value=0; for(i=8;i>0;i--) { DQ=1;_nop_();_nop_(); value>>=1; DQ=0;_nop_();_nop_();_nop_();_nop_(); DQ=1;_nop_();_nop_();_nop_();_nop_(); if(DQ)value|=0x80; delay(6); } DQ=1; return value; } read_temp() { ow_reset(); delay(200); write_byte(0xcc); write_byte(0x44); ow_reset(); delay(1); write_byte(0xcc); write_byte(0xbe); temp_data[0]=read_byte(); temp_data[1]=read_byte(); temp=temp_data[1]; temp<<=8; temp=temp|temp_data[0]; return temp; } work_temp(uint tem) { uchar n=0; if(tem>6348) { tem=65536-tem; n=1; } display[4]=tem&0x0f; display[0]=ditab[display[4]]; display[4]=tem>>4; display[3]=display[4]/100; display[1]=display[4]%100; display[2]=display[1]/10; display[1]=display[1]%10; r=display[1]+display[2]*10+display[3]*100; if(!display[3]) { display[3]=0x0a; if(!display[2]) { display[2]=0x0a; } } if(n) { display[3]=0x0b; } return n; } void BEEP() { if((r>30)) { beep=!beep; } else { beep=0; } } void main() { beep=0; dm=0x00; w0=0; w1=0; w2=0; w3=0; for(h=0;h<4;h++) { display[h]=0; } ow_reset(); write_byte(0xcc); write_byte(0x44); for(h=0;h<50;h++) { xianshi(); } while(1) { if(temp1==0) { work_temp(read_temp()); xianshi(); BEEP(); } } }

170 浏览量