12864液晶电子钟 具有按键可调、闹钟、温度显示

更新时间:2023-09-07 04:55:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

理解才是最主要

程序已全部通过硬件测试,请放心使用。(没有使用到DS1302)

/************12864时钟显示函数*************/

/******实现时间走动、按键控制、蜂鸣器闹铃、温度显示******/

#include<reg52.h>

#include <stdio.h>

#define uchar unsigned char

#define uint unsigned int

/******************** 功能:定义液晶12864控制端接口

*********************/

sbit rs=P2^6;

// 注意: rw 控制端始终为低电平,直接在硬件上接低电平

sbit en=P2^7;

sbit wd=P2^0; //温度传感器信号线

/******************** 功能:定义蜂鸣器、按键 接口

*********************/

sbit beet=P2^2; //蜂鸣器定义

sbit key1=P1^0; //功能选择

sbit key2=P1^1; //至加

sbit key3=P1^2; //至减

sbit key4=P1^3; //北京时间与闹钟时间画面切换

/******************** 功能:定义数据初始值

******************************/

char hour=23,minute=59,second=58,count=0;

char shi=0,fen=0,miao=0,hm;

int years=2012;

char month=12,day=30,mm=0,cc=7;

uint temp;

float f_temp;

/******************** 功能:定义数组字符串 *********************/

uchar code table1[]={" 幸福牌电子钟 "};

uchar code table2[]={"温馨提示:00.0℃"};

/******************** 功能:延时函数 ***************************/

void delay(uint z)

{

uint x,y;

for(x=z;x>0;x--)

for(y=110;y>0;y--);

}

/******************* 功能:蜂鸣器响应 ***********************/

void fengmingqi()

{

beet=0;delay(1);beet=1;delay(1);

}

理解才是最主要

/******************** 功能:液晶12864读写数据 ******************/

void xieling_shu(uchar aa,uchar bb)

{

if(aa==1){rs=0;}

if(aa==0){rs=1;}

P0=bb;delay(1);

en=1; delay(1);

en=0; delay(1);

}

/******************** 功能:液晶12864写入地址 ******************/

void xieludizhi(uchar x, uchar y)

{

switch(x)

{

case 1: xieling_shu(1,0x80 + y ); return;//return 返回的意思

case 2: xieling_shu(1,0x90 + y ); return;

case 3: xieling_shu(1,0x88 + y ); return;

case 4: xieling_shu(1,0x98 + y ); return;

}

}

/******************** 功能:液晶12864写入字符串 *****************/

void xiezifuchuan(uchar *dd)

{

while(*dd != '\0')

{

xieling_shu(0,*dd++ );

}

}

/******************** 功能:液晶12864清屏函数 *********************/

void qingping()

{

xieling_shu(1,0x01); //清屏

xieling_shu(1,0x01); //清屏

xieling_shu(1,0x01); //清屏

delay(20);

}

/******************** 功能:液晶12864初始化指令操作

******************/

void init_12864()

{

xieling_shu(1,0x30); //基本指令操作

xieling_shu(1,0x30); //基本指令操作

xieling_shu(1,0x0C); //0x0c: 无光标, OXOF: 光标反白显示

xieling_shu(1,0x01); //清屏

理解才是最主要

xieling_shu(1,0x06);

}

/******************** 功能:液晶12864初始化字串显示

******************/

void init_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("年 月 日");

}

/******************* 功能:时间、年月日 显示函数 ********************/

void display()

{

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);

}

/******************* 功能:闹钟(时间、年月日) 显示函数

********************/

void display1()

{

理解才是最主要

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);

}

/******************* 功能:星期函数 *********************************/

void xingqi()

{

switch(cc)

{

case 1: xieludizhi(3,7); xiezifuchuan("一"); return;

case 2: xieludizhi(3,7); xiezifuchuan("二"); return;

case 3: xieludizhi(3,7); xiezifuchuan("叁"); return;

case 4: xieludizhi(3,7); xiezifuchuan("四"); return;

case 5: xieludizhi(3,7); xiezifuchuan("五"); return;

case 6: xieludizhi(3,7); xiezifuchuan("六"); return;

case 7: xieludizhi(3,7); xiezifuchuan("日"); return;

}

}

/******************* 功能:按键程序 *******************/

void anjian()

{

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复位,初始化函数

**************************/

void dsreset(void)

{

uint i;

wd=0;

i=103;

while(i>0)i--;

wd=1;

i=4;

while(i>0)i--;

}

/******************* 18B20 读1位 函数 **************************/

bit tempreadbit(void)

{

uint i;

bit dat;

wd=0;i++; //i++ 起延时作用

wd=1;i++;i++;

dat=wd;

i=8;while(i>0)i--;

return (dat);

}

/******************* 18B20 读1个字节 函数

**************************/

uchar tempread(void)

{

uchar i,j,dat;

dat=0;

for(i=1;i<=8;i++)

{

j=tempreadbit();

dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在

DAT里

}

return(dat);

理解才是最主要

}

/******************* 18B20 写一个字节数据 函数

**************************/

void tempwritebyte(uchar dat)

{

uint i;

uchar j;

bit testb;

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 开始获取温度并转换 函数

**************************/

void tempchange(void)

{

dsreset();

delay(1);

tempwritebyte(0xcc); // 写跳过读ROM指令

tempwritebyte(0x44); // 写温度转换指令

}

/******************* 18B20 读取寄存器中存储的温度数据 函数

**************************/

uint get_temp()

{

uchar a,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;

return temp; //temp是整型

}

/******************* 18B20 发送数据 函数 **************************/

void comm(char *parr)

{

do

{

SBUF = *parr++; //发送数据

while(!TI); //等待发送完成标志为1

TI =0; //标志清零

}while(*parr); //保持循环直到字符为'\0'

}

/************************ 功能:主函数 ****************************/

void main()

{ uchar buff[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+

temp%100/10);

理解才是最主要

xieling_shu(0,0x2e);xieling_shu(0,0x30+temp%100%10);

}

if(hm==0)display(); // 如果 hm=0 显示北京时间,否则显示闹钟时间

else display1();

anjian(); // 按键判断

xingqi(); // 显示星期

if(minute==59&&second==59){fengmingqi();} // 整点 报时

if(shi==hour&&fen==minute&&miao>=second&&miao<=second+3){fengmingq

i();}// 闹钟

}

}

/************************ 功能:中断函数 **************************/

void time() interrupt 1

{

TH0=-50000/256;

TL0=-50000%256;

count++;

if(count==20)

{

count=0;

second++;

if(second==60)

{

second=0;

minute++;

if(minute==60)

{

minute=0;

hour++;

if(hour==24)

{

hour=0;

day++;

cc++;

if(cc==8) cc=1;

if(day==31)

{

day=1;

month++;

if(month==13)

理解才是最主要

{ month=1; years++;

} }

}

}

}

}

}

本文来源:https://www.bwwdw.com/article/ck9h.html

Top