51单片机报告文档Word下载.docx

上传人:b****6 文档编号:19436296 上传时间:2023-01-06 格式:DOCX 页数:43 大小:196.63KB
下载 相关 举报
51单片机报告文档Word下载.docx_第1页
第1页 / 共43页
51单片机报告文档Word下载.docx_第2页
第2页 / 共43页
51单片机报告文档Word下载.docx_第3页
第3页 / 共43页
51单片机报告文档Word下载.docx_第4页
第4页 / 共43页
51单片机报告文档Word下载.docx_第5页
第5页 / 共43页
点击查看更多>>
下载资源
资源描述

51单片机报告文档Word下载.docx

《51单片机报告文档Word下载.docx》由会员分享,可在线阅读,更多相关《51单片机报告文档Word下载.docx(43页珍藏版)》请在冰豆网上搜索。

51单片机报告文档Word下载.docx

#definew_xi0x8a//星期的lcd位置定义

#definew_Yea0x8c//年的lcd位置定义

#definer_Sec0x81//设定秒的lcd位置定义

#definer_Min0x83//设定分的lcd位置定义

#definer_Hou0x85//设定小时的lcd位置定义

#definer_Day0x87//设定日的lcd位置定义

#definer_Mou0x89//设定月lcd位置定义

#definer_xi0x8b//设定星期的lcd位置定义

#definer_Yea0x8d//设定年的lcd位置定义

#definew_protect0x8e//DS1302写保护

sbitRS=P2^5;

//1602指令数据端定义

sbitRW=P2^6;

//1602读写端定义

sbitEN=P2^7;

//1602使能端定义

sbitACC_7=ACC^7;

//位寻址寄存器

sbitSCK=P3^5;

//DS1302时钟信号

sbitSDA=P3^6;

//DS1302数据信号

sbitRST=P3^4;

//DS1302片选信号

sbitk1=P2^0;

//P2端口定义

sbitk2=P2^1;

sbitk3=P2^2;

sbitk4=P2^3;

sbitk5=P2^4;

sbitk6=P3^0;

sbitk7=P3^1;

sbitk8=P3^2;

sbitalarm=P3^3;

//闹钟输出定义

sbitDQ=P3^7;

//DS18B20

ucharcodetable[]="

00-00-00"

;

//制作时间

ucharcodetime1[]="

00:

00"

//时间模式1,用于普通计时

ucharcodetime2[]="

//时间模式2,用于秒表计时

ucharcodetime3[]="

//时间模式3,用于闹钟设置

ucharcodemiaobiao[]="

StopWatch"

//秒表英文显示

ucharcodenaozhong[]="

Alarm"

//闹钟英文显示

ucharcodexi1[]="

Mon"

//各星期的缩写

ucharcodexi2[]="

Tue"

ucharcodexi3[]="

Wed"

ucharcodexi4[]="

Thu"

ucharcodexi5[]="

Fri"

ucharcodexi6[]="

Sat"

ucharcodexi7[]="

Sun"

uchardatadisdata[5];

ucharcodetable1[]=

{

1,2,3,0x2b-0x30,

4,5,6,0x2d-0x30,

7,8,9,0x2a-0x30,

0,0x3d-0x30,0x01-0x30,0x2f-0x30

};

longa,b,c;

uchark=0,flag=0,num1,fuhao,i1;

//全局变量

uinttvalue;

//温度数值

uchartflag;

//温度正负标志

uintcount,i,shi,fen,miao,haomiao,nian,yue,ri,num,x,menu,n,nshi=0,nfen=0;

//nshi、nfen用来判别闹钟,与系统时间对比

ucharsshi,sfen,smiao,snian,syue,sri,sxi;

//时间有关的变量

voiddelay(uintz)

uintx,y;

for(x=z;

x>

0;

x--)

for(y=110;

y>

y--);

}

//***************向DS1302写入一字节数据

voidWrite_1302(ucharaddress,uchardate)

unsignedchari;

SCK=0;

//拉低时钟信号

RST=1;

