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

📄 +

📁 基于msp430和1286的红外控制的万年历
💻
字号:
#include <msp430x14x.h>
#include"ds1302.h"
#include "main.h"
#include "jiema.h"
#include "flash.h"
typedef unsigned char uchar;
typedef unsigned int  uint;

/**************宏定义***************/
#define DS_RST  BIT2        //DS_RST = P3.2 
#define DS_SCL  BIT6        //DS_SCL = P3.6 
#define DS_SDA  BIT7        //DS_SDA = P3.7 
#define DS_RST_IN P3DIR &= ~DS_RST
#define DS_RST_OUT P3DIR |= DS_RST
#define DS_RST0 P3OUT &= ~DS_RST
#define DS_RST1 P3OUT |= DS_RST
#define DS_SCL_IN P3DIR &= ~DS_SCL
#define DS_SCL_OUT P3DIR |= DS_SCL
#define DS_SCL0 P3OUT &= ~DS_SCL
#define DS_SCL1 P3OUT |= DS_SCL
#define DS_SDA_IN P3DIR &= ~DS_SDA
#define DS_SDA_OUT P3DIR |= DS_SDA
#define DS_SDA0 P3OUT &= ~DS_SDA
#define DS_SDA1 P3OUT |= DS_SDA
#define DS_SDA_BIT P3IN & DS_SDA

/*******************************************
函数名称:delay
功    能:延时一段时间
参    数:time--延时长度
返回值  :无
********************************************/
void delay(uint time)
{
    uint i;
    for(i = 0;i < time;i++)     _NOP();
}
/*******************************************
函数名称:Reset_DS1302
功    能:对DS1302进行复位操作
参    数:无
返回值  :无
********************************************/
void Reset_DS1302(void)
{
    DS_RST_OUT;  //RST对应的IO设置为输出状态
    DS_SCL_OUT;  //SCLK对应的IO设置为输出状态
    DS_SCL0;     //SCLK=0
    DS_RST0;     //RST=0
    delay(10);
    DS_SCL1;    //SCLK=1
}
/*******************************************
函数名称:Write1Byte
功    能:对DS1302写入1个字节的数据
参    数:wdata--写入的数据
返回值  :无
********************************************/
void Write1Byte(uchar wdata) 
{ 
    uchar i;

    DS_SDA_OUT;     //SDA对应的IO设置为输出状态
    DS_RST1;        //REST=1;

    for(i = 8; i > 0; i--) 
    {
        if(wdata&0x01)  DS_SDA1;
        else            DS_SDA0;
        DS_SCL0;
        delay(10); 
        DS_SCL1;
        delay(10); 
        wdata >>= 1; 
    } 
}
/*******************************************
函数名称:Read1Byte
功    能:从DS1302读出1个字节的数据
参    数:无
返回值  :读出的一个字节数据
********************************************/
uchar Read1Byte(void) 
{ 
    uchar i;
    uchar rdata = 0X00;

    DS_SDA_IN;  //SDA对应的IO设置为输入状态
    DS_RST1;    //REST=1;

    for(i = 8; i > 0; i--)
    {
        DS_SCL1;
        delay(10);
        DS_SCL0;
        delay(10);
        rdata >>= 1;
        if(DS_SDA_BIT)  rdata |= 0x80;
    } 
    
    return(rdata); 
}
/*******************************************
函数名称:W_Data
功    能:向某个寄存器写入一个字节数据
参    数:addr--寄存器地址
          wdata--写入的数据
返回值  :无
********************************************/
void W_Data(uchar addr, uchar wdata)
{
    DS_RST0; 
    DS_SCL0;   
    _NOP();
    DS_RST1;
    Write1Byte(addr);   //写入地址
    Write1Byte(wdata);  //写入数据
    DS_SCL1;
    DS_RST0;
} 
/*******************************************
函数名称:R_Data
功    能:从某个寄存器读出一个字节数据
参    数:addr--寄存器地址
返回值  :读出的数据
********************************************/
uchar R_Data(uchar addr)
{
    uchar rdata;
    
    DS_RST0; 
    DS_SCL0; 
    _NOP();
    DS_RST1;
    Write1Byte(addr);    //写入地址
    rdata = Read1Byte();  //读出数据 
    DS_SCL1;
    DS_RST0;
    
    return(rdata);
}
/*******************************************
函数名称:BurstWrite1302
功    能:以burst方式向DS1302写入批量时间数据
参    数:ptr--指向时间数据存放地址的指针
返回值  :读出的数据
说    明:时间数据的存放格式是:
          秒,分,时,日,月,星期,年,控制
            【7个数据(BCD格式)+1个控制】
********************************************/
void BurstWrite1302(uchar *ptr)
{
    uchar i;
    
    W_Data(0x8e,0x00);      //允许写入     
    DS_RST0; 
    DS_SCL0; 
    _NOP();
    DS_RST1;
    Write1Byte(0xbe);       // 0xbe:时钟多字节写入命令 
    for (i = 8; i > 0; i--) 
    {
        Write1Byte(*ptr++); 
    }
    DS_SCL1;
    DS_RST0;
    W_Data(0x8e,0x80);      // 禁止写入
} 
/*******************************************
函数名称:BurstRead1302
功    能:以burst方式从DS1302读出批量时间数据
参    数:ptr--指向存放时间数据地址的指针
返回值  :无
说    明:时间数据的存放格式是:
          秒,分,时,日,月,星期,年,控制
            【7个数据(BCD格式)+1个控制】
********************************************/
void BurstRead1302(uchar *ptr)
{
    uchar i;
  
    DS_RST0; 
    DS_SCL0; 
    _NOP();
    DS_RST1;
    Write1Byte(0xbf);             //0xbf:时钟多字节读命令
    for (i = 8; i > 0; i--) 
    {
       *ptr++ = Read1Byte(); 
    }
    DS_SCL1;
    DS_RST0;
}
/*******************************************
函数名称:BurstWriteRAM
功    能:以burst方式向DS1302的RAM中写入批量数据
参    数:ptr--指向存放数据地址的指针
返回值  :无
说明    :共写入31个字节的数据
********************************************/
void BurstWriteRAM(uchar *ptr)
{
    uchar i;
    
    W_Data(0x8e,0x00);         //允许写入
    DS_RST0; 
    DS_SCL0; 
    _NOP();
    DS_RST1;
    Write1Byte(0xfe);          //0xfe:RAM多字节写命令 
    for (i = 31; i>0; i--)     //RAM共有31个字节
    {
        Write1Byte(*ptr++); 
    }
    DS_SCL1;
    DS_RST0; 
    W_Data(0x8e,0x80);          //禁止写入
} 
/*******************************************
函数名称:BurstReadRAM
功    能:以burst方式从DS1302的RAM中读出批量数据
参    数:ptr--指向数据存放地址的指针
返回值  :无
说明    :共读出31个字节的数据
********************************************/
void BurstReadRAM(uchar *ptr)
{
    uchar i;
  
    DS_RST0; 
    DS_SCL0; 
    _NOP();
    DS_RST1;
    Write1Byte(0xff);             //0xff:RAM的多字节读命令 
    for (i = 31; i > 0; i--) 
    {
       *ptr++ = Read1Byte();   
    }
    DS_SCL1;
    DS_RST0;
}
/*******************************************
函数名称:Set_DS1302
功    能:设置DS1302内部的时间
参    数:ptr--指向存放数据地址的指针
返回值  :无
说明    :写入数据的格式:
            秒 分 时 日 月 星期 年  【共7个字节】
********************************************/
void Set_DS1302(uchar *ptr) 
{
    uchar i;
    uchar addr = 0x80; 
    
    W_Data(0x8e,0x00);    //允许写入
    
    for(i = 7;i > 0;i--)
    { 
        W_Data(addr,*ptr++); 
        addr += 2;
    }
    W_Data(0x8e,0x80);      //禁止
}
/******************************************************************** 
*
* 名称: Get_DS1302
* 说明: 
* 功能: 读取DS1302当前时间
* 调用: R_Data(uchar addr) 
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年 
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*******************************************
函数名称:Get_DS1302
功    能:读取DS1302内部的时间
参    数:ptr--指向数据存放地址的指针
返回值  :无
说明    :读出数据的格式:
            秒 分 时 日 月 星期 年  【共7个字节】
********************************************/
void Get_DS1302(uchar *ptr) 
{
    uchar i;
    uchar addr = 0x81;
    
    for(i = 0;i < 7;i++)
    {
        ptr[i] = R_Data(addr);
        addr += 2;
    }
}

