51时钟报时程序.docx
- 文档编号:16859183
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:24
- 大小:17.89KB
51时钟报时程序.docx
《51时钟报时程序.docx》由会员分享,可在线阅读,更多相关《51时钟报时程序.docx(24页珍藏版)》请在冰点文库上搜索。
51时钟报时程序
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitRS=P2^6;//数据/命令选择线
sbitEL=P2^7;//使能信号线
sbitgl=P1^3;
sbitja=P1^4;
sbitjan=P1^5;
sbitdgl=P1^6;
sbitlao=P1^7;
sbitlaoto=P3^2;
sbitds1302_clk=P1^0;//脉冲线
sbitds1302_io=P1^1;//数据线
sbitds1302_rst=P1^2;//复位控制线
ucharkk[]={'0','1','2','3','4','5','6','7','8','9'};
uchary1,y2,num,change;
uchartable1[]="Alarm:
12:
25";
uchartable2[]="";
ucharon[]="on";
ucharoff[]="off";
//--------------------------------------
voiddelay1(uintz)//延时函数
{uintx,y;
for(x=z;x>0;x--)
for(y=0;y<100;y++);
}
voidcomand_1602(ucharcom)//1602命令输入
{P0=com;//命令输入
RS=0;
EL=0;
delay1
(1);
EL=1;
delay1
(1);
EL=0;
}
voidindat_1602(uchardat)//1602数据输入
{P0=dat;//命令输入
RS=1;
EL=0;
delay1
(1);
EL=1;
delay1
(1);
EL=0;
}
voidPrint(unsignedchar*str)//1602显示函数
{while(*str!
='\0')
{indat_1602(*str);
str++;
}
}
voidinnit_1602()//1602初始化
{comand_1602(0x38);//功能设定
delay1(20);
comand_1602(0x38);//功能设定
delay1(20);
comand_1602(0x38);//功能设定
delay1(20);
//----------------------
comand_1602(0x38);//分两行显示,5*7显示方式
delay1(20);
comand_1602(0x0f);//开显示,有光标,光标闪烁
delay1(20);
comand_1602(0x01);//清屏
delay1(20);
comand_1602(0x06);//输入时光标自动向右移动一格,并且加一
delay1(20);
}
//----------------------------------------------
voiddelay(uintz)
{ucharx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
uchards1302_read()//读出数据
{uchari,b=0;
ds1302_clk=0;
for(i=0;i<8;i++)
{
if(ds1302_io==1)
{b=b|0x80;//先读低位
}
else
{b=b|0x00;
}
ds1302_clk=1;
ds1302_clk=0;
if(i<7)b=b>>1;
}
return(b);
}
voidds1302_write(ucharcom)
{uchari,a;
a=com;
ds1302_clk=0;
for(i=0;i<8;i++)
{if(a&0x01)
{ds1302_io=1;//先写低位
}
else
{ds1302_io=0;
}
ds1302_clk=1;
ds1302_clk=0;
a=a>>1;
}
}
uchards1302_read_baye(ucharadrr)
{ucharaa;
ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
ds1302_write(adrr);//写入地址
ds1302_io=0;
aa=ds1302_read();
ds1302_clk=1;
ds1302_rst=0;
return(aa);
}
uchards1302_write_baye(ucharadrr,dat)
{ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
ds1302_write(adrr);//写入地址
ds1302_write(dat);
ds1302_clk=1;
ds1302_rst=0;
}
uchargo10to16(ucharu)//10进制转换为16进制
{
uchara,b,c;
if(u<16)//小于16不用转换
{return(u);
}
else
{a=u/16;//取商
b=u%16;//取模
c=a*10+b;
return(c);
}
}
voidcuanhuan(uchari)
{uchara,b;
a=i;
b=go10to16(a);
if(b>0&b<10)
{y1=kk[0];
y2=kk[b];
}
else
{y1=kk[b/10];
y2=kk[b%10];
}
}
/*-----------------------------------------------------------
此函数在第一次用到DS1302时才用,初始化后,以后就不用初始化了,
除非你想再一次设定DS1302才用,注意填写10位与个位所放的位置,
如我要设27号,应为:
00100111
10位放在这个位放在这
而不是0x1B00011011
-------------------------------------------------------------*/
voidds1302int(ucharyear,moon,date,week,hour,mini,sen)//当DS1302第一次使用时要进行设置
{ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
ds1302_write(0x8e);
ds1302_write(0x00);
ds1302_rst=0;
ds1302_clk=1;
ds1302_write_baye(0x8c,year);//设置年为08年
ds1302_write_baye(0x88,moon);//设置月为3月
ds1302_write_baye(0x86,date);//设置日为27号
ds1302_write_baye(0x8B,week);//设置星期
ds1302_write_baye(0x84,hour);//设置时9时
ds1302_write_baye(0x82,mini);//设置分为5分
ds1302_write_baye(0x80,sen);//设置秒为00秒
ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
ds1302_write(0x8e);
ds1302_write(0x80);
}
voidds1302change(ucharaddr,date)//修改
{ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
ds1302_write(0x8e);
ds1302_write(0x00);
ds1302_rst=0;
ds1302_clk=1;
ds1302_write_baye(addr,date);
ds1302_rst=0;
ds1302_clk=0;
ds1302_rst=1;
ds1302_write(0x8e);
ds1302_write(0x80);
}
voidxs()
{
comand_1602(0x80);//清除第一行
if(lao==0)
{Print(table1);
if(laoto==0)
{Print(on);
}
if(laoto==1)
{Print(off);
}
}
if(lao==1)
{comand_1602(0x80);
Print("Date:
");
comand_1602(0x85);//在址00开始显示,第一行显示年-月-日
cuanhuan(ds1302_read_baye(0x8d));
indat_1602(y1);//显示年
indat_1602(y2);
indat_1602('-');
cuanhuan(ds1302_read_baye(0x89));//读出月份
indat_1602(y1);//显示月
indat_1602(y2);
indat_1602('-');
cuanhuan(ds1302_read_baye(0x87));//读出日
indat_1602(y1);//显示日
indat_1602(y2);
indat_1602('');
indat_1602('');//擦除闹钟数据
cuanhuan(ds1302_read_baye(0x8B));//读出星期
//indat_1602(y1);
comand_1602(0x80+15);
indat_1602(y2);//显示星期
}
comand_1602(0x80+0x45);//在第二行显示时:
分:
秒
cuanhuan(ds1302_read_baye(0x85));//读出时
indat_1602(y1);//显示时
indat_1602(y2);
indat_1602(':
');
cuanhuan(ds1302_read_baye(0x83));//读出分
indat_1602(y1);//显示分
indat_1602(y2);
indat_1602(':
');
cuanhuan(ds1302_read_baye(0x81));//读出秒
indat_1602(y1);//显示秒
indat_1602(y2);
}
voidkey1()//
{
if(gl==0)
{delay(5);
if(gl==0)
{num++;
while(!
gl);
if(num==1)
{comand_1602(0xC0+6);
comand_1602(0x0f);
}
if(num==2)
{comand_1602(0xC0+9);
comand_1602(0x0f);
}
if(num==3)
{comand_1602(0xC0+12);
comand_1602(0x0f);
}
if(num==4)
{comand_1602(0xC0+15);
comand_1602(0x0f);
}
if(num==5)
{num=0;
comand_1602(0x0c);
//comand_1602(0x01);//清屏
}
}
}
}
voidkeytime_add()//加时间
{if((num!
=0)&&(ja==0)&&(dgl==0))
{if((ja==0)&&(dgl==0))
{
delay(5);
if((ja==0)&&(dgl==0))
{while(!
ja);
if(num==1)
{change=ds1302_read_baye(0x85);
change++;
ds1302change(0x84,change);
}
if(num==2)
{change=ds1302_read_baye(0x83);
change++;
ds1302change(0x82,change);
}
if(num==3)
{change=ds1302_read_baye(0x81);
change++;
ds1302change(0x80,change);
}
}
}
}
xs();
}
voidkeydate_add()//加日期
{if((num!
=0)&&(ja==0)&&(dgl==1))
{
if((ja==0)&&(dgl==1))
{delay(10);
while(!
ja);
if((ja==0)&&(dgl==1))
{if(num==1)
{change=ds1302_read_baye(0x8D);
change++;
ds1302change(0x8C,change);
}
if(num==2)
{change=ds1302_read_baye(0x89);
change++;
ds1302change(0x88,change);
}
if(num==3)
{change=ds1302_read_baye(0x87);
change++;
ds1302change(0x86,change);
}
if(num==4)
{change=ds1302_read_baye(0x8B);
change++;
ds1302change(0x8A,change);
}
}
}
}
xs();
}
voidkeytime_reduce()//减
{if((num!
=0)&&(jan==0)&&(dgl==0))
{
if((jan==0)&&(dgl==0))
{delay(5);
while(!
jan);
if((jan==0)&&(dgl==0))
{while(!
jan);
if(num==1)
{change=ds1302_read_baye(0x85);
change--;
ds1302change(0x84,change);
}
if(num==2)
{change=ds1302_read_baye(0x83);
change--;
ds1302change(0x82,change);
}
if(num==3)
{change=ds1302_read_baye(0x81);
change--;
ds1302change(0x80,change);
}
}
}
}
xs();
}
voidkeydate_reduce()//减日期
{
if((num!
=0)&&(jan==0)&&(dgl==1))
{if((jan==0)&&(dgl==1))
{
delay(5);
while(!
jan);
if((jan==0)&&(dgl==1))
{if(num==1)
{change=ds1302_read_baye(0x8D);
change--;
ds1302change(0x8C,change);
}
if(num==2)
{change=ds1302_read_baye(0x89);
change--;
ds1302change(0x88,change);
}
if(num==3)
{change=ds1302_read_baye(0x87);
change--;
ds1302change(0x86,change);
}
if(num==4)
{change=ds1302_read_baye(0x8B);
change--;
ds1302change(0x8A,change);
}
}
}
}
xs();
}
voidkey()
{
keytime_add();
keydate_add();
keytime_reduce();
keydate_reduce();
}
voidmain()
{delay1(20);
innit_1602();//1602初始化
ds1302int(10,12,20,1,9,0x27,6);//DS1302初始化
comand_1602(0x80);
Print("Date:
");
comand_1602(0xC0);
Print("Time:
");
//P3=0x00;
//if(dgl==0)
//P3=0x00;
while
(1)
{
if(num==0)
{xs();
}
key1();
key();
//delay1(300);
}
}
/*---------------------------ISD4004------------------------------------------------*/
#include
#include
sbitsclk_4004=P2^5;
sbitint_4004=P2^4;
sbitrac_4004=P2^3;
sbitcs_4004=P2^2;
sbitmosi_4004=P2^1;
sbitmiso_4004=P2^0;
sbitled=P3^1;
sbitdgl=P1^7;
/*sbitcs_4004=P2^0;//LOWISACTIVELY
sbitmosi_4004=P2^1;
sbitmiso_4004=P2^2;
sbitsclk_4004=P2^3;*/
unsignedchart;//
voiddelay(unsignedinti)
{while(i--);
}
voidDelay1Ms(unsignedintt)
{unsignedinti;
for(;t>0;t--)
{for(i=0;i<120;i++);
}
}
voidsend8(unsignedcharisdx8)//spi数据传送
{unsignedchari;
cs_4004=0;//选中ISD4004
delay(3);
sclk_4004=0;
delay(3);
for(i=0;i<8;i++)//先发低位再发高位,依次发送。
{if((isdx8&0x01)==1)//发送最低位
mosi_4004=1;
else
mosi_4004=0;
isdx8>>=1;//右移一位
sclk_4004=0;//时钟下降沿发送
delay(3);
sclk_4004=1;
delay(3);
}
cs_4004=1;
delay(3);
}
voidstopmode()//停止
{send8(0x30);
}
voidpowerdown()//下电
{send8(0x10);
}
voidpowerup()//上电
{
send8(0x20);
}
voidrecord(unsignedintaddress)//从指定位置录音
{unsignedchari;
unsignedintdatasout=0;
powerup();
Delay1Ms(50);
powerup();
Delay1Ms(100);
sclk_4004=0;
delay(3);
cs_4004=0;
delay(3);
for(i=0;i<16;i++)
{address=_iror_(address,1);
datasout=address<<1;
mosi_4004=CY;
sclk_4004=0;
delay(3);
sclk_4004=1;
delay(3);
}
send8(0xA0);//从指定位置录音
send8(0xB0);//从当前位置录音
int_4004=1;//要读值先拉高
while(int_4004==1);
}
/*-----------------------------
-------------------------------*/
voidaudiout(unsignedintaddress)//放音
{unsignedchari;
unsignedintdatasout;
powerup();
Delay1Ms(50);
sclk_4004=0;
delay(3);
cs_4004=0;
delay(3);
for(i=0;i<16;i++)
{address=_iror_(address,1);
datasout=address<<1;
mosi_4004=CY;
sclk_4004=0;
delay(3);
sclk_4004=1;
delay(3);
}
send8(0xE0);//从指定位置放音
send8(0xF0);//从当前位置放音
int_4004=1;//要读值先拉高
while(int_4004==1);
}
/*--------------------------
----------------------------*/
voidaudn(unsignedintaddr,n)//放音nline
{unsignedchari,k;
unsignedintdatasout;
powerup();
Delay1Ms(50);
sclk_4004=0;
delay(3);
cs_4004=0;
delay(3);
for(k=0;k {for(i=0;i<16;i++) {addr=_iror_(addr,1); datasout=addr<<1; addr++; mosi_4004=CY; sclk_4004=0; delay(3); sclk_4004=1; delay(3); } send8(0xE0);//从指定位置放音 Delay1Ms(1000); } } /*---------------------------------------------- ------------------------------------------------*/ voidmain() { t=0; P1=0xff; P2=0xff; P3=0xff; led=0; EA=0; TMOD=0X06;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 51 时钟 报时 程序