多功能数字电子钟.docx
- 文档编号:7988125
- 上传时间:2023-01-27
- 格式:DOCX
- 页数:13
- 大小:35.01KB
多功能数字电子钟.docx
《多功能数字电子钟.docx》由会员分享,可在线阅读,更多相关《多功能数字电子钟.docx(13页珍藏版)》请在冰豆网上搜索。
多功能数字电子钟
项目名称:
多功能数字电子钟—刘峰华
1、研究目的、意义和必要性:
数字电子钟在现在的社会中应用的越来越广泛,在公交车上,高档的汽车上面都有应用数字式的电子钟,还有高档住宅,先进的设备里面都带有数字式的时钟,所以研究是很必要的.
2、研究目标:
方向是数字式的多功能的电子时钟
3、主要研究开发内容:
主要研究内容是电子种带有年月日时分秒显示和可调,还带有温度显示功能.
4、项目创新点及拟解决的关键技术问题:
创新点在于,这个数字钟能够进行切换显示各种时间,和温度显示,需要解决的是温度显示方面的技术问题.
5、研究方法和工艺技术路线:
仿真电路图:
部分程序:
//////////ds18b20/////////
#include
#include
unsignedcharreaddata[2];
sbitDQ=P3^4;
////////////endofds18b20variable///////
/////////////lcdvariable/////////////////
#defineucharunsignedchar
#defineuintunsignedint
ucharsecond,minute,hour,day,month,biao,aln;
uintyear;
bitzhi,fan;
unsignedcharleddata[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0x9c,0xc6};
unsignedcharbdatabusyflag;
unsignedchardat,datn,count;
unsignedcharidataled[]={0,1,2,3};
unsignedcharidatawords[4]={0};
sbitA0=P3^0;
sbitA1=P3^3;
sbitA2=P3^2;
sbitA3=P3^1;
bitA7=1;
sbitA5=P3^5;
sbitA6=P3^7;
sbitA4=P1^0;
sbitbusyflag_7=busyflag^7;
/////////////////endoflcdvariable////////////
voidplay();
////////////////////////////////////
voiddelay1(void)
{
ucharz;
for(z=1200;z>0;z--);
}
voiddisplay()
{if(zhi==0)
{if(biao>=0&&biao<=120)
{
led[1]=hour%10;
led[0]=hour/10;
led[3]=minute%10;
led[2]=minute/10;
}
if(biao>120&&biao<=130)
{
led[1]=month%10;
led[0]=month/10;
led[3]=day%10;
led[2]=day/10;
}
if(biao>130&&biao<=140)
{led[3]=year%10;
led[2]=year%100/10;
led[1]=year/100%10;
led[0]=year/1000;
}
if(biao>140&&biao<=150)
{
led[3]=words[3];
led[2]=words[2];
led[1]=words[1];
led[0]=words[0];
}
if(biao>150)biao=0;}
if(zhi==1)
switch(aln)
{
case1:
led[1]=hour%10;led[0]=hour/10;
if(fan==1){led[3]=minute%10;led[2]=minute/10;}
elseled[3]=led[2]=10;break;
case2:
led[3]=minute%10;led[2]=minute/10;
if(fan==1){led[1]=hour%10;led[0]=hour/10;}
elseled[1]=led[0]=10;break;
case3:
led[1]=month%10;led[0]=month/10;
led[3]=day%10;led[2]=day/10;A7=0;break;
case4:
A7=1;led[3]=day%10;led[2]=day/10;
if(fan==1){led[1]=month%10;led[0]=month/10;}
elseled[1]=led[0]=10;break;
case5:
led[1]=year/100%10;led[0]=year/1000;
if(fan==1){led[3]=year%10;led[2]=year%100/10;}elseled[2]=led[3]=10;break;
case6:
led[3]=year%10;led[2]=year%100/10;
if(fan==1){led[1]=year/100%10;led[0]=year/1000;}elseled[1]=led[0]=10;break;
default:
zhi=0;aln=0;break;
}
if(A7==0)
if(fan==1){led[2]=led[3]=10;}
play();
}
voidplay()
{
unsignedchartemp;
temp=P1&0x80;
A0=1;
A1=0;
A2=0;
A3=0;
P1=temp|leddata[led[0]];
delay1();
A0=0;
A1=1;
A2=0;
A3=0;
P1=temp|leddata[led[1]];
delay1();
A0=0;
A1=0;
A2=1;
A3=0;
P1=temp|leddata[led[2]];
delay1();
A0=0;
A1=0;
A2=0;
A3=1;
P1=temp|leddata[led[3]];
delay1();
A0=0;
A1=0;
A2=0;
A3=0;
delay1();
}
voidint1(void)interrupt1
{
staticunsignedcharn;
n++;
if(zhi==0)
{
if(n==20)
{n=0;
biao++;
second++;
if(second==60)
{
second=0;
minute++;
if(minute==60)
{
minute=0;
hour++;
if(hour==24)
{
hour=0;
day++;
if(day==31);
{
day=0;
month++;
if(month==13)
{
month=0;
year++;
}
}}}}
if(year==9999)
year=0;
if(zhi==0)
A4=second%2;
else
A4=0;
}}
if(zhi==1)
if(n>10)
{fan=~fan;
n=0;}
TH0=0x3c;
TL0=0x0b0;
}
voidscan()
{
if(A5==0)
{
delay1();
if(A5==0)
{aln++;
zhi=1;
while(A5==0)
play();}
}
if(zhi==1)
{
if(A6==0)
{
delay1();
if(A6==0)
switch(aln)
{
case1:
minute+=1;if(minute==60)minute=0;break;
case2:
hour+=1;if(hour==24)hour=0;break;
case3:
day+=1;if(day==31)day=0;break;
case4:
month+=1;if(month==13)month=0;break;
case5:
year=year+1;if(year%100>=99)year=0;break;
case6:
year=year+100;if(year>9900)year=0;break;
default:
aln=0;zhi=0;break;
}
while(A6==0)
{play();
fan=0;}
}
}
}
///////////////ds18b20/////////////////////
//延时函数
voiddelay(unsignedinti)
{
while(i--);
}
//初始化函数
voidInit_DS18B20(void)
{
unsignedcharx=0;
DQ=1;//DQ复位
delay(8);//稍做延时
DQ=0;//单片机将DQ拉低
delay(80);//精确延时大于480us
DQ=1;//拉高总线
delay(14);
x=DQ;//稍做延时后如果x=0则初始化成功x=1则初始化失败
delay(20);
}
//读一个字节
unsignedcharReadOneChar(void)
{
unsignedchari=0;
unsignedchardat=0;
for(i=8;i>0;i--)
{
DQ=0;//给脉冲信号
dat>>=1;
DQ=1;//给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
voidWriteOneChar(unsignedchardat)
{
unsignedchari=0;
for(i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}
//读取温度
voidReadTemperature(void)
{
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9个寄存器)前两个就是温度
readdata[0]=ReadOneChar();
readdata[1]=ReadOneChar();
}
voidTempprocess()//温度转换
{
unsignedintt;
if((readdata[1]&0x80)!
=0)
{
t=readdata[1];
words[0]=0;
t<<=8;
t=t|readdata[0];
t=t-1;
t=~t;
t>>=4;
words[1]=t/100+48;
words[0]=((t/10)%10);
words[1]=t%10;
words[2]=11;
words[3]=11;
}
else
{
words[0]=1;
t=readdata[1];
t<<=8;
t=t|readdata[0];
t>>=4;
words[2]=11;
words[3]=12;
words[0]=((t/10)%10);
words[1]=t%10;
}
}
/////////////////////endofds18b20//////////////////
//////////////endoflcd1602///////////////////////
voidmain()
{
ET0=1;
EA=1;
TMOD=0x01;
TH0=0x3c;
TL0=0x0b0;
TR0=1;
zhi=0;
aln=0;
month=0;
day=0;
hour=0;
minute=0;
year=2010;
while
(1)
{
//if(p10==0)//判断P1.0是否按下
scan();
if(!
(biao>140&&biao<=150))
{ReadTemperature();
Tempprocess();}
display();
}
}
程序功能:
0-120秒显示时分,120-130显示月天,130-140,显示年,140-150显示温度,之后就循环.
A按下时进入分调整,每阁500MS灭和亮切换显示按下B就对分进行加,按第2下是对时进行加,按下第3下对天进行加,第4下对月,调整,第5下对年的后两位进行调整,第6下对年的前2位进行调整,按下第7下进行复位,调整时候数码管会显示相应的调整数字
6、总经费预算、资金筹措方式及来源:
需要元件清单,一个STC90C51、2个30PF电容、一个12MHZ晶振、4个共阳数码管、4个9012、4个2K电阻、8个100欧电阻、2个按键、1个DS18B20温度芯片、30uf电解电容、1K电阻、3个按键
7、项目进度安排:
预计2-4个星期,第一个星期写出报告,第二个星期设计出程序,第3-4个星期进行调试
8、研究工作基础及条件:
现有的技术基础大致完成初步设计,温度显示需要进行查阅资料,在进行改装调试
9、项目负责人及主要成员简介:
087101班、刘峰华
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多功能 数字 电子钟