//使能端选通

//写入目标地址:

addr

for(i=0;

i<

8;

i++)//传送一个字节共八个数据位

{

if(address&

0x01)

SDA=1;

//若最低位为1时上述表达式为真

}

else

SDA=0;

//若最低位为0时上述表达式为假

}//最低位传送

SCK=1;

//上升沿写数据

address=address>

>

1;

//写入数据data

for(i=0;

i++)

if(date&

SDA=1;

SDA=0;

date=date>

RST=0;

//停止DS1302总线

//*************************从DS1302读出一字节数据

ucharRead_1302(ucharaddress)

uchari;

uchartemp;

uchardat1=0;

uchardat2=0;

i++)//写入目标地址:

if(address&

SCK=1;

i++)//输出数据:

temp

temp=temp>

if(SDA)

{

temp|=0x80;

temp&

=0x7F;

dat2=temp/16;

//BCD码到十进制的转换

dat1=temp%16;

dat1=dat2*10+dat1;

returndat1;

//返回数据

/*****************************1602显示******************************************/

voidwrite_com(ucharcom)//1602控制字

RS=0;

P0=com;

EN=1;

delay(5);

EN=0;

voidwrite_date(uchardate)//1602显示字

RS=1;

P0=date;

voidwrite_sfm(ucharadd,uchardate)//1602显示时分秒

ucharshi,ge;

shi=date/10;

ge=date%10;

write_add(0x80+0x40+add);

write_date(0x30+shi);

write_date(0x30+ge);

voidwrite_nyr(ucharadd,uchardate)//1602显示年月日

ucharshi,ge;

write_add(0x80+0x00+add);

voidwrite_xi(uchara)//显示星期的子程序

write_add(0x80+0x00+11);

if(a==1)

3;

write_date(xi1[i]);

if(a==2)

write_date(xi2[i]);

if(a==3)

write_date(xi3[i]);

if(a==4)

write_date(xi4[i]);

if(a==5)

write_date(xi5[i]);

if(a==6)

write_date(xi6[i]);

if(a==7)

write_date(xi7[i]);

voidwrite_fuhao(void)//写符号

write_add(0x80+0x00+2);

//显示-

write_date(table[2]);

delay(10);

write_add(0x80+0x00+5);

write_add(0x80+0x40+2);

//显示:

write_date(time1[2]);

write_add(0x80+0x40+5);

/******************************ds1820程序***************************************/

voiddelay_18B20(uchari)//延时1微秒

while(i--);

voidds1820rst()//ds1820复位

ucharx=0;

DQ=1;

//DQ复位

delay_18B20(4);

//延时

DQ=0;

//DQ拉低

delay_18B20(100);

//精确延时大于480us

//拉高

delay_18B20(40);

uchards1820rd()//读数据

uchari=0;

uchardat=0;

for(i=8;

i>

i--)

//给脉冲信号

dat>

=1;

if(DQ)

dat|=0x80;

delay_18B20(10);

return(dat);

voidds1820wr(ucharwdata)//写数据

uchari=0;

for(i=8;

DQ=0;

DQ=wdata&

0x01;

DQ=1;

wdata>

read_temp()//读取温度值并转换

uchara,b;

ds1820rst();

ds1820wr(0xcc);

//跳过读序列号

ds1820wr(0x44);

//启动温度转换

ds1820wr(0xbe);

//读取温度

a=ds1820rd();

b=ds1820rd();

tvalue=b;

tvalue<

<

=8;

tvalue=tvalue|a;

if(tvalue<

0x0fff)

tflag=0;

tvalue=~tvalue+1;

tflag=1;

tvalue=tvalue*(0.625);

//温度值扩大10倍,精确到1位小数

return(tvalue);

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

voidds1820disp()//温度值显示子程序

ucharflagdat;

disdata[0]=tvalue/1000+0x30;

//百位数

disdata[1]=tvalue%1000/100+0x30;

//十位数

disdata[2]=tvalue%100/10+0x30;

//个位数

disdata[3]=tvalue%10+0x30;

//小数位

if(tflag==0)

flagdat=0x20;

//正温度不显示符号

flagdat=0x2d;

//负温度显示负号:

-

if(disdata[0]==0x30)

disdata[0]=0x20;

//如果百位为0,不显示

if(disdata[1]==0x30)

disdata[1]=0x20;

//如果百位为0,十位为0也不显示

write_add(0x80+0x40+8);

write_date(flagdat);

//显示符号位

write_add(0x80+0x40+9);

write_date(disdata[0]);

//显示百位

write_add(0x80+0x40+10);

write_date(disdata[1]);

//显示十位

write_add(0x80+0x40+11);

write_date(disdata[2]);

//显示个位

write_add(0x80+0x40+12);

write_date(0x2e);

//显示小数点

write_add(0x80+0x40+13);

write_date(disdata[3]);

//显示小数位

write_add(0x80+0x40+14);

write_date(0xdf);

//显示"

"

write_add(0x80+0x40+15);

write_date(0x63);

c"

voidSpeak1()//闹铃

alarm=0;

smiao=Read_1302(r_Sec);

sfen=Read_1302(r_Min);

sshi=Read_1302(r_Hou);

snian=Read_1302(r_Yea);

syue=Read_1302(r_Mou);

sri=Read_1302(r_Day);

sxi=Read_1302(r_xi);

write_fuhao();

write_sfm(0,sshi);

write_sfm(3,sfen);

write_sfm(6,smiao);

write_nyr(0,snian);

write_nyr(3,syue);

write_nyr(6,sri);

write_xi(sxi);

delay(500);

alarm=1;

voidSpeak2()

delay(2000);

voidNormal()//正常显示时间功能

//读取时间数据

if((nshi==sshi)&

&

(nfen==sfen))//闹钟铃响

{

10;

Speak1();

while((k1==0||(k2==0)||(k3==0)||(k4==0)))//按下任意键,闹钟停止闹铃

alarm=1;

//关闭蜂鸣器

if((sshi==0||sshi==1||sshi==2||sshi==3||sshi==4||sshi==5||sshi==6||sshi==7

||sshi==8||sshi==9||sshi==10||sshi==11||sshi==12||sshi==13||sshi==14||sshi==15||sshi==16

||sshi==1||sshi==18||sshi==19||sshi==20||sshi==21||sshi==22||sshi==23)&

(sfen==0)&

(smiao==0))

Speak2();

//整点报时

voidStopWatch()//秒表功能

haomiao=0;

miao=0;

fen=0;

shi=0;

write_com(0x01);

//清屏命令

write_com(0x0c);

//写光标命令

write_com(0x80+0x00+0);

9;

write_date(miaobiao[i]);

write_com(0x80+0x40+0);

11;

write_date(time2[i]);

while(!

k4);

//按键释放确认

while(k4!

=0)//再次确认释放

if(k1==0)

//消抖

while(!

k1);

TR0=~TR0;

}

if(k2==0)

delay(10);

if(k2==0)

TR0=0;

haomiao=0;

miao=0;

fen=0;

shi=0;

writesfm(0,shi);

//小时若变化则重新写入

writesfm(3,fen);

//分钟若变化则重新写入

writesfm(6,miao);

//秒若变化则重新写入

writesfm(9,haomiao);

//毫秒若变化则重新写入

}

voidkey()//闹钟时的按键功能

n++;

if(n==1)

write_com(0x0f);

write_com(0x80+0x40+4);

//写shi

if(n==2)

write_com(0x80+0x40+7);

//写fen

if(n==3)

n=0;

nfen=fen;

nshi=shi;

write_com(0x0c);

//光标不闪烁

k2);

shi++;

if(shi==24)

writesfm(4,shi);

fen++;

if(fen==60)

writesfm(7,fen);

if(k3==0)

k3);

shi--;

if(shi==-1)

shi=23;

writesfm(4,s

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

当前位置:首页 > 经管营销 > 人力资源管理

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

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