DS1302时钟+DS18B20用LCD1602显示系统很简单文档格式.docx
- 文档编号:19190270
- 上传时间:2023-01-04
- 格式:DOCX
- 页数:18
- 大小:116.23KB
DS1302时钟+DS18B20用LCD1602显示系统很简单文档格式.docx
《DS1302时钟+DS18B20用LCD1602显示系统很简单文档格式.docx》由会员分享,可在线阅读,更多相关《DS1302时钟+DS18B20用LCD1602显示系统很简单文档格式.docx(18页珍藏版)》请在冰豆网上搜索。
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
0
//Command
#defineLCD_DATA
1
//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文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS1302 时钟 DS18B20 LCD1602 显示 系统 简单
![提示](https://static.bdocx.com/images/bang_tan.gif)