void ds1302_work()
{
  //功    能:以burst方式从DS1302读出批量时间数据
// 秒,分,时,日,月,星期,年,控制
  BurstRead1302(rdata);
  if(alarm_flag==0)
       {
           beep_out;
           beep_0;
          
           for(unsigned char i=0;i<4;i++)
           {//////////
              if(Flash_read_char(i+5)==0)
              {
                if( Flash_read_char(i+1)== (((rdata[2]&0xf0)>>4)*10+(rdata[2]&0x0F)) )
                {
                  if(rdata[1]==0)
                  {
                    if(rdata[0]==0)
                    {
                  alarm_flag=1;
                    }
                  
                  }
                }
              }
           }////////////
       }
       else if(alarm_flag==1)
       {
          beep_out;
           beep_1;
         static unsigned int j=0;
         j++;
          if(j>300)//2分钟
          {
            j=0;
            alarm_flag=0;
          }
         
       }
       
        dis_time_temp[6] =  (rdata[0]&0xf0)>>4 ;
        dis_time_temp[7] =  rdata[0]&0x0f;
        dis_time_temp[3] =  (rdata[1]&0xf0)>>4 ;
        dis_time_temp[4] =  rdata[1]&0x0f;
        dis_time_temp[0] =  (rdata[2]&0xf0)>>4 ;
        dis_time_temp[1] =  rdata[2]&0x0f;
        
        dis_date_temp[4] = (rdata[6]&0xf0)>>4 ;
        dis_date_temp[5] =rdata[6]&0x0f;
        dis_date_temp[7] =(rdata[4]&0xf0)>>4 ;
        dis_date_temp[8] =rdata[4]&0x0f;
        dis_date_temp[10]=(rdata[3]&0xf0)>>4 ;
        dis_date_temp[11]=rdata[3]&0x0f;
        
         dis_week_temp[2]= week[rdata[5]*2]; 
         dis_week_temp[3]= week[(rdata[5]*2)+1];
         dis_temperture_temp[0]=temp_temperture[0];
         dis_temperture_temp[1]=temp_temperture[1];
         for(unsigned char i=0;i<4;i++)
         {
            dis_week_temp[10]=kaiguan[2];
            dis_week_temp[11]=kaiguan[3];
           if(Flash_read_char(5+i)==0)
           {
              dis_week_temp[10]=kaiguan[0];
              dis_week_temp[11]=kaiguan[1];
              break;
           }  
            
         }
}

⌨️ 快捷键说明

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