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

📄 ds1302.c

📁 用ds18b20+ds1302+89s52做的时钟
💻 C
📖 第 1 页 / 共 2 页
字号:
/************************************/
/*杭州电子&计算机工作室				*/
/*http://www.hificat.com			*/
/*DS1302测试程序					*/
/*目标器件:AT89S51					*/
/*晶振:11.0592MHZ					*/
/*编译环境:Keil 7.50A				*/
/************************************/

/*********************************包含头文件********************************/
#include "reg51.h"
#include <intrins.h>

/*********************************端口定义**********************************/
sbit DS1302_CLK = P1^0;
sbit DS1302_IO  = P1^1;
sbit DS1302_RST = P1^2;

/*******************************共阳LED段码表*******************************/
unsigned char code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};

/******************************定义全局变量*********************************/
unsigned char second,minute,hour,week,day,month,year;		//秒、分、时、星期、日、月、年
//unsigned char minute1,hour1;
unsigned char second1,minute1,hour1,week1,day1,month1,year1;
unsigned char t1,t2,i;
unsigned char time[]={0x08,0x06,0x19,0x04,0x09,0x30,0x00};	//初始时间数组

//P=8C

unsigned  char secondchar,minutechar,hourchar,weekchar,daychar,monthchar,yearchar;

unsigned char keysum ;

sbit	K1 = P3^2;
sbit	K2 = P3^3;

unsigned char key_s, key_v, tmp;
unsigned char key_s1, key_v1;
//int kk;

/////////////////////温度/////
sbit DQ=P3^3;   				//数据传输线接单片机的相应的引脚

/*********************************定义全局变量******************************/
unsigned char tempL=0; 			//临时变量低位
unsigned char tempH=0;			//临时变量高位
float temperature;     			//温度值



/****************************************************************************
函数功能:延时子程序
入口参数:k
出口参数:
****************************************************************************/
void delayy(unsigned int k)
{         
	unsigned int n;     
	n=0;       
	while(n < k)      
	{n++;}        
	return;       
}    


void delay1(void)
{
	int k;
	for(k=0;k<400;k++);
}     

/****************************************************************************
函数功能:数码管扫描延时子程序
入口参数:
出口参数:
****************************************************************************/


/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void displayy(int k)
{
//	P2=0xfe;			
//	P0=tab[k/1000];
//	delay1();
//	P2=0xfd;
//	P0=tab[k%1000/100];
//	delay1();
	P2=0xfb;
	P0=tab[k%100/10];
	delay1();
	P2=0xf7;
	P0=tab[k%10];
	delay1();
    P2=0xef;
	P0=0xc6;
	delay1();

}

/****************************************************************************
函数功能:DS18B20初始化子程序
入口参数:
出口参数:
****************************************************************************/
Init_DS18B20(void)
{
	unsigned char x=0;
  	DQ=1;          			//DQ先置高
  	delayy(8);            	//延时
  	DQ=0;             		//发送复位脉冲
  	delayy(85);        	 	//延时(>480ms)
  	DQ=1;          			//拉高数据线
  	delayy(14);       		//等待(15~60ms) 
}

/****************************************************************************
函数功能:向DS18B20读一字节数据
入口参数:
出口参数:dat
****************************************************************************/
ReadOneChar(void)  			
{
	unsigned char i=0; 		
	unsigned char dat=0;
    for (i=8;i>0;i--)  		
		{
			DQ=1;
    		delayy(1);
    		DQ=0;      
    		dat>>=1;
   			DQ=1;
    		if(DQ)
   			dat|=0x80;
    		delayy(4);
		}
    return(dat);
}

/****************************************************************************
函数功能:向DS18B20写一字节数据
入口参数:dat
出口参数:
****************************************************************************/
WriteOneChar(unsigned char dat)
{ 
	unsigned char i=0; 		
	for(i=8;i>0;i--)  	
	{
		DQ=0;    	
		DQ=dat&0x01;
		delayy(5);
		DQ=1;
		dat>>=1;
	}
	delayy(4);
}

