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

上传人:b****5 文档编号:19190270 上传时间:2023-01-04 格式:DOCX 页数:18 大小:116.23KB
下载 相关 举报
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

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;

LcdEn=0;

returnDBPort;

}

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

#defineLCD_COMMAND 

//Command

#defineLCD_DATA 

//Data

#defineLCD_CLEAR_SCREEN 

0x01 

//清屏

#defineLCD_HOMING 

0x02 

//光标返回原点

voidLCD_Write(bitstyle,unsignedcharinput)

LcdRs=style;

LcdRw=0;

DBPort=input;

//注意顺序

LCD_Wait();

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

#defineLCD_SHOW 

0x04 

//显示开

#defineLCD_HIDE 

0x00 

//显示关 

#defineLCD_CURSOR 

0x02 

//显示光标

#defineLCD_NO_CURSOR 

//无光标 

#defineLCD_FLASH 

//光标闪动

#defineLCD_NO_FLASH 

//光标不闪动

voidLCD_SetDisplay(unsignedcharDisplayMode)

LCD_Write(LCD_COMMAND,0x08|DisplayMode);

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

#defineLCD_AC_UP 

0x02

#defineLCD_AC_DOWN 

//default

#defineLCD_MOVE 

//画面可平移

#defineLCD_NO_MOVE 

//default

voidLCD_SetInput(unsignedcharInputMode)

LCD_Write(LCD_COMMAND,0x04|InputMode);

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

voidLCD_Initial()

LCD_Write(LCD_COMMAND,0x38);

//8位数据端口,2行显示,5*7点阵

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) 

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

1;

//相当于汇编中的RRC 

ACC7=DS1302_IO;

return(ACC);

voidWrite1302(unsignedcharucAddr,unsignedcharucDa) 

//ucAddr:

DS1302地址,ucData:

要写的数据

DS1302_RST=0;

DS1302_RST=1;

DS1302InputByte(ucAddr);

//地址,命令 

DS1302InputByte(ucDa);

//写1Byte数据

unsignedcharRead1302(unsignedcharucAddr) 

//读取DS1302某地址的数据

unsignedcharucData;

DS1302InputByte(ucAddr|0x01);

//地址,命令 

ucData=DS1302OutputByte();

//读1Byte数据

return(ucData);

voidDS1302_GetTime(SYSTEMTIME*Time) 

//获取时钟芯片的时钟数据到自定义的结构型数组

unsignedcharReadValue;

ReadValue=Read1302(DS1302_SECOND);

Time->

Second=((ReadValue&

0x70)>

4)*10+(ReadValue&

0x0F);

ReadValue=Read1302(DS1302_MINUTE);

Minute=((ReadValue&

ReadValue=Read1302(DS1302_HOUR);

Hour=((ReadValue&

ReadValue=Read1302(DS1302_DAY);

Day=((ReadValue&

ReadValue=Read1302(DS1302_WEEK);

Week=((ReadValue&

ReadValue=Read1302(DS1302_MONTH);

Month=((ReadValue&

ReadValue=Read1302(DS1302_YEAR);

Year=((ReadValue&

voidDateToStr(SYSTEMTIME*Time) 

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

if(hide_year<

2) 

//这里的if,else语句都是判断位闪烁,<

2显示数据,>

2就不显示,输出字符串为2007/07/22

Time->

DateString[0]='

2'

;

DateString[1]='

0'

DateString[2]=Time->

Year/10+'

DateString[3]=Time->

Year%10+'

else

'

DateString[2]='

DateString[3]='

DateString[4]='

/'

if(hide_month<

2)

DateString[5]=Time->

Month/10+'

DateString[6]=Time->

Month%10+'

DateString[5]='

DateString[6]='

}

DateString[7]='

if(hide_day<

DateString[8]=Time->

Day/10+'

DateString[9]=Time->

Day%10+'

DateString[8]='

DateString[9]='

if(hide_week<

week_value[0]=Time->

Week%10+'

//星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示

week_value[0]='

week_value[1]='

DateString[10]='

//字符串末尾加'

判断结束字符

voidTimeToStr(SYSTEMTIME*Time) 

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

if(hide_hour<

TimeString[0]=Time->

Hour/10+'

TimeString[1]=Time->

Hour%10+'

TimeString[0]='

TimeString[1]='

TimeString[2]='

:

'

if(hide_min<

TimeString[3]=Time->

Minute/10+'

TimeString[4]=Time->

Minute%10+'

TimeString[3]='

TimeString[4]='

TimeString[5]='

if(hide_sec<

TimeString[6]=Time->

Second/10+'

TimeString[7]=Time->

Second%10+'

TimeString[6]='

TimeString[7]='

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

//拉高总线

delay_18B20(14);

x="

DQ"

//稍做延时后如果x=0则初始化成功x="

1则初始化失败"

delay_18B20(20);

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

unsignedcharReadOneChar(void)

uchari="

uchardat=0;

for(i=8;

i>

i--)

//给脉冲信号

dat>

=1;

if(DQ)

dat|=0x80;

delay_18B20(4);

return(dat);

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

voidWriteOneChar(uchardat)

unsignedchari="

DQ=0;

DQ=dat&

0x01;

delay_18B20(5);

DQ=1;

dat>

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

voidReadTemp(void)

unsignedchara="

unsignedcharb="

unsignedchart="

Init_DS18B20();

WriteOneChar(0xCC);

//跳过读序号列号的操作

WriteOneChar(0x44);

//启动温度转换

delay_18B20(100);

//thismessageisweryimportant

//跳过读序号列号的操作

WriteOneChar(0xBE);

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

a=ReadOneChar();

//读取温度值低位

b=ReadOneChar();

//读取温度值高位

temp_value=b<

<

4;

temp_value+=(a&

0xf0)>

voidtemp_to_str() 

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

TempBuffer

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

当前位置:首页 > PPT模板 > 节日庆典

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

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