DS1302 12864lcd单片机智能闹钟日期温度程序

更新时间:2024-06-09 05:56:01 阅读量: 综合文库 文档下载

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

/****************************************************************************/ //头文件

#include #include

/*****************************************************************************/ //灯与蜂鸣器定义 sbit led_b = P2^7; sbit led_r = P1^4; sbit led_g1 = P1^3; sbit led_g2 = P1^2; sbit led_g3 = P1^0; sbit led_g4 = P1^1; sbit beep = P3^1;

/*****************************************************************************/ //温度传感器定义

sbit DQ = P3 ^ 0;//ds18B20

/*****************************************************************************/ //键盘引脚定义

sbit KEY_1 = P2^3; //左上 sbit KEY_2 = P2^4; //左下 sbit KEY_3 = P2^6; //右上 sbit KEY_4 = P2^5; //右下 sbit KEY_I = P3^2; //常0

/****************************************************************************/ //引脚定义

sbit SID = P2^1; //数据 sbit SCLK = P2^2; //时钟

/*****************************************************************************/ //定义DS1302时钟接口

sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线) sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线) sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)

/*****************************************************************************/ //定义累加器A中的各位 sbit a0 = ACC ^ 0; sbit a1 = ACC ^ 1; sbit a2 = ACC ^ 2; sbit a3 = ACC ^ 3; sbit a4 = ACC ^ 4; sbit a5 = ACC ^ 5; sbit a6 = ACC ^ 6; sbit a7 = ACC ^ 7;

/****************************************************************************/ //定义全局变量

unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器) bit w = 0; //调时标志位

static unsigned char menu = 0;//定义静态小时更新用数据变量 static unsigned char keys = 0;//定义静态小时更新用数据变量 static unsigned char timecount = 0;//定义静态软件计数器变量

