Microsoft Word 文档.docx
- 文档编号:9851350
- 上传时间:2023-02-07
- 格式:DOCX
- 页数:21
- 大小:18.48KB
Microsoft Word 文档.docx
《Microsoft Word 文档.docx》由会员分享,可在线阅读,更多相关《Microsoft Word 文档.docx(21页珍藏版)》请在冰豆网上搜索。
MicrosoftWord文档
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitCLK_166=P3^1;
sbitSHLD_166=P3^4;
unsignedchardat;
unsignedcharK1,H2,K3;
sbitSDA=P1^0;//DS1302数据线
sbitCLK=P1^1;//DS1302时钟线
sbitRST=P1^2;//DS1302复位线
//sbitK1=P3^5;//小时调整
//sbitK2=P3^6;//分钟调整
//sbitK3=P3^7;//确定
sbitLED_DS=P2^3;//数据输入SI
sbitLED_ST=P2^1;//显示控制RCK
sbitLED_SH=P2^2;//数据控制SCK
//数码管字形码
ucharcodeDSY_shuma[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09
0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF};//共阳
//显示缓冲:
23-57-18;2011年04月16日
ucharDSY_BUFFER[]={0,0,0xBF,0,0};//显示缓冲00-00-00(12-04-10)
ucharCurrent_Time[7];//通过DS1302读取的日期和时间就放在这个数组中。
bitAdjust_Flag;
//*--------子程序声明--------*//
voiddelay(uintK);//延时子程序
voidDisplay();//显示子程序,主要显示小时、分钟和
voidInitialization();//初始化子程序
voidWrite_Byte_TO_DS1302(ucharx);//向DS1302写入一个字节
ucharRead_Byte_FROM_DS1302();//从DS1302读取一个字节
voidWrite_Data_TO_DS1302(ucharaddr,uchardat);//向DS1302中的寄存器中写入数据
ucharRead_Data_FROM_DS1302(ucharaddr);//从DS1302的某个寄存器中读取数据
voidGET_Time();//读取当前时间,年月日,小时、分钟、秒钟
voidSET_Time();//当调整时间时需要设置时间
//--------------------------------------------
//主程序
//--------------------------------------------
voidmain()
{
Initialization();
while
(1)
{
if(Adjust_Flag==0)
GET_Time();
Display();
}
//}
while
(1)
{
SHLD_166=0;
CLK_166=0;
CLK_166=1;
delay(1000);
SHLD_166=1;
SCON=0X10;
while(RI==0);
dat=SBUF;
switch(dat)
{
case0Xfe:
K1=0;break;
case0Xfd:
H2=0;break;
case0Xfb:
K3=0;break;
case0Xf7:
P0=0x1f;break;
case0Xef:
P0=0X2f;break;
case0Xdf:
P0=0xff;break;
}
}
}
//---------------------------------------------------------------------
//键盘中断服务程序(INT0)
//---------------------------------------------------------------------
voidEX_INT0()interrupt0
{
if(K1==0)//小时调整
{
Adjust_Flag=1;//正在调整
Current_Time[2]=(Current_Time[2]+1)%24;
}
elseif(H2==0)//分钟调整
{
Adjust_Flag=1;//正在调整
Current_Time[1]=(Current_Time[1]+1)%60;
}
elseif(K3==0)
{
SET_Time();//将调整后的时间写入DS1302
Adjust_Flag=0;//结束调整,时间继续正常显示
}
}
//*--------延时子程序--------*/
voiddelay(uintK)
{
uchari,p=120;
for(i=K;i>0;i--)
{for(;p>0;p--);}
}
//*--------写字节函数,向DS1302写入一个字节--------*//
voidWrite_Byte_TO_DS1302(ucharX)//向DS1302写入一个字节
{
uchari;
for(i=0;i<8;i++)
{
SDA=X&1;
CLK=1;
CLK=0;
X>>=1;
}
}
//*--------读字节函数,从DS1302读取一个字节--------*//
ucharRead_Byte_FROM_DS1302()
{
uchari,byte,t;
for(i=0;i<8;i++)
{
byte>>=1;
t=SDA;
byte|=t<<7;
CLK=1;
CLK=0;
}
//BCD码转换
returnbyte/16*10+byte%16;
}
//-------------------------------------------------------------
//从DS1302指定位置读取数据,读数据
//---------------------------------------------------------------
ucharRead_Data_FROM_DS1302(ucharaddr)
{
uchardat;
RST=0;
CLK=0;
RST=1;
Write_Byte_TO_DS1302(addr);//向DS1302写入一个地址
dat=Read_Byte_FROM_DS1302();//在上面写入的地址中读取数据
CLK=1;
RST=0;
returndat;
}
//-------------------------------------------------------------
//向DS1302指定位置写入数据,写数据
//---------------------------------------------------------------
voidWrite_Data_TO_DS1302(ucharaddr,uchardat)
{
CLK=0;
RST=1;
Write_Byte_TO_DS1302(addr);
Write_Byte_TO_DS1302(dat);
CLK=1;
RST=0;
}
//-------------------------------------------------------------
//读取当前时间,年月日,小时、分钟、秒钟
//---------------------------------------------------------------
voidGET_Time()
{
Current_Time[0]=Read_Data_FROM_DS1302(0x81);//读取当前时间秒
Current_Time[1]=Read_Data_FROM_DS1302(0x83);//读取当前时间分钟
Current_Time[2]=Read_Data_FROM_DS1302(0x85);//读取当前时间时钟
Current_Time[3]=Read_Data_FROM_DS1302(0x87);//读取当前时间日
Current_Time[4]=Read_Data_FROM_DS1302(0x89);//读取当前时间月
Current_Time[5]=Read_Data_FROM_DS1302(0x8B);//读取当前时间秒星期
Current_Time[6]=Read_Data_FROM_DS1302(0x8D);//读取当前时间秒年
}
//---------------------------------------------------------------------
//设置时间函数,当需要调整时间时,需要把调整好的时间写入时间缓冲数组中
//---------------------------------------------------------------------
voidSET_Time()
{
Write_Data_TO_DS1302(0x8e,0x00);//写控制字,取消写保护
Write_Data_TO_DS1302(0x82,(Current_Time[1]/10<<4)|(Current_Time[1]%10));//写入分钟
Write_Data_TO_DS1302(0x84,(Current_Time[2]/10<<4)|(Current_Time[2]%10));//写入时钟
Write_Data_TO_DS1302(0x8e,0x80);//加保护
}
//--------------------------
//初始化子程序
//------------------------------
voidInitialization()
{
Adjust_Flag=0;
IE=0x81;
IT0=0x01;
}
//------------------------------------------
//显示
//------------------------------------------
voidDisplay()
{
charj,j1,j2,j3,mask;
mask=0x01;
delay(1000);
for(j=0;j<8;j++)
{
LED_SH=0;//数据控制
LED_DS=(DSY_shuma[Current_Time[1]%10]&mask);//数据输入
LED_SH=1;//数据控制
mask=mask<<1;
}
mask=0x01;
//delay(10);
for(j1=0;j1<8;j1++)
{
LED_SH=0;//数据控制
LED_DS=(DSY_shuma[Current_Time[1]/10]&mask);//数据输入&同一则一,有零则零
LED_SH=1;//数据控制
mask=mask<<1;
}
mask=0x01;
//delay(10);
for(j2=0;j2<8;j2++)
{
LED_SH=0;//数据控制
LED_DS=(DSY_shuma[Current_Time[2]%10]&mask);//数据输入&同一则一,有零则零
LED_SH=1;//数据控制
mask=mask<<1;
}
mask=0x01;
//delay(10);
for(j3=0;j3<8;j3++)
{
LED_SH=0;//数据控制
LED_DS=(DSY_shuma[Current_Time[2]/10]&mask);//数据输入&同一则一,有零则零
LED_SH=1;//数据控制
mask=mask<<1;
}
LED_ST=0;//显示控制
LED_ST=1;//显示控制
}
//------------------------------------------------
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitCLK_166=P3^1;
sbitSHLD_166=P3^2;
unsignedchardat;
unsignedcharK1,K2,K3,K4=0,K5,K6;
sbitSDA=P1^0;//DS1302数据线
sbitCLK=P1^1;//DS1302时钟线
sbitRST=P1^2;//DS1302复位线
//sbitK1=P3^5;//小时调整
//sbitK2=P3^6;//分钟调整
//sbitK3=P3^7;//确定
sbitLED_clk=P2^0;
sbitLED_st=P2^1;
sbitLED=P2^2;//数据控制SCK
//数码管字形码
ucharcodeDSY_shuma[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09
0x83,0xC6,0xA1,0x86,0x8E,0xBF,0xFF};//共阳
//显示缓冲:
23-57-18;2011年04月16日
ucharDSY_BUFFER[]={0,0,0xBF,0,0};//显示缓冲00-00-00(12-04-10)
ucharCurrent_Time[7];//通过DS1302读取的日期和时间就放在这个数组中。
bitAdjust_Flag;
//*--------子程序声明--------*//
voiddelay(uintK);//延时子程序
voidDisplay();//显示子程序,主要显示小时、分钟和
voidInitialization();//初始化子程序
voidWrite_Byte_TO_DS1302(ucharx);//向DS1302写入一个字节
ucharRead_Byte_FROM_DS1302();//从DS1302读取一个字节
voidWrite_Data_TO_DS1302(ucharaddr,uchardat);//向DS1302中的寄存器中写入数据
ucharRead_Data_FROM_DS1302(ucharaddr);//从DS1302的某个寄存器中读取数据
voidGET_Time();//读取当前时间,年月日,小时、分钟、秒钟
voidSET_Time();//当调整时间时需要设置时间
//--------------------------------------------
//主程序
//--------------------------------------------
voidmain()
{
Initialization();
while
(1)
{
if(Adjust_Flag==0)
GET_Time();
Display();
}
//}
while
(1)
{
SHLD_166=0;
CLK_166=0;
CLK_166=1;
delay(1000);
SHLD_166=1;
SCON=0X10;
while(RI==0);
dat=SBUF;
switch(dat)
{
case0Xfe:
P0=0x03;K1=0;break;
case0Xfd:
K2=0;break;
case0Xfb:
K3=0;break;
case0Xf7:
K4++;break;
case0Xef:
K5++;break;
case0Xdf:
K6++;break;
}
}
}
//---------------------------------------------------------------------
//键盘中断服务程序(INT0)
//---------------------------------------------------------------------
voidEX_INT0()interrupt0
{
if(K1==0)//小时调整
{
Adjust_Flag=1;//正在调整
Current_Time[2]=(Current_Time[2]+1)%24;
}
elseif(K2==0)//分钟调整
{
Adjust_Flag=1;//正在调整
Current_Time[1]=(Current_Time[1]+1)%60;
}
elseif(K3==0)
{
SET_Time();//将调整后的时间写入DS1302
Adjust_Flag=0;//结束调整,时间继续正常显示
}
}
/*{
if(K4%2==1)//小时调整
{
//Adjust_Flag=1;//正在调整
if(K5==1)
{
Current_Time[2]=(Current_Time[2]+1)%24;
}
if(K6==1)
{
Current_Time[2]=(Current_Time[2]-1)%24;
}
}
Else//if(K4==2)分钟调整
{
Adjust_Flag=1;//正在调整
if(K5==1)
{
Current_Time[1]=(Current_Time[1]+1)%60;
}
if(K6==1)
{
Current_Time[1]=(Current_Time[1]-1)%60;
}
}
/*elseif(K4==0)
{
SET_Time();//将调整后的时间写入DS1302
Adjust_Flag=0;//结束调整,时间继续正常显示
}
}*/
//*--------延时子程序--------*/
voiddelay(uintK)
{
uchari,p=120;
for(i=K;i>0;i--)
{for(;p>0;p--);}
}
//*--------写字节函数,向DS1302写入一个字节--------*//
voidWrite_Byte_TO_DS1302(ucharX)//向DS1302写入一个字节
{
uchari;
for(i=0;i<8;i++)
{
SDA=X&1;
CLK=1;
CLK=0;
X>>=1;
}
}
//*--------读字节函数,从DS1302读取一个字节--------*//
ucharRead_Byte_FROM_DS1302()
{
uchari,byte,t;
for(i=0;i<8;i++)
{
byte>>=1;
t=SDA;
byte|=t<<7;
CLK=1;
CLK=0;
}
//BCD码转换
returnbyte/16*10+byte%16;
}
//-------------------------------------------------------------
//从DS1302指定位置读取数据,读数据
//---------------------------------------------------------------
ucharRead_Data_FROM_DS1302(ucharaddr)
{
uchardat;
RST=0;
CLK=0;
RST=1;
Write_Byte_TO_DS1302(addr);//向DS1302写入一个地址
dat=Read_Byte_FROM_DS1302();//在上面写入的地址中读取数据
CLK=1;
RST=0;
returndat;
}
//-------------------------------------------------------------
//向DS1302指定位置写入数据,写数据
//---------------------------------------------------------------
voidWrite_Data_TO_DS1302(ucharaddr,uchardat)
{
CLK=0;
RST=1;
Write_Byte_TO_DS1302(addr);
Write_Byte_TO_DS1302(dat);
CLK=1;
RST=0;
}
//-------------------------------------------------------------
//读取当前时间,年月日,小时、分钟、秒钟
//---------------------------------------------------------------
voidGET_Time()
{
Current_Time[0]=Read_Data_FROM_DS1302(0x81);//读取当前时间秒
Current_Time[1]=Read_Data_FROM_DS1302(0x83);//读取当前时间分钟
Current_Time[2]=Read_Data_FROM_DS1302(0x85);//读取当前时间时钟
Current_Time[3]=Read_Data_FROM_DS1302(0x87);//读取当前时间日
Current_Time[4]=Read_Data_FROM_DS1302(0x89);//读取当前时间月
Current_Time[5]=Read_Data_FROM_DS1302(0x8B);//读取当前时间秒星期
Current_Time[6]=Read_Data_FROM_DS1302(0x8D);//读取当前时间秒年
}
/
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Microsoft Word 文档