/****************************************************************************
函数功能:向DS18B20读温度值
入口参数:
出口参数:temperature
****************************************************************************/
ReadTemperature(void)
{  
	Init_DS18B20();  			//初始化
	WriteOneChar(0xcc);  		//跳过读序列号的操作
	WriteOneChar(0x44); 		//启动温度转换
	delayy(125);   				//转换需要一点时间,延时
	Init_DS18B20();  			//初始化
	WriteOneChar(0xcc);  		//跳过读序列号的操作
	WriteOneChar(0xbe); 		//读温度寄存器(头两个值分别为温度的低位和高位)
	tempL=ReadOneChar(); 		//读出温度的低位LSB
	tempH=ReadOneChar(); 		//读出温度的高位MSB  
 	//温度转换,把高低位做相应的运算转化为实际温度
	temperature=((tempH*256)+tempL)*0.0625; 
	delayy(200);
	return(temperature);
}

/****************************************************************************
函数功能:主程序
入口参数:
出口参数:
****************************************************************************/     
////////////////////////////////////////////////////////////////////////////////////////////////


/****************************************************************************
函数功能:数码管扫描延时子程序
入口参数:
出口参数:
****************************************************************************/


void delayms(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}


void delayms1(unsigned char ms)	
// 延时子程序
{						
	unsigned char i;
	while(ms--)
	{
		for(i = 0; i < 120; i++);
	}
}


void displayhour(void)
{
	P2=0xfe;
    P0=0x8c;
	delayms1(1);
			
	P2=0xfd;
    P0=tab[5];
	delayms1(1);

    P2=0xf7;
    P0=tab[hour1/10];
	delayms1(1);

//	P2=0xfd;
    P2=0xef;
	P0=tab[hour1%10];
	delayms1(1);
}

void displayminuite(void)
{

	P2=0xfe;
    P0=0x8c;
	delayms1(1);
			
	P2=0xfd;
    P0=tab[6];
	delayms1(1);

	P2=0xf7;
	P0=tab[minute1/10];
	delayms1(1);

	P2=0xef;
	P0=tab[minute1%10];
	delayms1(1);

}


void displayyear(void)
{
    P2=0xff;

	P2=0xfe;
    P0=0x8c;
	delayms1(1);
			
	P2=0xfd;
    P0=tab[1];
	delayms1(1);

	P2=0xf7;
	P0=tab[year1/10];
	delayms1(1);

	P2=0xef;
	P0=tab[year1%10];
	delayms1(1);

}


void displaymonth(void)
{

	P2=0xfe;
    P0=0x8c;
	delayms1(1);
			
	P2=0xfd;
    P0=tab[2];
	delayms1(1);

	P2=0xf7;
	P0=tab[month1/10];
	delayms1(1);

	P2=0xef;
	P0=tab[month1%10];
	delayms1(1);

}

void displayday(void)
{


	P2=0xfe;
    P0=0x8c;
	delayms1(1);
			
	P2=0xfd;
    P0=tab[3];
	delayms1(1);

	P2=0xf7;
	P0=tab[day1/10];
	delayms1(1);

	P2=0xef;
	P0=tab[day1%10];
	delayms1(1);

}

void displayweek(void)
{

	P2=0xfe;
    P0=0x8c;
	delayms1(1);
			
	P2=0xfd;
    P0=tab[4];
	delayms1(1);

	P2=0xf7;
	P0=tab[week1/10];
	delayms1(1);

	P2=0xef;
	P0=tab[week1%10];
	delayms1(1);

}


void displaysecond(void)
{
    
	P2=0xfe;
    P0=0x8c;
	delayms1(1);
			
	P2=0xfd;
    P0=tab[7];
	delayms1(1);

	P2=0xf7;
	P0=tab[second1/10];
	delayms1(1);

	P2=0xef;
	P0=tab[second1%10];
	delayms1(1);

	

}
/****************************************************************************
函数功能:数码管显示子程序
入口参数:k
出口参数:
****************************************************************************/
void display(void)
{   
	P2=0xfe;			
	P0=tab[hour/16];
	delay1();

	P2=0xfd;
	P0=tab[hour%16];
	delay1();

//	P2=0xfb;
//	P0=0xbf;			//显示"-"
//	delay1();

	P2=0xfb;
	P0=tab[minute/16];
	delay1();

	P2=0xf7;
	P0=tab[minute%16];
	delay1();

//	P2=0xdf;
//	P0=0xbf;			//显示"-"
//	delay1();

	P2=0xef;

⌨️ 快捷键说明

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