51单片机c语言电子万年历完整程序文件.docx

上传人:b****4 文档编号:5993493 上传时间:2023-05-09 格式:DOCX 页数:28 大小:18.71KB
下载 相关 举报
51单片机c语言电子万年历完整程序文件.docx_第1页
第1页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第2页
第2页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第3页
第3页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第4页
第4页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第5页
第5页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第6页
第6页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第7页
第7页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第8页
第8页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第9页
第9页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第10页
第10页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第11页
第11页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第12页
第12页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第13页
第13页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第14页
第14页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第15页
第15页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第16页
第16页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第17页
第17页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第18页
第18页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第19页
第19页 / 共28页
51单片机c语言电子万年历完整程序文件.docx_第20页
第20页 / 共28页
亲,该文档总共28页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

51单片机c语言电子万年历完整程序文件.docx

《51单片机c语言电子万年历完整程序文件.docx》由会员分享,可在线阅读,更多相关《51单片机c语言电子万年历完整程序文件.docx(28页珍藏版)》请在冰点文库上搜索。

51单片机c语言电子万年历完整程序文件.docx

51单片机c语言电子万年历完整程序文件

该程序为51单片机c语言电子万年历

#include"reg52.h"

//#include

#defineucharunsignedchar

#defineuintunsignedint

sbitlcden=P3^4;

sbitlcdrs=P3^5;

sbitDATA=P0^7;

sbitRST=P0^5;

sbitSCLK=P0^6;

sbitmenu=P3^0;//菜单

sbitadd=P3^1;//加一

sbitdec=P3^7;//减一

sbitled0=P1^0;

sbitled1=P1^1;

sbitled2=P1^2;

sbitled3=P1^3;

sbitds=P3^2;

//sbitbeep=P3^3;

uinttemp;

floatf_temp;

uintwarn_l1=270;

uintwarn_l2=250;

uintwarn_h1=300;

uintwarn_h2=320;

uintget_temp();

voiddelayms(uintx);

voidwrite_(uchar);

voidwrite_data(uchardate);

voidinit();

voiddis_temp(uintt);

voidWrite1302(uchardat);

voidWriteSet1302(ucharCmd,uchardat);

ucharRead1302(void);

ucharReadSet1302(ucharCmd);

voidInit_DS1302(void);

voidDisplaySecond(ucharx);

voidDisplayMinute(ucharx);

voidDisplayHour(ucharx);

voidDisplayDay(ucharx);

voidDisplayMonth(ucharx);

voidDisplayYear(ucharx);

voidDisplayWeek(ucharx);

voiddis_temp(uintt);

voidread_date(void);

voidturn_val(charnewval,ucharflag,

ucharnewaddr,uchars1num);

voidkey_scan(void);

charcodetable[]="0123456789";

ucharcodetable2[]="TUEWESTHUFRISATSUNMON";

ucharsecond,minute,hour,day,month,year,week,count=0;

ucharReadValue,num,time;

voiddelayms(uintx)

{

uinti,j;

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

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

}

////////////////////////////////////////////////////////////

voidwrite_(uchar)

{

lcdrs=0;

P2=;

delayms(5);

lcden=1;

delayms(5);

lcden=0;

}

voidwrite_data(uchardate)

{

lcdrs=1;

P2=date;

delayms(5);

lcden=1;

delayms(5);

lcden=0;

}

voidinit()

{

lcden=0;

write_(0x38);

write_(0x0c);

write_(0x06);

write_(0x01);

}

/////////////////////////////////////////////////////////////////

voidWrite1302(uchardat)

{

uchari;

SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备

delayms

(2);//稍微等待,使硬件做好准备

for(i=0;i<8;i++)//连续写8个二进制位数据

{

DATA=dat&0x01;//取出dat的第0位数据写入1302

delayms

(2);//稍微等待,使硬件做好准备

SCLK=1;//上升沿写入数据

delayms

(2);//稍微等待,使硬件做好准备

SCLK=0;//重新拉低SCLK,形成脉冲

dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位

}

}

voidWriteSet1302(ucharCmd,uchardat)

{

RST=0;//禁止数据传递

SCLK=0;//确保写数居前SCLK被拉低

RST=1;//启动数据传输

delayms

(2);//稍微等待,使硬件做好准备

Write1302(Cmd);//写入命令字

Write1302(dat);//写数据

SCLK=1;//将时钟电平置于已知状态

RST=0;//禁止数据传递

}

