12864液晶电子钟具有按键可调闹钟温度显示资料.docx
《12864液晶电子钟具有按键可调闹钟温度显示资料.docx》由会员分享,可在线阅读,更多相关《12864液晶电子钟具有按键可调闹钟温度显示资料.docx(16页珍藏版)》请在冰豆网上搜索。
12864液晶电子钟具有按键可调闹钟温度显示资料
//程序已全部通过硬件测试,请放心使用。
(没有使用到DS1302)
/************12864时钟显示函数*************/
/******实现时间走动、按键控制、蜂鸣器闹铃、温度显示******/
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
/********************功能:
定义液晶12864控制端接口*********************/
sbitrs=P2^6;
//注意:
rw控制端始终为低电平,直接在硬件上接低电平
sbiten=P2^7;
sbitwd=P2^0;//温度传感器信号线
/********************功能:
定义蜂鸣器、按键接口*********************/
sbitbeet=P2^2;//蜂鸣器定义
sbitkey1=P1^0;//功能选择
sbitkey2=P1^1;//至加
sbitkey3=P1^2;//至减
sbitkey4=P1^3;//北京时间与闹钟时间画面切换
/********************功能:
定义数据初始值******************************/
charhour=23,minute=59,second=58,count=0;
charshi=0,fen=0,miao=0,hm;
intyears=2012;
charmonth=12,day=30,mm=0,cc=7;
uinttemp;
floatf_temp;
/********************功能:
定义数组字符串*********************/
ucharcodetable1[]={"幸福牌电子钟"};
ucharcodetable2[]={"温馨提示:
00.0℃"};
/********************功能:
延时函数***************************/
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/*******************功能:
蜂鸣器响应***********************/
voidfengmingqi()
{
beet=0;delay
(1);beet=1;delay
(1);
}
/********************功能:
液晶12864读写数据******************/
voidxieling_shu(ucharaa,ucharbb)
{
if(aa==1){rs=0;}
if(aa==0){rs=1;}
P0=bb;delay
(1);
en=1;delay
(1);
en=0;delay
(1);
}
/********************功能:
液晶12864写入地址******************/
voidxieludizhi(ucharx,uchary)
{
switch(x)
{
case1:
xieling_shu(1,0x80+y);return;//return返回的意思
case2:
xieling_shu(1,0x90+y);return;
case3:
xieling_shu(1,0x88+y);return;
case4:
xieling_shu(1,0x98+y);return;
}
}
/********************功能:
液晶12864写入字符串*****************/
voidxiezifuchuan(uchar*dd)
{
while(*dd!
='\0')
{
xieling_shu(0,*dd++);
}
}
/********************功能:
液晶12864清屏函数*********************/
voidqingping()
{
xieling_shu(1,0x01);//清屏
xieling_shu(1,0x01);//清屏
xieling_shu(1,0x01);//清屏
delay(20);
}
/********************功能:
液晶12864初始化指令操作******************/
voidinit_12864()
{
xieling_shu(1,0x30);//基本指令操作
xieling_shu(1,0x30);//基本指令操作
xieling_shu(1,0x0C);//0x0c:
无光标,OXOF:
光标反白显示
xieling_shu(1,0x01);//清屏
xieling_shu(1,0x06);
}
/********************功能:
液晶12864初始化字串显示******************/
voidinit_zifu()
{
xieludizhi(1,0);xiezifuchuan("欢迎使用");delay
(1);
xieludizhi(2,0);xiezifuchuan("幸福牌电子钟");delay
(1);
xieludizhi(3,0);xiezifuchuan("订购热线");delay
(1);
xieludizhi(4,0);xiezifuchuan("Phone:
0777-66914");delay(9534);
qingping();
xieludizhi(1,0);xiezifuchuan(table1);delay
(1);
xieludizhi(4,0);xiezifuchuan(table2);delay
(1);
xieludizhi(3,5);xiezifuchuan("星期");
xieludizhi(2,2);xiezifuchuan("年月日");
}
/*******************功能:
时间、年月日显示函数********************/
voiddisplay()
{
xieludizhi(3,0);//显示时分秒
xieling_shu(0,0x30+hour/10);
xieling_shu(0,0x30+hour%10);
xieling_shu(0,':
');
xieling_shu(0,0x30+minute/10);
xieling_shu(0,0x30+minute%10);
xieling_shu(0,':
');
xieling_shu(0,0x30+second/10);
xieling_shu(0,0x30+second%10);
xieludizhi(2,0);//显示年
xieling_shu(0,0x30+years/1000);
xieling_shu(0,0x30+years%1000/100);
xieling_shu(0,0x30+years%100/10);
xieling_shu(0,0x30+years%10);
xieludizhi(2,3);//显示月
xieling_shu(0,0x30+month/10);
xieling_shu(0,0x30+month%10);
xieludizhi(2,5);//显示日
xieling_shu(0,0x30+day/10);
xieling_shu(0,0x30+day%10);
}
/*******************功能:
闹钟(时间、年月日)显示函数********************/
voiddisplay1()
{
xieludizhi(3,0);//显示时分秒
xieling_shu(0,0x30+shi/10);
xieling_shu(0,0x30+shi%10);
xieling_shu(0,':
');
xieling_shu(0,0x30+fen/10);
xieling_shu(0,0x30+fen%10);
xieling_shu(0,':
');
xieling_shu(0,0x30+miao/10);
xieling_shu(0,0x30+miao%10);
xieludizhi(2,0);//显示年
xieling_shu(0,0x30+years/1000);
xieling_shu(0,0x30+years%1000/100);
xieling_shu(0,0x30+years%100/10);
xieling_shu(0,0x30+years%10);
xieludizhi(2,3);//显示月
xieling_shu(0,0x30+month/10);
xieling_shu(0,0x30+month%10);
xieludizhi(2,5);//显示日
xieling_shu(0,0x30+day/10);
xieling_shu(0,0x30+day%10);
}
/*******************功能:
星期函数*********************************/
voidxingqi()
{
switch(cc)
{
case1:
xieludizhi(3,7);xiezifuchuan("一");return;
case2:
xieludizhi(3,7);xiezifuchuan("二");return;
case3:
xieludizhi(3,7);xiezifuchuan("叁");return;
case4:
xieludizhi(3,7);xiezifuchuan("四");return;
case5:
xieludizhi(3,7);xiezifuchuan("五");return;
case6:
xieludizhi(3,7);xiezifuchuan("六");return;
case7:
xieludizhi(3,7);xiezifuchuan("日");return;
}
}
/*******************功能:
按键程序*******************/
voidanjian()
{
if(key4==0){delay
(1);hm=~hm;while(key4==0);}
/*******************功能:
key1按键选择功能*******************/
if(key1==0)
{
delay
(1);
mm++;if(hm!
=0){if(mm>=4)mm=0;}
if(mm==1){xieludizhi(3,3);xieling_shu(0,0x5f);}
if(mm==2){TR0=1;xieludizhi(3,2);xieling_shu(0,0x5f);}
if(mm==3){xieludizhi(3,0);xieling_shu(0,0x5f);}
if(mm==4){xieludizhi(2,5);xieling_shu(0,0x5f);}
if(mm==5){xieludizhi(2,3);xieling_shu(0,0x5f);}
if(mm==6){xieludizhi(2,1);xieling_shu(0,0x5f);}
if(mm==7){xieludizhi(3,7);xieling_shu(0,0x5f);}
if(mm==8){xieludizhi(2,7);xieling_shu(0,0x02);}
if(mm>=9){xieludizhi(2,7);xieling_shu(0,0x20);mm=0;}//mm=0;跳出调整时间
while(key1==0);
}
/*******************功能:
key2按键加减功能*******************/
if(mm==1&&key2==0)//秒加1
{
if(hm==0){TR0=0;delay
(1);if(key2==0){second++;if(second>=60){second=0;}}}
if(hm!
=0){delay
(1);if(key2==0){miao++;if(miao>=60){miao=0;}}}
while(key2==0);
}
if(mm==1&&key3==0)//秒减1
{
if(hm==0){TR0=0;delay
(1);if(key3==0){second--;if(second<=-1){second=59;}}}
if(hm!
=0){delay
(1);if(key3==0){miao--;if(miao<=-1){miao=59;}}}
while(key3==0);
}
if(mm==2&&key2==0)//分加1
{
if(hm==0){delay
(1);if(key2==0){minute++;if(minute>=60){minute=0;}}}
if(hm!
=0){delay
(1);if(key2==0){fen++;if(fen>=60){fen=0;}}}
while(key2==0);
}
if(mm==2&&key3==0)//分减1
{
if(hm==0){delay
(1);if(key3==0){minute--;if(minute<=-1){minute=59;}}}
if(hm!
=0){delay
(1);if(key3==0){fen--;if(fen<=-1){fen=59;}}}
while(key3==0);
}
if(mm==3&&key2==0)//时加1
{
if(hm==0){delay
(1);if(key2==0){hour++;if(hour>=24){hour=0;}}}
if(hm!
=0){delay
(1);if(key2==0){shi++;if(shi>=24){shi=0;}}}
while(key2==0);
}
if(mm==3&&key3==0)//时减1
{
if(hm==0){delay
(1);if(key3==0){hour--;if(hour<=-1){hour=23;}}}
if(hm!
=0){delay
(1);if(key3==0){shi--;if(shi<=-1){shi=23;}}}
while(key3==0);
}
if(mm==4&&key2==0)//日加1
{
delay
(1);
if(key2==0)
{
day++;
if(day>=31){day=1;}
}
while(key2==0);
}
if(mm==4&&key3==0)//日减1
{
delay
(1);
if(key3==0)
{
day--;
if(day<=0){day=31;}
}
while(key3==0);
}
if(mm==5&&key2==0)//月加1
{
delay
(1);
if(key2==0)
{
month++;
if(month>=13){month=1;}
}
while(key2==0);
}
if(mm==5&&key3==0)//月减1
{
delay
(1);
if(key3==0)
{
month--;
if(month<=0){month=12;}
}
while(key3==0);
}
if(mm==6&&key2==0)//年加1
{
delay
(1);
if(key2==0){years++;}//不设置年限
while(key2==0);
}
if(mm==6&&key3==0)//年减1
{
delay
(1);
if(key3==0){years--;}
while(key3==0);
}
if(mm==7&&key2==0)//星期加1
{
delay
(1);
if(key2==0)
{
cc++;
if(cc>=8){cc=1;}
}
while(key2==0);
}
if(mm==7&&key3==0)//星期减1
{
delay
(1);
if(key3==0)
{
cc--;
if(cc==0){cc=7;}
}
while(key3==0);
}
}
/***************************************************************************************
*******************************功能:
18B20所有函数************************************/
/*******************18B20复位,初始化函数**************************/
voiddsreset(void)
{
uinti;
wd=0;
i=103;
while(i>0)i--;
wd=1;
i=4;
while(i>0)i--;
}
/*******************18B20读1位函数**************************/
bittempreadbit(void)
{
uinti;
bitdat;
wd=0;i++;//i++起延时作用
wd=1;i++;i++;
dat=wd;
i=8;while(i>0)i--;
return(dat);
}
/*******************18B20读1个字节函数**************************/
uchartempread(void)
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}
/*******************18B20写一个字节数据函数**************************/
voidtempwritebyte(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//写1
{
wd=0;
i++;i++;
wd=1;
i=8;while(i>0)i--;
}
else
{
wd=0;//写0
i=8;while(i>0)i--;
wd=1;
i++;i++;
}
}
}
/*******************18B20开始获取温度并转换函数**************************/
voidtempchange(void)
{
dsreset();
delay
(1);
tempwritebyte(0xcc);//写跳过读ROM指令
tempwritebyte(0x44);//写温度转换指令
}
/*******************18B20读取寄存器中存储的温度数据函数**************************/
uintget_temp()
{
uchara,b;
dsreset();
delay
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();//读低8位
b=tempread();//读高8位
temp=b;
temp<<=8;//两个字节组合为1个字
temp=temp|a;
f_temp=temp*0.0625;//温度在寄存器中为12位分辨率位0.0625°
temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
f_temp=f_temp+0.05;
returntemp;//temp是整型
}
/*******************18B20发送数据函数**************************/
voidcomm(char*parr)
{
do
{
SBUF=*parr++;//发送数据
while(!
TI);//等待发送完成标志为1
TI=0;//标志清零
}while(*parr);//保持循环直到字符为'\0'
}
/************************功能:
主函数****************************/
voidmain()
{ucharbuff[4];
TMOD=0x01;//设置T0为工作方式1
EA=1;
ET0=1;
TR0=1;//开启T0中断
TH0=-50000/256;
TL0=-50000%256;
init_12864();
init_zifu();
hm=0;
while
(1)
{if(count>5&&count<18)
{
tempchange();//开始获取温度
get_temp();//读取寄存温度
sprintf(buff,"%f",f_temp);
comm(buff);
xieludizhi(4,5);xieling_shu(0,0x30+temp/100);xieling_shu(0,0x30