首页 基于51单片机的1302时钟芯片C程序

基于51单片机的1302时钟芯片C程序

举报
开通vip

基于51单片机的1302时钟芯片C程序/*============================================================ 使用1602液晶显示DS1302+c51时钟 [注:AT89C51使用12M晶振] =============================================================*/ #include #include #include #define delayNOP(); {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ; ...

基于51单片机的1302时钟芯片C程序
/*============================================================ 使用1602液晶显示DS1302+c51时钟 [注:AT89C51使用12M晶振] =============================================================*/ #include #include #include < intrins.h > #define delayNOP(); {_nop_() ;_nop_() ;_nop_() ;_nop_() ;} ; #define LCM_RW P2_5 //定义引脚 #define LCM_RS P2_4 #define LCM_E P2_6 #define LCM_Data P0 #define Busy 0x80 //用于检测LCM状态字中的Busy标识 #define uchar unsigned char #define uint unsigned int sbit T_CLK=P3^5; sbit T_IO =P3^6; sbit T_RST=P3^7; sbit ACC0=ACC^0; sbit ACC7=ACC^7; sbit LED=P1^6; //背光灯输出 (因本实验板无此功能 所以此项功能无效) sbit system=P2^0; //模式 sbit TimerUp=P2^2; //时间减 sbit TimerDown=P2^1; //时间加 sbit k1=P2^3; sbit k2=P2^7; sbit k3=P3^0; sbit k4=P3^1; sbit D1=P3^2; sbit D2=P3^3; sbit D3=P3^4; sbit Speaker=P1^5; //蜂鸣器 sbit ds18b20=P1^7; /*************ds1302 关于工期滞后的函关于工程严重滞后的函关于工程进度滞后的回复函关于征求同志党风廉政意见的函关于征求廉洁自律情况的复函 数声明************/ void Set(uchar,uchar); //根据选择调整相应项目 void RTInputByte(uchar); //输入 1Byte */ uchar RTOutputByte(void); //输出 1Byte */ void W1302(uchar, uchar); //向DS1302写入一个字节 uchar R1302(uchar); //从DS1302读出一个字节 void Set1302(uchar * ); //设置时间 void KeySound(); //按键音 void ClockSound(); //闹铃蜂鸣声 /**************温度函数声明************/ void display_tem(); uint read_tmp(); void tmpchange(); void tmpwrite(uchar dat); uchar tmpread_byte(); bit tmpread_bit(); void dsreset(); void delay2(uint z); //void time_LCM(uchar); void keyscan(); uchar id,msec,model,LedTime,flag,d,num1,num2,num3,c1,c2,c3,flag1; bit a,b; uchar inittime[7]={0x00,0x00,0x12,0x20,0x07,0x02,0x10}; //初始化后设置为:2010年7月20日星期2 12点0分0秒 void Out_LCM(void); //显示屏幕 void model0(void); //显示输出 void model1(void); void model2(void); void model3(void); void model4(void); void model5(void); void model6(void); void mode1(); void mode2(); void mode3(); void mode4(); void mode5(); void mode6(); void mode7(); void mode8(); void id_case1_key(); //项目调整 void Modset(); //模式键处理 void WriteDataLCM(uchar WDLCM); void WriteCommandLCM(uchar WCLCM,BuysC); uchar ReadStatusLCM(void); void LCMInit(void); void OutputInformation(uchar X, uchar Y, uchar DData); void DisplayListChar(uchar X, uchar Y, uchar code *DData); void Delay5Ms(void); void Delay400Ms(void); void systemsetup(void); //进入系统设置 uchar code systemp[]={"System.setup"}; //字符串输出(系统设定) uchar code TIMER[]={"Time"}; //字符串输出(时间) uchar code TIMER1[]={"T"}; //字符串输出(时间) uchar code DATE[]={"Date"}; //字符串输出(日期) uchar code DATE1[]={"D"}; //字符串输出(日期) uchar code alarmclock[]={"Clock"}; //字符串输出(闹铃) uchar code lamp[]={"Lamp"}; //字符串输出(背光灯) uchar code reset[]={"Reset"}; //字符串输出(时间归零) uchar code exit[]={"Exit"}; //字符串输出(退出) uchar code set[]={"Set"}; //字符串输出(设置) uchar code sec[]={"sec"}; //字符串输出(秒) uchar code ClockSet[]={"ClockSet"}; //字符串输出(闹铃设置) uchar code ClockOn[]={"ON"}; //字符串输出(ON) uchar code ClockOff[]={"OFF"}; //字符串输出(OFF) uchar code take[]={"TakingTimeToSet"}; //字符串输出(ON) uchar code shi1[]={"06:30"}; uchar code shi2[]={"07:30"}; uchar code shi3[]={"11:30"}; uchar code shi4[]={"12:30"}; uchar code shi5[]={"18:30"}; uchar code shi6[]={"19:30"}; uchar code shi7[]={"00:30"}; uchar code shi8[]={"03:30"}; void timesetup(void); //时间设置 void datesetup(void); //日期设置 void alarmclockset(void); //闹铃设置 void lampsetup(void); //背光灯设置 void timereset(void); //时间清零 /*******************************************************************/ void delay1(int ms) { unsigned char y ; while(ms--) { for(y = 0 ; y<250 ; y++) { _nop_() ; _nop_() ; _nop_() ; _nop_() ; } } } void main(void) { Speaker=1; //关闭蜂鸣器 LED=0; //打开LED ,低电平有效,外接9012驱动 Delay400Ms(); //启动等待,等LCM讲入工作状态 Delay400Ms(); LCMInit(); //LCM初始化 TMOD=0x01; //16位定时 TH0=0x3c; //50ms TL0=0xb0; EA=1; TR0=1; ET0=1; flag=1; flag1=1; while(1) { keyscan(); if(TimerDown==0) //左移键按下后把背光灯打开 {Delay5Ms(); if(TimerDown==0) {KeySound(); //蜂鸣声 LED=0; //打开背光灯 LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数 } if(TimerUp==0) //左移键按下后把背光灯打开 {Delay5Ms(); if(TimerUp==0) {KeySound(); //蜂鸣声 LED=0; //打开背光灯 LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16;} //取出背光灯时间并转换为十进制数 } b=1; //模式键是否动作标志。为1时不动作,为0时动作。 Modset(); //调用模式键处理程序判断按键是否按下。 if(b==0) { KeySound(); //蜂鸣声 LED=0; //打开背光灯 systemsetup(); //进入系统设置模式 LedTime=R1302(0xc1)/16*10+R1302(0xc1)%16; //取出背光灯时间并转换为十进制数 } if((LED==0)&&LedTime==0) //延时间是否到 LED=1; //关闭背光灯 if(R1302(0xc3)==1) //闹铃是否打开,0xc3为读闹铃寄存器地址。 { if((R1302(0x85)==R1302(0xc5))&&(R1302(0x83)==R1302(0xc7))&&(flag1)) //判断闹铃时间是否到, { ClockSound(); //发出闹铃蜂鸣声,无按键动作蜂鸣一分钟。 LED=0; if((TimerDown==0)||(TimerUp==0)) { flag1=0; } } if(R1302(0x83)!=R1302(0xc7)) flag1=1; } model0(); //输出显示屏幕 } } void KeySound() //按键音 { Speaker=0; //开蜂鸣声 Delay5Ms(); Speaker=1; //关蜂鸣声 } void ClockSound() //闹铃蜂鸣声 { if(a==0) { Speaker=0; //开蜂鸣声 Delay5Ms(); Delay5Ms(); Delay5Ms(); Speaker=1; //关蜂鸣声 } } void Modset() //模式键处理 { if(system==0) { Delay5Ms(); if(system==0) {while(system==0); KeySound(); //蜂鸣声 a=0;msec=0;b=0; //a、msec为闪烁标志,按键有动作时清零,不闪烁。 } //b为模式键确认动作。其它程判断b是否为零时来确定模式键是否动作。 } } void systemsetup(void) //系统设置 { model=1; while(model!=0) { Out_LCM(); if (TimerUp==0) //设置项目左移 {Delay5Ms(); if(TimerUp==0) {a=0;msec=0;KeySound();//蜂鸣声 if(model--==1) //6种系统设置项目 model=6; } while(TimerUp==0); } if (TimerDown==0) //设置项目右移 { Delay5Ms(); if(TimerDown==0) {a=0;msec=0;KeySound();//蜂鸣声 if(model++==6) model=1; } while(TimerDown==0); } b=1; //模式键是否动作标志。为1时不动作,为0时动作。 Modset(); //调用模式键处理程序判断按键是否按下。 if(b==0) {KeySound(); //蜂鸣声 switch(model) //进入进个项目设置 { case 1: timesetup(); break; //时间设置 case 2: datesetup();break; //日期设置 case 3: alarmclockset();break;//闹铃设置 case 4: lampsetup();break; //背光灯设置 case 5: timereset();break; //时间清零 case 6: model=0;break; //退出系统设置 } } } } void timesetup() //时间调整 { id=6; while(model==1) //model为1时进入时间调整 { b=1; Modset(); if(b==0) {KeySound(); //蜂鸣声 if(id++==9) //6..9为时分秒调。 . id=6; } id_case1_key(); //调用按键处理 Out_LCM(); //显示输出 } } void datesetup() //对日期进行调整 { id=1; while(model==2) //model为2时进入日期调整 {b=1; Modset(); //模式键是否动作 if(b==0) {KeySound(); //蜂鸣声 if(id++==5) //1..5为年月日星期 exit id=1; } id_case1_key(); //日期调整 Out_LCM(); //显示输出 } } void alarmclockset(void) //闹铃调整 {id=12; while(model==3) //进入闹铃设置 {b=1; Modset(); //模式键是否动作 if(b==0) {KeySound(); //蜂鸣声 if(R1302(0xc3)%16==0) {id=0;model++;} //0xc2为闹铃开关寄存器。当为关时按下模式键时将退出闹铃设置,当开时进入闹铃时间设置 else if(id++==15) //12..15为闹铃开关和时间设置 exit id=12; } id_case1_key(); //调整 Out_LCM(); //显示输出 } } void lampsetup(void) //背光灯时间设置 {id=10; //背光灯存储空间DS1302(0xc0) while(model==4) //model为3时进入背光灯调整 {b=1; Modset(); //模式键是否动作 if(b==0) {KeySound(); //蜂鸣声 if(id++==11) //10为背光灯 exit id=10; } id_case1_key(); Out_LCM(); //显示输出 } } void timereset() //时间清零 { Set1302(inittime); //清时间 W1302(0x90,0xa6); //打开充电二级管 一个二级管串联一个2K电阻 model++; } //对相应的项目进行加、减调整。 void id_case1_key() //按键处理 { if (TimerUp==0) //增加 { Delay5Ms(); if(TimerUp==0) {a=0;msec=0;KeySound(); //蜂鸣声 if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调整 { model++; //退出时间、日期设置 id=0; } else Set(id,1); } while(TimerUp==0); } if (TimerDown==0) //减少 { Delay5Ms(); if(TimerDown==0) {a=0;msec=0;KeySound(); //蜂鸣声 if((id==9)||(id==5)||(id==11)||(id==15)) //当ID为9、5时按下加、减键将退出调整 { model++; //退出时间、日期设置 id=0; } else Set(id,0); //调用DS1302写入函数 } while(TimerDown==0); } } void timer_1(void) interrupt 1 //中断入口,闪烁 { TH0=0x3c; //50ms定时 TL0=0xb0; if(msec++==10) //500ms { msec=0;a=~a; //闪烁标志反转 if(a==0) //1秒后背光时间减一秒。 LedTime--; } } //根据选择调整相应项目并写入DS1302 void Set(uchar sel,uchar sel_1) { uchar address,item; uchar max,min; if(sel==1) {address=0x8c; max=99;min=0;} //年 if(sel==2) {address=0x88; max=12;min=1;} //月 if(sel==3) {address=0x86; max=31;min=1;} //日 if(sel==4) {address=0x8a; max=7; min=1;} //星期 if(sel==6) {address=0x84; max=23;min=0;} //小时 if(sel==7) {address=0x82; max=59;min=0;} //分钟 if(sel==8) {address=0x80; max=59;min=0;} //秒 if(sel==10) {address=0xc0; max=59;min=0;} //背光时间,最长1分钟 if(sel==12) {address=0xc2; max=1;min=0;} //闹铃开关寄存器 if(sel==13) {address=0xc4; max=23;min=0;} //闹铃时寄存器 if(sel==14) {address=0xc6; max=59;min=0;} //闹铃分寄存器 item=R1302(address+1)/16*10+R1302(address+1)%16; if (sel_1==0) item++; else item--; if(item>max) item=min; if(item
本文档为【基于51单片机的1302时钟芯片C程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
is_021285
暂无简介~
格式:doc
大小:221KB
软件:Word
页数:43
分类:工学
上传时间:2010-11-30
浏览量:28