初学单片机万能模板51单片机C语言程序.docx
《初学单片机万能模板51单片机C语言程序.docx》由会员分享,可在线阅读,更多相关《初学单片机万能模板51单片机C语言程序.docx(27页珍藏版)》请在冰豆网上搜索。
初学单片机万能模板51单片机C语言程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitDQ=P1A7;
sbitEN=P2A7;
sbitRS=P2A5;
sbitRW=P2A6;
sbitkey1=P1A0;
sbitkey2=P1A1;
sbitkey3=P1A2;
sbitkey4=P1A3;
sbitSDA=P2A4;
sbitSCLK=P2A3;
sbitCE=P2A2;
sbitbuzzer=P2A1;
ucharcodea[]={"MONTUEWEDTHUFRISATSUN"};
charnian=13,yue=3,ri=20,shi=20,fen,miao,
t1,num2,num3,date=3,A1;
bitflag;
inttemp;
floatf_temp;
voidweek(date);voidWrite_1302(ucharaddress,uchardat);bitRST_DS18B20();
voidWBIT_DS18B20(bitdata_bit);bitRBIT_DS18B20(void);void
WBYTE_DS18B20(uchardata_byte);
ucharRBYTE_DS18B20(void);voidSTART_DS18B20(void);uintREAD_TEM(void);
voidDelay_15us(uinttemp)
//延时函数。
公式:
(15*temp+15)us
for(temp;temp>0;temp--)
_nop_();
_nop_();
_nop_();
_nop_();
}
_nop_();
_nop_();
}
voiddelay(ucharx)
{
uchary,z;
for(y=x;y>0;y--)for(z=110;z>0;z--);
}
voidwrite_com(ucharcom)//1602写指令
{
RS=0;
RW=0;delay
(1);
P3=com;
EN=0;
delay
(1);
EN=1;
}
voidwrite_date(uchardate)//1602写数据{
RS=1;
RW=0;
delay
(1);
P3=date;
EN=0;delay
(1);
EN=1;
}
voidinit()
{
write_com(0x38);
位数据接口
delay(5);write_com(0x38);
delay(5);
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);delay(5);
//初始化
//显示模式设置16*2显示,5*7点阵,8
//显示开显示.显示光标,不闪烁00001110
//写一个字符后地址指针+1
//清零
miao=miao/10*16+miao%10;
fen=fen/10*16+fen%10;shi=shi/10*16+shi%10;ri=ri/10*16+ri%10;
yue=yue/10*16+yue%10;
nian=nian/10*16+nian%10;
}
voidwrite_sfm(ucharadd,chardate)
//
时分秒显示
charshi,ge;shi=date/16;ge=date%16;write_com(0xc0+add);write_date(0x30+shi);write_date(0x30+ge);
}
voidwrite_nyr(ucharadd,chardate)//年月日显示
{
charshi,ge;
shi=date/16;
ge=date%16;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidWrite_1302(ucharaddress,uchardat)//1302写数据
{
uchari;
CE=0;
SCLK=0;
CE=1;
for(i=0;i<8;i++)//循环8次写入地址数据
{
SCLK=0;
_nop_();
SDA=address&0x01;//每次传输低字节
//每次传输低字节
//右移一位DSCLK=1
//1302读数据
_nop_();
}
for(i=0;i<8;i++)//循环8次写入数据
{
SCLK=0;
_nop_();
SDA=dat&0x01;
dat>>=1;
SCLK=1;
_nop_();
}
CE=0;
_nop_();
}
ucharRead_1302(ucharaddress)
{
uchari,temp=0x00;
CE=0;
SDA=1;
SCLK=0;
CE=1;
for(i=0;i<8;i++)
//循环8次写入地址数据
{
SCLK=0;
SDA=address&0x01;//每次传输低字节
}
delay
(1);
if(SDA)temp|=0x80;
SCLK=0;temp>>=1;
for(i=0;i<7;i++)
{
SCLK=0;
if(SDA==1)
temp|=0x80;
SCLK=1;temp>>=1;
//每次传输低字节
//循环8次读取数据
//每次传输低字节
//右移一位
}
SCLK=1;
CE=0;
SDA=0;
returntemp;
}
voidDS1302_initW()
{
Write_1302(0x8e,0x00);
Write_1302(0x80,miao);
Write_1302(0x82,fen);
Write_1302(0x84,shi);
//返回
//初始化时间设置(写)
//写保护关
//秒
//分
//时
Write_1302(0x88,yue);
Write_1302(0x8a,date);
Write_1302(0x8c,nian);
Write_1302(0x8e,0x80);
}
voidDS1302_initR()
{
miao=Read_1302(0x81);
fen=Read_1302(0x83);
shi=Read_1302(0x85);
date=Read_1302(0x8b);
ri=Read_1302(0x87);
yue=Read_1302(0x89);
nian=Read_1302(0x8d);
}
voiddisplay()
{
write_com(0x80+0x07);
write_date('-');
write_com(0x80+0x04);
write_date('-');
write_com(0xc0+0x02);
write_date(':
');
write_com(0xc0+0x05);
write_date(':
');
//月
//周
//年
//写保护开
//初始化时间设置(读)
//读秒数据
//读分钟数据
//读小时数据
//读星期数据
//读日数据
//读月数据
//读年数据
//显示函数
write_com(0x80+0x00);
write_date(0x30+2);
write_date(0x30);
DS1302_initR();
write_nyr(2,nian);//送液晶显示
write_nyr(5,yue);
write_nyr(8,ri);
write_sfm(0,shi);
write_sfm(3,fen);
write_sfm(6,miao);
week(date);
//星期函数
}
voidweek(date)
{
write_com(0x80+12);
if(date==1)
{
for(num3=0;num3<3;num3++)
{
write_date(a[num3]);
delay
(2);
}
}
if(date==2)
{
for(num3=4;num3<7;num3++)
{
write_date(a[num3]);
delay
(2);
}
if(date==3)
{
for(num3=8;num3<11;num3++)
{
write_date(a[num3]);delay
(2);
}
}
if(date==4)
{
for(num3=12;num3<15;num3++)
{
write_date(a[num3]);delay
(2);
}
}
if(date==5)
{
for(num3=16;num3<19;num3++)
{
write_date(a[num3]);delay
(2);
}
}
if(date==6)
{
for(num3=20;num3<23;num3++)
write_date(a[num3]);
复位
//写位
delay
(2);
if(date==7)
{
for(num3=24;num3<27;num3++)
{
write_date(a[num3]);
delay
(2);
}
}
}
bitRST_DS18B20()//DS18B20
{
bitret=1;
DQ=0;
Delay_15us(39);
DQ=1;
Delay_15us(4);
ret=DQ;
Delay_15us(27);
DQ=1;
return(ret);
}
voidWBIT_DS18B20(bitdata_bit)
{
DQ=0;
Delay_15us(0);
DQ=data_bit;
//读位
//写字节
Delay_15us
(2);
DQ=1;
}
bitRBIT_DS18B20(void)
{
bitdata_bit;
DQ=0;
_nop_();
_nop_();
_nop_();
DQ=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
data_bit=DQ;
Delay_15us(3);
DQ=1;
return(data_bit);
}
voidWBYTE_DS18B20(uchardata_byte)
{
uchari;
for(i=0;i<8;i++)
//温度转换函数
//初始化
//跳过ROM
//温度转换
//读温度转换函数
WBIT_DS18B20((bit)(data_byte&0x01));
data_byte>>=1;
}
ucharRBYTE_DS18B20(void)//读字节
{
uchardata_byte=0;
uchari,j;
for(i=0;i<8;i++)
{
j=RBIT_DS18B20();
j=j<
data_byte=data_byte|j;
}
returndata_byte;
}
voidSTART_DS18B20(void)
{
DQ=1;
_nop_();
_nop_();
RST_DS18B20();
WBYTE_DS18B20(0xcc);
WBYTE_DS18B20(0x44);
}
uintREAD_TEM(void)
uchara,b,c,d;
_nop_();
_nop_();
TR0=0;
RST_DS18B20();
WBYTE_DS18B20(0xcc);
WBYTE_DS18B20(0xbe);
temp=RBYTE_DS18B20();
temp=(RBYTE_DS18B20()<<8)|temp;
//负数时
TR0=1;
if((temp&0X0800)>=2048)
的检测
{
temp=~temp+1;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;a=temp/100;
b=temp%100/10;c=temp%10;write_com(0xc0+13);write_date('.');
write_com(0xc0+11);
write_date(0x30+a);
write_com(0xc0+12);
write_date(0x30+b);
write_com(0xc0+14);
write_date(0x30+c);
write_com(0xc0+10);write_date('-');
//温度的小数点
//温度负值时的显示函数
//温度的负值
}
else
正数时
{
f_temp=temp*0.0625;
temp=f_temp*10+0.5;a=temp/1000;b=temp%1000/100;c=temp%100/10;
d=temp%10;
write_com(0xc0+13);
write_date('.');
write_com(0xc0+10);
write_date(0x30+a);
write_com(0xc0+11);
write_date(0x30+b);
write_com(0xc0+12);
write_date(0x30+c);
write_com(0xc0+14);write_date(0x30+d);
}
returntemp;
}
voidkey()
//温度的小数点
//温度正值时的显示函数
//键盘
{
ucharfen1,fen2,shi1,shi2,ri1,ri2,yue1,yue2,nian1,nian2,miao1,miao2;
if(!
key1)//暂停选位
//
if(!
key1){
while(!
key1);
num2++;
switch(num2)
{
case1:
flag=~flag;
Write_1302(0x8e,0x00);
write_com(0xc7);
write_com(0x0f);
break;
case2:
write_com(0xc4)
break;
case3:
write_com(0xc1)
break;
case4:
write_com(0x80+0x09);
break;
case5:
write_com(0x80+0x0c);
break;
case6:
write_com(0x80+0x06);
break;
case7:
write_com(0x80+0x03);
break;
write_com(0x0c);
num2=0;
flag=~flag;
write_nyr(2,nian);
write_nyr(5,yue);
write_nyr(8,ri);
write_sfm(0,shi);
write_sfm(3,fen);
write_sfm(6,miao);
week(date);
DS1302_initW();
//将设置的时间日期等写入DS1302中
Write_1302(0x8e,0x80);//
写保护开
break;
}
}
}
if(flag==1)
{
if(!
key2)//数字加减
{
delay(10);
if(!
key2)
{
while(!
key2);
switch(num2)
{
case1:
DS1302_initW();
miao1=miao/16;
miao2=miao%16;
miao2++;
if(miao2==10)
{
miao2=0;
miao1++;
}
if(miao1==6)
{
miao1=0;
miao2=0;
}
miao=miao1*16+miao2;
write_sfm(6,miao);
write_com(0xc7);
break;
case2:
fen1=fen/16;
fen2=fen%16;
fen2++;
if(fen2==10)
{
fen2=0;
fen1++;
}
if(fen1==6)
{
fen1=0;
fen2=0;
}
write_sfm(3,fen);
write_com(0xc4);
break;
case3:
shi1=shi/16;
shi2=shi%16;
shi2++;
if(shi2==10)
{
shi2=0;
shi1++;
}
if((shi1==2)&&(shi2==4))
{
shi1=0;
shi2=0;
}
shi=shi1*16+shi2;
write_sfm(0,shi);
write_com(0xc1)
break;
case4:
ri1=ri/16;
ri2=ri%16;
ri2++;
if(ri2==10)
{
ri2=0;
ri1++;
}
ri1=0;
ri2=1;
}
ri=ri1*16+ri2;
write_nyr(8,ri);
write_com(0x80+0x09);
break;
case5:
date++;
if(date==8)
date=1;
week(date);
write_com(0x80+0x0c);
break;
case6:
yue1=yue/16;
yue2=yue%16;
yue2++;
if(yue2==10)
{
yue2=0;
yue1++;
}
if((yue1==1)&&(yue2==3))
{
yue1=0;
yue2=1;
}yue=yue1*16+yue2;
write_nyr(5,yue);write_com(0x80+0x06);
break;
case7:
nian1=nian/16;nian2=nian%16;
nian2++;if(nian2==10)
{
nian2=0;
nian1++;
}
if((nian1==8)&&(nian2==0))
{
nian1=0;
nian2=0;
}nian=nian1*16+nian2;write_nyr(2,nian);write_com(0x80+0x03);
break;
case8:
Write_1302(0x8e,0x80);
//写保护开
break;
}
}
}
if(!
key3)
{
delay(10);
if(!
key3)
{
switch(num2){
case1:
miao1=miao/16;
miao2=miao%16;
miao2--;
if(miao2==-1)
{
miao2=9;
miao1--;
}
if(miao1==-1)
miao1=5;
miao=miao1*16+miao2;
write_sfm(6,miao);
write_com(0xc7)break;
case2:
fen1=fen/16;
fen2=fen%16;
fen2--;
if(fen2==-1)
{
fen2=9;
fen1--;
}
if(fen1==-1)
fen1=5;
fen=fen1*16+fen2;
write_sfm(3,fen);
write_com(0xc4)
break;
case3:
shi1=shi/16;
shi2=shi%16;
shi2--;
if(shi2==-1)
{
shi2=9;shi1--;
}if(shi1==-1)
{
shi1=2;
shi2=3;
}
shi=shi1*16+shi2;
write_sfm(0,shi);
write_com(0xc1)break;
case4:
ri1=ri/16;
ri2=ri%16;
ri2--;
if(ri2==-1)
{
ri2=9;ri1--;
}
if(ri1==-1)
{
ri1=3;
ri=ri1*16+ri2;
write_nyr(8,ri);
write_com(0x80+0x09);
break;
case5:
date--;
if(date==-1||date==0)
date=7;
week(date);
write_com(0x80+0x0c);
break;
case6:
yue1=yue/16;
yue2=yue%16;
yue2--;
if(yue2==-1)
{
yue2=9;
yue1--;
}
if(yue1==-1)
{
yue1=1;
yue2=2;
}
yue=yue1*16+yue2;
write_nyr(5,yue);
write_com(0x80+0x06);
break;
case7:
nian1=nian/16;
nian2=nian%16;nian2--;
if(nian2==-1)
{
nian2=9;
nian1--;
}
if(nian1==-1)
{
nian1=7;
nian2=9;
}
nian=nian1*16+nian2;write_nyr(2,nian);
write_com(0x80+0x03);break;
//写保护开
case8:
Write_1302(0x8e,0x80);
break;
}
}
}
}
}
voidmain()
{
uinttemp=0;
init();
DS1302_initW();
//初始化时间日期
DS1302_initR();
while
(1)
{
display();
key();
START_DS18B20();temp=READ_TEM();delay(5);
while(flag==1)key();