初学单片机万能模板51单片机C语言程序.docx

上传人:b****7 文档编号:25330391 上传时间:2023-06-07 格式:DOCX 页数:27 大小:17.85KB
下载 相关 举报
初学单片机万能模板51单片机C语言程序.docx_第1页
第1页 / 共27页
初学单片机万能模板51单片机C语言程序.docx_第2页
第2页 / 共27页
初学单片机万能模板51单片机C语言程序.docx_第3页
第3页 / 共27页
初学单片机万能模板51单片机C语言程序.docx_第4页
第4页 / 共27页
初学单片机万能模板51单片机C语言程序.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

初学单片机万能模板51单片机C语言程序.docx

《初学单片机万能模板51单片机C语言程序.docx》由会员分享,可在线阅读,更多相关《初学单片机万能模板51单片机C语言程序.docx(27页珍藏版)》请在冰豆网上搜索。

初学单片机万能模板51单片机C语言程序.docx

初学单片机万能模板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();

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

当前位置:首页 > 教学研究 > 教学反思汇报

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

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