ucharRead1302(void)

{

uchari,dat;

delayms

(2);//稍微等待,使硬件做好准备

for(i=0;i<8;i++)//连续读8个二进制位数据

{

dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位

if(DATA==1)//如果读出的数据是1

dat|=0x80;//将1取出,写在dat的最高位

SCLK=1;//将SCLK置于高电平,为下降沿读出

delayms

(2);//稍微等待

SCLK=0;//拉低SCLK,形成脉冲下降沿

delayms

(2);//稍微等待

}

returndat;//将读出的数据返回

}

ucharReadSet1302(ucharCmd)

{

uchardat;

RST=0;//拉低RST

SCLK=0;//确保写数居前SCLK被拉低

RST=1;//启动数据传输

Write1302(Cmd);//写入命令字

dat=Read1302();//读出数据

SCLK=1;//将时钟电平置于已知状态

RST=0;//禁止数据传递

returndat;//将读出的数据返回

}

voidInit_DS1302(void)

{

WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令

WriteSet1302(0x80,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值

WriteSet1302(0x82,((59/10)<<4|(59%10)));//根据写分寄存器命令字,写入分的初始值

WriteSet1302(0x84,((23/10)<<4|(23%10)));//根据写小时寄存器命令字,写入小时的初始值

WriteSet1302(0x86,((28/10)<<4|(28%10)));//根据写日寄存器命令字,写入日的初始值

WriteSet1302(0x88,((2/10)<<4|(2%10)));//根据写月寄存器命令字,写入月的初始值

WriteSet1302(0x8c,((14/10)<<4|(14%10)));//nian

//WriteSet1302(0x8a,((4/10)<<4|(4%10)));

}

/////////////////////////////////////////////////////////////////

voidDisplaySecond(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_(0x80+0x46);

write_data(i+0x30);

write_(0x80+0x47);

write_data(j+0x30);

write_(0x80+0x48);

write_data('');

dis_temp(get_temp());

}

voidDisSecond(ucharx)

{

uchari,j;

ReadValue=ReadSet1302(0x81);

second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

i=x/10;

j=x%10;

write_(0x80+0x46);

write_data(i+0x30);

write_(0x80+0x47);

write_data(j+0x30);

}

voidDisplayMinute(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_(0x80+0x43);

write_data(i+0x30);

write_(0x80+0x44);

write_data(j+0x30);

write_(0x80+0x45);

write_data(':

');

}

voidDisplayHour(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_(0x80+0x40);

write_data(i+0x30);

write_(0x80+0x41);

write_data(j+0x30);

write_(0x80+0x42);

write_data(':

');

}

voidDisplayDay(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_(0x89);

write_data(i+0x30);

write_(0x8a);

write_data(j+0x30);

}

voidDisplayMonth(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_(0x86);

write_data(i+0x30);

write_(0x87);

write_data(j+0x30);

write_(0x88);

write_data('/');

}

voidDisplayYear(ucharx)

{

uchari,j;

i=x/10;

j=x%10;

write_(0x81);

write_data(2+0x30);

write_(0x82);

write_data(0+0x30);

write_(0x83);

write_data(i+0x30);

write_(0x84);

write_data(j+0x30);

write_(0x85);

write_data('/');

}

voidDisplayWeek(ucharx)

{uchari;

x=x*3;

//write_(0x8c);write_data(table2[x]);

//write_(0x8d);write_data(table2[x+1]);

//write_(0x8e);write_data(table2[x+2]);

write_(0x8c);

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

{

write_data(table2[x]);

x++;

}

}

voidread_date(void)

{

ReadValue=ReadSet1302(0x81);

second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x83);

minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x85);

hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x87);

day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x89);

month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x8d);

year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);

ReadValue=ReadSet1302(0x8b);//读星期

week=ReadValue&0x07;

DisplayYear(year);

DisplayMonth(month);

DisplayDay(day);

DisplayWeek(week);

DisplayHour(hour);

DisplayMinute(minute);

DisplaySecond(second);

dis_temp(get_temp());///温度显示

key_scan();///按键检测

}

voidturn_val(charnewval,ucharflag,ucharnewaddr,uchars1num)

