万年历c程序.docx

上传人:b****5 文档编号:29028145 上传时间:2023-07-20 格式:DOCX 页数:19 大小:16.88KB
下载 相关 举报
万年历c程序.docx_第1页
第1页 / 共19页
万年历c程序.docx_第2页
第2页 / 共19页
万年历c程序.docx_第3页
第3页 / 共19页
万年历c程序.docx_第4页
第4页 / 共19页
万年历c程序.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

万年历c程序.docx

《万年历c程序.docx》由会员分享,可在线阅读,更多相关《万年历c程序.docx(19页珍藏版)》请在冰豆网上搜索。

万年历c程序.docx

万年历c程序

#include"reg52.h"

#include"absacc.h"

#defineLEDP0

#defineDIGP2

#definekey_ioP1

voiddisplay();

voidkey_scan(void);

voidkey_scan_proc(void);

voiddisplay_one();

 

unsignedchark=0;

unsignedcharkey_flag;

unsignedcharkey_return;

unsignedchart=0;

unsignedchardisp_flag;

unsignedchardisp_num;

unsignedcharbell_flag;

unsignedcharset[6];

unsignedcharset_time[6];

unsignedchardisp[7];

sbitCLK=P3^4;/*实时时钟时钟线引脚*/

sbitIO=P3^5;/*实时时钟数据线引脚*/

sbitRST=P3^6;/*实时时钟复位线引脚*/

sbitdq=P1^4;/*ds18b20*/

sbitACC0=ACC^0;

sbitACC7=ACC^7;

//sbitkey1=P1^0;

//sbitkey2=P1^1;

//sbitkey3=P1^2;

//sbitkey4=P1^3;

sbitlight=P3^0;

sbitbell=P3^7;

/**********************************************************

延时子函数

**********************************************************/

voiddelay(unsignedchardly)

{

while(dly--);

}

/***********************************************************

向DS1302写入1Byte数据

***********************************************************/

voidInputByte(unsignedcharucDa)

{

unsignedchari;

ACC=ucDa;

for(i=8;i>0;i--)

{

IO=ACC0;

CLK=1;

CLK=0;

ACC>>=1;

}

}

/***********************************************************

从DS1302读取1Byte数据

***********************************************************/

unsignedcharOutputByte(void)

{

unsignedchari;

for(i=8;i>0;i--)

{

ACC>>=1;

ACC7=IO;

CLK=1;

CLK=0;

}

return(ACC);

}

/***********************************************************

向DS1302指定地址写数据

***********************************************************/

voidW_1302(unsignedcharAddr,unsignedcharDa)

{

RST=0;

CLK=0;

RST=1;

InputByte(Addr);//写地址

InputByte(Da);//写1Byte数据

CLK=1;

RST=0;

}

/***********************************************************

读取DS1302某地址的数据

***********************************************************/

unsignedcharR_1302(unsignedcharAddr)

{

unsignedcharDa;

CLK=0;

RST=0;

RST=1;

InputByte(Addr);//地址,命令

Da=OutputByte();//读1Byte数据

RST=0;

CLK=1;

return(Da);

}

/*************************************************************

初始化ds18b20

*************************************************************/

voidrst_18b20(void)

{

dq=1;

delay(8);

dq=0;

delay(80);

dq=1;

delay(35);

}

/*************************************************************

读ds18b20一个byte数据

*************************************************************/

unsignedcharread_18b20(void)

{

unsignedchari,dat=0;

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

{

dq=0;

dat>>=1;

dq=1;

if(dq==1)

dat|=0x80;

delay(4);

}

return(dat);

}

/*************************************************************

向ds18b20写入一个byte数据

**************************************************************/

voidwrite_18b20(unsignedchardat)

{

unsignedchari;

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

{

dq=0;

dq=dat&0x01;

delay(5);

dq=1;

dat>>=1;

}

}

/**************************************************************

读取温度值ds18b20

**************************************************************/

unsignedintread_T(void)

{

unsignedintt=0;//16bit

unsignedchart0=0,t1=0;

floattemp=0;//32bit

rst_18b20();

write_18b20(0xcc);

write_18b20(0x44);

rst_18b20();

write_18b20(0xcc);

write_18b20(0xbe);

t0=read_18b20();

t1=read_18b20();

t=t1;

t<<=8;

t=t+t0;

t>>=4;

/*t=(t0>>1);

temp=t*0.0625;

t=temp*10+0.5;*/

return(t);

}

 

voidmain(void)

{

W_1302(0x8e,0x00);//开保护

W_1302(0x8c,0x09);//year

W_1302(0x8a,0x05);//week

W_1302(0x88,0x05);//mouth

W_1302(0x86,0x29);//date

W_1302(0x84,0x15);//hour

W_1302(0x82,0x59);//minute

W_1302(0x80,0x00);//second

W_1302(0x8e,0x80);//写保护

TMOD=0x01;

TH0=0xFa;

TL0=0xFF;

EA=1;

ET0=1;

TR0=1;

bell=1;

disp_flag=0;

disp_num=0;

key_flag=0;

bell_flag=0;

while

(1)

{

while(disp_flag==0)

{

display();

if(light==0)

{

DIG=0X00;

disp_flag=2;

}

}

while(disp_flag==1)

display_one();

if(light==1)

disp_flag=0;

}

}

/*********************************************************

扫描显示函数

*********************************************************/

voiddisplay(void)

{

switch(k)

{

case0:

LED=(disp[0]&0XF0)+(disp[4]>>4);

DIG=0X80;

break;

case1:

LED=(disp[0]<<4)+(disp[4]&0X0F);

DIG=0X40;

break;

case2:

LED=(disp[1]&0X10)+(disp[5]>>4);

DIG=0X20;

break;

case3:

LED=(disp[1]<<4)+(disp[5]&0X0F);

DIG=0X10;

break;

case4:

LED=(disp[2]&0X30)+(disp[6]>>4);

DIG=0X08;

break;

case5:

LED=(disp[2]<<4)+(disp[6]&0X0F);

DIG=0X04;delay(15);

break;

case6:

LED=0xf0+t/10;

DIG=0X02;

break;

case7:

LED=(disp[3]<<4)+t%10;

DIG=0X01;//while

(1);

break;

case8:

DIG=0X00;

if(key_flag==0)

{

t=read_T();

disp[0]=R_1302(0x8d);//year

disp[1]=R_1302(0x89);//month

disp[2]=R_1302(0x87);//data

disp[3]=R_1302(0x8b);//week

disp[4]=R_1302(0x85);//hour

disp[5]=R_1302(0x83);//minte

disp[6]=R_1302(0x81);//second

if((disp[4]==set_time[0])&&(disp[5]==set_time[1]))

{

bell=0;

}

elsebell=1;

}

key_scan();

break;

}

}

voiddisplay_one()

{key_scan();

switch(disp_num)

{

case1:

{

DIG=0x00;

LED=(disp[0]&0XF0)+0x0f;

DIG=0X80;delay(100);DIG=0x00;

LED=(disp[0]<<4)+0x0F;

DIG=0X40;delay(100);

break;

}

case2:

{DIG=0x00;

LED=(disp[1]&0X10)+0x0f;

DIG=0X20;delay(100);DIG=0x00;

LED=(disp[1]<<4)+0x0F;

DIG=0X10;delay(100);

break;

}

case3:

{DIG=0x00;

LED=(disp[2]&0Xf0)+0x0f;

DIG=0X08;delay(100);DIG=0x00;

LED=(disp[2]<<4)+0x0F;

DIG=0X04;delay(100);

break;

}

case4:

{DIG=0x00;

LED=0xff;

DIG=0X00;delay(100);DIG=0x00;

LED=(disp[3]<<4)+0x0F;

DIG=0X01;delay(100);

break;

}

case5:

{DIG=0x00;

LED=(disp[4]>>4)+0xF0;

DIG=0X80;delay(100);DIG=0x00;

LED=(disp[4]&0x0F)+0xF0;

DIG=0X40;delay(100);

break;

}

case6:

{DIG=0x00;

LED=(disp[5]>>4)+0xF0;

DIG=0X20;delay(100);DIG=0x00;

LED=(disp[5]&0x0F)+0xF0;

DIG=0X10;delay(100);

break;

}

}

}

/***********************************************************

按键识别程序

***********************************************************/

voidkey_scan(void)

{

unsignedcharkey_data=0;

key_io=0xff;

key_data=key_io&0x0f;

if(key_data==0xff)

key_flag=0;

else

{

delay(30);

key_io=0xff;

if(((key_io&0x0f)!

=0x0f)&&((key_io&0x0f)==key_data))

{

while(key_io!

=0xff);

switch(key_data)

{

case0x0e:

{key_return=0;key_flag=1;break;}

case0x0d:

{key_return=1;key_flag=1;break;}

case0x0b:

{key_return=2;key_flag=1;break;}

case0x07:

{key_return=3;key_flag=1;break;}

default:

break;

}

}

if(key_flag==1)

{

disp_flag=1;

key_flag=0;

key_scan_proc();

}

}

}

/***************************************************************

按键函数

***************************************************************/

voidkey_scan_proc(void)

{intset;

switch(key_return)

{

case0:

{

disp_num+=1;

if(disp_num==7)

{

W_1302(0x8e,0x00);//开保护

W_1302(0x8c,disp[0]);//year

W_1302(0x8a,disp[3]);//week

W_1302(0x88,disp[1]);//mouth

W_1302(0x86,disp[2]);//date

W_1302(0x84,disp[4]);//hour

W_1302(0x82,disp[5]);//minute

W_1302(0x80,0x00);//second

W_1302(0x8e,0x80);//写保护

disp_flag=0;

disp_num=0;

}

break;

}

case1:

{

set=(disp[disp_num-1]>>4)*10+(disp[disp_num-1]&0x0f)-1;

if(disp_num==1&&set==-1)

set=99;

elseif(disp_num==2&&set==0)

set=12;

elseif(disp_num==3&&set==0)

{

if(disp[1]==2)

set=29;

elseif(disp[1]==1||disp[1]==3||disp[1]==5||disp[1]==7||disp[1]==8||disp[1]==0x10||disp[1]==12)

set=31;

elseif(disp[1]==4||disp[1]==6||disp[1]==9||disp[1]==0x11)

set=30;

}

elseif(disp_num==4&&set==0)

set=7;

elseif(disp_num==5&&set==-1)

set=23;

elseif(disp_num==6&&set==-1)

set=59;

disp[disp_num-1]=((set/10)<<4)+(set%10);

break;

}

case2:

{

set=((disp[disp_num-1]>>4)*10+(disp[disp_num-1]&0x0f))+1;

if(disp_num==1&&set==100)

set=0;

elseif(disp_num==2&&set==13)

set=1;

elseif(disp_num==3)

{

if(set==30&&disp[1]==2)

set=1;

elseif(set==32&&(disp[1]==1||disp[1]==3||disp[1]==5||disp[1]==7||disp[1]==8||disp[1]==0x10||disp[1]==12))

set=1;

elseif(set==31&&(disp[1]==4||disp[1]==6||disp[1]==9||disp[1]==0x11))

set=1;

}

elseif(disp_num==4&&set==8)

set=1;

elseif(disp_num==5&&set==24)

set=0;

elseif(disp_num==6&&set==60)

set=0;

disp[disp_num-1]=((set/10)<<4)+(set%10);

break;

}

case3:

{

disp_flag=1;

bell_flag=1;

switch(disp_num)

{

case0:

{disp_num=5;break;}

case5:

{disp_num=6;break;}

case6:

{

set_time[0]=disp[4];

set_time[1]=disp[5];

disp_flag=0;

bell_flag=0;

disp_num=0;

break;

}

}

break;

}

default:

break;

}

}

 

/*************************************************************

定时器中断函数

*************************************************************/

voidtimer0()interrupt1

{

TH0=0xFC;

TL0=0xFF;

k++;

if(k==20)

{

k=0;

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1