1602液晶显示DS1302+S51时钟+温度显示Word格式文档下载.docx
- 文档编号:424054
- 上传时间:2023-04-28
- 格式:DOCX
- 页数:36
- 大小:26.92KB
1602液晶显示DS1302+S51时钟+温度显示Word格式文档下载.docx
《1602液晶显示DS1302+S51时钟+温度显示Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《1602液晶显示DS1302+S51时钟+温度显示Word格式文档下载.docx(36页珍藏版)》请在冰点文库上搜索。
3
4|
VCC1
GND
1.脚接+5V2,3.脚32768HZ晶振4.脚接地5.脚接S51的P1.26.脚接S51的P1.17.接S51的P1.0
8.脚接后备电源,可以接老计算机主板上的3.6V电池,也可以通过二级管隔离接一个大容量电解电容
电压在2.5V以上即可维持
按键说明:
1.共三个键,低电平有效
2.P1.4和P1.5同时按:
初始化
3.P1.6端口按键:
选择要调整的项目
4.P1.5端口按键:
增加;
P1.4端口按键:
减少
[注:
AT89S51使用12M晶振]
原理图:
源代码:
=================定义与申明=============================================================*/
#include"
regx51.h"
string.h"
intrins.h"
#defineucharunsignedchar
#defineuintunsignedint
typedefunsignedcharbyte;
typedefunsignedint
word;
//***********1602引脚定义引脚
#defineLCM_RS
P2_0
//数据/命令选择信号
#defineLCM_RW
P2_1
//读/写选择信号
#defineLCM_E
P2_2
//使能信号
//***********DS1302时间显示定义部分
sbitT_CLK=P1^0;
//串行时钟输入
sbitT_IO=P1^1;
//串行数据端口
sbitT_RST=P1^2;
//复位端口
//***********18B20温度显示定义部分
sbitDQ=P3^3;
//18B20接P33口
sbitACC0=ACC^0;
sbitACC7=ACC^7;
#defineLCM_DataP0
//显示数据端口
#defineBusy
0x80
//用于检测LCM状态字中的Busy标识
ucharid,timecount;
//全局变量
bit
flag,sflag;
//flag是时钟冒号闪烁标志,sflag是温度负号显示标志
sec,min,hour,year,mon,day,weekk;
//闪烁标志位
//*********************函数申明
void
Disp_line1(void);
//显示屏幕第一行
Disp_line2(void);
//显示屏幕第二行
id_case1_key();
//id为1时的下一级选择
Set(uchar,uchar);
//根据选择调整相应项目
RTInputByte(uchar);
/*输入1Byte*/
uchar
RTOutputByte(void);
/*输出1Byte*/
W1302(uchar,uchar);
//向DS1302写入一个字节
R1302(uchar);
//从DS1302读出一个字节
Set1302(uchar*);
//设置时间
//*******1602LCD驱动**********************************************************
WriteDataLCM(ucharWDLCM);
//写数据
WriteCommandLCM(ucharWCLCM,BuysC);
//写指令
ReadStatusLCM(void);
//读状态
LCMInit(void);
//LCM初始化
DisplayOneChar(ucharX,ucharY,ucharDData);
//按指定位置显示一个字符
DisplayListChar(ucharX,ucharY,ucharcode*DData);
//按指定位置显示一串字符
Delay5Ms(void);
//5ms延时
Delay400Ms(void);
//400ms延时
Read_Temperature(char,char);
//温度显示
mychar(void);
//显示自定义字符
adjust_res(charres);
//res分别等于0x1f,0x3f,0x5f温度读数分辨率分别对应
//
0.5,0.25,0.125
//初始化后设置为:
07年07月04日星期312点00分00秒
//
12:
00:
00XX.C
07/07/04Week.3
unsignedcharinittime[7]={0x00,0x00,0x12,0x04,0x07,0x03,0x07};
秒
分钟小时
日
月
星期
年
ucharcodeweek[]={"
Week."
};
//星期显示
//=========================主函数=======================================================
/*****************************************************
函数名:
main()
功
能:
主函数
说
明:
入口参数:
无
返回值:
无
*****************************************************/
voidmain(void)
{
Delay400Ms();
//启动等待,等LCM讲入工作状态
LCMInit();
Delay5Ms();
//延时片刻(可不要)
mychar();
TMOD=0x01;
//选择定时模式
TH0=(65535-50000)/256;
//取定时初值
TL0=(65535-50000)%256;
EA=1;
//开中断
TR0=1;
ET0=1;
W1302(0x90,0xa5);
//打开充电二级管
一个二级管串联一个2K电阻
W1302(0x8e,0x80);
//写保护,禁止写操作
adjust_res(0x5f);
//调整18B20的分辨率0x1f:
0.5;
0x3f:
0.25;
0x5f:
0.125
while
(1)
{
if((P1_4|P1_5)==0)
//初始化同时按下P1_4、P1_5
{
//适当延时,消除抖动
if((P1_4|P1_5)==0)Set1302(inittime);
//显示初始值
}
if(P1_6==0)
//设置和选择项目键
if(P1_6==0){id++;
if(id>
7)id=0;
}
//7个可调节项目循环调节
while(P1_6==0);
switch(id)//跳转到对应的项目进行设置
case0:
sec=0;
Disp_line1();
Disp_line2();
break;
case1:
//调节年
year=1;
//设置年闪烁标志位
case2:
//调节月
year=0;
mon=1;
//设置月闪烁标志位
case3:
//调节日
mon=0;
day=1;
//设置日闪烁标志位
case4:
//调节星期
day=0;
weekk=1;
//设置星期闪烁标志位
case5:
//调节小时
weekk=0;
hour=1;
//设置小时闪烁标志位
case6:
//调节分钟
hour=0;
min=1;
//设置分钟闪烁标志位
case7:
//调节秒
min=0;
sec=1;
//设置秒钟闪烁标志位
}
//==================================定时中断=============================================
voidt0()
时间工作时,冒号闪烁
T0中断入口,方式1
无
voidt0(void)interrupt1using0
{
//取50ms定时初值
timecount++;
if(timecount>
9)
timecount=0;
//计时到,从先开始
flag=~flag;
//标志位取反
}
//====================================项目设置===========================================
voidid_case1_key()
项目设置加减控制
P1.5和P1.4<
==>
+和-
//id为1时的下一级选择
if(P1_5==0)
//P1_5有按下,则数值增加(+)
//适当延时,消除抖动
if(P1_5==0)Set(id,0);
//根据选择调整相应项目
if(id!
=7)
while(P1_5==0);
if(P1_4==0)
//P1_4有按下,则数值减少(-)
if(P1_4==0)Set(id,1);
//根据选择调整相应项目
=7)while(P1_4==0);
voidSet()
项目设置
sel_1=0时,数值加;
sel_1=1时,数值减
sel和sel_1
//根据选择调整相应项目并写入DS1302
voidSet(ucharsel,ucharsel_1)
signedcharaddress,item;
signedcharmax,mini;
//偶数指令是写,奇数指令是读
//最大值与最小值限定
if(sel==7)
{address=0x80;
max=00;
mini=0;
//秒
if(sel==6)
{address=0x82;
max=59;
//分钟
if(sel==5)
{address=0x84;
max=23;
//小时
if(sel==3)
{address=0x86;
max=31;
mini=1;
//日
if(sel==2)
{address=0x88;
max=12;
//月
if(sel==1)
{address=0x8c;
max=99;
//年
if(sel==4)
{address=0x8a;
max=07;
//星期
//先从1302中读出数据,把数据转换成十进制进行加减设置;
后从先转换回来写入1302中
item=R1302(address+1)/16*10+R1302(address+1)%16;
//从1302中读出1字节,再转换成十进制
if(sel_1==0)item++;
elseitem--;
//sel_1=0则加,sel_1=1则减
if(item>
max)item=mini;
//大于最大值,则赋最小值(循环)
if(item<
mini)item=max;
//小于最小值,则赋最大值(循环)
W1302(0x8e,0x00);
//允许写操作
W1302(address,item/10*16+item%10);
//把调节好的十进制数据转换成十六进制后写入1302中
//写保护,禁止写操作
//=======================================================================================
voidDisp_line1()
显示时间和温度(XX:
XX:
XXXX.XC)
第一行显示数据处理
//屏幕显示第一行:
时间和温度显示
voidDisp_line1(void)
Read_Temperature(10,0);
//温度显示
//冒号闪烁
if(flag==0)
{DisplayOneChar(3,0,0x3a);
DisplayOneChar(6,0,0x3a);
else
{DisplayOneChar(3,0,0x20);
DisplayOneChar(6,0,0x20);
if(sec==1)
//秒闪烁标志位
if(flag==1)
DisplayOneChar(7,0,R1302(0x81)/16+0x30);
//显示秒十位
DisplayOneChar(8,0,R1302(0x81)%16+0x30);
//显示秒个位
DisplayOneChar(7,0,0x20);
DisplayOneChar(8,0,0x20);
//显示秒个位
}
if(min==1)
//分钟闪烁标志位
DisplayOneChar(4,0,R1302(0x83)/16+0x30);
//显示分钟十位
DisplayOneChar(5,0,R1302(0x83)%16+0x30);
//显示分钟个位
DisplayOneChar(4,0,0x20);
DisplayOneChar(5,0,0x20);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 1602 液晶显示 DS1302 S51 时钟 温度 显示