毕业设计(论文)
开 题 报 告
1 选题的背景和意义
1.1 选题的背景
21世纪,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。
时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。但是,一旦重要事情,一时的耽误可能酿成大祸。手表当然是一个好的选择,但是,什么时候到达所需要的时间却难以判断。所以,要制作一个定时系统。随时提醒这些容易忘记时间的人。
钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能。诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、定时启闭电路、定时开关烘箱、通断动力设备,甚至各种定时电气的自动启用等,所有这些,都是以钟表数字化为基础的。因此,研究数字钟及扩大其应用,有着非常现实的意义。随着人类科技文明的发展,人们对于时钟的要求在不断地提高。时钟已不仅仅被看成一种用来显示时间的工具,在很多实际应用中它还需要能够实现更多其它的功能。高精度、多功能、小体积、低功耗,是现代时钟发展的趋势。在这种趋势下,时钟的数字化、多功能化已经成为现代时钟生产研究的主导设计方向。
1.2 国内外研究现状及发展趋势
单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。单片机具有体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。
目前单片机渗透到我们生活的各个领域,几乎很难找到哪个领域没有单片机的踪迹。电子钟是一种利用数字电路来显示秒、分、时的计时装置,与传统的机械钟相比,它具有走时准确、显示直观、无机械传动装置等优点,因而得到广泛应用。随着人们生活环境的不断改善和美化,在许多场合可以看到数字电子钟。在城市的主要营业场所、车站、码头等公共场所使用lcd数字电子钟已经成为一种时尚。但目前市场上各式各样的lcd数字电子钟大多数用全硬件电路实现,电路结构复杂,功率损耗大等缺点。因此有必要对数字电子钟进行改进。
2 研究的基本内容
课题利用单片机语言,采用模块化编程思想实现。设计使用51系列单片机配以串入并出的芯片实现对60个发光二极管的有序控制来模拟秒针的行走。设计在实现校时、定时功能的基础上,并可对时钟的时间进行修改,并且可以设置断电保护时段
2.1 基本框架
2.2 研究的重点和难点
1.LED显示模块的驱动和编程;2.有关单片机中定时器的使用;3.如何利用单片机的外部中断实现时钟功能和运行模式的转换
2.3 拟解决的关键问题
(1)设计并显示具有时、分、秒计时功能的时钟;
(2)可修改工作时间和工作时段 ;
(3)可断电保护工作时段。
3 研究的方法及措施
使用51系列单片机配以串入并出的芯片实现对60个发光二极管的有序控制来模拟秒针
用单片机内部的定时/计数器来实现电子时钟的方法。用定时器可以产生250us的精确定时,然后,4000次中断后就得到了精确的1s的定时。60个1s,即产生1分钟等等…用延时也可以做电子钟,但产生的定时一般是近似值,走的时间久了,定时会产生较大的偏差,而用定时器中断做的电子钟就不会有这个问题,很准确。
4 预期成果
数字钟可以进行24小时制的计时,并且有时分秒显示,在此的基础上,用单片机来实现设置工作时段,并且有断电保护,并且可以十分方便的修改时钟的时间和工作时段
5 研究工作进度计划
20##年9月:选题、课题调研、查阅文献等。
20##年10月8日—10月21日: 完成文献综述、开题报告等。
20##年10月22日—10月27日:完成外文翻译,修改开题报告、文献综述等。
20##年10月28日—11月12日:修改前期材料,完成定稿。课题方案设计。
20##年11月13日—11月22日:各单元电路、总电路设计、软件程序设计等。
20##年11月23日—12月18日:安装、调试、电路改进、软、硬件联调、用PRTELL99制图。撰写论文初稿。
20##年12月19日—12月25日:修改论文、定稿,答辩。
6 其他需要说明的问题
无
总结
通过这次课程设计我最大的收获是对单片机的定时中断方式有了直观的认识,设计数字钟我们用单片机内部定时/计数器,通过设置定时器产生精确的定时中断,达到计时的目的。
参考文献
[1] 盛蒙蒙,葛亦斌等.基于单片机实现多功能数字钟的系统设计[J].硅谷,2009,27(20):67-69.
[2] 马丽萍,肖渊.基于Proteus的数字钟设计及仿真[J]. 西安工程大学学报,2009,23(3):59-62.
[3] 刘睿劼.基于FPGA的多功能数字钟的设计[J].应用技术与研究,2009,(5):73-75
[4] 黄明,黄艳.多功能数字钟电路的设计与制作[J].机械与电子,2009(27):71-72.
[5].邵雯.基于MULTISIM8 的数字钟的设计[J]. 光盘技术,2009(3):46-48.
[6].毕满清等.电子技术实验与课程设计.北京:机械工业出版社,1995.131~132
[7].谢自美.电子线路设计.实验.测试.华中科技大学出版社,2000.7.
[8].彭容修,刘泉,马建国.数字电子技术基础.武汉理工大学出版社.2006.1
[9].侯伯亨,顾新.VHDI。硬件描述语言与数字电路逻辑设计[M].西安:西安电子科技大学出版社。2001.
[10].李国洪,沈明山.可编程器件EDA技术与实践[M].北京:机械工业出版社,2004.
[11].李景华,杜玉远.可编程逻辑器件与EDA技术[M].沈阳:东北大学出版社,2000.
[12]刘斌儒;戴勇;基于AVR单片机Mega16的电子时钟设计[J];国外电子元器件;20##年07期
[13]刘建英;基于单片机的时钟设计[J];内蒙古石油化工;20##年01期
第二篇:多功能数字钟
原理图:
程序:
/***************************制作信息******************************************/ /* 说明:数字时钟 = DS1302+DS18B20+LCD1602+单片机
功能:时间显示+秒表计时+闹钟响铃+整点报时+温度显示+制作者信息 制作时间:20xx年6月20日
******************************************************************************/ #include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
#define w_Sec 0x80
#define w_Min 0x82
#define w_Hou 0x84
#define w_Day 0x86
#define w_Mou 0x88
#define w_xi 0x8a
#define w_Yea 0x8c // DS1302写数据
#define r_Sec 0x81
#define r_Min 0x83
#define r_Hou 0x85
#define r_Day 0x87
#define r_Mou 0x89
#define r_xi 0x8b
#define r_Yea 0x8d //DS1302读数据
#define w_protect 0x8e //DS1302写保护
uchar code table[]="11-6-20"; //制作时间
uchar code time1[]="00:00:00"; //时间模式1,用于普通计时
uchar code time2[]="00:00:00:00"; //时间模式2,用于秒表计时
uchar code time3[]="00:00"; //时间模式3,用于闹钟设置
uchar code miaobiao[]="StopWatch";
uchar code naozhong[]="Alarm";
uchar code stuinfo1[]="ZSA0501090210";
uchar code stuinfo2[]="YHB0501090225";
uchar code xi1[]="Mon";
uchar code xi2[]="Tue";
uchar code xi3[]="Wed";
uchar code xi4[]="Thu";
uchar code xi5[]="Fri";
uchar code xi6[]="Sat";
uchar code xi7[]="Sun";
unsigned char code str1[]={"Temperature:"};
unsigned char code str2[]={" "};
uchar data disdata[5];
uint tvalue; //温度值
uchar tflag; //温度正负标志 //18B20
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2; //1602控制端定义
sbit ACC_7 = ACC^7; //位寻址寄存器
sbit SCK = P1^1; //DS1302时钟信号
sbit SDA = P1^0; //DS1302数据信号
sbit RST = P1^2 ; //DS1302片选信号
sbit k1=P1^4;
sbit k2=P1^5;
sbit k3=P1^6;
sbit k4=P1^7;
sbit alarm=P3^7;
sbit DQ = P2^7; //DS18B20
uint i,shi,fen,miao,haomiao,nian,yue,ri,num,x,menu,n,nshi=0,nfen=1; //nshi、nfen用来判别闹钟,与系统时间对比
uchar sshi,sfen,smiao,snian,syue,sri,sxi; void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*向DS1302写入一字节数据
------------------------------------------------*/ void Write1302(uchar addr, uchar d) {
unsigned char i;
RST=1;
//写入目标地址:addr
addr = addr & 0xFE; //最低位置零 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读出一字节数据
------------------------------------------------*/ unsigned char Read1302(uchar addr) {
unsigned char i;
unsigned char temp;
unsigned char dat1=0;
unsigned char dat2=0;
RST=1;
//写入目标地址:addr
addr = addr | 0x01;
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;
return dat1;
}
void write_add(uchar add) //1602控制字 {
RS=0;
P0=add;
EN=1;
delay(5);
EN=0;
}
void write_date(uchar date) //1602显示字
{
RS=1;
P0=date;
EN=1;
delay(5);
EN=0;
}
void writesfm(uchar add,uchar date) //1602显示时分秒 {
uchar s,g;
s = date/10;
g = date%10;
write_add(0x80+0x40+add);
write_date(0x30+s);
write_date(0x30+g);
}
void writenyr(uchar add,uchar date) //1602显示年月日 {
uchar s,g;
s=date/10;
g=date%10;
write_add(0x80+0x00+add);
write_date(0x30+s);
write_date(0x30+g);
}
void writexi(uchar a)
{
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);
}
}
}
void writefuhao(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***************************************/ void delay_18B20(unsigned int i)//延时1微秒 {
while(i--);
}
void ds1820rst() //ds1820复位 {
unsigned char x=0;
DQ = 1; //DQ复位 delay_18B20(4); //延时
DQ = 0; //DQ拉低
delay_18B20(100); //精确延时大于480us DQ = 1; //拉高
delay_18B20(40);
}
uchar ds1820rd() //读数据
{ 程序
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; //给脉冲信号 dat>>=1;
DQ = 1; //给脉冲信号 if(DQ)
dat|=0x80;
delay_18B20(10);
}
return(dat);
}
void ds1820wr(uchar wdata) //写数据 {
unsigned char i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = wdata&0x01;
delay_18B20(10);
DQ = 1;
wdata>>=1;
}
}
read_temp() //读取温度值并转换 {
uchar a,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*(0.625);//温度值扩大10倍,精确到1位小数
return(tvalue);
}
/*******************************************************************/ void ds1820disp() //温度值显示
{
uchar flagdat;
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”
}
void init_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);
}
}
/*void init_1602(void) {
write_add(0x80+0x00+0); for(i=0;i<7;i++) {
write_date(table[i]); delay(5);
}
write_add(0x80+0x00+11); for(i=0;i<3;i++) {
write_date(xi3[i]); delay(5);
}
write_add(0x80+0x40+0); for(i=0;i<8;i++) {
write_date(time1[i]); delay(5);
}
}*/
void Speak1() //闹铃 {
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);
}
void Speak2()
{
alarm=0;
delay(2000);
alarm=1;
}
void Normal() //正常显示时间功能
{
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);
}
void StopWatch () 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);
}
/*TMOD=0X01;
TH0=(65536-10000)/256; TL0=(65536-10000)%256; EA=1;
ET0=1;
TR0=1;*/
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;*/ }
void key() //闹钟时的按键功能 {
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;
}
void Alarm(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); //开显示,不显示光标 }
void key1(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_add(0x0f); //显示光标并闪烁 write_add(0x80+0x40+3);
}
if(num==3)
{
write_add(0x0f); //显示光标并闪烁 write_add(0x80+0x40+0);
}
if(num==4)
{
write_add(0x0f); //显示光标并闪烁 write_add(0x80+0x00+6);
}
if(num==5)
{
write_add(0x0f); //显示光标并闪烁 write_add(0x80+0x00+3);
}
if(num==6)
{
write_add(0x0f); //显示光标并闪烁 write_add(0x80+0x00+0);
}
if(num==7)
{
write_add(0x0f); //显示光标并闪烁 write_add(0x80+0x00+11);
}
if(num==8)
{
num=0;
write_add(0x0c);
}
}
}
}
void key2(void)
{
Write1302(w_protect,0x00); //禁止写保护
if(k2==0) //实现加法
{
delay(10);
if(k2==0)
{
while(!k2);
if(num==1)
{
miao++;
if(miao==60)
{
miao=0;
}
writesfm(6,miao);
Write1302(w_Sec,(miao/10)*16+miao%10); //将miao转换成BCD码 }
if(num==2)
{
fen++;
if(fen==60)
{
fen=0;
}
writesfm(3,fen);
Write1302(w_Min,(fen/10)*16+fen%10);
}
if(num==3)
{
shi++;
if(shi==24)
{
shi=0;
}
writesfm(0,shi);
Write1302(w_Hou,(shi/10)*16+shi%10);
}
if(num==4)
{
ri++;
if(ri==30)
{
ri=0;
}
writenyr(6,ri);
Write1302(w_Day,(ri/10)*16+ri%10);
}
if(num==5)
{
yue++;
if(yue==13)
{
yue=1;
}
writenyr(3,yue);
Write1302(w_Mou,(yue/10)*16+yue%10); }
if(num==6)
{
nian++;
if(nian==100)
{
nian=0;
}
writenyr(0,nian);
Write1302(w_Yea,(nian/10)*16+nian%10); }
if(num==7)
{
x++;
writexi(x);
Write1302(w_xi,(x/10)*16+x%10); if(x==7)
{
x=0;
}
}
}
}
}
void key3(void)
{
Write1302(w_protect,0x00); //禁止写保护
if(k3==0) //实现减法
{
delay(10);
if(k3==0)
{
while(!k3);
if(num==1)
{
miao--;
if(miao==-1)
{
miao=59;
}
writesfm(6,miao);
Write1302(w_Sec,(miao/10)*16+miao%10); }
if(num==2)
{
fen--;
if(fen==-1)
{
fen=59;
}
writesfm(3,fen);
Write1302(w_Min,(fen/10)*16+fen%10); }
if(num==3)
{
shi--;
if(shi==-1)
{
shi=23;
}
writesfm(0,shi);
Write1302(w_Hou,(shi/10)*16+shi%10); }
if(num==4)
{
ri--;
if(ri==-1)
{
ri=30;
}
writenyr(6,ri);
Write1302(w_Day,(ri/10)*16+ri%10); }
if(num==5)
{
yue--;
}
}
void key4()
{
if(k4==0)
{
delay(10); } } if(yue==-1) { yue=12; } writenyr(3,yue); Write1302(w_Mou,yue); } if(num==6) { nian--; if(nian==-1) { nian=99; } writenyr(0,nian); Write1302(w_Yea,(yue/10)*16+yue%10); } if(num==7) { x--; writexi(x); Write1302(w_xi,(x/10)*16+x%10); if(x==1) { x=8; }
if(k4==0)
{
while(!k4);
menu++;
}
}
}
void TimeSet()
{
write_add(0x0f);
write_add(0x80+0x40+9);
while(k4)
{
key1();
key2();
key3();
}
Write1302(w_protect,0x00); //写保护
menu=2;
}
void init_DS1302(void)
{
Write1302(w_protect,0x00); //禁止写保护
Write1302(w_Sec,0x56);
Write1302(w_Min,0x59);
Write1302(w_Hou,0x23); //24小时模式
Write1302(w_xi,0x03);
Write1302(w_Day,0x28);
Write1302(w_Mou,0x02);
Write1302(w_Yea,0x11); //初始化系统时间 20xx年5月11日周三12:12:12 Write1302(w_protect,0x80); //写保护
}
void disp(void)
{
key4();
if(menu==0)
{
Normal();
read_temp(); //读取温度
ds1820disp();//显示
}
if(menu==1)
{
TimeSet();
}
num=0;
if(menu==2)
{
StopWatch();
}
if(menu==3)
{
Alarm();
}
if(menu==4)
{
init_info();
}
if(menu==5)
{
menu=0;
write_add(0x01); //清屏
}
}
void main()
{
init_DS1302(); //初始化1302
EN=1;
RW=0; //写命令
write_add(0x38); //设置16*2行显示,5*7点阵,8位数据接口 write_add(0x0c); //开显示,不显示光标
write_add(0x06);
write_add(0x01); //清屏
while(1)
{
disp(); //显示
}
}
void t0()interrupt 1 //定时器中断0
{
TH0=(65536-10000)/256;
TL0=(65536-10000)%256;
}