原创 【博客大赛】DIY个性时钟与温度计

2012-11-30 08:53 1782 9 11 分类: MCU/ 嵌入式

   学了51,你可以自己diy个性时钟与温度计,让你的东西与众不同,让同学们羡慕去吧

[注:AT89S52使用12M晶振]
=============================================================*/
//#include
#include
#include
#include

#define LCM_RS P2_4 //定义引脚
#define LCM_RW P2_5
#define LCM_E  P2_6
#define LCM_Data P0

#define Busy 0x80 //用于检测LCM状态字中的Busy标识
#define uchar unsigned char

uchar id,timecount;
bit  flag,sflag; //flag是时钟冒号闪烁标志,sflag是温度负号显示标志
void Disp_line1(void); //显示屏幕第一行
void Disp_line2(void); //显示屏幕第二行
void id_case1_key();

//*********** DS1302 时间显示定义部分
sbit T_CLK=P3^6;
sbit T_IO =P3^4;
sbit T_RST=P3^5;
sbit ACC0=ACC^0;
sbit ACC7=ACC^7;
void Set(uchar,uchar);     //根据选择调整相应项目
void   RTInputByte(uchar);       /* 输入 1Byte */       
uchar  RTOutputByte(void);       /* 输出 1Byte */
void   W1302(uchar, uchar);   // 向DS1302写入一个字节
uchar  R1302(uchar);          // 从DS1302读出一个字节
void   Set1302(unsigned char * ); //  设置时间
bit sec,min,hour,year,mon,day,weekk; //闪烁标志位
//初始化后设置为:08年1月1日星期二 0点0分0秒
unsigned char inittime[7]={0x00,0x00,0x00,0x08,0x01,0x02,0x08};
//                          秒  分钟 小时  日   月  星期  年

//***** 18B20温度显示定义部分
sbit DQ=P1^3; //18B20 接P13口

typedef unsigned char byte;
typedef unsigned int  word;
void Read_Temperature(char,char);
void mychar(void);
void adjust_res(char res); //res 分别等于 0x1f, 0x3f, 0x5f 温度读数分辨率分别对应
                           //              0.5, 0.25, 0.125  
//******* 1602LCD驱动 **********************************************************
void WriteDataLCM(unsigned char WDLCM);
void WriteCommandLCM(unsigned char WCLCM,BuysC);
unsigned char ReadStatusLCM(void);
void LCMInit(void);
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
void Delay5Ms(void);
void Delay400Ms(void);
unsigned char code week[]={"Week."};

//==============================================
sbit PSK=P1^0;
//==============================================

void main(void)

  PSK=0;

  Delay400Ms(); //启动等待,等LCM讲入工作状态
  LCMInit(); //LCM初始化
  Delay5Ms(); //延时片刻(可不要)
  mychar(); //显示自定义字符

  TMOD=0x01;
  TH0=(65535-50000)/256;
  TL0=(65535-50000)%256;
  EA=1;
  TR0=1;
  ET0=1; 
  W1302(0x90,0xab);//打开充电二级管 , 二个二级管串联一个8K电阻
  W1302(0x8e,0x80);//写保护,禁止写操作
  adjust_res(0x5f); //调整18B20的分辨率 0x1f:0.5; 0x3f:0.25; 0x5f:0.125
  while(1)
    {             
     if ((P3_2|P3_3)==0) //初始化
      {
       Delay5Ms();
       if ((P3_2|P3_3)==0) Set1302(inittime);
      }
     if (P3_1==0) // 设置和选择项目键
      {
       Delay5Ms();
       if(P3_1==0){id++;if(id>7) id=0;}
       while(P3_1==0);   
      }
     switch(id)
      {
       case 0:
         sec=0;
         Disp_line1(); Disp_line2();
         break;
       case 1://年
         year=1;
         Disp_line1(); Disp_line2();                 
         id_case1_key();
         break;
       case 2://月
         year=0;mon=1;
         Disp_line1(); Disp_line2();                
         id_case1_key();
         break;
       case 3://日
         mon=0;day=1;
         Disp_line1(); Disp_line2();
         id_case1_key();
         break;            
       case 4://星期
         day=0;weekk=1;
         Disp_line1(); Disp_line2();        
         id_case1_key();
         break;
       case 5://小时
         weekk=0;hour=1;
         Disp_line1(); Disp_line2();
         id_case1_key();     
         break;      
       case 6://分钟
         hour=0;min=1;
         Disp_line1(); Disp_line2();
         id_case1_key();
         break;
       case 7://秒
         min=0;sec=1;
         Disp_line1(); Disp_line2();            
         id_case1_key();
         break;             
      }
    }
}