/****************************************************************************/ void DelayM(unsigned int a){//延时函数 1MS/次 unsigned char i; while( --a != 0){ for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。 } //i 从0加到125,CPU大概就耗时1毫秒 }

/****************************************************************************/ //函数声明

void lcm_w_word(unsigned char *str) ; //写字符 例:lcm_w_word(\您好!\void lcm_w_test(bit start,unsigned char ddata); //(0,指令) (1,数据) void lcm_w_byte(unsigned char bbyte); //写一个字节给lcm void delaynms(unsigned int di); //延时 void lcm_init(void); //lcm初始化 void lcm_clr(void); //清屏

void days (viod) { //公历节日数据库 lcm_w_test(0,0x80); lcm_w_word(\ [Set]\ lcm_w_test(0,0x98); // ----|----------------| if ( mo == 0x01 && dd == 0x01 ){ lcm_w_word(\月 if ( mo == 0x01 && dd == 0x28 ){ lcm_w_word(\ 世界麻风日 \

if ( mo == 0x02 && dd == 0x02 ){ lcm_w_word(\ 世界湿地日 \2月 if ( mo == 0x02 && dd == 0x13 ){ lcm_w_word(\ 明天情人节了 \ if ( mo == 0x02 && dd == 0x14 ){ lcm_w_word(\ 今天是情人节 \

if ( mo == 0x03 && dd == 0x01 ){ lcm_w_word(\ 国际海豹日 \3月 if ( mo == 0x03 && dd == 0x03 ){ lcm_w_word(\ 全国爱耳日 \ if ( mo == 0x03 && dd == 0x08 ){ lcm_w_word(\ 3.8妇女节 \ if ( mo == 0x03 && dd == 0x12 ){ lcm_w_word(\ 植树节 \ if ( mo == 0x03 && dd == 0x14 ){ lcm_w_word(\ 国际警察日 \ if ( mo == 0x03 && dd == 0x15 ){ lcm_w_word(\ 消费者权益日 \ if ( mo == 0x03 && dd == 0x17 ){ lcm_w_word(\ 国际航海日 \ if ( mo == 0x03 && dd == 0x21 ){ lcm_w_word(\ 世界森林日 \

if ( mo == 0x03 && dd == 0x22 ){ lcm_w_word(\ 世界水日 \ if ( mo == 0x03 && dd == 0x23 ){ lcm_w_word(\ 世界气象日 \ if ( mo == 0x03 && dd == 0x24 ){ lcm_w_word(\世界防治结核病日\ if ( mo == 0x04 && dd == 0x01 ){ lcm_w_word(\愚人节 小心上当\4 if ( mo == 0x04 && dd == 0x07 ){ lcm_w_word(\ 世界卫生日 \ if ( mo == 0x04 && dd == 0x08 ){ lcm_w_word(\ 复活节 \ if ( mo == 0x04 && dd == 0x13 ){ lcm_w_word(\ 黑色星期五 \ if ( mo == 0x05 && dd == 0x01 ){ lcm_w_word(\ 劳动节 放假 \5 if ( mo == 0x05 && dd == 0x04 ){ lcm_w_word(\ 青年节 \ if ( mo == 0x05 && dd == 0x08 ){ lcm_w_word(\ 世界红十字日 \ if ( mo == 0x05 && dd == 0x12 ){ lcm_w_word(\ 国际护士节 \ if ( mo == 0x05 && dd == 0x05 ){ lcm_w_word(\近日注意母亲节 \ if ( mo == 0x05 && dd == 0x15 ){ lcm_w_word(\ 国际家庭日 \if ( mo == 0x05 && dd == 0x31 ){ lcm_w_word(\ 世界无烟日 \ if ( mo == 0x06 && dd == 0x01 ){ lcm_w_word(\ 国际儿童节 \6 if ( mo == 0x06 && dd == 0x05 ){ lcm_w_word(\ 世界环境日 \ if ( mo == 0x06 && dd == 0x26 ){ lcm_w_word(\ 国际禁毒日 \ if ( mo == 0x06 && dd == 0x06 ){ lcm_w_word(\ 全国爱眼日 \ if ( mo == 0x06 && dd == 0x13 ){ lcm_w_word(\近日注意父亲节 \if ( mo == 0x06 && dd == 0x15 ){ lcm_w_word(\近日注意父亲节 \ if ( mo == 0x07 && dd == 0x01 ){ lcm_w_word(\香港回归记念日 \if ( mo == 0x07 && dd == 0x07 ){ lcm_w_word(\抗日战争记念日 \if ( mo == 0x07 && dd == 0x11 ){ lcm_w_word(\ 世界人口日 \if ( mo == 0x08 && dd == 0x01 ){ lcm_w_word(\ 八一建军节 \8 if ( mo == 0x08 && dd == 0x08 ){ lcm_w_word(\ 中国男子节 \if ( mo == 0x08 && dd == 0x15 ){ lcm_w_word(\抗战胜利记念日 \if ( mo == 0x09 && dd == 0x10 ){ lcm_w_word(\ 中国教师节 \9 if ( mo == 0x09 && dd == 0x18 ){ lcm_w_word(\九·一八事变记念\if ( mo == 0x09 && dd == 0x20 ){ lcm_w_word(\ 国际爱牙日 \if ( mo == 0x09 && dd == 0x27 ){ lcm_w_word(\ 世界旅游日 \if ( mo == 0x10 && dd == 0x01 ){ lcm_w_word(\ 中国国庆节 \if ( mo == 0x10 && dd == 0x04 ){ lcm_w_word(\ 世界动物日 \if ( mo == 0x10 && dd == 0x24 ){ lcm_w_word(\ 联合国日 \if ( mo == 0x10 && dd == 0x12 ){ lcm_w_word(\明天国际教师节 \if ( mo == 0x10 && dd == 0x13 ){ lcm_w_word(\ 国际教师节 \if ( mo == 0x11 && dd == 0x10 ){ lcm_w_word(\ 世界青年节 \

if ( mo == 0x11 && dd == 0x17 ){ lcm_w_word(\ 世界学生节 \if ( mo == 0x12 && dd == 0x01 ){ lcm_w_word(\ 世界艾滋病日 \if ( mo == 0x12 && dd == 0x23 ){ lcm_w_word(\ 明晚平安夜 \if ( mo == 0x12 && dd == 0x24 ){ lcm_w_word(\ 今晚平安夜 \if ( mo == 0x12 && dd == 0x25 ){ lcm_w_word(\ 圣诞快乐 \if ( mo == 0x12 && dd == 0x31 ){ lcm_w_word(\ 明日新年 \else{

if ( hh >= 0x04 && hh < 0x06 ){ lcm_w_word(\★★__▲▲__凌晨\ if ( hh >= 0x06 && hh < 0x08 ){ lcm_w_word(\☆○__▲△__早晨\ if ( hh >= 0x08 && hh < 0x12 ){ lcm_w_word(\●__▲▲__上午\ if ( hh == 0x12) { lcm_w_word(\▲●▲__中午\ if ( hh >= 0x13 && hh < 0x18 ){ lcm_w_word(\▲▲__●__下午\ if ( hh >= 0x18 && hh < 0x22 ){ lcm_w_word(\△▲__●☆__晚上\ if ( hh >= 0x22 && hh <= 0x23 ){ lcm_w_word(\△▲__★☆__夜里\ if ( hh >= 0x00 && hh < 0x04 ){ lcm_w_word(\★▲▲★__深夜\ } }

/****************************************************************************/ //初始化LCM

void lcm_init(void) {

delaynms(100); //启动等待,等LCM讲入工作状态 lcm_w_test(0,0x30); //8 位介面,基本指令集

lcm_w_test(0,0x0c); //显示打开,光标关,反白关

lcm_w_test(0,0x01); //清屏,将DDRAM的地址计数器归零 delaynms(100); //启动等待,等LCM讲入工作状态 }

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

//写指令或数据 (0,指令) (1,数据) void lcm_w_test(bit start, unsigned char ddata) { unsigned char start_data,Hdata,Ldata; if(start==0) start_data=0xf8; //0:写指令 else start_data=0xfa; //1:写数据

Hdata=ddata&0xf0; //取高四位 Ldata=(ddata<<4)&0xf0; //取低四位

lcm_w_byte(start_data); //发送起始信号 delaynms(5); //延时是必须的 lcm_w_byte(Hdata); //发送高四位 delaynms(5); //延时是必须的 lcm_w_byte(Ldata); //发送低四位 delaynms(5); //延时是必须的 }

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

//发送一个字节(底层函数)

void lcm_w_byte(unsigned char bbyte) { unsigned char i; for(i=0;i<8;i++){

SID=bbyte&0x80; //取出最高位 SCLK=1; SCLK=0;

bbyte<<=1; //左移 } }

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

//延时(LCM占用)

void delaynms(unsigned int di) { unsigned int da,db; for(da=0;da

/*****************************************************************************/ //清屏函数

void lcm_clr(void){ lcm_w_test(0,0x01); delaynms(40); //启动等待,等LCM讲入工作状态 }

/*****************************************************************************/ //向LCM发送一个字符串,长度64字符之内。 //应用:lcm_w_word(\您好!\ void lcm_w_word(unsigned char *str){ while(*str != '\\0'){ lcm_w_test(1,*str++);

lcm_w_word(\月\} //}

/*****************************************************************************/ //星期处理并送入LCM的指定区域 void lcm_w_xq(void){ unsigned char sel; //if(read_clock(0x8b) != xq){ xq = read_clock(0x8b); sel = (read_clock(0x8b)); //字节低4位的BCD码放入sel lcm_w_test(0,0x97);//写入指定区域(97H 第二行第8个字) if(sel==7) {lcm_w_word(\日\ // if(sel==6) {lcm_w_word(\六\ // if(sel==5) {lcm_w_word(\五\ // if(sel==4) {lcm_w_word(\四\ //

if(sel==3) {lcm_w_test(1,0xc8);lcm_w_test(1,0xfd);} //此指令等于lcm_w_word(\三\因为“三”的内码失效。

if(sel==2) {lcm_w_word(\二\ //

if(sel==1) {lcm_w_word(\一\ //星期一 lcm_w_test(0,0x95); lcm_w_word(\星期\ //} }

/*****************************************************************************/ //向LCM中填写 日 数据 void lcm_w_dd(void){

// if(read_clock(0x87) != dd){ dd = read_clock(0x87); lcm_w_test(0,0x92); if(dd/16 != 0){lcm_w_test(1,(dd/16)+0x30);} //十位消隐 else{lcm_w_test(1,0x20);}//同上 lcm_w_test(1,dd+0x30); lcm_w_test(0,0x93); lcm_w_word(\日 \ } //}

/*****************************************************************************/ //向LCM中填写 小时 数据 void lcm_w_hh(void){ if(read_clock(0x85) != hh){ hh = read_clock(0x85); if (hh > 0x07 && hh < 0x22 && w == 0){ beep = 0; led_r = 0; DelayM(100);

beep = 1; led_r = 1; } } lcm_w_test(0,0x88); lcm_w_test(1,(hh/16)+0x30); lcm_w_test(1,hh+0x30); } //}

/*****************************************************************************/ //向LCM中填写 分钟 数据 void lcm_w_mm(void){ if(read_clock(0x83) != mm){ mm = read_clock(0x83); if( w == 0){

days(); //节日显示 updata (); //刷新数据 } } lcm_w_test(0,0x89); lcm_w_test(1,0x3a); //\ lcm_w_test(1,(mm/16)+0x30); lcm_w_test(1,mm+0x30); lcm_w_test(1,0x2e); //\ }

/*****************************************************************************/ //刷新数据

void updata (void){

lcm_w_hh();//刷新 小时 lcm_w_dd();//刷新 日 lcm_w_xq();//更新星期值 lcm_w_mo();//刷新 月 lcm_w_yy();//刷新 年 }

/*****************************************************************************/ //向LCM中填写 秒 数据 void lcm_w_ss(void){ unsigned int i=0; unsigned char a=0,b=0,c=0; if(read_clock(0x81) != ss){ //判断是否需要更新 ss = read_clock(0x81); //更新数据 lcm_w_test(0,0x8b); //秒值在LCM上的写入位置 lcm_w_test(1,(ss/16)+0x30); //写十位 lcm_w_test(1,ss+0x30); //写个位

led_b = ~led_b; //背光闪烁 lcm_w_mm();//刷新 分 lcm_w_test(0,0x8d); //温度在LCM上的写入位置 i=ReadTemperature();//读温度并送显 a=i/100;

lcm_w_test(1,a+0x30); //显示温度十位 b=i/10-a*10;

lcm_w_test(1,b+0x30); //个位 lcm_w_test(1,0x2e); //\c=i-a*100-b*10;

lcm_w_test(1,c+0x30); //小位1位 lcm_w_word(\℃\//度C } }

/*****************************************************************************/ //---主程序---//

main() { unsigned char e=0; KEY_I = 0;KEY_1 = 1;KEY_2 = 1;KEY_3 = 1;KEY_4 = 1;//初始键盘 yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新 beep = 0; DelayM(900); beep = 1;

lcm_init();//初始化液晶显示器 lcm_clr();//清屏

lcm_w_word(\ 12864LcdClock Hello !! from

DoYoung.net\显示欢迎字 //----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺 DelayM(3000); //显示等留3秒 //lcm_w_test(0,0x80); //lcm_w_word(\ [Set]\

while(1){ if (w == 0){ //正常走时 lcm_w_ss();//刷新 秒 } else { //启动调时 } //------------------------------------------------------------------ if (KEY_3 == 0) // 设置时间

{

DelayM(20); //去抖 led_g3 = 0;led_r = 1;

if(KEY_3 == 0 && w == 1) //当是调时状态 本键用于调整下一项 { e++; if (e >= 6 ){e = 0;} Set_time(e);//调整 }

if(KEY_3 == 0 && w == 0) //当是正常状态时就进入调时状态 { led_b = 1;//

lcm_clr();//清屏

//yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新 w=1; //进入调时 lcm_w_test(0,0x9e); lcm_w_word(\lcm_w_test(0,0x80); lcm_w_word(\lcm_w_test(0,0x85); lcm_w_word(\lcm_w_test(0,0x98); lcm_w_word(\

Set_time(e);//调整 } while(KEY_3 == 0);//等待键松开 led_g3 = 1; led_r = 0;//红灯亮,表示调时 } //------------------------------------------------------------------ if (KEY_1 == 0) // 当在调时状态时就退出调时 { DelayM(20);led_g1 = 0;led_r = 1; if(KEY_1 == 0 && w == 1){

}

if(KEY_1 == 0 && w == 0){ lcm_clr();//清屏 lcm_w_test(0,0x80); lcm_w_word(\ 12864LcdClock V1.01 2006-11-26 Hello !! from

w = 0;

e = 0;

//退出调时 //“下一项”计数器清0

DoYoung.net\

}

//----------|-------1-------|-------3-------|-------2-------|-------4-------|-----//标尺 while(KEY_1 == 0);//等待键松开

lcm_clr();//清屏

//lcm_w_word(\ [Set]\

//yy=0xff;mo=0xff;dd=0xff;xq=0xff;hh=0xff;mm=0xff;ss=0xff; //各数据刷新

days(); //节日显示 updata (); //刷新数据 lcm_w_mm();//刷新 分

while(KEY_1 == 0);//等待键松开 led_g1 = 1; } //------------------------------------------------------------------ if (KEY_2 == 0 && w == 1){ // 加减调整{ DelayM(20);led_g2 = 0;led_r = 1; if(KEY_2 == 0 && w == 1){

}

Set_time(e);//调整

while(KEY_2 == 0);//等待键松开 led_g2 = 1; led_r = 0; } //------------------------------------------------------------------ if (KEY_4 == 0 && w == 1){ // 加减调整 DelayM(20); led_g4 = 0;led_r = 1; if(KEY_4 == 0 && w == 1){

Set_time(e);//调整 } while(KEY_4 == 0);//等待键松开 led_g4 = 1; led_r = 0; } //------------------------------------------------------------------ if(KEY_1 == 1 && KEY_2 == 0 && KEY_3 == 1 && KEY_4 == 0){ //时钟初始化{ led_r = 0; DelayM(3000); led_r = 1; if(KEY_1 == 0 && KEY_2 == 0&& KEY_3 == 1&& KEY_4 == 0){

}

}

} Init_1302();

lcm_w_test(0,0x80); lcm_clr();//清屏 lcm_w_word(\初始化成功! 2007-1-1 00:00.0\ //----------|-------1-------|-------3-------| while(1); }

}

}

} Init_1302();

lcm_w_test(0,0x80); lcm_clr();//清屏 lcm_w_word(\初始化成功! 2007-1-1 00:00.0\ //----------|-------1-------|-------3-------| while(1); }

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

Top