C语言 ds1302时间温度液晶显示Word文件下载.docx

上传人:b****3 文档编号:16925528 上传时间:2022-11-27 格式:DOCX 页数:21 大小:20.72KB
下载 相关 举报
C语言 ds1302时间温度液晶显示Word文件下载.docx_第1页
第1页 / 共21页
C语言 ds1302时间温度液晶显示Word文件下载.docx_第2页
第2页 / 共21页
C语言 ds1302时间温度液晶显示Word文件下载.docx_第3页
第3页 / 共21页
C语言 ds1302时间温度液晶显示Word文件下载.docx_第4页
第4页 / 共21页
C语言 ds1302时间温度液晶显示Word文件下载.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

C语言 ds1302时间温度液晶显示Word文件下载.docx

《C语言 ds1302时间温度液晶显示Word文件下载.docx》由会员分享,可在线阅读,更多相关《C语言 ds1302时间温度液晶显示Word文件下载.docx(21页珍藏版)》请在冰豆网上搜索。

C语言 ds1302时间温度液晶显示Word文件下载.docx

/*****************温度11us延时函数*************************/

voiddelay2(uintt)

{

for(;

t>

0;

t--);

}

/****************DS18B20复位函数************************/

ow_reset(void)

charpresence=1;

while(presence)

while(presence)

{

DQ=1;

_nop_();

//从高拉倒低

DQ=0;

delay2(50);

//550us

DQ=1;

delay2(6);

//66us

presence=DQ;

//presence=0复位成功,继续下一步

}

delay2(45);

//延时500us

presence=~DQ;

//拉高电平

//

/****************DS18B20写命令函数************************/

//向1-WIRE总线上写1个字节

voidwrite_byt(ucharval)

{

uchari;

for(i=8;

i>

i--)

//从高拉倒低

DQ=0;

//5us

DQ=val&

0x01;

//最低位移出

delay2(6);

val=val/2;

//右移1位

}

delay2

(1);

/****************DS18B20读1字节函数************************/

//从总线上取1个字节

ucharread_byt(void)

uchari;

ucharvalue=0;

for(i=8;

value>

>

=1;

//4us

if(DQ)value|=0x80;

return(value);

/****************读出温度函数************************/

uintread_temp()

ow_reset();

//总线复位

delay2(200);

write_byt(0xcc);

//发命令

write_byt(0x44);

//发转换命令

write_byt(0xbe);

temp_data[0]=read_byt();

//读温度值的第字节

temp_data[1]=read_byt();

//读温度值的高字节

temp1=temp_data[1];

temp1<

<

=8;

temp1=temp1|temp_data[0];

//两字节合成一个整型变量。

returntemp1;

//返回温度值

work_temp(uinttemp1)

ucharn=0;

if(temp1>

6348)//温度值正负判断

{temp1=65536-temp1;

n=1;

}//负温度求补码,标志位置1

display[9]=temp1&

0x0f;

//取小数部分的值

display[1]=ditab[display[9]];

//存入小数部分显示值

display[9]=temp1>

4;

//取中间八位,即整数部分的值

display[8]=display[9]/100;

//取百位数据暂存

display[4]=display[9]/10%10;

//取十位数据暂存

display[2]=display[9]%10;

//取个位数据暂存

/******************符号位显示判断**************************/

/*if(display[8]=1)

display[8]=0x31;

}*/

if(!

display[8])

display[8]='

'

;

//最高位为0时不显示

elsedisplay[8]=0x31;

if(n){display[8]='

-'

}//负温度时最高位显示"

-"

}

//********************ds1302**************

/**************************************************************/

ucharcodetab1[]={"

20--week"

//年显示的固定字符

ucharcodetab2[]={"

:

.C"

//时间显示的固定字符

//延时函数,后面经常调用

voiddelay(uintxms)//延时函数,有参函数

uintx,y;

for(x=xms;

x>

x--)

for(y=110;

y>

y--);

/********液晶写入指令函数与写入数据函数,以后可调用**************/

write_1602com(ucharcom)//****液晶写入指令函数****

rs=0;

//数据/指令选择置为指令

rw=0;

//读写选择置为写

P0=com;

//送入数据

delay

(1);

en=1;

//拉高使能端,为制造有效的下降沿做准备

en=0;

//en由高变低,产生下降沿,液晶执行命令

write_1602dat(uchardat)//***液晶写入数据函数****

rs=1;

//数据/指令选择置为数据

P0=dat;

//en置高电平,为制造下降沿做准备

lcd_init()//***液晶初始化函数****

write_1602com(0x38);

//设置液晶工作模式,意思:

16*2行显示,5*7点阵,8位数据

write_1602com(0x0c);

//开显示不显示光标

write_1602com(0x06);

//整屏不移动,光标自动右移

write_1602com(0x01);

//清显示

write_1602com(yh);

//日历显示固定符号从第一行第1个位置之后开始显示

for(a=0;

a<

16;

a++)

write_1602dat(tab1[a]);

//向液晶屏写日历显示的固定符号部分

write_1602com(er+1);

//时间显示固定符号写入位置,从第2个位置后开始显示

15;

write_1602dat(tab2[a]);

//写显示时间固定符号,两个冒号

/*********************over***********************/

/***************DS1302有关子函数********************/

voidwrite_byte(uchardat)//写一个字节

ACC=dat;

RST=1;

for(a=8;

a>

a--)

IO=ACC0;

SCLK=0;

SCLK=1;

ACC=ACC>

1;

ucharread_byte()//读一个字节

ACC7=IO;

return(ACC);

//----------------------------------------

voidwrite_1302(ucharadd,uchardat)//向1302芯片写函数,指定写入地址,数据

RST=0;

SCLK=0;

write_byte(add);

write_byte(dat);

SCLK=1;

ucharread_1302(ucharadd)//从1302读数据函数,指定读取数据来源地址

uchartemp;

temp=read_byte();

return(temp);

ucharBCD_Decimal(ucharbcd)//BCD码转十进制函数,输入BCD,返回十进制

ucharDecimal;

Decimal=bcd>

return(Decimal=Decimal*10+(bcd&

=0x0F));

//--------------------------------------

voidds1302_init()//1302芯片初始化子函数(2010-01-07,12:

00:

00,week4)

RST=0;

SCLK=0;

write_1302(0x8e,0x00);

//允许写,禁止写保护

write_1302(0x80,0x00);

//向DS1302内写秒寄存器80H写入初始秒数据00

write_1302(0x82,0x00);

//向DS1302内写分寄存器82H写入初始分数据00

write_1302(0x84,0x12);

//向DS1302内写小时寄存器84H写入初始小时数据12

write_1302(0x8a,0x07);

//向DS1302内写周寄存器8aH写入初始周数据4

write_1302(0x86,0x15);

//向DS1302内写日期寄存器86H写入初始日期数据07

write_1302(0x88,0x06);

//向DS1302内写月份寄存器88H写入初始月份数据01

write_1302(0x8c,0x14);

//向DS1302内写年份寄存器8cH写入初始年份数据10

write_1302(0x8e,0x80);

//打开写保护

//温度显示子函数

voidwrite_temp(ucharadd,uchardat)//向LCD写温度数据,并指定显示位置

uchargw,sw;

gw=dat%10;

//取得个位数字

sw=dat/10%10;

//取得十位数字

write_1602com(er+add);

//er是头文件规定的值0x80+0x40

write_1602dat(display[8]);

write_1602dat(0x30+sw);

//数字+30得到该数字的LCD1602显示码

write_1602dat(0x30+gw);

//数字+30得到该数字的LCD1602显示码

voidwrite_xs(ucharadd,uchardat)

write_1602dat(dat);

//时分秒显示子函数

voidwrite_sfm(ucharadd,uchardat)//向LCD写时分秒,有显示位置加、现示数据,两个参数

sw=dat/10;

//年月日显示子函数

voidwrite_nyr(ucharadd,uchardat)//向LCD写年月日,有显示位置加数、显示数据,两个参数

write_1602com(yh+add);

//设定显示位置为第一个位置+add

voidwrite_week(ucharweek)//写星期函数

write_1602com(yh+0x0f);

//星期字符的显示位置

switch(week)

case1:

write_1602dat('

1'

);

//星期数为1时,显示

break;

case2:

2'

//星期数据为2时显示

case3:

3'

//星期数据为3时显示

case4:

4'

//星期数据为4是显示

case5:

5'

//星期数据为5时显示

case6:

6'

//星期数据为6时显示

case7:

7'

//星期数据为7时显示

//****************键盘扫描有关函数**********************

voidkeyscan()

if(key1==0)//key1为功能键(设置键)

delay(9);

//延时,用于消抖动

if(key1==0)//延时后再次确认按键按下

buzzer=0;

//蜂鸣器短响一次

delay(20);

buzzer=1;

while(!

key1);

key1n++;

if(key1n==9)

key1n=1;

//设置按键共有秒、分、时、星期、日、月、年、返回,8个功能循环

switch(key1n)

case1:

TR0=0;

//关闭定时器

write_1602com(er+0x08);

//设置按键按动一次,秒位置显示光标

write_1602com(0x0f);

//设置光标为闪烁

temp=(miao)/10*16+(miao)%10;

//秒数据写入DS1302

write_1302(0x8e,0x00);

write_1302(0x80,0x80|temp);

//miao

write_1302(0x8e,0x80);

case2:

write_1602com(er+5);

//按2次fen位置显示光标

case3:

write_1602com(er+2);

//按动3次,shi

case4:

//按动4次,week

case5:

write_1602com(yh+0x09);

//按动5次,ri

case6:

write_1602com(yh+0x06);

//按动6次,yue

case7:

write_1602com(yh+0x03);

//按动7次,nian

case8:

write_1602com(0x0c);

//按动到第8次,设置光标不闪烁

TR0=1;

//打开定时器

temp=(miao)/10*16+(miao)%10;

write_1302(0x8e,0x00);

write_1302(0x80,0x00|temp);

//miao数据写入DS1302

break;

//------------------------------加键key2----------------------------

if(key1n!

=0)//当key1按下以下。

再按以下键才有效(按键次数不等于零)

if(key2==0)//上调键

delay(10);

if(key2==0)

key2);

miao++;

//设置键按动1次,调秒

if(miao==60)

miao=0;

write_sfm(0x07,miao);

write_1302(0x80,temp);

write_1302(0x8e,0x80);

fen++;

if(fen==60)

fen=0;

write_sfm(0x04,fen);

temp=(fen)/10*16+(fen)%10;

write_1302(0x82,temp);

write_1602com(er+5);

shi++;

if(shi==24)

shi=0;

write_sfm(1,shi);

temp=(shi)/10*16+(shi)%10;

write_1302(0x84,temp);

write_1602com(er+2);

week++;

if(week==8)

week=1;

write_1602com(yh+0x0f);

write_week(week);

temp=(week)/10*16+(week)%10;

write_1302(0x8a,temp);

write_1602com(yh+0x0f);

ri++;

if(ri==32)

ri=1;

write_nyr(8,ri);

temp=(ri)/10*16+(ri)%10;

write_1302(0x86,temp);

write_1602com(yh+9);

yue++;

if(yue==13)

yue=1;

write_nyr(5,yue);

temp=(yue)/10*16+(yue)%10;

write_1302(0x88,temp);

write_1602com(yh+6);

nian++;

if(nian==100)

nian=0;

write_nyr(2,nian);

temp=(nian)/10*16+(nian)%10;

write_1302(0x8c,temp);

write_1602com(y

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

当前位置:首页 > 工程科技 > 能源化工

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

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