📄 ds12cr887mnl.c
字号:
/*-----------------------------------------------------------------------------
电子智能时钟源wj
单片机:STC89C52RC
晶振:12MHz
时钟芯片:DS12CR887+5
液晶屏:LCM-12864-ST7920
时间:2009.04.16
LCM12864使用并口连接方式
-----------------------------------------------------------------------------*/
/*头文件---------------------------------------------------------------------*/
#include <reg52.h>
#include <string.h>
#include "DS12CR887mnl.h"
/*定义全局变量---------------------------------------------------------------*/
uchar sec,min,hour, day, date, month,year;
//秒,分,小时,星期,日期,月, 年
bit w = 0; //调时标志位
/*延时程序-------------------------------------------------------------------*/
//延时函数 1MS/次
void DelayM(uint a)
{
uchar i;
while( --a != 0)
{
for(i = 0; i < 125; i++); //一个 ; 表示空语句,CPU空转。
} //i 从0加到125,CPU大概就耗时1毫秒
}
//延时函数
void Delay(int num)
{
while(num--);
}
/*DS12CR887驱动程序----------------------------------------------------------*/
//往DS12CR887写数据函数
void ds_write(uchar add,uchar date)
{
DS_CS=0;
DS_DS=1;
DS_RW=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_RW=0;
Ds_Bus=date;
DS_RW=1;
DS_AS=1;
DS_CS=1;
}
//读取DS12CR887的数据
uchar ds_read(uchar add)
{
uchar z;
DS_CS=0;
DS_RW=1;
DS_DS=1;
DS_AS=1;
Ds_Bus=add;
DS_AS=0;
DS_DS=0;
Ds_Bus=0xff;
z=Ds_Bus;
DS_DS=1;
DS_AS=1;
DS_CS=1;
return z;
}
//DS12CR887初始化
void ds_int()
{
DS_AS=0;
DS_DS=0;
DS_RW=0;
ds_write(0x0a,0x20);//DS12CR887寄存器A功能设置,开启时钟振荡器
}
/*12864液晶显示屏并口驱动程序------------------------------------------------*/
//检查忙位(底层)
void chk_busy()
{
LCM_RS=0;
LCM_RW=1;
LCM_EN=1;
Lcd_Bus=0xff;
while((Lcd_Bus&0x80)==0x80);
LCM_EN=0;
}
//写指令到LCD(底层)
void write_com(uchar cmdcode)
{
chk_busy();
LCM_RS=0;
LCM_RW=0;
LCM_EN=1;
Lcd_Bus=cmdcode;
LCM_EN=0;
}
//写数据到LCD(底层)
void write_data(uchar Dispdata)
{
chk_busy();
LCM_RS=1;
LCM_RW=0;
LCM_EN=1;
Lcd_Bus=Dispdata;
LCM_EN=0;
}
//初始化LCD屏(被调用层)
void lcm_init()
{
LCM_PSB=1; //如果液晶屏的PSB在电路板中接了高电平的,这里可以屏蔽
LCM_RST=1; //如果液晶屏的RST在电路板中接了高电平的,这里可以屏蔽
write_com(0x30); //选择8bit数据流
write_com(0x0c); //开显示(无游标、不反白)
write_com(0x01); //清除显示,并且设定地址指针为00H
}
//向LCM发送一个字符串,长度64字符之内。(被调用层)
//应用:lcm_w_word("您好!");
void lcm_w_word(uchar *s)
{
while(*s>0)
{
write_data(*s);
s++;
}
}
//写指令或数据(被调用层)
void lcm_w_test(bit i,uchar word)
{
if(i == 0)
{
write_com(word);//写指令或数据(0,指令)
}
else
{
write_data(word);//写指令或数据(1,数据)
}
}
//清屏函数
void lcm_clr(void)
{
lcm_w_test(0,0x01);
}
/*DS18B20驱动程序------------------------------------------------------------*/
//初始化ds1820函数
void Init_DS18B20(void)
{
uchar x=0;
DQ = 1; //DQ复位
Delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
Delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
Delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
Delay(20);
}
//读一个字节函数
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
if(DQ)
dat|=0x80;
Delay(4);
}
return(dat);
}
//写一个字节函数
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8; i>0; i--)
{
DQ = 0;
DQ = dat&0x01;
Delay(5);
DQ = 1;
dat>>=1;
}
}
//读取温度函数
uint ReadTemperature(void)
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器
a=ReadOneChar(); //读低8位
b=ReadOneChar(); //读高8位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t= tt*10+0.5; //放大10倍输出并四舍五入
return(t);
}
/*公历节日数据库-------------------------------------------------------------*/
void days (void)
{
lcm_w_test(0,0x98);//在液晶屏的第四行第一列显示以下节日提示
if ( month == 1 && date == 1 ){ lcm_w_word(" 元旦快乐 "); }//1月
if ( month == 1 && date == 28 ){ lcm_w_word(" 世界麻风日 "); }
if ( month == 2 && date == 2 ){ lcm_w_word(" 世界湿地日 "); }//2月
if ( month == 2 && date == 13 ){ lcm_w_word(" 明天情人节了 "); }
if ( month == 2 && date == 14 ){ lcm_w_word(" 今天是情人节 "); }
if ( month == 3 && date == 1 ){ lcm_w_word(" 国际海豹日 "); }//3月
if ( month == 3 && date == 3 ){ lcm_w_word(" 全国爱耳日 "); }
if ( month == 3 && date == 8 ){ lcm_w_word("国际劳动妇女节 "); }
if ( month == 3 && date == 12 ){ lcm_w_word(" 植树节 "); }
if ( month == 3 && date == 14 ){ lcm_w_word(" 国际警察日 "); }
if ( month == 3 && date == 15 ){ lcm_w_word(" 消费者权益日 "); }
if ( month == 3 && date == 17 ){ lcm_w_word(" 国际航海日 "); }
if ( month == 3 && date == 21 ){ lcm_w_word(" 世界森林日 "); }
if ( month == 3 && date == 22 ){ lcm_w_word(" 世界水日 "); }
if ( month == 3 && date == 23 ){ lcm_w_word(" 世界气象日 "); }
if ( month == 3 && date == 24 ){ lcm_w_word("世界防治结核病日"); }
if ( month == 4 && date == 1 ){ lcm_w_word("愚人节 小心上当"); }//4
if ( month == 4 && date == 7 ){ lcm_w_word(" 世界卫生日 "); }
if ( month == 4 && date == 8 ){ lcm_w_word(" 复活节 "); }
if ( month == 4 && date == 13 ){ lcm_w_word(" 黑色星期五 "); }
if ( month == 5 && date == 1 ){ lcm_w_word("五一国际劳动节 "); }//5
if ( month == 5 && date == 4 ){ lcm_w_word(" 青年节 "); }
if ( month == 5 && date == 8 ){ lcm_w_word(" 世界红十字日 "); }
if ( month == 5 && date == 12 ){ lcm_w_word(" 国际护士节 "); }
if ( month == 5 && date == 5 ){ lcm_w_word("近日请注意母亲节"); }
if ( month == 5 && date == 15 ){ lcm_w_word(" 国际家庭日 "); }
if ( month == 5 && date == 31 ){ lcm_w_word(" 世界无烟日 "); }
if ( month == 6 && date == 1 ){ lcm_w_word(" 国际儿童节 "); }//6
if ( month == 6 && date == 5 ){ lcm_w_word(" 世界环境日 "); }
if ( month == 6 && date == 26 ){ lcm_w_word(" 国际禁毒日 "); }
if ( month == 6 && date == 6 ){ lcm_w_word(" 全国爱眼日 "); }
if ( month == 6 && date == 13 ){ lcm_w_word("近日请注意父亲节"); }
if ( month == 6 && date == 15 ){ lcm_w_word("近日请注意父亲节"); }
if ( month == 7 && date == 1 ){ lcm_w_word(" 七一党生日 "); }//7
if ( month == 7 && date == 7 ){ lcm_w_word("抗日战争纪念日 "); }
if ( month == 7 && date == 11 ){ lcm_w_word(" 世界人口日 "); }
if ( month == 8 && date == 1 ){ lcm_w_word(" 八一建军节 "); }//8
if ( month == 8 && date == 8 ){ lcm_w_word(" 中国男子节 "); }
if ( month == 8 && date == 15 ){ lcm_w_word("抗战胜利纪念日 "); }
if ( month == 9 && date == 10 ){ lcm_w_word(" 中国教师节 "); }//9
if ( month == 9 && date == 18 ){ lcm_w_word("九一八事变纪念日"); }
if ( month == 9 && date == 20 ){ lcm_w_word(" 国际爱牙日 "); }
if ( month == 9 && date == 27 ){ lcm_w_word(" 世界旅游日 "); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -