⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ds12cr887mnl.c

📁 基于DS12887的多功能电子智能时钟
💻 C
📖 第 1 页 / 共 2 页
字号:
/*-----------------------------------------------------------------------------
电子智能时钟源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 + -