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