用户注册



邮箱:

密码:

用户登录


邮箱:

密码:
记住登录一个月忘记密码?

发表随想


还能输入:200字
云代码 - c代码库

51实现日历(温度时间日期1602实时显示)

2012-09-09 作者: wayneliu举报

[c]代码库

#include<reg52.h>
#define ui unsigned int 
#define uc unsigned char 
sbit clk=P3^6;// ds1302 端口
sbit io=P3^4;
sbit rst=P3^5;

sbit rs=P2^6;//1602液晶 端口
sbit en=P2^7;
sbit rw=P2^5;

sbit DQ=P3^7;//ds18b20 端口


uc code table[]= "20  -  -";
uc code table1[]="  :  :      .  c";
uc shi,fen,miao,shi1,shi2,fen1,fen2,nian,yue,ri,count,flag,flag1;
uc a,b,c,d,e,m,n,s,num,nling,count;
int t1,t2; 
float tt;
uint ;temph=30;
uint ;templ=0;
///////////////////**延时部分**////////////////////

void delay1(ui i) //us延时函数
{
 while(i--);
}
void delay(ui z) //ms延时函数
{
   ui x,y;
   for(x=z;x>0;x--)
     for(y=110;y>0;y--);
}

///////////////////**1602液晶**////////////////////
void write_1602(uc d,uc date) 
{ 
   rs=d;      //d=0写命令 d=1写数据
   P0=date;
   delay(2);
   en=1;
   delay(2);
   en=0;
}

void wadd_1602s(uc add,uc date)//往lcd指定地址写两位数据
{
	uc shi,ge;
	shi=date/10;
	ge=date%10;
	write_1602(0,add);
	write_1602(1,0x30+shi);
	write_1602(1,0x30+ge);
}

void wadd_1602z(uc add1,uc date1,uc date2,uc date3)  // 指定地址写三位字符
{
   write_1602(0,add1);
   write_1602(1,date1);
   write_1602(1,date2);
   write_1602(1,date3);
}
void init_1602() //1602初始化
{
    uc a;
    rw=0;
    write_1602(0,0x38);
    write_1602(0,0x0c);
    write_1602(0,0x06);
    write_1602(0,0x01);
    for(a=0;a<=7;a++)
       { 
         write_1602(1,table[a]);
       }
    write_1602(0,0x80+0x40);
    for(a=0;a<=16;a++)
       {
         write_1602(1,table1[a]);
       }
}

////////////////////**ds1302时钟**////////////////////

void write_1302(uc date)  //写数据
{
  ui i,k;
  k=date;
  for(i=0;i<8;i++)
     {
       io=k&0x01;
       clk=1;
       clk=0;
       k=k>>1;
     }
}
uc read_1302()  //读数据
{
  ui i,k;
  for(i=0;i<8;i++)
     {
       k=k>>1;
       if(io==1)k=k+0x80;
       clk=1;
       clk=0;
     }
  return k;
}
void wadd_1302(uc add,uc date)  //指定地址写数据
{ 
  rst=0;
  clk=0;
  rst=1;
  write_1302(add);
  write_1302(date);
  clk=1;
  rst=0;
}
uc radd_1302(uc add)  //指定地址读数据
{  
  uc d;
  rst=0;
  clk=0;
  rst=1;
  write_1302(add|0x01);
  d=read_1302();
  clk=1;
  rst=0;
  return d;
}
 void Initial_DS1302(void)   //时钟芯片初始化
 { 
   wadd_1302(0x8e,0x00);
   wadd_1302(0x80,0x00);
   wadd_1302(0x82,0x45);
   wadd_1302(0x84,0x16);
   wadd_1302(0x86,0x20);
   wadd_1302(0x88,0x07);
   wadd_1302(0x8c,0x12);
   wadd_1302(0x8e,0x80);
   }
    
////////////////////**18b20测温**//////////////////

void init_ds18b20()   //18b20初始化函数
{
 uc x=0;
 DQ = 1;    //DQ复位
 delay1(8);  //稍做延时
 DQ = 0;    //单片机将DQ拉低
 delay1(80); //精确延时 大于 480us
 DQ = 1;    //拉高总线
 delay1(10);
 x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 delay1(5);
}

uc ReadOneChar() //读一个字节
{
uc i;
uc dat=0;
for (i=8;i>0;i--)
 {
  DQ = 0; // 给脉冲信号
  dat>>=1;
  DQ = 1; // 给脉冲信号
  if(DQ)
  dat|=0x80;
  delay1(5);
 }
 return(dat);
}

void WriteOneChar(uc dat)//写一个字节
{
 uc i;
 for (i=8; i>0; i--)
 {
  DQ = 0;
  DQ = dat&0x01;
  delay1(5);
  DQ = 1;
  dat>>=1;
 }
delay1(5);
}

void ReadTem()//读取温度
{

  init_ds18b20();
  WriteOneChar(0xcc); // 跳过读序号列号的操作
  WriteOneChar(0x44); // 启动温度转换
  delay1(200);
  init_ds18b20();
  WriteOneChar(0xcc); //跳过读序号列号的操作 
  WriteOneChar(0xbe); //读取温度寄存器等
  a=ReadOneChar();
  b=ReadOneChar();
  t1=b;
  t1<<=8;
  t1=t1|a;

  if(tt>=35)
     nling=1;
  else if(tt<=10)
	    nling=1;
}
 
///////////////////////显示部分////////////////////////

void display()    
{
  ReadTem();                   //温度
  if(t1<0){t2=~t1+1; write_1602(0,0x80+0x40+9);write_1602(1,'-');}
  else {t2=t1;write_1602(0,0x80+0x40+9);write_1602(1,' ');}
  tt=t2*0.0625; //将温度的高位与低位合并
  t2=tt*10+0.5; //对结果进行4舍5入
  write_1602(0,0x80+0x40+10);
  write_1602(1,0x30+(t2/100)%10);
  write_1602(1,0x30+(t2/10)%10);
  write_1602(1,'.');
  write_1602(1,0x30+(t2%10));
  write_1602(1,0xdf);
  write_1602(1,'C');
  shi=(radd_1302(0x84)>>4)*10+(radd_1302(0x84)&0x0f);
  fen=(radd_1302(0x82)>>4)*10+(radd_1302(0x82)&0x0f);
  miao=(radd_1302(0x80)>>4)*10+(radd_1302(0x80)&0x0f);

  wadd_1602s(0x80+0x40,shi);
  wadd_1602s(0x80+0x43,fen);
  wadd_1602s(0x80+0x46,miao);  //时间

  nian=(radd_1302(0x8c)>>4)*10+(radd_1302(0x8c)&0x0f);
  yue=(radd_1302(0x88)>>4)*10+(radd_1302(0x88)&0x0f);
  ri=(radd_1302(0x86)>>4)*10+(radd_1302(0x86)&0x0f);

  wadd_1602s(0x82,nian);
  wadd_1602s(0x85,yue);
  wadd_1602s(0x88,ri);        //日期
}



//*******************主函数******************
void main()
{ 
 
  init_1602();
  init_ds18b20();
  Initial_DS1302();
  while(1)
   {
     if(flag1==0)
        display();
	 delay(100);
   }
}


网友评论    (发表评论)


发表评论:

评论须知:

  • 1、评论每次加2分,每天上限为30;
  • 2、请文明用语,共同创建干净的技术交流环境;
  • 3、若被发现提交非法信息,评论将会被删除,并且给予扣分处理,严重者给予封号处理;
  • 4、请勿发布广告信息或其他无关评论,否则将会删除评论并扣分,严重者给予封号处理。


扫码下载

加载中,请稍后...

输入口令后可复制整站源码

加载中,请稍后...