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

📄 ds1302clock.c.bak

📁 89C52控制1302和18B20和1602的时钟和温度的实时显示
💻 BAK
📖 第 1 页 / 共 3 页
字号:
/******************************************************************************
Copyright 2007 
All rights reserved.

文件名	:ds1302clock.c
模块名称:
功能概要:

取代版本:0.0.1
修改人	:pulan
完成日期:2007.07.08
升级说明:create
CPU: stc89c58   主频:11.0592M
液晶型号:       生产厂家:        驱动芯片:
硬件连接:
---------------------------------------------------------------
|DB0-----P0.0 | DB4-----P0.4 | RW-------P2.2 | 
|DB1-----P0.1 | DB5-----P0.5 | RS-------P2.1 | 
|DB2-----P0.2 | DB6-----P0.6 | E -------P2.5 |
|DB3-----P0.3 | DB7-----P0.7 | Vo接1k电阻到地
---------------------------------------------------------------
******************************************************************************/
#include <reg52.h>
#include <string.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

#define LCM_Data P0
#define Busy 0x80 //用于检测LCM状态字中的Busy标识
sbit LCM_RW = P2^2;//定义引脚
sbit LCM_RS = P2^1;
sbit LCM_E  = P2^5;

sbit key1  = P1^5;
sbit key2  = P1^6;
sbit key3  = P1^7;
sbit key4  = P3^2;

uchar id,timecount;
bit flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志
void Disp_line1(void); //显示屏幕第一行 
void Disp_line2(void); //显示屏幕第二行
void id_case1_key();

//*********** DS1302 时间显示定义部分
sbit T_CLK = P3^5;
sbit T_IO  = P3^6;
sbit T_RST = P3^7;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void Set(uchar,uchar);     //根据选择调整相应项目
void   RTInputByte(uchar);       /* 输入 1Byte */
uchar  RTOutputByte(void);       /* 输出 1Byte */
void   W1302(uchar, uchar);   // 向DS1302写入一个字节
uchar  R1302(uchar);          // 从DS1302读出一个字节
void   Set1302(uchar * ); //  设置时间 
bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
//初始化后设置为:04年12月2日星期4 0点0分0秒
uchar inittime[7]={0x00,0x00,0x00,0x02,0x12,0x04,0x04};
//                          秒  分钟 小时  日   月   年  星期

//***** 18B20温度显示定义部分 
sbit DQ = P1^4; //18B20 接P07口
typedef unsigned char byte;
typedef unsigned int  word;
Read_Temperature(char,char);
void mychar(void);
void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
                           //              0.5, 0.25, 0.125   