{

newval=ReadSet1302(newaddr);//读取当前时间

newval=((newval&0x70)>>4)*10+(newval&0x0f);//将bcd码转换成十进制

if(flag)//判断是加一还是减一

{

newval++;

switch(s1num)

{case1:

if(newval>99)newval=0;

DisplayYear(newval);

break;

case2:

if(newval>12)newval=1;

DisplayMonth(newval);

break;

case3:

if(newval>31)newval=1;

DisplayDay(newval);

break;

case4:

if(newval>6)newval=0;

DisplayWeek(newval);

break;

case5:

if(newval>23)newval=0;

DisplayHour(newval);

break;

case6:

if(newval>59)newval=0;

DisplayMinute(newval);

break;

case7:

if(newval>59)newval=0;

DisplaySecond(newval);

break;

default:

break;

}

}

else

{

newval--;

switch(s1num)

{case1:

if(newval==0)newval=99;

DisplayYear(newval);

break;

case2:

if(newval==0)newval=12;

DisplayMonth(newval);

break;

case3:

if(newval==0)newval=31;

DisplayDay(newval);

break;

case4:

if(newval<0)newval=6;

DisplayWeek(newval);

break;

case5:

if(newval<0)newval=23;

DisplayHour(newval);

break;

case6:

if(newval<0)newval=59;

DisplayMinute(newval);

break;

case7:

if(newval<0)newval=59;

DisplaySecond(newval);

break;

default:

break;

}

}

WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));//将新数据写入寄存器

}

//////////////////////////////////////

voiddsreset(void)

{

uinti;

ds=0;

i=103;

while(i>0)

i--;

ds=1;

i=4;

while(i>0)

i--;

}

bittempreadbit(void)

{

uinti;

bitdat;

ds=0;i++;

ds=1;i++;i++;

dat=ds;

i=8;

while(i>0)

i--;

return(dat);

}

uchartempread(void)

{

uchari,j,dat;

dat=0;

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

{

j=tempreadbit();

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

}

return(dat);

}

voidtempwritebyte(uchardat)

{

uinti;

ucharj;

bittestb;

for(j=1;j<=8;j++)

{

testb=dat&0x01;

dat=dat>>1;

if(testb)

{

ds=0;

i++;i++;

ds=1;

i=8;

while(i>0)

i--;

}

else

{

ds=0;

i=8;

while(i>0)i--;

ds=1;

i++;i++;

}

}

}

voidtempchange(void)

{

dsreset();

delayms

(1);

tempwritebyte(0xcc);

tempwritebyte(0x44);

key_scan();//////按键函数

}

uintget_temp()

{

uchara,b;

tempchange();//////温度函数

dsreset();

delayms

(1);

tempwritebyte(0xcc);

tempwritebyte(0xbe);

a=tempread();

b=tempread();

temp=b;

temp<<=8;

temp=temp|a;

f_temp=temp*0.0625;

temp=f_temp*10+0.5;

f_temp=f_temp+0.05;

returntemp;

}

//////

voiddis_temp(uintt)

{

ucharn1,n2,n3;

n1=t/100;

n2=t%100/10;

n3=t%100%10;

DisSecond(second);///秒显示

write_(0x80+0x49);

write_data(table[n1]);

//delayms(5);

write_(0x80+0x4a);

write_data(table[n2]);

//delayms(5);

write_(0x80+0x4b);

write_data('.');

//delayms(5);

write_(0x80+0x4c);

write_data(table[n3]);

//delayms(5);

write_(0x80+0x4d);

write_data('^');

//delayms(5);

write_(0x80+0x4e);

write_data('C');

//delayms(5);

DisSecond(second);////秒显示

}

/*********************液晶显示*****************/

voidwarn(uints,ucharled)

{

uchari;i=s;

//beep=0;

P1=~(led);

while(i--)

{

dis_temp(get_temp());

}

//beep=1;

P1=0xff;

i=s;

while(i--)

{

dis_temp(get_temp());

}

}

voiddeal(uintt)

{

uchari;

if((t>warn_l2)&&(t<=warn_l1))

{

warn(40,0x01);

}

elseif(t<=warn_l2)

{

warn(10,0x03);

}

elseif((t=warn_h1))

{

warn(40,0x04);

}

elseif(t>=warn_h2)

{

warn(10,0x0c);

}

else

{

i=40;

while(i--)

{dis_temp(get_temp());

DisSecond(second);}

}

}

///////////////////////////////////////

voidmain()

{

init();

Init_DS1302();

while

(1)

{

tempchange();

read_date();

deal(temp);

key_scan();

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

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

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2