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