这是自己写的万年历,拥有显示万年历、闹钟、温度上下限报警功能,闹钟有一分钟的响铃时间。有4个按键,仿真里从左到右依次代表 【确定】【加键】【减键】【返回】
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- #include<ds1302.h>
- #include<intrins.h>
- //******寄存器地址,顺序为秒分时日月周年七位******//
- uchar code ADDR_READ[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- uchar code ADDR_WRITER[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- //*****显示初始值******//
- //顺序为秒分时日月周年七位//
- uchar time[7]={0,0,0x12,0x25,0x10,0x01,0x17}; //初始化时间为2017年10月23日周一 12点00分00秒
- //*****DS1302写函数*****//
- void DS1302_Writer(uchar addr , uchar dat)
- {
- uint i;
- RST=0;
- _nop_();
- SCLK=0;
- _nop_();
- RST=1;
- for(i=0;i<8;i++)
- {
- temp=addr&0x01;
- addr=addr>>1;
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- for(i=0;i<8;i++)
- {
- temp=dat&0x01;
- dat=dat>>1;
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- RST=0;
- _nop_();
- }
- //********DS1302读函数*********//
- uchar DS1302_Read(uchar addr)
- {
- uint i;
- uchar dat,dat1;
- RST=0;
- _nop_();
- SCLK=0;
- _nop_();
- RST=1;
- for(i=0;i<8;i++)
- {
- temp=addr&0x01;
- addr=addr>>1;
- SCLK=1;
- _nop_();
- SCLK=0;
- }
- _nop_();
- for(i=0;i<8;i++)
- {
- dat1=temp;
- dat = (dat>>1) | (dat1<<7);
- SCLK=1;
- _nop_();
- SCLK=0;
- _nop_();
- }
- RST = 0;
- _nop_(); //以下为DS1302复位的稳定时间,必须的。
- SCLK = 1;
- _nop_();
- temp = 0;
- _nop_();
- temp = 1;
- _nop_();
- return dat;
- }
- //******初始化函数********//
- void DS1302_INIT()
- {
- int i;
- DS1302_Writer(0x8e,0x00);//当对日历、时钟寄存器或片内RAM进行写时WP应清零
- for(i=0;i<7;i++)
- {
- DS1302_Writer(ADDR_WRITER[i],time[i]); //初始化时分秒
- }
- DS1302_Writer(0x8e,0x80);//当对日历、时钟寄存器或片内RAM进行读时WP一般置1
- }
- //*********DS1302时钟暂停函数***************//
- void DS1302_STOP()
- {
- int i;
- DS1302_Writer(0x8e,0x00);//当对日历、时钟寄存器或片内RAM进行写时WP应清零
- DS1302_Writer(0x80,time[0]|0x80);
- for(i=1;i<7;i++)
- {
- DS1302_Writer(ADDR_WRITER[i],time[i]); //初始化时分秒
- }
- DS1302_Writer(0x8e,0x80);//当对日历、时钟寄存器或片内RAM进行读时WP一般置1
- }
- //******读取DS1302计时*******//
- void DS1302_ReadTime()
- {
- int i;
- for(i=0;i<7;i++)
- {
- time[i]=DS1302_Read(ADDR_READ[i]); //读取秒分时日月周年七位储存到全局变量time中
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
LCD1602万年历 温度报警显示 闹钟.zip
(118.13 KB, 下载次数: 565)
|