多用途时钟程序DS1302Word文档下载推荐.docx
- 文档编号:4452459
- 上传时间:2023-05-03
- 格式:DOCX
- 页数:35
- 大小:19.03KB
多用途时钟程序DS1302Word文档下载推荐.docx
《多用途时钟程序DS1302Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《多用途时钟程序DS1302Word文档下载推荐.docx(35页珍藏版)》请在冰点文库上搜索。
//工作指示灯
ucharDot;
bitSign;
ucharTr;
ucharflag=0;
charHour,Minute;
ucharBlack_1,Black_2;
uinttime;
ucharNum;
bitZ_flag=0;
uintN;
charT_Hour,T_Minute;
bitAlarm_flag=0;
ucharCH=0;
charT_ON_Hour,T_ON_Minute,T_OFF_Hour,T_OFF_Minute;
bitAl_flag=0;
bitSW_flag=0;
bitDis_Sign=0;
ucharcodeDis[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
//共阴数码管花数
ucharIR_Code[4];
ucharIR_Data[33];
ucharIR_Time;
bitIRPRO_OK=0,IR_OK=0;
/*延时函数*/
voidDelay(uintt)
{
while(t--)
{}
/*DS1302写一个字节*/
voidWrite_Byte(ucharByte)
uchari;
for(i=0;
i<
8;
i++)
{
SCLK=0;
IO=(bit)(Byte&
0x01);
SCLK=1;
Byte>
>
=1;
}
/*DS1302读一个字节*/
ucharRead_Byte(void)
uchari,Result;
Result>
NOP();
if(IO)
Result|=0x80;
else
Result&
=0x7f;
returnResult;
/*写DS1302*/
voidWrite_1302(ucharAddr,ucharDat)
CE=0;
CE=1;
Write_Byte(Addr);
Write_Byte(Dat);
/*读DS1302*/
ucharRead_1302(ucharAddr)
ucharValue;
Value=Read_Byte();
returnValue;
/*DS1302初始化*/
voidInit_1302(void)
Delay(60000);
Write_1302(0x8e,0x00);
//关写保护
Delay(100);
Write_1302(0x8c,0x12);
//年
Write_1302(0x8a,0x04);
//周
Write_1302(0x88,0x01);
//月
Write_1302(0x86,0x26);
//日
Write_1302(0x84,0x00);
//时
Write_1302(0x82,0x35);
//分
Write_1302(0x80,0x05);
//秒
Write_1302(0x8e,0x80);
//开写保护
Delay(500);
/*按键声*/
voidBeep_Play(void)
{
Beep=1;
Delay(3000);
Beep=0;
/*闹铃声*/
voidClock_Alarm(void)
time++;
if(time==100)
if(time==150)
time=0;
}
/*整点报时声*/
voidZ_Alarm(void)
if(Z_flag)
{
if(time==249)
if(time==250)
Z_flag=0;
/*闪灯*/
voidWork_LED(void)
N++;
if(N==750)
LED=1;
if(N>
800)
N=0;
LED=0;
/*数码管显示1*/
voidTime_Display(void)
ucharTime[3];
Time[0]=Read_1302(0x81);
Time[1]=Read_1302(0x85);
P0=Dis[Time[1]>
4]&
Black_1;
Row1=0;
Delay(250);
Row1=1;
P0=(Dis[Time[1]&
0x0f]&
Black_1)|Dot;
Row2=0;
Row2=1;
Time[2]=Read_1302(0x83);
P0=Dis[Time[2]>
Black_2;
Row3=0;
Row3=1;
P0=Dis[Time[2]&
Row4=0;
Delay(200);
Row4=1;
if(Tr!
=(Time[0]&
0x0f))
Sign=!
Sign;
Tr=Time[0]&
0x0f;
if(Time[2]==0x00&
&
Time[0]==0x00)//整点报时
Z_flag=1;
if(Al_flag)//控制蜂鸣器标志标
if(Time[1]==T_Hour&
Time[2]==T_Minute&
Time[0]<
0x30)
Alarm_flag=1;
Alarm_flag=0;
if(SW_flag)//控制继电器
if(Time[1]>
T_ON_Hour&
Time[2]>
=T_ON_Minute)
SW=1;
elseif(Time[1]==T_OFF_Hour&
Time[2]==T_OFF_Minute)
SW=0;
else_nop_();
P0=0x00;
P2|=0xf0;
/*数码管显示2*/
voidDisplay_Alarm(ucharT_h,ucharT_m,bita)
ucharDota;
if(a)
Dota=0x80;
Dota=0x00;
P0=Dis[T_h>
P0=(Dis[T_h&
Black_1)|Dota;
P0=Dis[T_m>
P0=Dis[T_m&
/*数码管显示3*/
voidDis_ON_OFF(void)
if(Al_flag)
P0=Dis[1];
P0=Dis[0];
P0=0x40;
if(SW_flag)
/*设置*/
voidTime_Setup(void)
charShi,Ge;
if(!
Key_Setup)//设置下一位
Key_Setup)
while(!
Key_Setup);
Beep_Play();
flag++;
if(flag>
1)
flag=0;
if(flag==0)
Key_Add)//"
+"
Key_Add)
Key_Add);
if(CH==1)//设置“时”
{
Hour=Read_1302(0x85);
Ge=Hour&
Shi=Hour>
4;
Ge++;
if(Ge>
9)
Ge=0;
Shi++;
if(Shi>
2)
Shi=0;
}
Shi<
<
=4;
Hour=Shi|Ge;
if(Hour>
0x23)
Hour=0x00;
Delay(50);
Write_1302(0x84,Hour);
Delay(10);
elseif(CH==2)//设置闹钟“时”
Ge=T_Hour&
Shi=T_Hour>
T_Hour=Shi|Ge;
if(T_Hour>
T_Hour=0x00;
elseif(CH==3)//设置继电器开“时”
Ge=T_ON_Hour&
Shi=T_ON_Hour>
T_ON_Hour=Shi|Ge;
if(T_ON_Hour>
T_ON_Hour=0x00;
elseif(CH==4)//设置继电器关“时”
Ge=T_OFF_Hour&
Shi=T_OFF_Hour>
T_OFF_Hour=Shi|Ge;
if(T_OFF_Hour>
T_OFF_Hour=0x00;
elseif(CH==5)//设置闹钟标志位
Al_flag=!
Al_flag;
Key_Dec)//"
-"
注释同上
Key_Dec)
Key_Dec);
if(CH==1)
Ge--;
if(Ge<
0)
Ge=9;
Shi--;
if(Shi<
Shi=2;
Ge=3;
if(Hour<
Hour=0x23;
elseif(CH==2)
if(T_Hour<
T_Hour=0x23;
elseif(CH==3)
if(T_ON_Hour<
T_ON_Hour=0x23;
elseif(CH==4)
if(T_OFF_Hour<
T_OFF_Hour=0x23;
elseif(CH==5)
SW_flag=!
SW_flag;
if(flag==1)
if(CH==1)//设置“分”
Minute=Read_1302(0x83);
Ge=Minute&
Shi=Minute>
5)
Minute=Shi|Ge;
if(Minute>
0x59)
Minute=0x00;
Write_1302(0x82,Minute);
elseif(CH==2)//设置闹钟“分”
Ge=T_Minute&
Shi=T_Minute>
T_Minute=Shi|Ge;
if(T_Minute>
T_Minute=0;
elseif(CH==3)//设置继电器开“分”
Ge=T_ON_Minute&
Shi=T_ON_Minute>
T_ON_Minute=Shi|Ge;
if(T_ON_Minute>
T_ON_Minute=0;
elseif(CH==4)//设置继电器关“分”
Ge=T_OFF_Minute&
Shi=T_OFF_Minute>
T_OFF_Minute=Shi|Ge;
if(T_OFF_Minute>
T_OFF_Minute=0;
elseif(CH==5)//设置继电器标志位
{
Shi=9;
if(Minute<
Minute=0x59;
if(T_Minute<
T_Minute=0x59;
if(T_ON_Minute<
T_ON_Minute=0x59;
if(T_OFF_Minute<
T_OFF_Minute=0x59;
/*中断、定时器初始化*/
voidIsr_Init(void)
TMOD=0x02;
//定时器0工作于8位自动重装模式
TH0=TL0=0x00;
IE=0x83;
//开总中断,开定时器0中断,开外部中断0
TCON=0x11;
//TR0=1,IT0=1
/*将接收到的数据解码*/
voidIR_Pro(void)
uchari,j,k;
ucharCord,Value=0;
k=1;
//k=1,丢掉引导码
i++)//共4个数据
for(j=0;
j<
j++)//一个数据8位
Value>
Cord=IR_Data[k];
if(Cord>
12)//Cord>
12,说明数据位为1,否则为0
Value|=0x80;
k++;
IR_Code[i]=Value;
Value=0;
IRPRO_OK=1;
/*红外操作*/
voidIR_Operate(void)
if(IR_Code[0]==0x00&
IR_Code[1]==0xff)
if(IR_Code[2]==0x4c&
IR_Code[3]==~IR_Code[2])//蜂鸣器控制
Beep=~Beep;
if(IR_Code[2]==0x0d&
IR_Code[3]==~IR_Code[2])//继电器控制
SW=~SW;
if(IR_Code[2]==0x0c&
IR_Code[3]==~IR_Code[2])//关闭数码管显示
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多用途 时钟 程序 DS1302