电子时钟完整版.docx
- 文档编号:12468206
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:33
- 大小:20.01KB
电子时钟完整版.docx
《电子时钟完整版.docx》由会员分享,可在线阅读,更多相关《电子时钟完整版.docx(33页珍藏版)》请在冰豆网上搜索。
电子时钟完整版
电子时钟完整版(C语言程序)
作者:
佚名 来源:
本站原创 点击数:
34 更新时间:
2012年03月26日 【字体:
大中小】
板子介绍:
淘宝购买:
点击咨询QQ电话:
本程序完全测试通过按上面的电路图用1602液晶显示可调时间.
#include<>
#defineuintunsignedint
#defineucharunsignedchar
#definew_Sec0x80
#definew_Min0x82
#definew_Hou0x84
#definew_Day0x86
#definew_Mou0x88
#definew_xi0x8a
#definew_Yea0x8c//DS1302写数据
#definer_Sec0x81
#definer_Min0x83
#definer_Hou0x85
#definer_Day0x87
#definer_Mou0x89
#definer_xi0x8b
#definer_Yea0x8d//DS1302读数据
#definew_protect0x8e//DS1302写保护
ucharcodetable[]="11-6-20";//制作时间
ucharcodetime1[]="00:
00:
00";//时间模式1,用于普通计时
ucharcodetime2[]="00:
00:
00:
00";//时间模式2,用于秒表计时
ucharcodetime3[]="00:
00";//时间模式3,用于闹钟设置
ucharcodemiaobiao[]="StopWatch";
ucharcodenaozhong[]="Alarm";
ucharcodestuinfo1[]="ZLW03";
ucharcodestuinfo2[]="LWL09";
ucharcodexi1[]="Mon";
ucharcodexi2[]="Tue";
ucharcodexi3[]="Wed";
ucharcodexi4[]="Thu";
ucharcodexi5[]="Fri";
ucharcodexi6[]="Sat";
ucharcodexi7[]="Sun";
unsignedcharcodestr1[]={"Temperature:
"};
unsignedcharcodestr2[]={""};
uchardatadisdata[5];
uinttvalue;//温度值
uchartflag;//温度正负标志//18B20
sbitRS=P2^0;
sbitRW=P2^1;
sbitEN=P2^2;//1602控制端定义
sbitACC_7=ACC^7;//位寻址寄存器
sbitSCK=P1^1;//DS1302时钟信号
sbitSDA=P1^0;//DS1302数据信号
sbitRST=P1^2;//DS1302片选信号
sbitk1=P1^4;
sbitk2=P1^5;
sbitk3=P1^6;
sbitk4=P1^7;
sbitalarm=P3^7;
sbitDQ=P2^7;//DS18B20
uinti,shi,fen,miao,haomiao,nian,yue,ri,num,x,menu,n,nshi=0,nfen=1;//nshi、nfen用来判别闹钟,与系统时间对比
ucharsshi,sfen,smiao,snian,syue,sri,sxi;
/***********************延时程序*********************************/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************ds1302***************************************/
//***************向DS1302写入一字节数据
voidWrite1302(ucharaddr,uchard)
{
unsignedchari;
SCK=0;
RST=1;
//写入目标地址:
addr
for(i=0;i<8;i++)
{
if(addr&0x01)
{
SDA=1;
}
else
{
SDA=0;
}//并口转串口
SCK=1;//上升沿写数据
SCK=0;
addr=addr>>1;
}
//写入数据:
d
for(i=0;i<8;i++)
{
if(d&0x01)
{
SDA=1;
}
else
{
SDA=0;
}
SCK=1;
SCK=0;
d=d>>1;
}
RST=0;//停止DS1302总线
}
//*************************从DS1302读出一字节数据
unsignedcharRead1302(ucharaddr)
{
unsignedchari;
unsignedchartemp;
unsignedchardat1=0;
unsignedchardat2=0;
SCK=0;
RST=1;
//写入目标地址:
addr
for(i=0;i<8;i++)
{
if(addr&0x01)
{
SDA=1;
}
else
{
SDA=0;
}
SCK=1;
SCK=0;
addr=addr>>1;
}
//输出数据:
temp
for(i=0;i<8;i++)
{
temp=temp>>1;
if(SDA)
{
temp|=0x80;
}
else
{
temp&=0x7F;
}
SCK=1;
SCK=0;
}
RST=0;//停止DS1302总线
dat2=temp/16;//数据进制转换
dat1=temp%16;
dat1=dat2*10+dat1;
returndat1;
}
/*****************************1602显示******************************************/
voidwrite_add(ucharadd)//1602控制字
{
RS=0;
P0=add;
EN=1;
delay(5);
EN=0;
}
voidwrite_date(uchardate)//1602显示字
{
RS=1;
P0=date;
EN=1;
delay(5);
EN=0;
}
voidwritesfm(ucharadd,uchardate)//1602显示时分秒
{
uchars,g;
s=date/10;
g=date%10;
write_add(0x80+0x40+add);
write_date(0x30+s);
write_date(0x30+g);
}
voidwritenyr(ucharadd,uchardate)//1602显示年月日
{
uchars,g;
s=date/10;
g=date%10;
write_add(0x80+0x00+add);
write_date(0x30+s);
write_date(0x30+g);
}
voidwritexi(uchara)
{
write_add(0x80+0x00+11);
if(a==1)
{
for(i=0;i<3;i++)
{
write_date(xi1[i]);
delay(5);
}
}
if(a==2)
{
for(i=0;i<3;i++)
{
write_date(xi2[i]);
delay(5);
}
}
if(a==3)
{
for(i=0;i<3;i++)
{
write_date(xi3[i]);
delay(5);
}
}
if(a==4)
{
for(i=0;i<3;i++)
{
write_date(xi4[i]);
delay(5);
}
}
if(a==5)
{
for(i=0;i<3;i++)
{
write_date(xi5[i]);
delay(5);
}
}
if(a==6)
{
for(i=0;i<3;i++)
{
write_date(xi6[i]);
delay(5);
}
}
if(a==7)
{
for(i=0;i<3;i++)
{
write_date(xi7[i]);
delay(5);
}
}
}
voidwritefuhao(void)//写符号
{
write_add(0x80+0x00+2);
write_date(table[2]);
delay(10);
write_add(0x80+0x00+5);
write_date(table[2]);
delay(10);
write_add(0x80+0x40+2);
write_date(time1[2]);
delay(10);
write_add(0x80+0x40+5);
write_date(time1[2]);
delay(10);
}
/******************************ds1820程序***************************************/
voiddelay_18B20(unsignedinti)//延时1微秒
{
while(i--);
}
voidds1820rst()//ds1820复位
{
unsignedcharx=0;
DQ=1;//DQ复位
delay_18B20(4);//延时
DQ=0;//DQ拉低
delay_18B20(100);//精确延时大于480us
DQ=1;//拉高
delay_18B20(40);
}
uchards1820rd()//读数据
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
voidds1820wr(ucharwdata)//写数据
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=wdata&0x01;
delay_18B20(10);
DQ=1;
wdata>>=1;
}
}
read_temp()//读取温度值并转换
{
uchara,b;
ds1820rst();
ds1820wr(0xcc);//跳过读序列号
ds1820wr(0x44);//启动温度转换
ds1820rst();
ds1820wr(0xcc);//跳过读序列号
ds1820wr(0xbe);//读取温度
a=ds1820rd();
b=ds1820rd();
tvalue=b;
tvalue<<=8;
tvalue=tvalue|a;
if(tvalue<0x0fff)
tflag=0;
else
{
tvalue=~tvalue+1;
tflag=1;
}
tvalue=tvalue*;//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/
voidds1820disp()//温度值显示
{
ucharflagdat;
disdata[0]=tvalue/1000+0x30;//百位数
disdata[1]=tvalue%1000/100+0x30;//十位数
disdata[2]=tvalue%100/10+0x30;//个位数
disdata[3]=tvalue%10+0x30;//小数位
if(tflag==0)
flagdat=0x20;//正温度不显示符号
else
flagdat=0x2d;//负温度显示负号:
-
if(disdata[0]==0x30)
{
disdata[0]=0x20;//如果百位为0,不显示
if(disdata[1]==0x30)
{
disdata[1]=0x20;//如果百位为0,十位为0也不显示
}
}
write_add(0x80+0x40+8);
write_date(flagdat);//显示符号位
write_add(0x80+0x40+9);
write_date(disdata[0]);//显示百位
write_add(0x80+0x40+10);
write_date(disdata[1]);//显示十位
write_add(0x80+0x40+11);
write_date(disdata[2]);//显示个位
write_add(0x80+0x40+12);
write_date(0x2e);//显示小数点
write_add(0x80+0x40+13);
write_date(disdata[3]);//显示小数位
write_add(0x80+0x40+14);
write_date(0xdf);//显示"。
"
write_add(0x80+0x40+15);
write_date(0x63);//显示"c"
}
voidinit_info(void)
{
write_add(0x80+0x00+0);
for(i=0;i<14;i++)
{
write_date(stuinfo1[i]);
delay(5);
}
write_add(0x80+0x40+0);
for(i=0;i<14;i++)
{
write_date(stuinfo2[i]);
delay(5);
}
}
voidSpeak1()//闹铃
{
alarm=0;
smiao=Read1302(r_Sec);
sfen=Read1302(r_Min);
sshi=Read1302(r_Hou);
snian=Read1302(r_Yea);
syue=Read1302(r_Mou);
sri=Read1302(r_Day);
sxi=Read1302(r_xi);
writefuhao();
writesfm(0,sshi);
writesfm(3,sfen);
writesfm(6,smiao);
writenyr(0,snian);
writenyr(3,syue);
writenyr(6,sri);
writexi(sxi);
delay(500);
alarm=1;
delay(500);
}
voidSpeak2()
{
alarm=0;
delay(2000);
alarm=1;
}
voidNormal()//正常显示时间功能
{
smiao=Read1302(r_Sec);
sfen=Read1302(r_Min);
sshi=Read1302(r_Hou);
snian=Read1302(r_Yea);
syue=Read1302(r_Mou);
sri=Read1302(r_Day);
sxi=Read1302(r_xi);//读取时间数据
if((nshi==sshi)&&(nfen==sfen))//闹钟铃响
{
for(i=0;i<10;i++)
{
Speak1();
}
while((k1==1)||(k2==1)||(k3==1)||(k4==1))//按下任意键,闹钟停止闹铃
{
alarm=1;
}
}
//关闭蜂鸣器
if((sshi==0||sshi==1||sshi==2||sshi==3||sshi==4||sshi==5||sshi==6||sshi==7
||sshi==8||sshi==9||sshi==10||sshi==11||sshi==12||sshi==13||sshi==14||sshi==15||sshi==16
||sshi==1||sshi==18||sshi==19||sshi==20||sshi==21||sshi==22||sshi==23)&&(sfen==0)&&(smiao==0))
{
Speak2();//整点报时
}
alarm=1;//关闭蜂鸣器
writefuhao();
writesfm(0,sshi);
writesfm(3,sfen);
writesfm(6,smiao);
writenyr(0,snian);
writenyr(3,syue);
writenyr(6,sri);
writexi(sxi);
}
voidStopWatch()reentrant//秒表功能
{
haomiao=0;
miao=0;
fen=0;
shi=0;
write_add(0x01);//清屏
write_add(0x0c);
write_add(0x80+0x00+0);
for(i=0;i<9;i++)
{
write_date(miaobiao[i]);
delay(5);
}
write_add(0x80+0x40+0);
for(i=0;i<11;i++)
{
write_date(time2[i]);
delay(5);
}
while(!
k4);
while(k4!
=0)
{
if(k1==0)
{
delay(10);//消抖
if(k1==0)
StopWatch();
}
haomiao++;
if(haomiao==100)
{
haomiao=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
fen=0;
shi++;
if(shi==24)
{
shi=0;
}
writesfm(0,shi);
}
writesfm(3,fen);
}
writesfm(6,miao);
}
writesfm(9,haomiao);
}
/*TR0=0;
menu=3;*/
}
voidkey()//闹钟时的按键功能
{
if(k1==0)
{
delay(10);
if(k1==0)
{
n++;
while(!
k1);
if(n==1)
{
write_add(0x0f);
write_add(0x80+0x40+4);//写shi
}
if(n==2)
{
write_add(0x0f);
write_add(0x80+0x40+7);//写fen
}
if(n==3)
{
n=0;
nfen=fen;
nshi=shi;//确认
write_add(0x0c);//光标不闪烁
}
}
}
if(k2==0)
{
delay(10);
if(k2==0)
{
while(!
k2);
if(n==1)
{
shi++;
if(shi==24)
shi=0;
writesfm(4,shi);
}
if(n==2)
{
fen++;
if(fen==60)
fen=0;
writesfm(7,fen);
}
}
}
if(k3==0)
{
delay(10);
if(k3==0)
{
while(!
k3);
if(n==1)
{
shi--;
if(shi==-1)
shi=23;
writesfm(4,shi);
}
if(n==2)
{
fen--;
if(fen==-1)
fen=59;
writesfm(7,fen);
}
}
}
menu=4;
}
voidAlarm(void)//设定闹钟功能,k4键跳转其他功能
{
write_add(0x06);
write_add(0x01);//清屏
write_add(0x80+0x00+0);
for(i=0;i<5;i++)
{
write_date(naozhong[i]);//显示Alarm标识符
}
write_add(0x80+0x40+4);
writesfm(4,nshi);
write_date(0x3a);
writesfm(7,nfen);
shi=nshi;
fen=nfen;
while(!
k4);
while(k4)
{
key();
}
write_add(0x0c);//开显示,不显示光标
}
voidkey1(void)
{
if(k1==0)//设置光标所在位置
{
delay(10);//去抖
if(k1==0)
{
num++;
while(!
k1);
if(num==1)
{
write_add(0x0f);//显示光标并闪烁
write_add(0x80+0x40+6);
}
if(num==2)
{
write_
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 时钟 完整版
![提示](https://static.bdocx.com/images/bang_tan.gif)