电子时钟完整版.docx

上传人:b****1 文档编号:12468206 上传时间:2023-04-19 格式:DOCX 页数:33 大小:20.01KB
下载 相关 举报
电子时钟完整版.docx_第1页
第1页 / 共33页
电子时钟完整版.docx_第2页
第2页 / 共33页
电子时钟完整版.docx_第3页
第3页 / 共33页
电子时钟完整版.docx_第4页
第4页 / 共33页
电子时钟完整版.docx_第5页
第5页 / 共33页
点击查看更多>>
下载资源
资源描述

电子时钟完整版.docx

《电子时钟完整版.docx》由会员分享,可在线阅读,更多相关《电子时钟完整版.docx(33页珍藏版)》请在冰豆网上搜索。

电子时钟完整版.docx

电子时钟完整版

 

电子时钟完整版(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_

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

当前位置:首页 > 医药卫生 > 基础医学

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

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