功能有闹钟、温度显示、可修改时间、有高温报警和低温报警,是用1602显示,使用ds1302时钟芯片,使用18b20温度传感器
单片机源程序如下:
- #include <reg52.h>
- #include <LCD1602.h> //LCD1602头文件
- #include <ds1302.h> //时钟芯片头文件
- #include <tem.h> //温度18b20头文件
- #define u8 unsigned char //重定义
- #define u16 unsigned int
- sbit KEY1=P3^0; //定义界面功能按键、确定键
- sbit add=P3^1; //定义加按键
- sbit sub=P3^2; //定义减按键
- sbit KEY4=P3^3; //定义改变功能键、返回键
- sbit beep=P1^5; //蜂鸣器输出口
- int con=0,mon=0;
- bit bcon=0;
- char mm,ff,ss,ww; //秒表的时分秒微秒;
- bit cool,teel;
- bit miao=0,nao=0,wen=0;//nao为闹钟标志位,wen为温度标志位
- u16 win0,win1;//win0为行数win1为位置数
- u16 hin=0;
- char t[][16]={"H33 L20 12/09/25", //显示日期 放在随机存储器中
- "21.3C 14:00:00 6"}; //显示时间、周 放在程序存储器
- char c1[]="Clock 10:02:00 "; //显示闹钟时间
- char code c2[]=" Good Everyday "; // Good Everyday
- char code c3[]=" Open OR Close "; // Open OR Close 开启还是关闭
- char code c4[]=" miao-biao ";
- char code c5[]=" 00:00:00:0 ";
- char code M1[][16]={"> Time <","> Clock <",
- "> Tem_Aralm <"}; // 时间调整,闹钟,温度上下限
- char K1[16]=" ";
- u8 code kai[]={" The design by zhangkewei welcome to ccdugt "};
- uchar code SONG_TONE[]={212,212,190,212,159,169,212,212,190,212,142,159,
- 212,212,106,126,159,169,190,119,119,126,159,142,159,0};
- uchar code SONG_LONG[]={9,3,12,12,12,24,9,3,12,12,12,24,
- 9,3,12,12,12,12,12,9,3,12,12,12,24,0};
- //*********延时函数***********//
- void delay(u16 i)
- {
- while(i--);
- }
- //*********开机画面*********//
- void open()
- {
- int i=0,j;
- while(kai[i]!='\0')
- i++;
- i--;
- for(i;i!=0;i--)
- {
- K1[0]=kai[i];
- LCD1602_WRITERCOM(0x80);
- for(j=0;j<16;j++)
- {
- LCD1602_WRITERDAT(K1[j]);
- }
- LCD1602_WRITERCOM(0xC0);
- for(j=0;j<16;j++)
- {
- LCD1602_WRITERDAT(K1[j]);
- }
- for(j=14;j>=0;j--)
- {
- K1[j+1]=K1[j];
- }
- delay(10000);
- }
- }
- //**********定时器0初始化函数*********//
- void TIME0_INIT()
- {
- TMOD=0x01;
- TH0=0x00;
- TL0=0x00;
- ET0=1;
- EA=1;
- TR0=0;
- }
- //**********定时器1初始化函数*********//
- void TIME1_INIT()
- {
- TMOD=0x10;
- TH1=0xFA;
- TL1=0x15;
- ET1=1;
- EA=1;
- TR1=0;
- }
- //*********显示函数************//
- void display(char *p,char *q)
- {
- int i;
- LCD1602_WRITERCOM(0x80);
- for(i=0;i<16;i++)
- {
- LCD1602_WRITERDAT(*p++);
- }
- LCD1602_WRITERCOM(0xC0);
- for(i=0;i<16;i++)
- {
- LCD1602_WRITERDAT(*q++);
- }
- }
- //*********数据处理函数**********//
- void change()
- {
- t[1][12]=time[0]/16+'0'; //秒
- t[1][13]=time[0]%16+'0';
- t[1][9]=time[1]/16+'0'; //分
- t[1][10]=time[1]%16+'0';
- t[1][6]=time[2]/16+'0'; //时
- t[1][7]=time[2]%16+'0';
- t[0][14]=time[3]/16+'0'; //日
- t[0][15]=time[3]%16+'0';
- t[0][11]=time[4]/16+'0'; //月
- t[0][12]=time[4]%16+'0';
- t[1][15]=time[5]%16+'0'; //周
- t[0][8]=time[6]/16+'0'; //年
- t[0][9]=time[6]%16+'0';
- }
- //*******字符移动动画函数********//
- void move1(char *m)
- {
- int i,n;
- char bin;
- m=m+15;
- bin=con?0xC0:0x80;
- n=17;
- while(n--)
- {
- LCD1602_WRITERCOM(bin);
- for(i=0;i<16;i++)
- {
- LCD1602_WRITERDAT(K1[i]);
- }
- for(i=14;i>=0;i--)
- {
- K1[i+1]=K1[i];
- }
- K1[0]=*m--;
- delay(1000);
- }
- }
- //**************时间修改函数****************//
- void TimeChange()
- {
- int b=1;
- int i;
- u8 max,min; //日历最大值与最小值
- TIME0_INIT(); // 定时器0
- DS1302_Writer(0x8e,0x00);
- DS1302_Writer(0x80,time[0]|0x80);//暂停DS1302计时
- delay(1000);
- while(!KEY1);//判断按键是否松开
- for(i=0;i<7;i++)
- {
- switch (i)
- {
- case 0 :
- win0=1; win1=12; max=0x59; min=0; break; //秒位置
- case 1 :
- win0=1; win1=9; max=0x59; min=0; break; //分位置
- case 2 :
- win0=1; win1=6; max=0x24; min=0; break; //时位置
- case 3 :
- win0=0; win1=14; max=0x31; min=0x01; break; //日位置
- case 4 :
- win0=0; win1=11; max=0x12; min=0x01; break; //月位置
- case 5 :
- win0=1; win1=15; max=0x07; min=0x01; break; //周位置
- case 6 :
- win0=0; win1=8; max=0x99; min=0x01; break; //年位置
- default :
- break;
- }
- while(1)
- {
- TR0=1; //开启定时器0
- if(!add) //判断是否按下加按键
- {
- delay(1000); //消抖,必须要有
- if(!add)
- {
- TR0=0; //关闭定时器0
- time[i]++;
- if((time[i]&0x0f)>0x09) //因为是BCD码
- time[i]=time[i]+6;
- while(!add); //判断按键是否松开
- }
- }
- if(!sub) //判断是否按下加按键
- {
- delay(1000); //消抖,必须要有
- if(!sub)
- {
- TR0=0; //关闭定时器0
- if(time[i]==min) //判断是否减到最小值
- b--;
- time[i]--;
- if((time[i]&0x0f)>0x09) //因为是BCD码
- time[i]=time[i]-6;
- while(!sub);
- }
- }
- if(time[i]>max)
- time[i]=min; //不能超过最大值和最小值
- if(!b)
- {
- time[i]=max;
- b=1;
- }
- if(!KEY1) //判断是否按下确定键
- {
- delay(1000); //消抖
- if(!KEY1)
- break;
- }
- }
- TR0=0; //
- delay(1000);
- while(!KEY1);
- }
- DS1302_STOP(); //DS1302获取改变后的值
- change();
- display(t[0],t[1]);
- DS1302_INIT();
- // while(KEY1); //显示改变后的值,等待按键KEY1按下确认时间
- // if(!KEY1)
- // {
- // delay(1000);
- // if(!KEY1)
- //
- // }
- // TR0=0;
- // while(!KEY1);//判断按键是否松开
- }
- //********闹钟设置函数*******//
- u16 ClockChange()
- {
- u16 b=1;
- display(c1,c2);
- TIME0_INIT(); //定时器0初始化
- delay(1000);
- while(!KEY1);
- win0=0;
- win1=9;
- hin=(c1[9]-'0')*10+(c1[10]-'0'); //分位置
- while(1)
- {
- TR0=1;
- if(!add)
- {
- delay(1000);
- if(!add)
- {
- TR0=0;
- hin++;
- while(!add);
- }
- }
- if(!sub)
- {
- delay(1000);
- if(!sub)
- {
- TR0=0;
- if(hin==0)
- b--;
- hin--;
- while(!sub);
- }
- }
- if(!KEY1)
- {
- delay(1000);
- if(!KEY1)
- {
- break;
- }
- }
- if(hin>59)
- hin=0; //不能超过最大值和最小值
- if(!b)
- {
- hin=59;
- b=1;
- }
- }
- while(!KEY1)
- TR0=0;
- c1[win1]=hin/10+'0';
- c1[win1+1]=hin%10+'0';
- win0=0;
- win1=6;
- hin=(c1[6]-'0')*10+(c1[7]-'0');
- while(KEY1)
- {
- TR0=1;
- win0=0; //时位置
- win1=6;
- if(!add)
- {
- delay(1000);
- if(!add)
- {
- TR0=0;
- hin++;
- while(!add);
- }
- }
- if(!sub)
- {
- delay(1000);
- if(!sub)
- {
- TR0=0;
- if(hin==0)
- b--;
- hin--;
- while(!sub);
- }
- }
- if(hin>24)
- hin=0; //不能超过最大值和最小值
- if(!b)
- {
- hin=24;
- b=1;
- }
- }
- while(!KEY1)
- TR0=0;
- c1[win1]=hin/10+'0';
- c1[win1+1]=hin%10+'0';
- display(c1,c3);
- while(1)
- {
- if(!KEY1)
- {
- delay(1000);
- if(!KEY1)
- {
- return 1;
- }
- }
- if(!KEY4)
- {
- delay(1000);
- if(!KEY4)
- {
- return 0;
- }
- }
- }
- }
- //*************温度读取函数*********//
- void Tem_display( int d )
- {
- if(d>9999) d=9999; //温度显示在0~100度之间
- if(d<0) d=0;
- t[1][0] = d / 1000 + '0';
- t[1][1] = d % 1000 / 100 + '0' ;
- t[1][3] = d % 100 / 10 + '0';
- }
- //***********温度上下限设置函数***********//
- bit AralmChange()
- {
- u16 b=1,i;
- display(t[0],c2);
- TIME0_INIT();
- delay(1000);
- while(!KEY1);
- for(i=0;i<2;i++)
- {
- switch (i)
- {
- case (0) :
- win0=0;win1=1;hin=(t[win0][win1]-'0')*10+(t[win0][win1+1]-'0');break; //最低温度位置
- case (1) :
- t[win0][win1]=hin/10+'0';t[win0][win1+1]=hin%10+'0';
- win0=0;win1=5;hin=(t[win0][win1]-'0')*10+(t[win0][win1+1]-'0');break; //最高温度位置
- }
- while(1)
- {
- TR0=1;
- if(!add)
- {
- delay(1000);
- if(!add)
- {
- TR0=0;
- hin++;
- while(!add);
- }
- }
- if(!sub)
- {
- delay(1000);
- if(!sub)
- {
- TR0=0;
- if(hin==0)
- b--;
- hin--;
- while(!sub);
- }
- }
- if(!KEY1)
- {
- delay(1000);
- if(!KEY1)
- {
- TR0=0;
- break;
- }
- }
- if(hin>99)
- hin=0; //不能超过最大值和最小值
- if(!b)
- {
- hin=99;
- b=1;
- }
- }
- while(!KEY1);
- }
- t[win0][win1]=hin/10+'0';
- t[win0][win1+1]=hin%10+'0';
- display(t[0],c3);
- while(1)
- {
- if(!KEY1)
- {
- delay(1000);
- if(!KEY1)
- {
- return 1;
- }
- }
- if(!KEY4)
- {
- delay(1000);
- if(!KEY4)
- {
- return 0;
- }
- }
- }
- }
- //*************按键处理函数**************//
- int button()
- {
- if(!KEY1)
- {
- delay(100);
- if(!KEY1)
- {
- switch (mon)//mon,为菜单标志位
- {
- case 0:TimeChange(); break;
- case 1:cool=ClockChange();break;
- case 2:teel=AralmChange();break;
- }
- }
- while(!KEY1);
- }
- if(!add)
- {
- delay(1000);
- if(!add)
- {
- if(mon==0)
- {
- mon=3;
- con=1;
- }
- mon=mon-1;
- con=con-1;
- if(mon==1)
- {
- con=1;
- display(M1[1],M1[0]);
- }
- }
- while(!add); //判断按键是否松开
- }
- if(!sub)
- {
- delay(1000);
- if(!sub)
- {
- if(mon==3)
- {
- mon=-1;
- con=0;
- }
- mon=mon+1;
- con=con+1;
- if(mon==2)
- {
-
- con=1;
- display(M1[1],M1[2]);
- }
- }
- while(!sub);
- }
- if(!KEY4)
- {
- delay(100);
- if(!KEY4)
- {
- while(!KEY4);
- return 0;
- }
- }
- return 1;
- }
- //**************音乐播放函数**************//
- void PlayMusic(u8 flag)//音乐函数
- {
- if(flag==1)
- {
- uint i=0,j,k;
- for(i=0;i<13;i++)
- { //播放各个音符,SONG_LONG 为拍子长度
- for(j=0;j<SONG_LONG[i]*20;j++)
- {
- beep=~beep;
- //SONG_TONE 延时表决定了每个音符的频率
- for(k=0;k<SONG_TONE[i]/3;k++);
- }
- }
- flag=0;
- }
-
- }
- //**************判断是否有报警**************//
- void nao_baojing()
- {
- int i;
-
- for(i=6;i<11;i++)
- {
- if(c1[i]!=t[1][i])//对闹钟是否相同进行比较
- break;
- }
- if(i==11)//如果比较到最后一位都一样时
- nao=1;//闹钟响
- else
- nao=0;//闹钟不响
-
-
- }
- void wen_baojing()
- {
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei附件下载:
LCD1602显示.zip
(200.04 KB, 下载次数: 53)
|