ds1302万年历.docx
- 文档编号:28466312
- 上传时间:2023-07-14
- 格式:DOCX
- 页数:22
- 大小:18.04KB
ds1302万年历.docx
《ds1302万年历.docx》由会员分享,可在线阅读,更多相关《ds1302万年历.docx(22页珍藏版)》请在冰豆网上搜索。
ds1302万年历
/***************************************************************
系统名称:
电子万年历
日期:
2008,7,18
功能描述:
LCD12864串行模式显示,DS1302读取时间年月份,
18B20读取温度
****************************************************************/
#include
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/*------------LCD12864相关声明-----------------------------*/
#definecom0
#definedat1
sbitcs=P1^6;
sbitsid=P1^4;
sbitsck=P1^2;
ucharcodeTAB1[]={"电字钟w418781840"};//第一行初始化.
ucharcodeTAB2[]={"20年月日"};//第二行
ucharcodeTAB3[]={"星期:
:
"};//第三行
ucharcodeTAB4[]={"室温:
℃"};//第四行
/*----------------------DS1302相关声明-------------------------*/
charTAB_1302[]={0x00,0x29,0x02,//秒:
分:
时.
0x18,0x06,0x06,0x08};//日:
月:
星期:
年.
ucharcodeTAB_XQ[]={"一二三四五六日"};//把DS1302数字日期转换为中文字符.
sbitT_CLK=P2^4;/*实时时钟的时钟线引脚*/
sbitT_IO=P2^5;/*实时时钟的数据线*/
sbitT_RST=P2^6;/*实时时钟的复位线引脚*/
ucharbdatadatbyte;
sbitdatbyte0=datbyte^0;
sbitdatbyte7=datbyte^7;
/*--------------18B20相关声明-------------------------------*/
uchardis1[16];
sbitDQ=P1^0;/*DS18B20温度检测*/
/*----------键盘相关声明-------------------------------------*/
sbitkey=P3^2;//功能键
sbitkey1=P3^3;//只有加1键
ucharsum,keyflag=0;//调用时,分,秒,标志,调用键盘处理标志.
/*--------------以下为LCD12864相关函数--------------------------*/
/**************************************************************
函数名称:
voiddelay1ms(uintx)
函数功能:
延时1MS
***************************************************************/
voiddelay1ms(uintx)
{
uinti,j;
for(i=0;i for(j=0;j<120;j++); } /************************************************************** 函数名称: voidw_12864byte(ucharbyte) 函数功能: 写字节 **************************************************************/ voidw_12864byte(ucharbyte) { uchari; for(i=0;i<8;i++) { sck=0; byte<<=1; sid=CY; sck=1; } } /************************************************************** 函数名称: ucharr_12864byte(void) 函数功能: 读字节 ***************************************************************/ ucharr_12864byte(void) { uchari,temp1,temp2; temp1=0; temp2=0; for(i=0;i<8;i++) { temp1=temp1<<1; sck=0; sck=1; sck=0; if(sid)temp1++; } for(i=0;i<8;i++) { temp2=temp2<<1; sck=0; sck=1; sck=0; if(sid)temp2++; } return((0xf0&temp1)+(0x0f&temp2)); } /************************************************************** 函数名称: voidc_12864busy(void) 函数功能: 检测忙函数 **************************************************************/ voidc_12864busy(void) { do w_12864byte(0xfc);//11111,RW (1),RS(0),0 while(0x80&r_12864byte()); } /************************************************************** 函数名称: voidw_12864(bitdat_com,ucharbyt) 函数功能: 写入函数 ***************************************************************/ voidw_12864(bitdat_com,ucharbyt) { uchartemp; if(dat_com==0)//为零,写入指令 temp=0xf8;//11111,RS(0),RW(0),0 else//否则,写入数据 temp=0xfa;//11111,RS (1),RW(0),0 cs=1; c_12864busy(); w_12864byte(temp); w_12864byte(byt&0xf0);//写入高四位 w_12864byte(byt<<4);//写入低四位 cs=0; } /************************************************************** 函数名称: voidinit_12864(void) 函数功能: 初始化12864 ***************************************************************/ voidinit_12864(void) { w_12864(com,0x30);//基本指令功能. w_12864(com,0x0c);//显示打开,关光标,反白关. w_12864(com,0x01);//清屏指令. w_12864(com,0x06);//AC自动加一 } /*----------------以下为DS1302相关函数-------------------------*/ /************************************************************** 函数名称: voidw_1302byte(uchardate) 函数功能: 写一个字节(上升沿) ***************************************************************/ voidw_1302byte(uchardate) {uchari; datbyte=date; for(i=0;i<8;i++) {T_IO=datbyte0;//写最低位 T_CLK=0; T_CLK=1; datbyte>>=1; } } /************************************************************** 函数名称: ucharr_1302byte(void) 函数功能: 读一个字节(下降沿) ***************************************************************/ ucharr_1302byte(void) {uchari; datbyte=0; for(i=0;i<8;i++) {datbyte7=T_IO;//读最低位 T_CLK=1; T_CLK=0; datbyte>>=1; } return(datbyte); } /*************************************************************** 函数名称: voidwrite_1302(ucharaddr,uchardate) 函数功能: 指定位置写数据 ****************************************************************/ voidwrite_1302(ucharaddr,uchardate) {T_RST=0; T_CLK=0; T_RST=1; w_1302byte(addr); w_1302byte(date); T_CLK=0; T_RST=0; } /************************************************************** 函数名称: ucharread_1302(ucharaddr) 函数功能: 指定位置读数据 ****************************************************************/ ucharread_1302(ucharaddr) {uchardat1,dat2,temp; T_RST=0; T_CLK=0; T_RST=1; w_1302byte(addr); temp=r_1302byte(); T_RST=0; T_CLK=0; dat1=temp/16; dat2=temp%16; temp=dat1*10+dat2; return(temp); } /*************************************************************** 函数名称: voidinit_1302(void) 函数功能: 初始化 *****************************************************************/ voidinit_1302(void) {uchari; ucharaddr=0x80; write_1302(0x8e,0x00); for(i=0;i<7;i++) { write_1302(addr,TAB_1302[i]); addr+=2; } write_1302(0x8e,0x80); } /**************************************************************** 函数名称: voidget_1302(void) 功能说明: 读取DS1302时钟信息. *****************************************************************/ voidget_1302(void) {uchari,addr=0x81; for(i=0;i<7;i++) {TAB_1302[i]=read_1302(addr); addr+=2; } } /*---------------以下为18B20相关函数-----------------------------*/ /****************************************************************** 函数名称: voiddelay(uintx) 功能说明: 若机器周期为1us,则本延时程序为延时4*x(us) ******************************************************************/ voiddelay(uintx)//本板延时8us { while(--x); } /***************************************************************** 函数名称: ucharbus_rest(void) 功能说明: 产生单总线系统信号的总线复位信号,并返回 总线上是否存在单总线器件信息 ******************************************************************/ ucharbus_rest(void) { ucharpresence; DQ=0;//将DQ信号线拉低 delay(29);//持续48US DQ=1;//释放总线 delay(3);//等待从设备将总线拉低 presence=DQ;//保存当前总线状态 delay(25);//等待总线初始化过程结束 returnpresence;//返回是否有从设备将总线拉低 } /**************************************************************** 函数名称: ucharr_1820BYTE(void) 功能说明: 向单总线读取一个数据字节 *****************************************************************/ ucharr_1820BYTE(void) { uchari=0; uchardate=0; for(i=8;i>0;i--) { DQ=0;//将DQ信号线拉低启动读时隙 DQ=1;//释放总线,等待从机动车辆返回数据位 delay (1);//越接近15us越好;准备采样总线上的信号 date>>=1; if(DQ) date=date|0x80; delay(6); } return(date); } /***************************************************************** 函数名称: voidw_1280Byte(ucharbytevalue) 功能说明: 向单总线写一个数据字节 ******************************************************************/ voidw_1280Byte(ucharbytevalue) { uchari; for(i=0;i<8;i++) { DQ=0;//将DQ信号线拉低启动读时隙 DQ=bytevalue&0x01;// delay(5);//等待写时隙结束 DQ=1;//释放 bytevalue>>=1; } delay(5);////等待写时隙结束 } /***************************************************************** 函数名称: uintread_T(void) 功能说明: 读取1820温度 *******************************************************************/ uintread_T(void) { uchara=0; ucharb=0; uintt=0; bus_rest(); w_1280Byte(0xCC);//跳过读序号列号的操作; w_1280Byte(0x44);//启动温度转换,模数转化; bus_rest(); w_1280Byte(0xCC);//跳过读序号列号的操作; a=r_1820BYTE();//低8位 b=r_1820BYTE();//高8位 t=(b*256)+a; return(t); } /************************************************************** 函数名称: voidshow_T(uinttemp) 函数功能: 显示温度 **************************************************************/ voidshow_T(uinttemp) { inti; floatftemp; ftemp=temp*0.0625; w_12864(com,0x98+3); for(i=0;i<5;i++) w_12864(dat,dis1[i]);//写入温度 } /*---------------以下为显示相关函数--------------------------*/ /****************************** 函数名称: voidfenli(ucharx,uchary,ucharval) 功能描述: 指定位置写入数据 ********************************/ voidfenli(ucharx,uchary,ucharval) {ucharge,shi,addr,i=0; if(val==5)//星期数字显示的转换为中文 { w_12864(com,0x88+2); for(i=0;i<2;i++) { if(TAB_1302[5]==0)w_12864(dat,TAB_XQ[i]); if(TAB_1302[5]==1)w_12864(dat,TAB_XQ[2+i]); if(TAB_1302[5]==2)w_12864(dat,TAB_XQ[3+i]); if(TAB_1302[5]==3)w_12864(dat,TAB_XQ[5+i]); if(TAB_1302[5]==4)w_12864(dat,TAB_XQ[7+i]); if(TAB_1302[5]==5)w_12864(dat,TAB_XQ[9+i]); if(TAB_1302[5]==6)w_12864(dat,TAB_XQ[11+i]); } } else { shi=TAB_1302[val]/10;//分离十位 ge=TAB_1302[val]%10; if(x==1)x=0x80; if(x==2)x=0x90; if(x==3)x=0x88; if(x==4)x=0x98; addr=x+y; w_12864(com,addr);//指定位置 w_12864(dat,0x30+shi);//写入 w_12864(dat,0x30+ge); } } /************************************************************* 函数名称: voiddisplay(void) 功能描述: 显示函数 **************************************************************/ voiddisplay(void) {get_1302();//读1302 fenli(3,7,0);//读秒 fenli(3,5,1);//读分 fenli(3,3,2);//读时 fenli(2,5,3);//读日 fenli(2,3,4);//读月 fenli(3,2,5);//读星期 fenli(2,1,6);//读年 } /*---------------按键处理相关函数--------------------------*/ /************************************************************ 函数名称: voidscanner() 功能描述: 按键函数 *************************************************************/ voidscanner() {uchari,j; if(! key)//功能键按下 {delay1ms(500);//延时500MS if(! key)//还按下,退出时间调整 {keyflag=0;//标志位为0 sum=0;//清0 w_12864(com,0x0c);//清闪烁 for(i=0;i<7;i++)//十进制转十六进制 {j=TAB_1302[i]/10; TAB_1302[i]=TAB_1302[i]%10; TAB_1302[i]=TAB_1302[i]+16*j; } init_1302();//写入1302 while(! key);//等待释放 delay1ms(10);//延时消抖 } else//500MS内放开 {keyflag=1;//标志为1,进行时间调整 sum++;//功能键加1 if(sum==8) sum=0; switch(sum) {case1: // {w_12864(com,0x98+7); w_12864(com,0x0f); break; } case2: //为2,年闪烁 w_12864(com,0x90+1); break; case3: //月闪烁 w_12864(com,0x90+3); break; case4: //日闪烁 w_12864(com,0x90+5); break; case5: //星期闪烁 w_12864(com,0x88+2); break; case6: //分闪烁 w_12864(com,0x88+5); break; case7: //时闪烁 w_12864(com,0x88+3); break; } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ds1302 万年历