基于单片机的时钟温度显示.docx
- 文档编号:29129577
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:36
- 大小:22.37KB
基于单片机的时钟温度显示.docx
《基于单片机的时钟温度显示.docx》由会员分享,可在线阅读,更多相关《基于单片机的时钟温度显示.docx(36页珍藏版)》请在冰豆网上搜索。
基于单片机的时钟温度显示
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitrs=P1^0;//寄存器选择
sbitrw=P1^1;//读写信号线
sbitlcden=P1^2;//led使能端
sbitscl=P1^3;//时钟线
sbitrst=P1^5;//复位线
sbitio=P1^4;//数据口
sbitkey_set_time=P3^4;//设置时间键
sbitkey_add=P3^5;//加键
sbitkey_minus=P3^6;//减键
sbitkey_set_alarm=P3^7;//设置闹钟键
sbitbee=P1^6;//蜂鸣器接口
sbitdq=P1^7;//ds18b20测温
uchargetTimebuf[7];//存放时间数据
uchartime[]={":
:
"};//时间格式字符串
uchardate[]={"20--"};//日期格式字符串
ucharweeklist[]={"SunMonTueWedThuFriSat"};//星期字符列表
ucharweek[]={""};//星期格式字符串
intcount;//设定秒分时日月星期年的时候count的值分别为1235647
intalarm;//是否进入闹钟设置界面123分别代表开关分小时的设置
intisOpen;//闹钟是否开启默认不开启
intfen,shi;//闹钟的分钟小时
intisRing;//闹钟是否在响
ucharisInit_1302;//是否初始化时钟完毕
intnum;
inttemperature;//温度
inttemp_flag;//温度正负标志
voiddelay(uintx){
inty;
while(x--){
for(y=100;y>0;y--);
}
}
voidwrite_1602com(ucharcom){
//1602写指令
rs=0;
lcden=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidwrite_1602data(uchardat){
//1602写数据
rs=1;
lcden=0;
P2=dat;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
voidinit_1602(){
//初始化1602液晶
rw=0;
lcden=0;
write_1602com(0x38);//设置显示模式
write_1602com(0x0c);//显示开关及光标是否显示和闪动
write_1602com(0x06);//光标移动方向
write_1602com(0x01);//清屏
}
voidwrite_ds1302_byte(uchartemp){
//ds1302写一个字节数据
uchari;
for(i=0;i<8;i++){
io=temp&0x01;//将数据放到IO口上
scl=0;//scl为低时准备数据
scl=1;//上升沿写入
temp>>=1;
}
}
voidwrite_ds1302(ucharadd,uchardat){
//向地址add写入数据dat
rst=0;
scl=0;
rst=1;
write_ds1302_byte(add);
write_ds1302_byte(dat);
scl=1;
rst=0;
}
ucharread_ds1302(ucharadd){
//ds1302读数据
uchari,dat;
rst=0;
scl=0;
rst=1;
write_ds1302_byte(add);//首先写入要读的数据处的地址
for(i=0;i<8;i++){
if(io==1){
dat|=0x80;
}
scl=1;
scl=0;//下降沿读取数据
dat>>=1;
}
scl=1;
rst=0;
returndat;
}
voidread_time(ucharcurr_time[]){
uchari;
ucharucAddr=0x81;
for(i=0;i<7;i++){
curr_time[i]=read_ds1302(ucAddr);//格式为:
秒分时日月星期年
ucAddr+=2;
}
}
voidset_time(uchar*pSecDa){
//设定时间
uchari;
ucharucAddr=0x80;
write_ds1302(0x8e,0x00);
for(i=7;i>0;i--){
write_ds1302(ucAddr,*pSecDa);//秒分时日月星期年
pSecDa++;
ucAddr+=2;
}
write_ds1302(0x8e,0x80);
}
voidinit_ds1302(){
//ds1302初始化
isInit_1302=read_ds1302(0x81);//读出时钟状态
if(isInit_1302&0x80){//说明没有初始化
write_ds1302(0x8e,0x00);//关闭写保护以后一直开着
write_ds1302(0x90,0xa5);//辅助电源充电命令一个二极管一个2K电阻
write_ds1302(0x80,0x00);//秒CH置0开启时钟
write_ds1302(0x82,0x59);//分
write_ds1302(0x84,0x10);//时
write_ds1302(0x86,0x07);//日
write_ds1302(0x88,0x05);//月
write_ds1302(0x8a,0x04);//星期
write_ds1302(0x8c,0x14);//年
write_ds1302(0x8e,0x80);
}
}
charint_to_char(inttemp){
//把0到9对应的数字转为字符
charx='0';
switch(temp){
case0:
x='0';break;
case1:
x='1';break;
case2:
x='2';break;
case3:
x='3';break;
case4:
x='4';break;
case5:
x='5';break;
case6:
x='6';break;
case7:
x='7';break;
case8:
x='8';break;
case9:
x='9';break;
}
returnx;
}
intds18b20_read_temp();
voiddisplay(){
ucharbai,shi,ge,point,fuhao;
read_time(getTimebuf);//时时读取时间
time[6]=(getTimebuf[0])/16+48;//格式化时间秒
time[7]=(getTimebuf[0])%16+48;
time[3]=(getTimebuf[1])/16+48;//格式化时间分
time[4]=(getTimebuf[1])%16+48;
time[0]=(getTimebuf[2])/16+48;//格式化时间小时
time[1]=(getTimebuf[2])%16+48;
date[8]=getTimebuf[3]/16+48;//格式化日期日
date[9]=getTimebuf[3]%16+48;
date[5]=getTimebuf[4]/16+48;//格式化日期月
date[6]=getTimebuf[4]%16+48;
date[2]=getTimebuf[6]/16+48;//格式化日期年
date[3]=getTimebuf[6]%16+48;
week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
week[1]=weeklist[(getTimebuf[5]%10)*3+1];
week[2]=weeklist[(getTimebuf[5]%10)*3+2];
write_1602com(0x80+1);
for(num=0;num<10;num++){
write_1602data(date[num]);
}
write_1602data('');
for(num=0;num<3;num++){
write_1602data(week[num]);
}
write_1602com(0x80+0x40);
for(num=0;num<8;num++){
write_1602data(time[num]);
}
//显示温度值
write_1602com(0x80+0x40+8);//设置数据指针
temperature=ds18b20_read_temp();
bai=temperature/1000+0x30;
shi=temperature%1000/100+0x30;
ge=temperature%100/10+0x30;
point=temperature%100%10+0x30;
if(temp_flag==1){//说明为正数不显示符号位125.625.7两种
fuhao=0x20;//显示空白
if(bai==0x30){
bai=0x20;//如果百位为0不显示
if(shi==0x30){
shi=0x20;//如果百位为0十位也为0都不显示
}
}
write_1602data(fuhao);
write_1602data(bai);
write_1602data(shi);
}else{
fuhao=0x2d;//显示负号-2.5-25.8两种
write_1602data(0x20);//因为负数最低到55,所以不显示百位
if(shi==0x30){
write_1602data(0x20);
write_1602data(fuhao);
}else{
write_1602data(fuhao);
write_1602data(shi);
}
}
write_1602data(ge);
write_1602data('.');
write_1602data(point);
write_1602data(0xdf);
write_1602data('C');
}
voiddisplay_alarm(ucharadd,intdat){
//把设定的时分显示出来
intx,y;
x=dat/10;
y=dat%10;
write_1602com(add);
write_1602data(int_to_char(x));
write_1602com(add+1);//防止写后地址自动向后加一光标闪烁看不到
write_1602data(int_to_char(y));
write_1602com(add+1);
}
voidinit_alarm(){
//闹钟设置界面只有首次进入才执行
ucharcodex[]="SETALARM";
uchari;
if(alarm==0){
write_1602com(0x01);//清屏
write_1602com(0x80+3);//设置数据指针
for(i=0;i<9;i++){
write_1602data(x[i]);
}
display_alarm(0x80+0x40+5,shi);//载入闹钟的时分
write_1602com(0x80+0x40+7);
write_1602data(':
');
display_alarm(0x80+0x40+8,fen);
if(isOpen){//初始化的时候如果已经设定闹钟则显示ON
write_1602com(0x80+0x40+13);
write_1602data('');
write_1602data('O');
write_1602data('N');
}else{
write_1602com(0x80+0x40+13);
write_1602data('O');
write_1602data('F');
write_1602data('F');
}
}
}
voidkey_scan(){
inti;
ucharcodetips1[]="SETSUCCESS";//闹钟设置成功的提示
ucharcodetips2[]="CANCELSUCCESS";//取消闹钟的提示
if(key_set_time==0){//检测是否按下
delay(10);//消抖
if(key_set_time==0){//再次检测是否按下
while(!
key_set_time);//检测是否松开
delay(10);//延时消抖
while(!
key_set_time);//再次检测是否松开
if(alarm==0){//当没有显示闹钟界面时才显示时间设定
count++;
write_ds1302(0x80,0x80);//让时钟停止
if(count==8){
//继续走时,说明时间已经设定好了
write_1602com(0x0c);//让光标消失
write_ds1302(0x80,0);//让时钟继续
set_time(getTimebuf);//写入新的时间
count=0;
return;
}
switch(count){
case1:
write_1602com(0x80+0x40+7);//在秒的位置
break;
case2:
write_1602com(0x80+0x40+4);//在分的位置
break;
case3:
write_1602com(0x80+0x40+1);//在时的位置
break;
case4:
write_1602com(0x80+14);//在星期的位置
break;
case5:
write_1602com(0x80+10);//在日的位置
break;
case6:
write_1602com(0x80+7);//在月的位置
break;
case7:
write_1602com(0x80+4);//在年的位置
break;
}
write_1602com(0x0f);//让光标闪烁
}
}
}
if(key_add==0){//检测是否按下
delay(10);//消抖
if(key_add==0){//再次检测是否按下
while(!
key_add);//检测是否松开
delay(10);//延时消抖
while(!
key_add);//再次检测是否松开
if(count!
=0){
switch(count){
case1:
//在秒的位置
getTimebuf[0]++;
if(getTimebuf[0]==0x5a){
getTimebuf[0]=0;
}
if(getTimebuf[0]==0x4a){
getTimebuf[0]=0x50;
}
if(getTimebuf[0]==0x3a){
getTimebuf[0]=0x40;
}
if(getTimebuf[0]==0x2a){
getTimebuf[0]=0x30;
}
if(getTimebuf[0]==0x1a){
getTimebuf[0]=0x20;
}
if(getTimebuf[0]==0x0a){
getTimebuf[0]=0x10;
}
time[6]=(getTimebuf[0])/16+48;//格式化时间秒
time[7]=(getTimebuf[0])%16+48;
write_1602com(0x80+0x40+6);//在秒的位置
write_1602data(time[6]);
write_1602com(0x80+0x40+7);//在秒的位置
write_1602data(time[7]);
write_1602com(0x80+0x40+7);//让光标在秒的位置闪烁
break;
case2:
//在分的位置
getTimebuf[1]++;
if(getTimebuf[1]==0x5a){
getTimebuf[1]=0;
}
if(getTimebuf[1]==0x4a){
getTimebuf[1]=0x50;
}
if(getTimebuf[1]==0x3a){
getTimebuf[1]=0x40;
}
if(getTimebuf[1]==0x2a){
getTimebuf[1]=0x30;
}
if(getTimebuf[1]==0x1a){
getTimebuf[1]=0x20;
}
if(getTimebuf[1]==0x0a){
getTimebuf[1]=0x10;
}
time[3]=(getTimebuf[1])/16+48;//格式化时间分
time[4]=(getTimebuf[1])%16+48;
write_1602com(0x80+0x40+3);//在分的位置
write_1602data(time[3]);
write_1602com(0x80+0x40+4);//在分的位置
write_1602data(time[4]);
write_1602com(0x80+0x40+4);//让光标在分的位置闪烁
break;
case3:
//在时的位置
getTimebuf[2]++;
if(getTimebuf[2]==0x24){
getTimebuf[2]=0;
}
if(getTimebuf[2]==0x1a){
getTimebuf[2]=0x20;
}
if(getTimebuf[2]==0x0a){
getTimebuf[2]=0x10;
}
time[0]=(getTimebuf[2])/16+48;//格式化时间小时
time[1]=(getTimebuf[2])%16+48;
write_1602com(0x80+0x40+0);//在小时的位置
write_1602data(time[0]);
write_1602com(0x80+0x40+1);
write_1602data(time[1]);
write_1602com(0x80+0x40+1);
break;
case4:
//在星期的位置
getTimebuf[5]++;
if(getTimebuf[5]==0x08){
getTimebuf[5]=0x01;
}
if((getTimebuf[5]%10)*3==21){//轮完了重新开始
week[0]=weeklist[0];
week[1]=weeklist[1];
week[2]=weeklist[2];
}else{
week[0]=weeklist[(getTimebuf[5]%10)*3];//格式化星期
week[1]=weeklist[(getTimebuf[5]%10)*3+1];
week[2]=weeklist[(getTimebuf[5]%10)*3+2];
}
write_1602com(0x80+12);
write_1602data(week[0]);
write_1602com(0x80+13);
write_1602data(week[1]);
write_1602com(0x80+14);
write_1602data(week[2]);
write_1602com(0x80+14);
break;
case5:
//在日的位置
getTimebuf[3]++;
if(getTimebuf[3]==0x32){
getTimebuf[3]=0x01;
}
if(getTimebuf[3]==0x2a){
getTimebuf[3]=0x30;
}
if(getTimebuf[3]==0x1a){
getTimebuf[3]=0x20;
}
if(getTimebuf[3]==0x0a){
getTimebuf[3]=0x10;
}
dat
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 单片机 时钟 温度 显示