//******* 1602LCD驱动 **********************************************************
void WriteDataLCM(uchar WDLCM);
void WriteCommandLCM(uchar WCLCM,BuysC);
uchar ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(uchar X, uchar Y, uchar DData);
void DisplayListChar(uchar X, uchar Y, uchar code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
uchar code week[]={"Week."};
/******************************************************************************************
* 函数名称    :
* 功能描述    :
* 参数        :  参数名称:	输入/输出?	类型		描述
* 
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    : 			 修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void main(void)
{  
  	Delay400Ms(); //启动等待,等LCM讲入工作状态
  	LCMInit(); //LCM初始化
  	Delay5Ms(); //延时片刻(可不要)
  	mychar(); //显示自定义字符

  	TMOD=0x01;
  	TH0=(65535-50000)/256;
  	TL0=(65535-50000)%256;
  	EA=1;
  	TR0=1;
  	ET0=1;  
  	W1302(0x90,0xa5);//打开充电二级管  一个二级管串联一个2K电阻 
  	W1302(0x8e,0x80);//写保护,禁止写操作 
  	adjust_res(0x1f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
  	while(1)
   	{              
     	if ((key1|key2)==0) //初始化
      	{
       		Delay5Ms();
       		if ((key1|key2)==0) 
       			Set1302(inittime);
      	}
     	if (key3==0) // 设置和选择项目键
      	{
       		Delay5Ms();
       		if(key3==0)
       		{
       			id++;
       			if(id>7) 
       				id=0;
       		}
       	while(key3==0);    
      	}
     switch(id)
      {
       		case 0:
         		sec=0;
         		Disp_line1();
         	 	Disp_line2();
         		break;
       		case 1://年
         		year=1;
         		Disp_line1(); 
         		Disp_line2();                  
         		id_case1_key();
         		break;
       		case 2://月
         		year=0;
         		mon=1;
         		Disp_line1(); 
         		Disp_line2();                 
         		id_case1_key();
         		break;
       		case 3://日
         		mon=0;
         		day=1;
         		Disp_line1(); 
         		Disp_line2();
         		id_case1_key();
         		break;             
      	 	case 4://星期
         		day=0;
         		weekk=1;
         		Disp_line1(); 
         		Disp_line2();         
         		id_case1_key();
         		break;
       		case 5://小时
         		weekk=0;
         		hour=1;
         		Disp_line1(); 
         		Disp_line2(); 
         		id_case1_key();      
         		break;       
       		case 6://分钟
         		hour=0;
         		min=1;
         		Disp_line1(); 
         		Disp_line2(); 
         		id_case1_key();
         		break;
       		case 7://秒
         		min=0;
         		sec=1;
         		Disp_line1(); 
         		Disp_line2();             
         		id_case1_key();
         		break;              
      }
    }
}
/******************************************************************************************
* 函数名称    :
* 功能描述    :中断入口,冒号闪烁
* 参数        :  参数名称:	输入/输出?	类型		描述
* 
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    : 			 修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void t0(void) interrupt 1 using 0
{
  	TH0=(65535-50000)/256; //50ms定时
  	TL0=(65535-50000)%256;  
  	timecount++;
  	if(timecount>9)
   	{
    	timecount=0;    
    	flag=~flag;             
   	}  
}
/******************************************************************************************
* 函数名称    :id_case1_key
* 功能描述    :id为1时的下一级选择
* 参数        :  参数名称:	输入/输出?	类型		描述
* 
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    : 			 修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void id_case1_key()
{
  	if(key2==0) //增加
      {
       	Delay5Ms();
       	if(key2==0) 
       		Set(id,0);  
       	if(id!=7)  
       		while(key2==0);    
      }
   	if(key1==0)  //减少
      {
       	Delay5Ms();
       	if(key1==0) 
       		Set(id,1);          
       	if(id!=7) 
       		while(key1==0);    
      }
}

/******************************************************************************************
* 函数名称    :Set
* 功能描述    :根据选择调整相应项目并写入DS1302
* 参数        :  参数名称:	输入/输出?	类型		描述
* 
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    : 			 修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Set(uchar sel,uchar sel_1) 
{
  	signed char address,item;
  	signed char max,mini;
  	if(sel==7)  
  		{
  			address=0x80; 
  			max=0;
  			mini=0;
  		}     //秒
  	if(sel==6)  
  		{
  			address=0x82; 
  			max=59;
  			mini=0;
  		}    //分钟
  	if(sel==5)  
  		{
  			address=0x84; 
  			max=23;
  			mini=0;
  		}    //小时
  	if(sel==3)  
  		{
  			address=0x86; 
  			max=31;
  			mini=1;
  		}    //日
  	if(sel==2)  
  		{
  			address=0x88; 
  			max=12;mini=1;
  		}    //月
  	if(sel==1)  
  		{
  			address=0x8c; 
  			max=99;mini=0;
  		}    //年
  	if(sel==4)  
  		{
  			address=0x8a; 
  			max=7; mini=1;
  		}    //星期
  
  	item=R1302(address+1)/16*10+R1302(address+1)%16;
  	if (sel_1==0) 
  		item++;  
  		else 
  			item--;
  	if(item>max) item=mini;   
  	if(item<mini) item=max;
           
  	W1302(0x8e,0x00);//允许写操作
  	W1302(address,item/10*16+item%10);
  	W1302(0x8e,0x80);//写保护,禁止写操作  
}

/******************************************************************************************
* 函数名称    :Disp_line1
* 功能描述    :屏幕显示第一行 时间和温度
* 参数        :  参数名称:	输入/输出?	类型		描述
* 
* 返回值      :
* 作者        :
* 创建日期    :2006-12-19
* 全局变量    :
* 全局静态变量:
* 局部静态变量:
*----------------------------------------修改历史------------------------------------------
* 当前版本    : 			 修改人:                  修改日期:
* 修改说明    :
******************************************************************************************/
void Disp_line1(void) 
{  
  	Read_Temperature(10,0); //温度显示
  //冒号闪烁     
  	if(flag==0)
    	{
    		DisplayOneChar(3,0,0x3a); 
    		DisplayOneChar(6,0,0x3a);
    	}
  	else
    	{
    		DisplayOneChar(3,0,0x20); 
    		DisplayOneChar(6,0,0x20);
    	}

  	if(sec==1)  //秒闪烁标志位
    	{
     	if(flag==1)
       {    
        DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒
        DisplayOneChar(8,0,R1302(0x81)%16+0x30);        
       }
     else
       {
        DisplayOneChar(7,0,0x20); //显示秒
        DisplayOneChar(8,0,0x20);    
       }
    } 
  else
    {
     DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒
     DisplayOneChar(8,0,R1302(0x81)%16+0x30);         
    }    
   

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -