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

📄 12864和1302和18b20的综合.c

📁 采用AT89S51单片机的经典时钟程序
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#define uint   unsigned int
#define uchar  unsigned char 


sbit  E    = P1^2;    // 使能端 //
sbit  RW   = P1^1;    // 读写控制端 //
sbit  RS   = P1^0;    // 数据或指令寄存器选择端 //
sbit psb= P1^3;      //H=并口; L=串口;
sbit LCDrst= P1^4;      //Reset Signal 低电平有效


unsigned char code name00[]={"蚕种催青综合控制"};
unsigned char code name01[]={"温度  . 湿度  . "};
unsigned char code name02[]={"时间            "};
unsigned char code name03[]={"菜单  确定  取消"};


unsigned char hour,minute,second;
unsigned int counter=0;  		  //250us计数单元
unsigned char n,n10;      
/****************/
void Show_Welcome(void);

/****************/
void delay_1(unsigned char tt)//延时1ms
{
   unsigned char j;
   while(tt--)
    {
   for(j=0;j<125;j++)
    {;}
    }
}
//******************/
void wr_com(unsigned char value)//写指令,写指令时必须为RS=0;RW=0;
{
 E=0;
 RS=0;
 RW=0;
 delay_1(1);
 P0=value;
 E=1;
 delay_1(2); //如果没有延时就必须要加查忙指令
 E=0;
}
//****************************/
void wr_data(unsigned char sj)//写数据,写数据时必须为 RS=1;RW=0;
{
 E=0;
 RS=1;
 RW=0;
 P0=sj;
 E=1;
 delay_1(1);//如果没有延时就必须要加查忙指令
 E=0;
}
//**************************/
void reset (void)
{
  LCDrst=1;
  psb=1;
  wr_com(0x30);/*30---基本指令动作*/
  wr_com(0x01);/*清屏,地址指针指向00H*/
  wr_com(0x06);/*光标的移动方向*/
  wr_com(0x0c);/*开显示,关游标*/
}
//********************************/
//outChinese 为函数名
//place 为显示地址的首地址
//unit  字符长度
//charcode[]  要显示数据的内容
void outChinese(unsigned char place,unsigned char unit,unsigned char charcode[] )
{
 unsigned char i;
 wr_com(place);
 for(i=0;i<unit*2;i++)//一个汉字为两个字符
 {wr_data(charcode[i]);}
}
//***********************************/
/*void outchar(unsigned char place,unsigned char unit,unsigned char charcode[] )
{
 unsigned char i;
 wr_com(place);
 for(i=0;i<unit;i++)
 {wr_data(charcode[i]);}
}

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

void display(unsigned char *s)			//写字符串
	{
	for(;*s!='\0';s++)
  	wr_data(*s);
	}			

//**************************************/
void Show_Welcome(void)
	{
	outChinese(0x80,8,name00);//第一行:80-87H
	outChinese(0x90,8,name01);//第二行:90-97H
	outChinese(0x88,8,name02);//第三行:88-8fH
	outChinese(0x98,8,name03);//第四行:98-9fH

	}


////////////////////////////////////////////////////////////
////////////---------------------18B20---------------------/
////////////////////////////////////////////////////////////
sbit  b=P3^3;   
sbit  a=P3^4;
unsigned char D,TH,TL,TA,TB,TC,TD;

//延时--------------------------------------------------------------------
void YS(unsigned int n)
{
while(n)n--;
}
//复位--------------------------------------------------------------------
void REST(void)
{
a=0;
YS(60);//600us
a=1;
YS(50);
}
//写0--------------------------------------------------------------------
void Write_0(void)
{
a=0;
YS(5);//50us
a=1;
}
//写1--------------------------------------------------------------------
void Write_1(void)
{
a=0;
a=0;
a=1;
YS(5);//50us 

}

//写1Byte--------------------------------------------------------------------
void Write_Byte(unsigned char D)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(D&0x01)Write_1();else Write_0();		  //从低位开始写
D=D>>1;
}
}

//读1Byte--------------------------------------------------------------------
unsigned char Read_Byte(void)
{
unsigned char i; D=0;

for(i=0;i<8;i++)
{
a=0;
a=0;
a=0;
a=0;
a=1;
D=D>>1;
if(a){D|=0x80;}

YS(5); //50us 
}
return D;
} 
//读T--------------------------------------------------------------------
void Read_T(void)
{
REST();            		
Write_Byte(0XCC);
Write_Byte(0X44);

REST();
Write_Byte(0XCC);
Write_Byte(0XBE);	

TL=Read_Byte();
TH=Read_Byte();
REST();

TH=(TL>>4)|(TH<<4);
TL=(TL&0x0f)*25/4;

TA=TH/10+48;
TB=TH%10+48;

TC=TL/10+48;
TD=TL%10+48;  
}
//-------------------------------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------
//----------第二个18B20----------------------------------------
//-------------------------------------------------------------
//-------------------------------------------------------------


//复位--------------------------------------------------------------------
void bREST(void)
{
b=0;
YS(60);//600us
b=1;
YS(50);
}
//写0--------------------------------------------------------------------
void bWrite_0(void)
{
b=0;
YS(5);//50us
b=1;
}
//写1--------------------------------------------------------------------
void bWrite_1(void)
{
b=0;
b=0;
b=1;
YS(5);//50us 

}

//写1Byte--------------------------------------------------------------------
void bWrite_Byte(unsigned char D)
{
unsigned char i;
for(i=0;i<8;i++)
{
if(D&0x01)bWrite_1();else bWrite_0();		  //从低位开始写
D=D>>1;
}
}

//读1Byte--------------------------------------------------------------------
unsigned char bRead_Byte(void)
{
unsigned char i; D=0;

for(i=0;i<8;i++)
{
b=0;
b=0;
b=0;
b=0;
b=1;
D=D>>1;
if(b){D|=0x80;}

YS(5); //50us 
}
return D;
} 
//读T--------------------------------------------------------------------
void bRead_T(void)
{
bREST();            		
bWrite_Byte(0XCC);
bWrite_Byte(0X44);

bREST();
bWrite_Byte(0XCC);
bWrite_Byte(0XBE);	

TL=bRead_Byte();
TH=bRead_Byte();
bREST();

TH=(TL>>4)|(TH<<4);
TL=(TL&0x0f)*25/4;

TA=TH/10+48;
TB=TH%10+48;

TC=TL/10+48;
TD=TL%10+48;  
}

//--------------------------------------------
//----------------DS1302----------------------
//--------------------------------------------
//--------------------------------------------


sbit CLK =P3^5;
sbit IO  =P3^6;
sbit RST =P3^7;


//--------------WriteOneByteData-----------------/
void WriteByte(uchar ucda)
    {
	  uchar i; 	  
	  for(i=8;i>0;i--)
	     {
		   IO=(bit)(ucda&0x01);
		   CLK=1;		   
		   CLK=0;
		   ucda>>=1;
		 }
	}

//--------------ReadOneByteData-----------------/
uchar ReadByte(void)
    {
	  uchar i,a;
	  for(i=8;i>0;i--)
	     { 		   		   
		   a>>=1;
		   if(IO)a|=0x80;
		   CLK=1;           
		   CLK=0;
		 }	
	  return(a);
	}
//--------------WriteAddrFist,ThenWriteData-----------------/

void write1302(uchar Addr,uchar Data)
    {
	  RST=0;
	  CLK=0;
	  RST=1;
	  WriteByte(Addr);
	  WriteByte(Data);
	  CLK=1;
	  RST=0;
	}

//--------------WriteAddrFirst,ThenReadData-----------------/

uchar read1302(uchar Addr)
    {
	  uchar Data;
	  RST=0;
	  CLK=0;	
	  RST=1;
	  WriteByte(Addr);
	  Data=ReadByte();
	  CLK=1;
	  RST=0;
	  return(Data);
	}
 ////////////////ds1302初始化//////////////////
void csh1302(void)
{  	
  CLK=0;
  RST=0; 
  write1302(0x8e,0x00);//打开写保护
  write1302(0x90,0x06);//禁止充电
  /////////////////////////////////////////////////
  write1302(0x80,0x00);//预置秒
  write1302(0x82,0x08);//预置分
  write1302(0x84,0x91);//预置时
  write1302(0x86,0x26);//预置日期
  write1302(0x88,0x04);//预置月
  write1302(0x8a,0x06);//预置星期
  write1302(0x8c,0x08);//预置年	  
  ////////////////////////////////////////////////
  write1302(0x80,0x00);//启动时钟
  write1302(0x8e,0x80);//关闭写保护
}

main()
{
  //csh1302();
  CLK=0;
  RST=0; 

reset();
Show_Welcome();
	while(1)
	{
	wr_com(0x8b);
	
	n=read1302(0x85);			   //时
	n&=0x1f;
	wr_data(n/10+48);		     //注意是映射码,液晶中是写入的内部规定的映射表
	wr_data(n%10+48);
	
	display(":");
	
	n10=read1302(0x83);			   //分
	n=read1302(0x83)&0x0f;
	n10=n10>>4;
	n10=n10&0x07;
  	wr_data(n10+48);
  	wr_data(n+48);
  	
	display(":");
	
	n10=read1302(0x81);			   //秒
	n=read1302(0x81)&0x0f;
	n10=n10>>4;
	n10=n10&0x07;
	wr_data(n10+48);
	wr_data(n+48);		 

	
//////////////////////////////////////////////	
	Read_T();

	wr_com(0x92);
	wr_data(TA);
	wr_data(TB);
	display(".");
	wr_data(TC);
//	wr_data(TD);
	
	bRead_T();
	
	wr_com(0x96);
	wr_data(TA);
	wr_data(TB);
	display(".");
	wr_data(TC);
//	wr_data(TD);
	
	}		  



}

⌨️ 快捷键说明

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