基于51单片机电子万年历设计 lcd12864+24c02+ds1302

2019-10-18来源: 51hei关键字:51单片机  电子万年历  lcd12864  24c02  ds1302

作品名称:基于51单片机电子万年历设计
作评功能:1:实现ds1302的读写
                2:lcd12864的显示
                3:24c02的读写
                4:更改日期,时间
                5:整点报时,闹钟的功能
                6:阴阳历的转换


硬件部分:普中开发板(程序内明确标明接线方式)
软件部分:原创
                1:代码规范:易于更改
                2:封装良好,可以直接移植。
 

单片机源程序如下:

#include "reg51.h"    //此文件中定义了单片机的一些特殊功能寄存器

#include "lcd12864.h"

#include "ds1302.h"

#include "24c04.h"

#include "stdio.h"

#include "string.h"

#include "ALG.h"

//预编译

#define DISPLAY_DATA_SIZE 30                //显示显示一帧数据长度

#define GPIO_KEY P1


//全局变量

unsigned char display_buff[DISPLAY_DATA_SIZE];

unsigned char ds1302_buff[2*sizeof(TIME)];

unsigned char key_value=0xff;

unsigned char receive_buff[sizeof(TIME)];

unsigned char store_row=0;

unsigned char store_line=0;

unsigned char interface_flag=0;

unsigned char ds1302_receive_flag=0;

unsigned char temp[8];

unsigned char display_flag=0;

unsigned char table[32][4]=

{        

        {0x01,0x01, 0x00, 0x12},

        {0x01,0x20, 0x00, 0x12},

        {0x01,0x30, 0x00, 0x12},

        {0x00,0x40, 0x00, 0x12},

        {0x00,0x50, 0x00, 0x12},

        {0x01,0x00, 0x01, 0x12},

        {0x01,0x50, 0x01, 0x12},

        {0x01,0x50, 0x01, 0x12},

        {0x01,0x01, 0x00, 0x12},

        {0x01,0x20, 0x00, 0x12},

        {0x01,0x30, 0x00, 0x12},

        {0x00,0x40, 0x00, 0x12},

        {0x00,0x50, 0x00, 0x12},

        {0x01,0x00, 0x01, 0x12},

        {0x01,0x50, 0x01, 0x12},

        {0x01,0x50, 0x01, 0x12},

        {0x01,0x01, 0x00, 0x12},

        {0x01,0x20, 0x00, 0x12},

        {0x01,0x30, 0x00, 0x12},

        {0x00,0x40, 0x00, 0x12},

        {0x00,0x50, 0x00, 0x12},

        {0x01,0x00, 0x01, 0x12},

        {0x01,0x50, 0x01, 0x12},

        {0x01,0x50, 0x01, 0x12},

        {0x01,0x01, 0x00, 0x12},

        {0x01,0x20, 0x00, 0x12},

        {0x01,0x30, 0x00, 0x12},

        {0x00,0x40, 0x00, 0x12},

        {0x00,0x50, 0x00, 0x12},

        {0x01,0x00, 0x01, 0x12},

        {0x01,0x50, 0x01, 0x12},

        {0x01,0x50, 0x01, 0x12}

};


sbit buzzer=P3^7;

//全局函数声明

void system_init(void);

void delay_ms(int ms);

void lcd_display(char row,char* buff,char num);

void timer_init(void);

void key_check(void);

void major_interface(void);

void store_interface(void);

void time_interface(void);

void key_pro(void);

void bcd_to_ascii(unsigned char* buff,unsigned char num);

void data_pro(unsigned char*des_buff,unsigned char*src_buff,unsigned char num);

/*

        biref                主函数

        param                无

        return        无

*/

void main(void)

{        

        unsigned char temp[7];

        unsigned char i=0;

        system_init();

        //在24cxx中读取数据。

        for(i=0;i<32;i++)

        {

                read_24cxx(0x00+i*4,table+i,4);

        }

        while(1)

        {  

                major_interface();

                store_interface();

                time_interface();

                key_check();

                key_pro();

        }                

}


/*

        biref                系统初始化函数

        param                无

        return        无

*/

void system_init(void)

{

        LCD12864_Init();

        Ds1302Init(TIME);

//        Ds18b20Init();

        timer_init();

}


/*

        biref         延时函数

        param                延时时间,单位ms;

        return        无

*/

void delay_ms(int ms)

{

        int x,i;

        x=ms;

        while(x--)

                for(i=123;i;i--);

}

/*

        biref                12864显示函数

        param                显示缓存区

        return        无

*/

void lcd_display(char row,char* buff,char num)

{

        unsigned int i;

                

        switch(row)

        {

                case 0:

                {

                        LCD12864_SetWindow(0, 0);

                        for(i=0;i

                        {

                                LCD12864_WriteData(buff[i]);

                        }

                        break;

                }

                case 1:

                {

                        LCD12864_SetWindow(1, 0);

                        for(i=0;i

                        {

                                LCD12864_WriteData(buff[i]);

                        }

                        break;

                }

                case 2:

                {

                        LCD12864_SetWindow(2, 0);

                        for(i=0;i

                        {

                                LCD12864_WriteData(buff[i]);

                        }

                        break;

                }

                case 3:

                {

                        LCD12864_SetWindow(3, 0);

                        for(i=0;i

                        {

                                LCD12864_WriteData(buff[i]);

                        }

                        break;

                }

                default:

                {

                        break;

                }

        }

}

/*

biref

[1] [2] [3] [4] [5] [6]
关键字:51单片机  电子万年历  lcd12864  24c02  ds1302 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic477564.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:关于51单片机的定时器T0、T1总结
下一篇:Keil C51破解版(c语言单片机编程软件) v9.0 免费汉化版

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

avr单片机汇编参考程序
该AVR的汇编程序选自《M128》,程序中体现了AVR汇编的基本特点,仅供大家参考。该应用系统为一个带1/100秒的简易24小时制时钟,它在上电后能够自动从11时59分55秒00开始计时和显示时间。下图为简易时钟系统硬件电路图。                           图  简易24小时时钟硬件原理图系统使用8个LED数码管显示时、分、秒、1/100秒4个时段的数字,每个时段占用2个LED。显示方式采用动态扫描方式,ATme
发表于 2019-11-14
avr单片机汇编参考程序
AVR单片机一些学习笔记
下面是自己在学习AVR单片机时的学习经验,分享出来给大家,一起学习。1、AVR单片机采用RISC架构,8051单片机采用CISC架构。 前者速度为后者的2~4倍,为流水线操作指令。2、 AVR单片机有32个通用寄存器(地址在RAM区从$0000开始到$001F),其中有6个(最后6个)合并为3个16位的X,Y,Z寄存器,用来存放地址指针,Z寄存器还可以寻址程序存储器。3、 哈佛结构,131条机器指令。4、 延迟开机功能。5、 内部自带RC振荡器,可提供1/2/4/8MHZ的工作时钟。6、 FLASH+EEPROM+SRAM+SPI+USART+TWI+PWM+RTC+10位ADC+模拟比较器+JTAG。7、 堆栈指针向下增长,51
发表于 2019-11-14
mega32单片机最简单的中断程序——外部中断
学单片机的第二条槛:中断,每次我都选最简单的中断——外部中断。*****************************************************************//CPU:mega32//编译器:iar#include <ioavr.h>void eint0_init(void);int main(void){    DDRD |= (1 << 7);     //PD7置为输出    eint0_init();    
发表于 2019-11-14
mega32单片机最简单的中断程序——外部中断
单片机之间通信(类红外发送与接收)
;   {             c++;             if(c==1)  RB2=0;             if(c==41) RB2=1;             if(c>=51)         
发表于 2019-11-14
喜欢单片机的同学快来看啊,过来人的经验告白
的,这样在以后你就会明白其中的道理。昨天已经说过要学单片机就要先学一种,至于哪一种就看自己的了。何为搭建平台,也就是说要有一套开发工具,学习单片机一定要实践,不实践的人永远学不会单片机。要自己动手写,那怕是1条语句,一段指令。一个小程序。只有自己动手写了,才会发现自己在那出了错误,才能真正体会。因此在这强调一个动手实践的过程,不知道大家有没有这中体会,以前课本上的东西很容易忘,但做实验的东西就不容易忘,也就是这个道理。今天总结一下以前的学习:我学的是PIC单片机,以前在学校学的是51,为什么不继续学习51了,一方面是以前学51学的不怎么好,另一方面是觉得51的指令太多,不容易记,所以我选择了PIC。我自己搭建的平台是买的别人的开发板,我记
发表于 2019-11-14
单片机EC1数字旋扭编码仿真程序
一个按键正转,另一个按键反转.模拟输出编码信号.正转1110 00 10  反转11 01 00 01//1H=GP2  2H=GP1  3H=GP0  4H=GP4  KEY=GP3  #include<pic.h>__CONFIG(0xFEA);#define uchar unsigned char #define CW_A GP4 //#define CW_B GP5 //#define KEY_A GP0 //#define KEY_B GP1 //uchar tmp=1,at=0;&
发表于 2019-11-14
单片机EC1数字旋扭编码仿真程序
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved