智能电子钟源程序.docx

上传人:b****8 文档编号:9134827 上传时间:2023-02-03 格式:DOCX 页数:24 大小:20.09KB
下载 相关 举报
智能电子钟源程序.docx_第1页
第1页 / 共24页
智能电子钟源程序.docx_第2页
第2页 / 共24页
智能电子钟源程序.docx_第3页
第3页 / 共24页
智能电子钟源程序.docx_第4页
第4页 / 共24页
智能电子钟源程序.docx_第5页
第5页 / 共24页
点击查看更多>>
下载资源
资源描述

智能电子钟源程序.docx

《智能电子钟源程序.docx》由会员分享,可在线阅读,更多相关《智能电子钟源程序.docx(24页珍藏版)》请在冰豆网上搜索。

智能电子钟源程序.docx

智能电子钟源程序

#include

#defineuintunsignedint

#defineucharunsignedchar

#defineyh0x80

#defineer0x80+0x40

uchara,miao,shi,fen,ri,yue,nian,week,flag,key1n,temp;

uinttem;

floatf_tem;

//液晶屏的与C51之间的引脚连接定义

sbitrs=P2^0;

sbiten=P2^2;

sbitrw=P2^1;//如果硬件上rw接地,就不用写这句和后面的rw=0了

sbitIO=P1^1;

sbitSCLK=P1^0;

sbitRST=P1^2;

sbitled=P2^6;//LED背光开关

sbitACC0=ACC^0;

sbitACC7=ACC^7;

//校时按键与C51的引脚连接定义

sbitkey1=P1^5;//设置键

sbitkey2=P1^6;//加键

sbitkey3=P1^7;//减键

sbitbuzzer=P1^3;//蜂鸣器,通过三极管9012驱动,端口低电平响

//ds18b20芯片与c51之间的引脚连接定义

sbittem_ds=P3^3;

ucharcodetab1[]={"20--"};//年显示的固定字符

ucharcodetab2[]={":

:

"};//时间显示的固定字符

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

{

uintx,y;

for(x=xms;x>0;x--)

for(y=110;y>0;y--);

}

//******ds18b20芯片有关子程序******//

voidDS18B20_init()

{uinti;

tem_ds=0;

i=160;

while(i>0)

i--;

tem_ds=1;

i=8;

while(i>0)

i--;

}

voidtemwritebit(ucharinstruc_data)

{

inttime;

if(instruc_data)

{

tem_ds=0;

time=3;//延时14us

while(time>0)

time--;

tem_ds=1;//写"1"

time=8;//延时35us

while(time>0)

time--;

}

else

{

tem_ds=0;

time=14;//延时62us

while(time>0)

time--;

}

tem_ds=1;//释放数据线

time++;time++;

}

uchartemreadbit()

{uinti;

bitdatbit;

tem_ds=0;

i++;

tem_ds=1;

i++;i++;

datbit=tem_ds;//读数据

i=10;//延时45

while(i>0)

i--;

tem_ds=1;

return(datbit);

}

uchartemreadbyte()

{

uchari,j,dat;

dat=0;

for(i=0;i<8;i++)

{

j=temreadbit();

dat=(j<<7)|(dat>>1);

}

return(dat);

}

voidtemwritebyte(ucharinstru)

{

inti;

for(i=0;i<8;i++)

{

temwritebit(instru&01);

instru>>=1;

}

}

uintget_tem()//采集温度

{

uchartem_L,tem_H;

DS18B20_init();

temwritebyte(0xcc);

temwritebyte(0x44);

delay

(1);

temwritebyte(0xcc);//写跳过ROM指令;

temwritebyte(0xbe);//读数据

tem_L=temreadbyte();

tem_H=temreadbyte();

tem=tem_H<<8|tem_L;

f_tem=tem*0.0625;//得到真实的十进制温度值

tem=f_tem;

return(tem);

}

//液晶写入指令函数与写入数据函数

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

{

rs=0;//数据/指令选择置为指令

rw=0;//读写选择置为写

P0=com;//送入数据

delay

(1);

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

delay

(1);

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

}

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

{

rs=1;//数据/指令选择置为数据

rw=0;//读写选择置为写

P0=dat;//送入数据

delay

(1);

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

delay

(1);

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

}

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

{

write_1602com(0x38);//设置液晶工作模式,意思:

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

write_1602com(0x01);//清显示

write_1602com(0x06);//整屏不移动,光标自动右移

write_1602com(yh+1);//日历显示固定符号从第一行第1个位置之后开始显示

write_1602com(0x0c);//开显示不显示光标

for(a=0;a<14;a++)

{

write_1602dat(tab1[a]);//向液晶屏写日历显示的固定符号部分

delay(3);

}

write_1602com(er+2);//时间显示固定符号写入位置,从第2个位置后开始显示

for(a=0;a<8;a++)

{

write_1602dat(tab2[a]);//写显示时间固定符号,两个冒号

delay(3);

}

}

//DS1302有关子函数//

voidwrite_byte(uchardat)//写一个字节

{

ACC=dat;

RST=1;

for(a=8;a>0;a--)

{

IO=ACC0;

SCLK=0;

SCLK=1;

ACC=ACC>>1;

}

}

ucharread_byte()//读一个字节

{

RST=1;

for(a=8;a>0;a--)

{

ACC7=IO;

SCLK=1;

SCLK=0;

ACC=ACC>>1;

}

return(ACC);

}

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

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

{

RST=0;

SCLK=0;

RST=1;

write_byte(add);

write_byte(dat);

SCLK=1;

RST=0;

}

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

{

uchartemp;

RST=0;

SCLK=0;

RST=1;

write_byte(add);

temp=read_byte();

SCLK=1;

RST=0;

return(temp);

}

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

{

ucharDecimal;

Decimal=bcd>>4;

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,0x05);//向DS1302内写周寄存器8aH写入初始周数据4

write_1302(0x86,0x09);//向DS1302内写日期寄存器86H写入初始日期数据07

write_1302(0x88,0x12);//向DS1302内写月份寄存器88H写入初始月份数据01

write_1302(0x8c,0x11);//向DS1302内写年份寄存器8cH写入初始年份数据10

write_1302(0x8e,0x80);//打开写保护

}

//温度显示子函数

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

{

uchargw,sw;

gw=dat%10;//个位

sw=dat/10;//十位

write_1602com(er+add);//er是头文件规定的值0x80+0x40

write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码

write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

write_1602dat(0xdf);//显示温度的小圆圈符号,0xdf是液晶屏字符库的该符号地址码

write_1602dat(0x43);//显示"C"符号,0x43是液晶屏字符库里大写C的地址码

}

//时分秒显示子函数

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

{

uchargw,sw;

gw=dat%10;//取得个位数字

sw=dat/10;//取得十位数字

write_1602com(er+add);//er是头文件规定的值0x80+0x40

write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码

write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

}

//年月日显示子函数

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

{

uchargw,sw;

gw=dat%10;//取得个位数字

sw=dat/10;//取得十位数字

write_1602com(yh+add);//设定显示位置为第一个位置+add

write_1602dat(0x30+sw);//数字+30得到该数字的LCD1602显示码

write_1602dat(0x30+gw);//数字+30得到该数字的LCD1602显示码

}

voidwrite_week(ucharweek)//写星期函数

{

write_1602com(yh+0x0c);//星期字符的显示位置

switch(week)

{

case1:

write_1602dat('M');//星期数为1时,显示

write_1602dat('O');

write_1602dat('N');

break;

case2:

write_1602dat('T');//星期数据为2时显示

write_1602dat('U');

write_1602dat('E');

break;

case3:

write_1602dat('W');//星期数据为3时显示

write_1602dat('E');

write_1602dat('D');

break;

case4:

write_1602dat('T');//星期数据为4是显示

write_1602dat('H');

write_1602dat('U');

break;

case5:

write_1602dat('F');//星期数据为5时显示

write_1602dat('R');

write_1602dat('I');

break;

case6:

write_1602dat('S');//星期数据为6时显示

write_1602dat('T');

write_1602dat('A');

break;

case7:

write_1602dat('S');//星期数据为7时显示

write_1602dat('U');

write_1602dat('N');

break;

}

}

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

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;//关闭定时器

//TR1=0;

write_1602com(er+0x09);//设置按键按动一次,秒位置显示光标

write_1602com(0x0f);//设置光标为闪烁

temp=(miao)/10*16+(miao)%10;//秒数据写入DS1302

write_1302(0x8e,0x00);

write_1302(0x80,0x80|temp);//miao

write_1302(0x8e,0x80);

break;

case2:

write_1602com(er+6);//按2次fen位置显示光标

//write_1602com(0x0f);

break;

case3:

write_1602com(er+3);//按动3次,shi

//write_1602com(0x0f);

break;

case4:

write_1602com(yh+0x0e);//按动4次,week

//write_1602com(0x0f);

break;

case5:

write_1602com(yh+0x0a);//按动5次,ri

//write_1602com(0x0f);

break;

case6:

write_1602com(yh+0x07);//按动6次,yue

//write_1602com(0x0f);

break;

case7:

write_1602com(yh+0x04);//按动7次,nian

//write_1602com(0x0f);

break;

case8:

write_1602com(0x0c);//按动到第8次,设置光标不闪烁

TR0=1;//打开定时器

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

write_1302(0x8e,0x00);

write_1302(0x80,0x00|temp);//miao数据写入DS1302

write_1302(0x8e,0x80);

break;

}

}

}

//***************加键key2*************//

if(key1n!

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

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

{

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

{

delay(10);

if(key2==0)

{

buzzer=0;//蜂鸣器短响一次

delay(20);

buzzer=1;

while(!

key2);

switch(key1n)

{

case1:

miao++;//设置键按动1次,调秒

if(miao==60)

miao=0;

write_sfm(0x08,miao);

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

write_1302(0x8e,0x00);

write_1302(0x80,temp);

write_1302(0x8e,0x80);

write_1602com(er+0x09);

//write_1602com(0x0b);

break;

case2:

fen++;

if(fen==60)

fen=0;

write_sfm(0x05,fen);

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

write_1302(0x8e,0x00);

write_1302(0x82,temp);

write_1302(0x8e,0x80);

write_1602com(er+6);

break;

case3:

shi++;

if(shi==24)

shi=0;

write_sfm(2,shi);

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

write_1302(0x8e,0x00);

write_1302(0x84,temp);

write_1302(0x8e,0x80);

write_1602com(er+3);

break;

case4:

week++;

if(week==8)

week=1;

write_1602com(yh+0x0C);

write_week(week);

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

write_1302(0x8e,0x00);

write_1302(0x8a,temp);

write_1302(0x8e,0x80);

write_1602com(yh+0x0e);

break;

case5:

ri++;

if(ri==32)

ri=1;

write_nyr(9,ri);

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

write_1302(0x8e,0x00);

write_1302(0x86,temp);

write_1302(0x8e,0x80);

write_1602com(yh+10);

break;

case6:

yue++;

if(yue==13)

yue=1;

write_nyr(6,yue);

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

write_1302(0x8e,0x00);

write_1302(0x88,temp);

write_1302(0x8e,0x80);

write_1602com(yh+7);

break;

case7:

nian++;

if(nian==100)

nian=0;

write_nyr(3,nian);

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

write_1302(0x8e,0x00);

write_1302(0x8c,temp);

write_1302(0x8e,0x80);

write_1602com(yh+4);

break;

}

}

}

//************减键key3,各句功能参照'加键'注释*************//

if(key3==0)

{

delay(10);//调延时,消抖动

if(key3==0)

{

buzzer=0;//蜂鸣器短响一次

delay(20);

buzzer=1;

while(!

key3);

switch(key1n)

{

case1:

miao--;

if(miao==-1)

miao=59;

write_sfm(0x08,miao);

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

write_1302(0x8e,0x00);

write_1302(0x80,temp);

write_1302(0x8e,0x80);

write_1602com(er+0x09);

//write_1602com(0x0b);

break;

case2:

fen--;

if(fen==-1)

fen=59;

write_sfm(5,fen);

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

write_1302(0x8e,0x00);

write_1302(0x82,temp);

write_1302(0x8e,0x80);

write_1602com(er+6);

break;

case3:

shi--;

if(shi==-1)

shi=23;

write_sfm(2,shi);

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

write_1302(0x8e,0x00);

write_1302(0x84,temp);

write_1302(0x8e,0x80);

write_1602com(er+3);

break;

case4:

week--;

if(week==0)

week=7;

write_1602com(yh+0x0C);

write_week(week);

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

write_1302(0x8e,0x00);

write_1302(0x8a,temp);

write_1302(0x8e,0x80);

write_1602com(yh+0x0e);

break;

case5:

ri--;

if(ri==0)

ri=31;

write_nyr(9,ri);

temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码

write_1302(0x8e,0x00);//允许写,禁止写保护

writ

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

当前位置:首页 > 高等教育 > 医学

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

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