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

📄 2402test.c

📁 时钟是用微控制器
💻 C
📖 第 1 页 / 共 4 页
字号:
 if(DT==0x12)
 {
  AT24C02_Write1Byte(address,0xff);
 }
}
//===================================DS18B20驱动===========================================
sbit DQ=P2^0;     // 定义DS18B20数据线
/*******************延时函数***********************************************************/
void Delay(int num)
{
 while(num--) ;
}
/*******************初始化ds1820***********************************************************/
void Init_DS18B20(void)
{
 unsigned char x=0;
 DQ=1;          //DQ复位
 Delay(8);      //稍做延时
 DQ=0;          //单片机将DQ拉低
 Delay(80);     //精确延时大于480us
 DQ=1;          //拉高总线
 Delay(14);
 x=DQ;          //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 Delay(20);
}
/*******************读一个字节***********************************************************/
unsigned char ReadOneChar(void)
{
 unsigned char i=0;
 unsigned char dat=0;
 for(i=8;i>0;i--)
 {
  DQ=0;              // 给脉冲信号
  dat>>=1;
  DQ=1;              // 给脉冲信号
  if(DQ)
  dat|=0x80;
  Delay(4);
 }
 return(dat);
}
/*******************写一个字节***********************************************************/
void WriteOneChar(unsigned char dat)
{
 unsigned char i=0;
 for(i=8;i>0;i--)
 {
  DQ=0;
  DQ=dat&0x01;
  Delay(5);
  DQ=1;
  dat>>=1;
 }
}
/*******************读取温度***********************************************************/
unsigned int ReadTemperature(void)
{
 unsigned char a=0;
 unsigned char b=0;
 unsigned int t=0;
 float tt=0;
 Init_DS18B20();
 WriteOneChar(0xCC);   //跳过读序号列号的操作
 WriteOneChar(0x44);   //启动温度转换
 Init_DS18B20();
 WriteOneChar(0xCC);   //跳过读序号列号的操作
 WriteOneChar(0xBE);   //读取温度寄存器
 a=ReadOneChar();      //读低8位
 b=ReadOneChar();      //读高8位
 t=b;
 t<<=8;
 t=t|a;
 tt=t*0.0625;
 t=tt*10+0.5;          //放大10倍输出并四舍五入
 return(t);
}
/*******************写一个字节***********************************************************/
void printTemperature(void)
{
 unsigned int i=0;
 unsigned char a=0,b=0,c=0;
 i=ReadTemperature();   //读温度并送显
 a=i/100;
 if(a>0x06)
 {
  print(0xc0,"--.-");
 }
 else
 {	
  print2(0xc1,a+0x30);	//显示温度十位
  b=i/10-a*10;
  print2(0xc2,b+0x30);	//个位
  print(0xc3,".");      //"."
  c=i-a*100-b*10;
  print2(0xc4,c+0x30);  //小位1位
 }		
 print2(0xc5,0x00);
 print(0xc6,"C");       //度C
}
//=================================DS1302时钟驱动===========================================//
//注释DS1302寄存器
// DS1302内部RAM分址:00 = 0xc0(写) = 0xc1(读)  奇数是读,偶数是写
/*******************定义DS1302时钟接口******************************************************/
sbit clock_clk=P3^5;    //ds1302_clk(时钟线)
sbit clock_dat=P3^6;    //ds1302_dat(数据线)
sbit clock_Rst=P3^7;    //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;     //调时标志位
/*******************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写数据(底层协议)************************************************/
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;
}
/*******************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);
}
/*******************调时程序**********************************************************/
/*******************根据选择调整的相应项目加1并写入DS1302*****************************/
void Set_time(unsigned char sel,bit a)
{
 signed char address,item,item2;
 signed char max,mini;
 write_clock(0x8e,0x00);                    //允许写操作
 if(sel==7){address=0x80;max=59;mini=0;}    //秒7
 if(sel==6){address=0x82;max=59;mini=0;}    //分钟6
 if(sel==5){address=0x84;max=23;mini=0;}    //小时5
 if(sel==4){address=0x8a;max=7;mini=1;}     //星期4
 if(sel==3){address=0x86;max=31;mini=0;}    //日3
 if(sel==2){address=0x88;max=12;mini=0;}    //月2
 if(sel==1){address=0x8c;max=99; mini=0;}   //年1
 if(a==0)                                   //如果a是0则表示现在键入的是 十位 数据
 {
  write_clock(address,0x00);                //将 个位 的数据清0 防止数值范围计算有错
  item=DT;                                  //键值数给 十位
  item2=0;                                  // 个位 填入 0
 }
 else                                       //否则是 个位数据
 {
  item=(read_clock(address+1))/16;          //先读出 十位 数据
  item2=DT;                                 //键值放入 个位
 }  
 item=(item)*10+(item2);                    //将 十位 和 个位 数据合成
 if(item>max)
 item=mini;                                 //查看数值有效范围
 if(item<mini)
 item=max;
 write_clock(address,(item/10)*16+item%10); //转换成16进制写入1302
 write_clock(0x8e,0x80);                    //写保护,禁止写操作
}										  
/*******************检测时钟芯片是否未被初始化,如是则设置1302的初始时间********************/
void Init_1302(void)             //2008年1月1日00时00分00秒星期二
{
 menu=0;
 if(read_clock(0xc1)!=0xaa)
 {
  write_clock(0x8e,0x00);        //允许写操作
  write_clock(0x8c,0x08);        //08年
  write_clock(0x8a,0x02);        //星期二
  write_clock(0x88,0x01);        //01月
  write_clock(0x86,0x01);        //01日
  write_clock(0x84,0x00);        //00小时
  write_clock(0x82,0x00);        //00分钟
  write_clock(0x80,0x00);        //00秒
  write_clock(0x90,0xa5);        //充电
  write_clock(0xc0,0xaa);        //写入初始化标志RAM(第00个RAM位置)
  write_clock(0x8e,0x80);        //禁止写操作
  AT24C02_Write1Byte(0x03,0x00); //初始化24C02中的报警开关选择寄存器
  menu=1;                      //如果初始化则直接提示调时
 }
}
/*******************定义小汉字**************************************************************/
uint8 code Xword[]={
0x02,0x05,0x02,0x00,0x00,0x00,0x00,0x00,        //C,代码 0x03
0x00,0x00,0x00,0xff,0x00,0x00,0x00,0x00,        //一,代码 0x04
0x00,0x0e,0x00,0x00,0x00,0xff,0x00,0x00,        //二,代码 0x05
0x00,0xff,0x00,0x0e,0x00,0xff,0x00,0x00,        //三,代码 0x06
0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,0x00,        //四,代码 0x07
0x00,0xff,0x04,0x3f,0x09,0xff,0x00,0x00,        //五,代码 0x08
0x00,0x04,0xff,0x00,0x0a,0x11,0x00,0x00,        //六,代码 0x09
0x00,0x1f,0x11,0x1f,0x11,0x1f,0x00,0x00,        //日,代码 0x0a
};
/*******************装入cgram***************************************************************/
void CgramWrite(void)
{
 uint8 i;
 LCM2402_WriteCMD(0x06);        // CGRAM地址自动加1
 LCM2402_WriteCMD(0x40);        // CGRAM地址设为00处
 for(i=0;i<64;i++)
 {
  LCM2402_WriteData(Xword[i]);
 }
}
//=================================红外遥控接收===========================================//
sbit KBS=P3^2;
/********************************************************************************************
* 函数名称:keyboard_int
* 功    能:中断 红外遥控器数据接收初始化

********************INT0中断0 P3.2引脚,不能更改********************************************/
void keyboard_int(void)
{
 TMOD=0x01;  //定时器0方式1
 EA=1;       //允许CPU中断
 IT0=1;      //INT0下降沿有效
 EX0=1;      //开INT0中断
 DT=0xff;
}
/********************************************************************************************
* 函数名称:keyboard
* 功    能:中断 红外遥控器数据接收
* 入口参数:无
* 出口参数:无
**********************定时器0中断处理*******************************************************/
void timeint(void) interrupt 1 using 2
{
 TH0=0xFC;
 TL0=0xE0;           //设定时值为800us
 if(IRCON<3)
 {
  if(IRCON2<8)      //每中断一次读一次遥控接收头的状态,每二次为遥控编码中的一个位
  {
   IRCON2++;
   IRCode[IRCON]=IRCode[IRCON]<<1;    //每读一次放入变量中的二进制的一个位,每次左移一位
   IRCode[IRCON]=IRCode[IRCON]|KBS;   //每八次填满一个字节,一个字节存放遥控编码4个位
   //LED1=~LED1;
  }
  else
  {
   IRCON++;                          //填满一个字节,指向下一个变量
   IRCON2=0;                         //计数清零
  }
 }
 else
 {
  TR0=0;                            //关闭定时器
  ET0=0;                            //定时器0中断关闭
  if((IRCode[1]!=0xff)&&(IRCode[2]!=0xff))
  {
   if(IRCode[1]==0x55)
   {
    LED1=0;
    switch(IRCode[2])
    {
     case 0xD2:DT=0X4C;break;	//POWER	ON
     case 0xD3:DT=0X2F;break;	//MUTE OFF
     case 0xAB:DT=0x01;break;	//1键控制
     case 0xAC:DT=0x02;break;	//2键控制
     case 0xAD:DT=0x03;break;	//3键控制
     case 0xB2:DT=0x04;break;	//4键控制
     case 0xB3:DT=0x05;break;	//5键控制
     case 0xB4:DT=0x06;break;	//6键控制
     case 0xB5:DT=0x07;break;	//7键控制
     case 0xCA:DT=0x08;break;	//8键控制
     case 0xCB:DT=0x09;break;	//9键控制
     case 0xAA:DT=0x00;break;	//0键控制
     case 0xCC:DT=0X11;break;	//-/--
     case 0x54:DT=0X12;break;	//SEARCH
     case 0x2A:DT=0X17;break;	//Vol+
     case 0x2B:DT=0X1A;break;   //Vol-
     case 0xD5:DT=0X19;break;	//RECALL
     case 0xD4:DT=0X1B;break;	//PP
    }
   }
   if(IRCode[1]==0x56)
   {
    LED1=0;
    switch(IRCode[2])
    {
     case 0xAA:DT=0x13;break;  //PR+
     case 0xAB:DT=0x14;break;  //PR-
     case 0xCD:DT=0x15;break;  //FT+
     case 0xD2:DT=0x16;break;  //FT-
     case 0xCB:DT=0x18;break;  //STORE
     case 0xB4:DT=0x1C;break;  //SLEEP
     case 0x4A:DT=0X1D;break;  //AV
    }
   }
  }
  EX0=1;                       //开INT0中断
 }
}
/*********************INT0中断***********************************************************************/
void INT0Fun(void) interrupt 0 using 3
{
 EX0=0;                         //外部中断0关闭
 ET0=1;                         //定时器0中断打开
 TH0=0xFC;
 TL0=0xE0;                      //设定时值为800us
 for(IRCON=0;IRCON<3;IRCON++)
 {
  IRCode[IRCON]=0;
 }
 IRCON=0;
 IRCON2=0;                      //计数清零
 TR0=1;                         //开始计数
}
//=================================BEEP驱动===========================================//
sbit Bell_Out=P3^0;    //元件是动圈式扬声器(并非有源蜂鸣器),需要MCU驱动发声
/****************原来扬声器声音*********************************************************
void beep(unsigned char a,unsigned char b,unsigned char c,unsigned char d)
{
 for(;a>0;a--)          //第一个声音的长度
 {
  Bell_Out=~Bell_Out;   //取反扬声器驱动口,以产生音频
  Delay(b);             //音调设置延时
 }
 for(;c>0;c--)          //同上
 {
  Bell_Out=~Bell_Out;
  Delay(d);
 }
 Bell_Out=1;
}
//------------------扬声器--按键音--------------------------
void beep_k(void)
{
 beep(10,60,5,250);
}
//------------------扬声器--闹钟报警--------------------------

⌨️ 快捷键说明

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