标题:
RTC实时时钟DS1302液晶显示单片机源程序
[打印本页]
作者:
jjx@qq
时间:
2017-5-12 14:00
标题:
RTC实时时钟DS1302液晶显示单片机源程序
RTC实时时钟DS1302液晶显示 ds18b20
0.png
(78.13 KB, 下载次数: 89)
下载附件
2017-5-12 16:28 上传
单片机源程序如下:
/*-----------------------------------------------
名称:LCD1602显示实时时钟
修改:无
内容:音乐闹钟 普通闹钟已被注释 音乐闹钟无法停止 自动播放后停止 (普通闹钟功能正常)
error:无
warning:四个 函数未被调用
-----------------------------------------------*/
#include<reg52.h>
#include <String.h>
#include"ds1302.h"
#include"LCD1602.h"
#include"key.h"
#include "18B20.h"
#include "240c02.h"
sbit buzeer = P2^3; //普通闹钟
sbit led1 =P2^4; //指示灯
sbit led2 =P2^5;
sbit led3 =P2^6;
sbit fm=P2^3; //音乐闹钟 接口相同
unsigned char timeh,timel,music;// 闹钟变量
unsigned char code zbjbxf[]={//
0x64,0xA3,0xC1,0xA2,0x62,0x84,0x61,0x81,0x61,0xA4,0xA1,
0x91,0xA1,0x81,0x64,0xA3,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,
0xA1,0xC1,0xA1,0xC1,0xD2,0xD2,0xD2,0xA2,0xC4,0xC2,0x62,
0xC2,0x62,0xA2,0xA2,0x84,0x94,0x94,0x92,0x81,0x91,
0xA2,0xC2,0xD4,0xE4,0xA4,0xE4,0xA2,0xE2,0xA2,0xE2,0xA2,
0xA2,0x84,0x94,0x94,0x92,0x81,0x91,0xA2,0xC2,0xD8};
uchar code chuzhi[]={
0xff,0xff,//
0xFC,0x8E,//L1-7
0xFC,0xED,
0xFD,0x43,
0xFD,0x6A,
0xFD,0xB3,
0xFD,0xF3,
0xFE,0x2D,
0xFE,0x47,//H1-7
0xFE,0x76,
0xFE,0xA1,
0xFE,0xC7,
0xFE,0xD9,
0xFE,0xF9,
0xFF,0x16
};
void timer0() interrupt 1 //音乐闹钟中断
{
TH0=timeh;
TL0=timel;
fm=~fm;
}
void delay(uint z) //??165MS,??????
{ uint y;
for(z;z>0;z--)
for(y=19000;y>0;y--);//????
}
void delay1(uint z) //??1MS
{ uint y;
for(z;z>0;z--)
for(y=112;y>0;y--);//????
}
//sbit bell = P2^3;
char key;
char keyflg;
//时钟变量
unsigned char times[7]={1};
unsigned char time[3];
unsigned char PPP;
unsigned char clock_buf[7];
//闹钟变量
unsigned char counter;
unsigned char baifenmiao;
unsigned char shifenmiao;
unsigned char miao;
unsigned char shimiao;
unsigned char baimiao;
void key_timeset(void);
void dateTrans(void);
void alarm_aclok(void);
void arm(void);
void timer_run(void);
void timer_runback(void);
void clock_display(void);
void clock_delay(void);
void start(void);
void delay_ms(unsigned int z);
void ds18b20(void);
void ds18b20_xiugai(void);
void xieshuju(void);
void dushuju(void);
void buzeer_music() //音乐闹钟
{
uint temp; //??????????????????
uchar i=0;
uchar jp; //jp????temp???8???8?
TMOD=0x01;//?????T0?????1
IE=0x82; //??T0??
while(music)
{
/* ds1302_read_time();//读取时钟信息
dateTrans(); //数据复制
disp();*/
key = Key4Scan();
if(key==4){cflg=1; keyflg=0;music=0;}
if(key==6){ keyflg=0;}
clock_delay();
temp=zbjbxf[i];
if(temp==0xff)
break;
jp=temp/16; //????4?,????
if(jp!=0)
{
timeh=chuzhi[jp*2];//????????8?
timel=chuzhi[jp*2+1]; //????????8?
TR0=1; //????
}
else
{
TR0=0; //????
fm=1; //????
}
delay(temp%16); //????4?,??(?????)
TR0=0; //??????5MS
fm=1;
delay1(5);
//TR0=1;
i++;
}
/*TR0=0; //????
fm=1; //????*/ //JJX
}
void Time1_Int(){ //用于定时 倒计时
TMOD=0x10;
TH1=0xfc; //10毫秒
TL1=0x66;
EA=1;
ET1=1;
TR1=1;
}
void main()
{
//buzeer=0; //闹钟停
buzeer=1; // 接非门后闹钟停
// dushuju(); //e2prom 读数据 有问题
ds1302_init(); /*DS302初始化函数*/
ds1302_write_time();
ds1302_read_time();
// tmpchange();
//Time0_Int();
InitLcd(); //初始化LCD
DelayMs(15); //延时用于稳定功能
Time1_Int();
start(); //开机显示
while(1)
{
key = Key4Scan();
if(!cflag){
if(key==4) { buzeer= 1;/*buzeer= 0;*/} //按键停止闹钟
// while(1); //调试
alarm_aclok(); //闹钟
ds1302_read_time();//读取时钟信息
dateTrans(); //数据复制
disp(); //液晶显示时间信息
timer_run(); //秒表
timer_runback(); //倒计时
clock_display(); //时钟显示
if(key==7) keyflg=7;
ds18b20(); //按键显示
// ds18b20_xiugai(); // 显示位置修改
if(key==4) keyflg=0;
if(key==5) keyflg=5;
if(key==6) keyflg=6;
clock_delay(); //瞌睡
xieshuju(); // ——>到e2prom
// WriteCommand(0x80+0x40+15); //按键调试信息
// WriteData(shuzi[key]);
}
key_timeset(); //案件时间设定
}
}
void key_timeset(void){
char i;
switch(key) //Key4Scan()
{
case 0x01:
switch(PP++) //??????
{
case 0: WriteCommand(0x80+0x40+7);break; //秒
case 1: WriteCommand(0x80+3);break; //年
case 2: WriteCommand(0x80+6);break; //月
case 3: WriteCommand(0x80+9);break; //日
case 4: WriteCommand(0x80+15);break; //周
case 5: WriteCommand(0x80+0x40+1);break; //时
case 6: WriteCommand(0x80+0x40+4);break; //分
default:break;
}
WriteCommand(0x0f);//光标闪烁
if(PP == 8) PP = 0; //7还是 8好像和编译器有关系
cflag = 1; //????
break;
case 0x02:
if(cflag)
{
switch(PP-1)
{
case 1: // 年
times[6]++;
if((times[6]&0x0f) == 0x0a) // 0000 1111 1010 转变为16进制
{
times[6] += 0x06;
}
if(times[6] > 0x99)
{
times[6] = 0x00;
}
WriteCommand(0x80+2);
WriteData(shuzi[times[6]>>4]);
WriteData(shuzi[times[6]&0x0f]);
WriteCommand(0x80+3);
break;
case 2: //月
times[4]++;
if((times[4]&0x0f) == 0x0a)
{
times[4] += 0x06;
}
if(times[4] > 0x12)
{
times[4] = 0x01;
}
WriteCommand(0x80+5);
WriteData(shuzi[times[4]>>4]);
WriteData(shuzi[times[4]&0x0f]);
WriteCommand(0x80+6);
break;
case 3: //
times[3]++;
if((times[3]&0x0f) == 0x0a)
{
times[3] += 0x06;
}
if(times[3] > 0x31)
{
times[3] = 0x01;
}
times[5]++;
if((times[5]&0x0f) == 0x08)
{
times[5] = 0x01;
}
WriteCommand(0x80+8);
WriteData(shuzi[times[3]>>4]);
WriteData(shuzi[times[3]&0x0f]);
WriteCommand(0x80+9);
break;
case 4: //?
times[5]++;
if((times[5]&0x0f) == 0x08)
{
times[5] = 0x01;
}
WriteCommand(0x80+15);
WriteData(shuzi[times[5]]);
WriteCommand(0x80+15);
break;
case 5: //?
times[2]++;
if((times[2]&0x0f) == 0x0a)
{
times[2] += 0x06;
}
if(times[2] > 0x23)
{
times[2] = 0x00;
}
WriteCommand(0x80+0x40+0);
WriteData(shuzi[times[2]>>4]);
WriteData(shuzi[times[2]&0x0f]);
WriteCommand(0x80+0x40+1);
break;
case 6: //?
times[1]++;
if((times[1]&0x0f) == 0x0a)
{
times[1] += 0x06;
}
if(times[1] > 0x59)
{
times[1] = 0x00;
}
WriteCommand(0x80+0x40+3);
WriteData(shuzi[times[1]>>4]);
WriteData(shuzi[times[1]&0x0f]);
WriteCommand(0x80+0x40+4);
break;
case 0: //?
times[0]++;
if((times[0]&0x0f) == 0x0a)
{
times[0] += 0x06;
}
if(times[0] > 0x59)
{
times[0] = 0x00;
}
WriteCommand(0x80+0x40+6);
WriteData(shuzi[times[0]>>4]);
WriteData(shuzi[times[0]&0x0f]);
WriteCommand(0x80+0x40+7);
break;
default:
break;
}
}
break;
case 0x03:
if(cflag)
{
cflag = 0;
PP = 0;
WriteCommand(0X0C); //取消 并关光标
}
break;
case 0x04: //保存数据到 DS1302
if(cflag)
{
cflag = 0;
PP = 0;
WriteCommand(0X0C); //关光标
ds1302_write_byte(ds1302_control_add,0x00); //关闭写保护
ds1302_write_byte(ds1302_sec_add,0x80); //暂停
ds1302_write_byte(ds1302_charger_add,0xa9); //涓流充电
ds1302_write_byte(ds1302_year_add,times[6]); //年
ds1302_write_byte(ds1302_month_add,times[4]); //月
ds1302_write_byte(ds1302_day_add,times[5]); //周
ds1302_write_byte(ds1302_date_add,times[3]); //日
ds1302_write_byte(ds1302_hr_add,times[2]); //时
ds1302_write_byte(ds1302_min_add,times[1]); //分
ds1302_write_byte(ds1302_sec_add,times[0]); //秒
ds1302_write_byte(ds1302_control_add,0x80); //打开写保护
// Set_DS1302(times); //DS1302 写入时间
}
break;
case 0x05: //保存数据到闹钟
if(cflag)
{
cflag = 0;
PP = 0;
WriteCommand(0X0C); //关光标
for(i=0;i<7;i++){
clock_buf[i]=times[i];
}
// strcpy(clock_buf,times);
}
break;
default:
break;
}
}
void dateTrans(void){
times[6]=time_buf[1];
times[5]=time_buf[7];
times[4]=time_buf[2];
times[3]=time_buf[3];
times[2]=time_buf[4];
times[1]=time_buf[5];
times[0]=time_buf[6];
}
void alarm_aclok(void)
{
if((times[2]==clock_buf[2])&&(times[1]==clock_buf[1])&&(times[0]==0)) {/*buzeer= 0;*/ music=1;buzeer_music();/*可替换为普通闹钟*/} //1111 0111 P2 & 0xf7
//else { buzeer= 1;}
}
void T1_time() interrupt 3 {
TH1=0xfc;
TL1=0x66;
counter++;
if(counter == 10) { counter = 0; baifenmiao++;}
if(baifenmiao == 10) {baifenmiao = 0; shifenmiao++;}
if(shifenmiao == 10) {shifenmiao = 0;led1=~led1; miao++;}
if(miao == 10) { miao = 0; shimiao++;}
if(shimiao == 10) { shimiao = 0; baimiao++;}
if(baimiao == 10) baimiao =0;
}
void timer_run(void)
{
if(key==2) keyflg=2; //计时功能
while(key==2)
{
WriteCommand(0x01); //显示清屏
while(keyflg==2){
key = Key4Scan();
if(key==4) keyflg=0;
WriteCommand(0x80+5); //计时功能
WriteData(shuzi[baimiao]);
WriteData(shuzi[shimiao]);
WriteData(shuzi[miao]);
WriteData('.');
WriteData(shuzi[shifenmiao]);
WriteData(shuzi[baifenmiao]);
if(key==2) TR1=~TR1;
if(key==3) {shifenmiao=0;baifenmiao=0;baimiao=0;shimiao=0;miao=0;TR0=0;}
}
WriteCommand(0x01); //显示清屏
}
}
void timer_runback(void){
if(key==3) keyflg=3; //倒计时功能
while(key==3)
{
WriteCommand(0x01); //显示清屏
WriteCommand(0x80+5); //显示清屏 k1 功能选择 k2 定是数据选择 k3数据保存
WriteData('0');
WriteData('0');
WriteData('0');
/* WriteData(':');
WriteData('0');
WriteData('0');*/
while(keyflg==3)
{
key = Key4Scan();
if(key==4) keyflg=0;
switch(key) //Key4Scan()
{
case 0x01:
switch(PPP++) //??????
{
case 0: WriteCommand(0x80+5);break; //分钟
case 1: WriteCommand(0x80+6);break; //
case 2: WriteCommand(0x80+7);break; //
/*case 3: WriteCommand(0x80+9);break; // 秒
case 4: WriteCommand(0x80+10);break; //*/
default:break;
}
WriteCommand(0x0f);//光标闪烁
if(PPP == 4){ PPP = 0; time[0]=time[1]=time[2] =0; } //7还是 8好像和编译器有关系
cflg = 1; //标志位
break;
case 0x02:
if(cflg)
{
switch(PPP-1)
{
case 0: // 百秒
time[0]++;
if(time[0] > 9)
{
time[0] = 0;
}
WriteCommand(0x80+5);
WriteData(shuzi[time[0]]);
WriteCommand(0x80+5);
break;
case 1: //十秒
time[1]++;
if(time[1] > 9)
{
time[1] = 0;
}
WriteCommand(0x80+6);
WriteData(shuzi[time[1]]);
WriteCommand(0x80+6);
break;
case 2: //秒
time[2]++;
if(time[2] > 9)
{
time[2] = 0;
}
WriteCommand(0x80+7);
WriteData(shuzi[time[2]]);;
WriteCommand(0x80+7);
break;
default:
break;
}
}
break;
case 0x03:
if(cflg)
{
cflg = 0;
PPP = 0;
WriteCommand(0X0C); //取消 并关光标
miao=9-time[2];
shimiao=9-time[1];
baimiao=9-time[0];
}
break;
/* case 0x05: //保存数据到闹钟
if(cflag)
{
cflag = 0;
PP = 0;
WriteCommand(0X0C); //关光标
}
break; */
default:
break;
}
while(!cflg)
{
WriteCommand(0X80+5); //取消 并关光标
WriteData(shuzi[9-baimiao]);
WriteData(shuzi[9-shimiao]);
WriteData(shuzi[9-miao]);
key = Key4Scan();
if(key==4){cflg=1; keyflg=0; }
while((9-baimiao)==0&&(9-shimiao==0)&&(9-miao)==0)
{
while(keyflg){
led3=~led3;
DelayMs(3500);
key = Key4Scan();
WriteCommand(0X80+7);
WriteData('0');
if(key==4){cflg=1; keyflg=0; }
}
}
}
}
WriteCommand(0X01);
}
}
void clock_display(void)
{
if(key==5)
{
WriteCommand(0x01);
WriteCommand(0x80+5);
WriteData(shuzi[clock_buf[2]/16]);
WriteData(shuzi[clock_buf[2]%16]);
WriteData(':');
WriteData(shuzi[clock_buf[1]/16]);
WriteData(shuzi[clock_buf[1]%16]);
delay_ms(2000);
}
}
void clock_delay(void)
{
if(key==6)
{
miao=0;
shimiao=0;
TR0=0;
buzeer=1;
}
if(keyflg==6)
{
if(miao==9)
{
//buzeer=0;
TR0=1;
buzeer_music();
}
}
}
void start(void)
{
WriteCommand(0x80+3);
WriteData('3');
WriteData('-');
WriteData('0');
WriteData('5');
WriteData('-');
WriteData('0');
WriteData('6');
led2=1;
delay_ms(1000);
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei提供下载:
RTC实时时钟DS1302液晶显示.rar
(96.15 KB, 下载次数: 24)
2017-5-12 13:59 上传
点击文件名下载附件
RTC实时时钟DS1302液晶显示
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1