//中断入口,冒号闪烁
void t0(void) interrupt 1 using 0
{
  TH0=(65535-50000)/256; //50ms定时
  TL0=(65535-50000)%256; 
  timecount++;
  if(timecount>9)
   {
    timecount=0;   
    flag=~flag;            
   } 
}
//id为1时的下一级选择
void id_case1_key()
{
  if (P3_3==0) //增加
      {
       Delay5Ms();
       if(P3_3==0) Set(id,0); 
       if(id!=7)  while(P3_3==0);   
      }
   if (P3_2==0)  //减少
      {
       Delay5Ms();
       if(P3_2==0) Set(id,1);         
       if(id!=7) while(P3_2==0);   
      }
}

//根据选择调整相应项目并写入DS1302
void Set(uchar sel,uchar sel_1)
{
  signed char address,item;
  signed char max,mini;
  if(sel==7)  {address=0x80; max=0;mini=0;}     //秒
  if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟
  if(sel==5)  {address=0x84; max=23;mini=0;}    //小时
  if(sel==3)  {address=0x86; max=31;mini=1;}    //日
  if(sel==2)  {address=0x88; max=12;mini=1;}    //月
  if(sel==1)  {address=0x8c; max=99;mini=0;}    //年
  if(sel==4)  {address=0x8a; max=7; mini=1;}    //星期
 
  item=R1302(address+1)/16*10+R1302(address+1)%16;
  if (sel_1==0) item++;  else item--;
  if(item>max) item=mini;  
  if(item          
  W1302(0x8e,0x00);//允许写操作
  W1302(address,item/10*16+item%10);
  W1302(0x8e,0x80);//写保护,禁止写操作 
}

//屏幕显示第一行 时间和温度
void Disp_line1(void)

  Read_Temperature(10,0); //温度显示
  //冒号闪烁    
  if(flag==0)
    {DisplayOneChar(3,0,0x3a); DisplayOneChar(6,0,0x3a);}
  else
    {DisplayOneChar(3,0,0x20); DisplayOneChar(6,0,0x20);}

  if(sec==1)  //秒闪烁标志位
    {
     if(flag==1)
       {   
        DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒
        DisplayOneChar(8,0,R1302(0x81)%16+0x30);       
       }
     else
       {
        DisplayOneChar(7,0,0x20); //显示秒
        DisplayOneChar(8,0,0x20);   
       }
    }
  else
    {
     DisplayOneChar(7,0,R1302(0x81)/16+0x30); //显示秒
     DisplayOneChar(8,0,R1302(0x81)%16+0x30);        
    }   
  
  if(min==1)  //分钟闪烁标志位
    {
     if(flag==1)
       {   
        DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟
        DisplayOneChar(5,0,R1302(0x83)%16+0x30);       
       }
     else
       {
        DisplayOneChar(4,0,0x20); //显示分钟
        DisplayOneChar(5,0,0x20);   
       }
    }
  else
    {
     DisplayOneChar(4,0,R1302(0x83)/16+0x30); //显示分钟
     DisplayOneChar(5,0,R1302(0x83)%16+0x30);        
    }

  if(hour==1)  //小时闪烁标志位
    {
     if(flag==1)
       {   
        DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时
        DisplayOneChar(2,0,R1302(0x85)%16+0x30);
       }
     else
       {
        DisplayOneChar(1,0,0x20); //显示小时
        DisplayOneChar(2,0,0x20);   
       }
    }
  else
   {
    DisplayOneChar(1,0,R1302(0x85)/16+0x30);//显示小时
    DisplayOneChar(2,0,R1302(0x85)%16+0x30);
   }
}

// 屏幕显示第二行  日期和星期  
void Disp_line2(void)
{
  DisplayOneChar(3,1,0x2f); //显示固定字符
  DisplayOneChar(6,1,0x2f);
  DisplayListChar(10,1,week);
   
  if(year==1)  //年闪烁标志位
    {
     if(flag==1)
       {   
        DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年
        DisplayOneChar(2,1,R1302(0x8d)%16+0x30);
       }
     else
       {
        DisplayOneChar(1,1,0x20); //显示年
        DisplayOneChar(2,1,0x20);   
       }
    }
  else
    {
      DisplayOneChar(1,1,R1302(0x8d)/16+0x30);//显示年
      DisplayOneChar(2,1,R1302(0x8d)%16+0x30);
    }
    
  if(mon==1)  //月闪烁标志位
    {
     if(flag==1)
       {   
        DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月
        DisplayOneChar(5,1,R1302(0x89)%16+0x30);
       }
     else
       {
        DisplayOneChar(4,1,0x20); //显示月
        DisplayOneChar(5,1,0x20);   
       }
    }
  else
    {
      DisplayOneChar(4,1,R1302(0x89)/16+0x30);//显示月
      DisplayOneChar(5,1,R1302(0x89)%16+0x30);
    }  

  if(day==1)  //日闪烁标志位
    {
     if(flag==1)
       {   
         DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日
         DisplayOneChar(8,1,R1302(0x87)%16+0x30);
       }
     else
       {
        DisplayOneChar(7,1,0x20); //显示日
        DisplayOneChar(8,1,0x20);   
       }
    }
  else
    {
      DisplayOneChar(7,1,R1302(0x87)/16+0x30);//显示日
      DisplayOneChar(8,1,R1302(0x87)%16+0x30);
    }
   
   if(weekk==1)  //星期闪烁标志位
    {
     if(flag==1)
       {   
         DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期
       }
     else
       {
        DisplayOneChar(15,1,0x20); //显示星期         
       }
    }
  else
    {
      DisplayOneChar(15,1,R1302(0x8b)%16+0x30);//显示星期
    }    
}

 

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

用户412802 2012-11-30 23:43

有视频,在ouryk.taobao.com配套板子就有的

用户403664 2012-11-30 14:47

有图才有真相啊
相关推荐阅读
用户412802 2013-10-11 21:26
【博客大赛】AD9834,高性能信号发生器的选择
  AD9834简介 AD9834是一款75 MHz、低功耗DDS器件,能够产生高性能正弦波和三角波输出。其片内还集成一个比较器,支持产生方波以用于时钟发生。当供电电压为3 V时,其功耗仅...
用户412802 2013-04-22 16:47
想学就学,EDN助你一臂之力!拿板子参加嵌入式主题大赛
  就这几个月入门进阶FPGA,边参加嵌入式主题大赛,边学习FPGA!加入FPGA入门小组一起学!       新手快来,原理有文档文档介绍,网友在完成此次的基础上,可尽情发挥,重在学习领...
用户412802 2013-02-19 10:55
ouryk回来,活动继续
最近一直忙着其他事情,小组等活动暂停了,不过现在回来了,继续完成承诺,给以最大优惠奉献大家,欢迎关注我的小组 我爱单片机...
用户412802 2013-01-12 17:09
2013的我们
2013的我们该怎么生活,技术路线,职业生涯,希望大家一起好好讨论下...
用户412802 2012-12-11 13:11
【告别2012】我们一起破2012还继续,奋斗着,学习着
2012即将结束,拿出手上的资源,让利给大家 单片机200 包邮价格 带液晶屏 http://item.taobao.com/item.htm?spm=a1z10.3.0.76.3bpjHq&...
EE直播间
更多
我要评论
2
9
关闭 站长推荐上一条 /3 下一条