⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clock.c

📁 使用DS1302+12864液晶+红外线遥控器,进行无线遥控来改变所有关于时间的设置.包括年,月,日等等的数字时钟的程序~
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************/
//头文件
#include <AT89X52.h>
#include <string.h>
/*****************************************************************************/


/****************************************************************************/
//引脚定义
//P2.0是遥控解码器的输入口。
sbit     SID     =    P2^1; //数据
sbit     SCLK    =    P2^2; //时钟
/*****************************************************************************/
//定义DS1302时钟接口.
sbit clock_clk = P3 ^ 5;//ds1302_clk(时钟线)
sbit clock_dat = P3 ^ 4;//ds1302_dat(数据线)
sbit clock_Rst = P3 ^ 3;//ds1302_Rst(复位线)
/*****************************************************************************/
//定义累加器A中的各位
sbit a0     = ACC ^ 0;
sbit a1     = ACC ^ 1;
sbit a2     = ACC ^ 2;
sbit a3     = ACC ^ 3;
sbit a4     = ACC ^ 4;
sbit a5     = ACC ^ 5;
sbit a6     = ACC ^ 6;
sbit a7     = ACC ^ 7;
/****************************************************************************/
//定义全局变量.
unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
bit w = 0; //调时标志位   


//*****************************************************************
#define       IR_RE P3_2

bit       k=0;                                          //红外解码判断标志位,为0则为有效信号,为1则为无效

unsigned char      date[4]={0xff,0xff,0xff,0xff};                            //date数组为存放地址原码,反码,数据原码,反码 
//******************************************************************


/*--------------------------延时1ms程子程序-----------------------*/
delay1000()             
{
unsigned char i,j;
i=5;
do{j=95;
      do{j--;}
      while(j);
      i--;
      }while(i);
}

/*---------------------------延时882us子程序-----------------------*/

delay882()
{
unsigned char i,j;
i=6;
do{j=71;
      do{j--;}
      while(j);
      i--;
      }while(i);
}

/*--------------------------延时2400ms程子程序-----------------------*/

delay2400()                                          
{
unsigned char i,j;
i=5;
do{j=237;
      do{j--;}
      while(j);
      i--;
      }while(i);
}
//**************************************************************


//**************************************************************
/*----------------------------------------------------------*/
/*-----------------------红外解码程序(核心)-----------------*/
/*----------------------------------------------------------*/

void IR_decode()
{
      unsigned char      i,j;

      while(IR_RE==0);
      delay2400();
      if(IR_RE==1)                                   //延时2.4ms后如果是高电平则是新码
      {
delay1000();
delay1000();

      for(i=0;i<4;i++)
      {
        for(j=0;j<8;j++)
        {
               while(IR_RE==0);                           //等待地址码第1位高电平到来
               delay882();                             //延时882ms判断此时引脚电平
         ///CY=IR_RE;
               if(IR_RE==0)
               {       
         date[i]>>=1;
//         date[i]=date[i]&0x7f;     
               }
               else if(IR_RE==1)
         {
         delay1000();
         date[i]>>=1;
         date[i]=date[i]|0x80;
         }
      }                                        //1位数据接收结束
         }                                           //32位二进制码接收结束
       } 
}

//*****************************************************************



//********************************************************************
/*------------------------外部中断0程序-------------------------*/
/*------------------主要用于处理红外遥控键值--------------------*/

void int0() interrupt 0
{ 
       unsigned char i;
       k=0;

       EX0=0;                                    //检测到有效信号关中断,防止干扰
       for(i=0;i<1;i++)
       { 
         delay1000();
      if(IR_RE==1){k=~k;}                       //刚开始为9ms的引导码,如果4ms内出现高电平则退出解码程序
       }

       if(k==0)
       { 
//       EX0=0;                                    //检测到有效信号关中断,防止干扰
       IR_decode();                              //如果接收到的是有效信号,则调用解码程序
       }
       delay2400();
       delay2400();
       delay2400();
      EX0=1;                                     //开外部中断,允许新的遥控按键
}

//*********************************************************************


/****************************************************************************/
void DelayM(unsigned int a){//延时函数 1MS/次 
    unsigned char i;
    while( --a != 0){  
     for(i = 0; i < 125; i++);    //一个 ; 表示空语句,CPU空转。
    }            //i 从0加到125,CPU大概就耗时1毫秒
}
/****************************************************************************/


/******************************************************************************/
//延时(LCM占用)
void delaynms(unsigned int di) {
unsigned int da,db;
    for(da=0;da<di;da++);
       for(db=0;db<10;db++);
}

/*****************************************************************************/


/******************************************************************************/
//发送一个字节(底层函数)
void lcm_w_byte(unsigned char bbyte) {
unsigned char i;
    for(i=0;i<8;i++){
       SID=bbyte&0x80; //取出最高位
     SCLK=1;
       SCLK=0;
       bbyte<<=1; //左移
      }  
}

/******************************************************************************/


/******************************************************************************/
//写指令或数据    (0,指令) (1,数据)
void lcm_w_test(bit start, unsigned char ddata) {
unsigned char start_data,Hdata,Ldata;
     if(start==0) 
    start_data=0xf8;    //0:写指令
      else    
       start_data=0xfa;    //1:写数据
  
     Hdata=ddata&0xf0;      //取高四位
     Ldata=(ddata<<4)&0xf0;    //取低四位
     lcm_w_byte(start_data);     //发送起始信号
     delaynms(10); //延时是必须的
     lcm_w_byte(Hdata);         //发送高四位
     delaynms(10);    //延时是必须的
     lcm_w_byte(Ldata);      //发送低四位
     delaynms(10);    //延时是必须的
}

/******************************************************************************/


/****************************************************************************/
//初始化LCM
void lcm_init(void)    {
delaynms(100); //启动等待,等LCM讲入工作状态

     lcm_w_test(0,0x30);    //8 位介面,基本指令集
     lcm_w_test(0,0x0c);    //显示打开,光标关,反白关
     lcm_w_test(0,0x01);    //清屏,将DDRAM的地址计数器归零 
delaynms(100); //启动等待,等LCM讲入工作状态

}
/******************************************************************************/


/*****************************************************************************/
//清屏函数
void lcm_clr(void){
lcm_w_test(0,0x01);
delaynms(40); //启动等待,等LCM讲入工作状态


}

/*****************************************************************************/


/*****************************************************************************/
//向LCM发送一个字符串,长度64字符之内。
//应用:lcm_w_word("您好!"); 
void lcm_w_word(unsigned char *str){
    while(*str != '\0'){
     lcm_w_test(1,*str++);
          }
    *str = 0;
}
/******************************************************************************/


/*****************************************************************************/
//1302驱动程序(底层协议)
void clock_out(unsigned char dd){
ACC=dd;
clock_dat=a0; clock_clk=1; clock_clk=0;
clock_dat=a1; clock_clk=1; clock_clk=0;
clock_dat=a2; clock_clk=1; clock_clk=0;
clock_dat=a3; clock_clk=1; clock_clk=0;
clock_dat=a4; clock_clk=1; clock_clk=0;
clock_dat=a5; clock_clk=1; clock_clk=0;
clock_dat=a6; clock_clk=1; clock_clk=0;
clock_dat=a7; clock_clk=1; clock_clk=0;
}
/*****************************************************************************/


/*****************************************************************************/
//DS1302写入字节(底层协议)
unsigned char clock_in(void){
clock_dat=1;
a0=clock_dat;
clock_clk=1; clock_clk=0; a1=clock_dat;
clock_clk=1; clock_clk=0; a2=clock_dat;
clock_clk=1; clock_clk=0; a3=clock_dat;
clock_clk=1; clock_clk=0; a4=clock_dat;
clock_clk=1; clock_clk=0; a5=clock_dat;
clock_clk=1; clock_clk=0; a6=clock_dat;
clock_clk=1; clock_clk=0; a7=clock_dat;
return(ACC);
}
/*****************************************************************************/



/*****************************************************************************/
//DS1302读数据(底层协议)
unsigned char read_clock(unsigned char ord){
unsigned char dd=0;
clock_clk=0;
clock_Rst=0;
clock_Rst=1;
clock_out(ord);
dd=clock_in();
clock_Rst=0;
clock_clk=1;
return(dd);
}
/*****************************************************************************/


⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -