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

📄 红外控制ds1302.c

📁 红外控制DS1302开发。很好的单片机学习资料
💻 C
📖 第 1 页 / 共 2 页
字号:
 /***********************************************************************************/
/*     程序名:红外控制DS1302实时钟                                                 */
/*                                                                                  */
/*     晶振:12.0 M                                        CPU型号:AT89S52         */
/*                                                                                  */                                             
/*                                                                                  */
/*     功能描述: 将实验板上的J6与J5的123个用跳帽连上                               */
/*					                             									*/
/*                                                                                  */
/*     网址:http://www.mcu-arm.cn                                                  */
/*     邮箱:mcu-arm2007@163.com
/*     QQ技术群:2056101                                                            */
/*   													 					    	*/
/*                                                                                  */
/*                                                创灵电子工作室 版权所有           */                                 
/*                                                         2007-12-20               */
/************************************************************************************/
#include <reg52.h>
#define uchar unsigned char               // 无符号8位整型变量
#define uint unsigned int
#define D 1
#define _TH0_TL0_ 	(65536 - 50000)  
#define HI 			(_TH0_TL0_ / 256) //给高8位赋值
#define LO 			(_TH0_TL0_ % 256) //给低8位赋值

static uchar flag, Sec_flag, Min_flag, time_flag, Time_flag0; //定义成静态变量,有利于数据的稳定性
static signed char Sec, Time, Min; //定义有符号的变量,方便我时钟的调整

sbit HW_IRQ = P3 ^ 2;                            // 定义38KHz一体化红外接收头与CPU的连接                                              
static uchar data IRCode[3],IRCON,IRCON2;

unsigned char SEG_TAB[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};//0-9数字
uchar SEG_TBC[] = {0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,
                   0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,
				   0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27,0x28,0x29,
				   0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,
				   0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47,0x48,0x49,
				   0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57,0x58,0x59} ; //16进制转BCD码

static signed char Count;
static uchar Count0;

sbit P1_0 = P1 ^ 0;
sbit P1_1 = P1 ^ 1;
sbit clock_dat = P1^1;			 //定义DS1302的I/O口
sbit clock_clk = P1^0;
sbit clock_rst = P1^2;

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;  

sbit P2_0 = P2 ^ 0;
sbit P2_1 = P2 ^ 1; 
sbit P2_2 = P2 ^ 2;
sbit P2_3 = P2 ^ 3;
sbit P2_4 = P2 ^ 4;
sbit P2_5 = P2 ^ 5;
sbit P2_6 = P2 ^ 6;
sbit P2_7 = P2 ^ 7;

/********************************************************************************************
* 函数名称:Delay()
* 功    能:延时程序
* 入口参数:延时时间
* 出口参数:无
*********************************************************************************************/
void Delay (uint t)
{
   uchar i;
   while(t--)
   {  for(i=0;i<125;i++)   //延时1Ms
       {;}
    }
}
/********************************************************************************************
* 函数名称:Timer0_Server()
* 功    能:定时器0中断服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Timer0_Server(void) interrupt 1 using 2
{
  TH0=0xFC;                                      // 12M: TH0=0XFC;TL0=0XE0;11.0592:TH0=0XFD;TL0=0X1E;
  TL0=0xE0;                                      // 设定时值为800us  500:FE0C
  
  if(IRCON<3)
   {
     if(IRCON2<8)                                // 每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
      {
        IRCON2++;
        IRCode[IRCON]=IRCode[IRCON]<<1;          // 每读一次放入变量中的二进制的一个位,每次左移一位
        IRCode[IRCON]=IRCode[IRCON] | HW_IRQ;    // 每八次填满一个字节,一个字节存放遥控编码4个位
      }
     else
      {
        IRCON++;                                 // 填满一个字节,指向下一个变量
        IRCON2=0;                                // 计数清零
      }
   }
  else
   {
     TR0 = 0;                                    // 关闭定时器
     ET0 = 0;                                    // 定时器0中断关闭
     if((IRCode[1] != 0xFF) && (IRCode[2] != 0xFF))
      {
        if(IRCode[1] == 0x55)
    	 {
           Count0 =IRCode[2];	 
         }
		 if(IRCode[1] == 0x56)
		 {
	       Count0 =IRCode[2];	 
	     }
      }
   }
}
/********************************************************************************************
* 函数名称:Timer1_Server()
* 功    能:定时器0中断服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void Timer1_Server(void) interrupt 3 using 3
{
   uchar i;
   TR1 = 0;               //以下调整出栈入栈的时间误差
   TL1 += (_TH0_TL0_ + 9) % 256;
   TH1 += (_TH0_TL0_ + 9) / 256 + (char)CY;
   TR1 = 1; 
   if( i== 10) //
   {
      EX0 = 1;
	  i = 0;
   }
   i++;
   flag++;
   if(flag == 20)
   {
   	  flag = 0;
   }
}
/********************************************************************************************
* 函数名称:INT0_Server()
* 功    能:外部中断0中断服务程序
* 入口参数:无
* 出口参数:无
*********************************************************************************************/
void INT0_Server(void) interrupt 0 using 2
{
  EX0 = 0;                                       // 外部中断0关闭
  ET0 = 1;                                       // 定时器0中断打开
  TH0=0xFc;
  TL0=0xe0;                                      // 设定时值为800us
  ET1 = 1;
  TH1 = 0x02;
  TL1 = 0x18;

  for(IRCON=0;IRCON<3;IRCON++) IRCode[IRCON] = 0;
  IRCON = 0;
  IRCON2 = 0;                                    // 计数清零

  TR0 = 1;                                       // 开始计数
  TR1 = 1;
}
/********************************************************************************************
* 函数名称:clock_out
* 功    能:对DS1302写1字节的数据
* 入口参数:数据 
* 出口参数:无
*********************************************************************************************/
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;
}
/********************************************************************************************
* 函数名称:clock_in()
* 功    能:读DS1302一字节的数据
* 入口参数:无 
* 出口参数:无
*********************************************************************************************/
uchar clock_in(void)//读数据 下跳沿
{
    clock_dat=1;//这个是时序,读a0的时候就是直接是clock_dat=1,a0是个位,不是一个值,
                //而读其他的就是先置1再为0,再a1=clkock—da

    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);
}
/********************************************************************************************
* 函数名称:read_clock()
* 功    能:读DS1302的数据
* 入口参数: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);
}

/********************************************************************************************
* 函数名称:write_clock()
* 功    能:对DS1302写控制时钟数据
* 入口参数:DS1302的控制字和数据 
* 出口参数:无
*********************************************************************************************/
void write_clock(unsigned char ord, unsigned char dd)
{
    clock_clk=0;//
    clock_rst=0;
    clock_rst=1;
    clock_out(ord);     //先写入控制码
    clock_out(dd);      //再写入数据
    clock_rst=0;
    clock_clk=1;
}
/********************************************************************************************
* 函数名称:Init_1302()
* 功    能:初始化DS1302
* 入口参数:无 
* 出口参数:无
*********************************************************************************************/
void Init_1302(void)
{
    write_clock(0x8e,0x00);//close_protect  0x8e--10001110   前一个参数为控制字,后一个为数据
    write_clock(0x8c,0x07);//year           0x8c--10001100
    write_clock(0x8a,0x04);//星期           0x8a--10001010
    write_clock(0x88,0x07);//month          0x88--10001000
    write_clock(0x86,0x31);//date           0x86--10000110
    write_clock(0x84,0x07);//hour           0x84--10000100
    write_clock(0x82,0x00);//minute         0x82--10000010
    write_clock(0x80,0x00);//second         0x80--10000000

    write_clock(0x90,0xa7);//supply_power   0x90--10010000   a5-10100101
    write_clock(0x8e,0x80);//open_protect   0x8e--10001110
}
/********************************************************************************************
* 函数名称:Disp_Time()
* 功    能:时钟显示和调整程序
* 入口参数: 
* 出口参数:无
*********************************************************************************************/
void Disp_Time(void)
{
   uchar Sec_0,Min_0,Time_0;
   Sec = read_clock(0x81);
   Sec_0 = Sec;
   Sec = Sec>>4;
   Sec_0 &= 0x0f;
   Min = read_clock(0x83);
   Min_0 = Min;
   Min = Min >> 4;
   Min_0 &= 0x0f;

⌨️ 快捷键说明

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