DS1302时钟+DS18B20用LCD1602显示系统很简单.docx

上传人:b****5 文档编号:7747578 上传时间:2023-01-26 格式:DOCX 页数:18 大小:115.72KB
下载 相关 举报
DS1302时钟+DS18B20用LCD1602显示系统很简单.docx_第1页
第1页 / 共18页
DS1302时钟+DS18B20用LCD1602显示系统很简单.docx_第2页
第2页 / 共18页
DS1302时钟+DS18B20用LCD1602显示系统很简单.docx_第3页
第3页 / 共18页
DS1302时钟+DS18B20用LCD1602显示系统很简单.docx_第4页
第4页 / 共18页
DS1302时钟+DS18B20用LCD1602显示系统很简单.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

DS1302时钟+DS18B20用LCD1602显示系统很简单.docx

《DS1302时钟+DS18B20用LCD1602显示系统很简单.docx》由会员分享,可在线阅读,更多相关《DS1302时钟+DS18B20用LCD1602显示系统很简单.docx(18页珍藏版)》请在冰豆网上搜索。

DS1302时钟+DS18B20用LCD1602显示系统很简单.docx

DS1302时钟+DS18B20用LCD1602显示系统很简单

DS1302时钟+DS18B20用LCD1602显示(系统很简单)

看仔细点啊 貌似很多这样的图但可不一样喔 最小系统是用AT89s52搭建的!

记得回去自己用protues和Keil仿真一下,这样有利于进一步了解!

故未将仿真好的代码上传,如果真的需要的话可以和我联系!

程序代码:

#include

#include

//#include"LCD1602.h"

//#include"DS1302.h"

#defineuintunsignedint

#defineucharunsignedchar

sbit DS1302_CLK=P1^7;             //实时时钟时钟线引脚 

sbit DS1302_IO =P1^6;             //实时时钟数据线引脚 

sbit DS1302_RST=P1^5;             //实时时钟复位线引脚

sbit wireless_1=P3^0;

sbit wireless_2=P3^1;

sbit wireless_3=P3^2;

sbit wireless_4=P3^3;

sbit ACC0=ACC^0;

sbit ACC7=ACC^7;

charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数

sbitSet=P2^0;      //模式切换键

sbitUp=P2^1;       //加法按钮

sbitDown=P2^2;     //减法按钮

sbitout=P2^3;      //立刻跳出调整模式按钮

sbitDQ=P1^0;       //温度传送数据IO口

chardone,count,temp,flag,up_flag,down_flag;

uchartemp_value;     //温度值

ucharTempBuffer[5],week_value[2];

voidshow_time();  //液晶显示程序

/***********1602液晶显示部分子程序****************/

//PortDefinitions**********************************************************

sbitLcdRs  =P2^5;

sbitLcdRw  =P2^6;

sbitLcdEn  =P2^7;

sfr DBPort =0x80;  //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口

//部等待函数**************************************************************************

unsignedcharLCD_Wait(void)

{

 LcdRs=0;

 LcdRw=1; _nop_();

 LcdEn=1; _nop_();

       

 LcdEn=0;

 returnDBPort;  

}

//向LCD写入命令或数据************************************************************

#defineLCD_COMMAND   0     //Command

#defineLCD_DATA   1     //Data

#defineLCD_CLEAR_SCREEN 0x01     //清屏

#defineLCD_HOMING   0x02     //光标返回原点

voidLCD_Write(bitstyle,unsignedcharinput)

{

 LcdEn=0;

 LcdRs=style;

 LcdRw=0;  _nop_();

 DBPort=input; _nop_();//注意顺序

 LcdEn=1;  _nop_();//注意顺序

 LcdEn=0;  _nop_();

 LCD_Wait(); 

}

//设置显示模式************************************************************

#defineLCD_SHOW   0x04   //显示开

#defineLCD_HIDE   0x00   //显示关  

#defineLCD_CURSOR   0x02 //显示光标

#defineLCD_NO_CURSOR  0x00   //无光标      

#defineLCD_FLASH   0x01   //光标闪动

#defineLCD_NO_FLASH  0x00   //光标不闪动

voidLCD_SetDisplay(unsignedcharDisplayMode)

{

 LCD_Write(LCD_COMMAND,0x08|DisplayMode); 

}

//设置输入模式************************************************************

#defineLCD_AC_UP   0x02

#defineLCD_AC_DOWN   0x00     //default

#defineLCD_MOVE   0x01     //画面可平移

#defineLCD_NO_MOVE   0x00     //default

voidLCD_SetInput(unsignedcharInputMode)

{

 LCD_Write(LCD_COMMAND,0x04|InputMode);

}

//初始化LCD************************************************************

voidLCD_Initial()

{

 LcdEn=0;

 LCD_Write(LCD_COMMAND,0x38);          //8位数据端口,2行显示,5*7点阵

 LCD_Write(LCD_COMMAND,0x38);

 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR);   //开启显示,无光标

 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN);  //清屏

 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE);      //AC递增,画面不动

}

//液晶字符输入的位置************************

voidGotoXY(unsignedcharx,unsignedchary)

{

 if(y==0)

  LCD_Write(LCD_COMMAND,0x80|x);

 if(y==1)

  LCD_Write(LCD_COMMAND,0x80|(x-0x40));

}

//将字符输出到液晶显示

voidPrint(unsignedchar*str)

{

 while(*str!

='\0')

 {

  LCD_Write(LCD_DATA,*str);

  str++;

 }

}

 

 

/***********DS1302时钟部分子程序******************/

typedefstruct__SYSTEMTIME__

{

 unsignedcharSecond;

 unsignedcharMinute;

 unsignedcharHour;

 unsignedcharWeek;

 unsignedcharDay;

 unsignedcharMonth;

 unsignedchar Year;

 unsignedcharDateString[11];

 unsignedcharTimeString[9];

}SYSTEMTIME; //定义的时间类型

SYSTEMTIMECurrentTime;

#defineAM(X) X

#definePM(X) (X+12)             //转成24小时制

#defineDS1302_SECOND 0x80         //时钟芯片的寄存器位置,存放时间

#defineDS1302_MINUTE 0x82

#defineDS1302_HOUR  0x84 

#defineDS1302_WEEK  0x8A

#defineDS1302_DAY  0x86

#defineDS1302_MONTH 0x88

#defineDS1302_YEAR  0x8C

voidDS1302InputByte(unsignedchard) //实时时钟写入一字节(部函数)

   unsignedchari;

   ACC=d;

   for(i=8;i>0;i--)

   {

       DS1302_IO=ACC0;           //相当于汇编中的RRC

       DS1302_CLK=1;

       DS1302_CLK=0;

       ACC=ACC>>1; 

   } 

}

unsignedcharDS1302OutputByte(void) //实时时钟读取一字节(部函数)

   unsignedchari;

   for(i=8;i>0;i--)

   {

       ACC=ACC>>1;           //相当于汇编中的RRC 

       ACC7=DS1302_IO;

       DS1302_CLK=1;

       DS1302_CLK=0;

   } 

   return(ACC); 

}

voidWrite1302(unsignedcharucAddr,unsignedcharucDa) //ucAddr:

DS1302地址,ucData:

要写的数据

{

   DS1302_RST=0;

   DS1302_CLK=0;

   DS1302_RST=1;

   DS1302InputByte(ucAddr);       //地址,命令 

   DS1302InputByte(ucDa);       //写1Byte数据

   DS1302_CLK=1;

   DS1302_RST=0;

}

unsignedcharRead1302(unsignedcharucAddr) //读取DS1302某地址的数据

{

   unsignedcharucData;

   DS1302_RST=0;

   DS1302_CLK=0;

   DS1302_RST=1;

   DS1302InputByte(ucAddr|0x01);       //地址,命令 

   ucData=DS1302OutputByte();        //读1Byte数据

   DS1302_CLK=1;

   DS1302_RST=0;

   return(ucData);

}

 

voidDS1302_GetTime(SYSTEMTIME*Time) //获取时钟芯片的时钟数据到自定义的结构型数组

{

 unsignedcharReadValue;

 ReadValue=Read1302(DS1302_SECOND);

 Time->Second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

 ReadValue=Read1302(DS1302_MINUTE);

 Time->Minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

 ReadValue=Read1302(DS1302_HOUR);

 Time->Hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

 ReadValue=Read1302(DS1302_DAY);

 Time->Day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); 

 ReadValue=Read1302(DS1302_WEEK);

 Time->Week=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

 ReadValue=Read1302(DS1302_MONTH);

 Time->Month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

 ReadValue=Read1302(DS1302_YEAR);

 Time->Year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F); 

}

voidDateToStr(SYSTEMTIME*Time)   //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]

{  if(hide_year<2)                //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为2007/07/22

   {                               

  Time->DateString[0]='2';

  Time->DateString[1]='0';  

  Time->DateString[2]=Time->Year/10+'0';

  Time->DateString[3]=Time->Year%10+'0';

 }

  else

    { 

      Time->DateString[0]='';

      Time->DateString[1]='';   

      Time->DateString[2]='';

      Time->DateString[3]='';

  }

 Time->DateString[4]='/';

 if(hide_month<2)

 {

  Time->DateString[5]=Time->Month/10+'0';

  Time->DateString[6]=Time->Month%10+'0';

 }

  else

  {

    Time->DateString[5]='';

    Time->DateString[6]='';

  }

 Time->DateString[7]='/';

 if(hide_day<2)

 {

  Time->DateString[8]=Time->Day/10+'0';

  Time->DateString[9]=Time->Day%10+'0';

 }

  else

  {

    Time->DateString[8]='';

    Time->DateString[9]='';     

  }

 if(hide_week<2)

 {

  week_value[0]=Time->Week%10+'0'; //星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示

 }

  else

  {

    week_value[0]='';

  }

  week_value[1]='\0';

 Time->DateString[10]='\0';//字符串末尾加'\0',判断结束字符

}

voidTimeToStr(SYSTEMTIME*Time) //将时,分,秒数据转换成液晶显示字符放到数组TimeString[];

{  if(hide_hour<2)

   {

  Time->TimeString[0]=Time->Hour/10+'0';

  Time->TimeString[1]=Time->Hour%10+'0';

 }

  else

    {

      Time->TimeString[0]='';

      Time->TimeString[1]='';

  }

 Time->TimeString[2]=':

';

   if(hide_min<2)

 {

  Time->TimeString[3]=Time->Minute/10+'0';

  Time->TimeString[4]=Time->Minute%10+'0';

 }

  else

    {

      Time->TimeString[3]='';

      Time->TimeString[4]='';

      }

 Time->TimeString[5]=':

';

   if(hide_sec<2)

   {

  Time->TimeString[6]=Time->Second/10+'0';

  Time->TimeString[7]=Time->Second%10+'0';

   }

     else

      {

        Time->TimeString[6]='';

     Time->TimeString[7]='';

      }

 Time->DateString[8]='\0';

}

voidInitial_DS1302(void)  //时钟芯片初始化

{   

 unsignedcharSecond="Read1302"(DS1302_SECOND);

 if(Second&0x80)      //判断时钟芯片是否关闭   

   {

 Write1302(0x8e,0x00);//写入允许

 Write1302(0x8c,0x07);//以下写入初始化时间日期:

07/07/25.星期:

3.时间:

23:

59:

55

 Write1302(0x88,0x07);

 Write1302(0x86,0x25);

 Write1302(0x8a,0x07);

 Write1302(0x84,0x23);

 Write1302(0x82,0x59);

 Write1302(0x80,0x55);

 Write1302(0x8e,0x80);//禁止写入

 }

}

/***********ds18b20子程序*************************/

/***********ds18b20延迟子函数(晶振12MHz)*******/

voiddelay_18B20(unsignedinti)

{

 while(i--);

}

/**********ds18b20初始化函数**********************/

voidInit_DS18B20(void) 

{

 unsignedcharx="0";

 DQ=1;         //DQ复位

 delay_18B20(8); //稍做延时

 DQ=0;         //单片机将DQ拉低

 delay_18B20(80);//精确延时大于480us

 DQ=1;         //拉高总线

 delay_18B20(14);

 x="DQ";           //稍做延时后如果x=0则初始化成功x="1则初始化失败"

 delay_18B20(20);

}

/***********ds18b20读一个字节**************/ 

unsignedcharReadOneChar(void)

{

 uchari="0";

 uchardat=0;

 for(i=8;i>0;i--)

 {

   DQ=0;//给脉冲信号

   dat>>=1;

   DQ=1;//给脉冲信号

   if(DQ)

   dat|=0x80;

   delay_18B20(4);

 }

  return(dat);

}

/*************ds18b20写一个字节****************/ 

voidWriteOneChar(uchardat)

{

  unsignedchari="0";

  for(i=8;i>0;i--)

  {

   DQ=0;

   DQ=dat&0x01;

    delay_18B20(5);

   DQ=1;

    dat>>=1;

 }

}

/**************读取ds18b20当前温度************/

voidReadTemp(void)

{

 unsignedchara="0";

 unsignedcharb="0";

 unsignedchart="0";

 Init_DS18B20();

 WriteOneChar(0xCC);    //跳过读序号列号的操作

 WriteOneChar(0x44); //启动温度转换

 delay_18B20(100);      //thismessageisweryimportant

 Init_DS18B20();

 WriteOneChar(0xCC); //跳过读序号列号的操作

 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器)前两个就是温度

 delay_18B20(100);

 a=ReadOneChar();    //读取温度值低位

 b=ReadOneChar();    //读取温度值高位

 temp_value=b<<4;

 temp_value+=(a&0xf0)>>4;               

}

voidtemp_to_str()  //温度数据转换成液晶字符显示

{

 TempBuff

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 理学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1