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

📄 2402test.txt

📁 时钟是用微控制器
💻 TXT
📖 第 1 页 / 共 3 页
字号:
 return(t);
}
//*******************写一个字节**************************************************************
void printTemperature(void)
{
 unsigned int i=0;
 unsigned char a=0,b=0,c=0;
 i=ReadTemperature();    //读温度并送显
 a=i/100;
 if(a>0x09)
 {
  print(0xc0,"--.-");
 }
 else
 {	
  print2(0xc0,a+0x30);	//显示温度十位
  b=i/10-a*10;
  print2(0xc1,b+0x30);	//个位
  print(0xc2,".");      //"."
  c=i-a*100-b*10;
  print2(0xc3,c+0x30);  //小数点后1位
 }
 print2(0xc4,0x00);     //度C
 print(0xc5,"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);
}
//*******************调时程序****************************************************************
void Set_time(unsigned char sel,bit a)          //根据选择调整的相应项目加1并写入DS1302
{
 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);          //年
  write_clock(0x8a,0x02);          //星期
  write_clock(0x88,0x01);          //月
  write_clock(0x86,0x01);          //日
  write_clock(0x84,0x00);          //小时
  write_clock(0x82,0x00);          //分钟
  write_clock(0x80,0x00);          //秒
  write_clock(0x90,0xa5);          //充电
  write_clock(0xc0,0xaa);          //写入初始化标志RAM(第00个RAM位置)
  write_clock(0x8e,0x80);          //禁止写操作
  AT24C02_Write1Byte(0x03,0x00);   //初始化24C00中的报警开关选择寄存器
  menu=1;                          //如果初始化则直接提示调时
 }
}
//*******************定义小汉字**************************************************************
uint8 code Xword[]={
0x02,0x05,0x05,0x02,0x00,0x00,0x00,0x00,
//0x18,0x18,0x07,0x08,0x08,0x08,0x07,0x00,      //C,代码 0x03
0x00,0x00,0x00,0x00,0xff,0x00,0x00,0x00,        //一,代码 0x04
0x00,0x00,0x00,0x0e,0x00,0xff,0x00,0x00,        //二,代码 0x05
0x00,0x00,0xff,0x00,0x0e,0x00,0xff,0x00,        //三,代码 0x06
0x00,0x00,0xff,0xf5,0xfb,0xf1,0xff,0x00,        //四,代码 0x07
0x00,0xfe,0x08,0xfe,0x0a,0x0a,0xff,0x00,        //五,代码 0x08
0x00,0x04,0x00,0xff,0x00,0x0a,0x11,0x00,        //六,代码 0x09
0x00,0x1f,0x11,0x1f,0x11,0x11,0x1f,0x00,        //日,代码 0x0a
//0x08,0x0f,0x14,0x0f,0x0c,0x1f,0x04,0x00,      //年
//0x07,0x09,0x0f,0x09,0x0f,0x0b,0x11,0x00,      //月
//0x1f,0x11,0x11,0x1f,0x11,0x11,0x1f,0x00,      //日
      //星
      //期
};
//*******************装入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中断;
 }
}

void INT0Fun(void) interrupt 0 using 3	//INT0中断
{
 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);
}
//---------------------------扬声器--闹钟报警
void beep_a(void)
{
 beep(250,16,150,40);
}
//---------------------------扬声器--成功音
void beep_y(void)
{
 beep(50,30,100,50);
}
//---------------------------扬声器--无效音
void beep_n(void)
{
 beep(50,80,100,100);
}
//================================纯软件部分=================================================
//显示项目 时间部分 在第一行全行显示时间
//*******************************************************************************************
void RealTime_Display(void)
{
 print(0x80,"20");
 print2(0x82,(read_clock(0x8d)/16)+0x30);
 print2(0x83,(read_clock(0x8d)%16)+0x30);
 print(0x84,"/");                           // 显示年

 print2(0x85,(read_clock(0x89)/16)+0x30);
 print2(0x86,(read_clock(0x89)%16)+0x30);
 print(0x87,"/");                           // 显示月

 print2(0x88,(read_clock(0x87)/16)+0x30);
 print2(0x89,(read_clock(0x87)%16)+0x30);
 print(0x8a," [");                           // 显示[
 print2(0x8c,read_clock(0x8b)%16);          // 星期
 print(0x8d,"] ");                           // 显示]

 print2(0x8f,(read_clock(0x85)/16)+0x30);   // 小时
 print2(0x90,(read_clock(0x85)%16)+0x30);
 print(0x91,":");                           // 显示cgram第一个字模":"

 print2(0x92,(read_clock(0x83)/16)+0x30);   // 分钟
 print2(0x93,(read_clock(0x83)%16)+0x30);
 print(0x94,":");                           // 显示cgram第一个字模":"

 print2(0x95,(read_clock(0x81)/16)+0x30);   // 秒
 print2(0x96,(read_clock(0x81)%16)+0x30);

// print(0x8a," ");                           //在主显示区空白处写入空格 防止乱码
// print(0x8e," ");
// print(0xc0," ");
}
/********************************************************************************************
//显示项目 定时时间部分 在第一行全行显示时间
*********************************************************************************************/    
void alarm_Display(void)
{
 print(0x80,"AL");
 print2(0x82,(AT24C02_Read1Byte(0x05+(rom*10))/16)+0x30);
 print2(0x83,(AT24C02_Read1Byte(0x05+(rom*10))%16)+0x30);
 print(0x84,"/");                                           // 显示年

 print2(0x85,(AT24C02_Read1Byte(0x06+(rom*10))/16)+0x30);
 print2(0x86,(AT24C02_Read1Byte(0x06+(rom*10))%16)+0x30);
 print(0x87,"/");                                           // 显示月

 print2(0x88,(AT24C02_Read1Byte(0x07+(rom*10))/16)+0x30);
 print2(0x89,(AT24C02_Read1Byte(0x07+(rom*10))%16)+0x30);
 print(0x8b,"[");                                           // 显示[
 if(AT24C02_Read1Byte(0x08+(rom*10))==0xff)
 {
  print(0x8c,"?");
 }
 else
 {
  print2(0x8c,AT24C02_Read1Byte(0x08+(rom*10))%16);         //星期
 }
 print(0x8d,"]");                                           // 显示]

 print2(0x8f,(AT24C02_Read1Byte(0x09+(rom*10))/16)+0x30);   //小时
 print2(0x90,(AT24C02_Read1Byte(0x09+(rom*10))%16)+0x30);
 print(0x91,":");                                           // 显示cgram第一个字模":"

 print2(0x92,(AT24C02_Read1Byte(0x0a+(rom*10))/16)+0x30);   //分钟
 print2(0x93,(AT24C02_Read1Byte(0x0a+(rom*10))%16)+0x30);
 print(0x94,":");                                           // 显示cgram第一个字模":"

 print2(0x95,(AT24C02_Read1Byte(0x0b+(rom*10))/16)+0x30);   //秒
 print2(0x96,(AT24C02_Read1Byte(0x0b+(rom*10))%16)+0x30);

 print2(0xc0,AT24C02_Read1Byte(0x04+(rom*10))/16+0x30);     //显示控制项值
 print2(0xc1,AT24C02_Read1Byte(0x04+(rom*10))%16+0x30);
}
/********************************************************************************************
清屏+刷新显示+延时+清空DT 一体函数
LRDD()
*********************************************************************************************/    
void LRDD (void)
{
 LCM2402_Init();
 RealTime_Display();
 DelayS(500);
 DT=0xff;
}
/********************************************************************************************
清屏+刷新定时值显示+延时+清空DT 一体函数
LADD()
*********************************************************************************************/    
void LADD (void)
{
 LCM2402_Init();
 alarm_Display();
 DT=0xff;
}
/********************************************************************************************
闹钟呜响查寻程序
BEEPing();
********************************************************************************************/
void BEEPing(void)    //闹钟呜响查寻程序
{
 uint8 a;
 LADD();
 print(0xc4,"{Time's up}  AV: Stop");
 for(a=0;a<250&&DT==0xff;a++)
 {
  beep_a();
 }
 DT=0xff;
}
/********************************************************************************************
闹钟和无线遥控的键值处理
ALARMing();
*********************************************************************************************/    
void ALARMing(void)
{
 uint8 alarm_bit;
 alarm_bit = AT24C02_Read1Byte(0x03);      // 从AT24C02的地址0x03读出定时报警设置数据
 if(AT24C02_Read1Byte(0x04+(rom*10))<2&&alarm_bit==1||alarm_bit==3)//键值值为0则是闹钟,不为0则是无线控制
 {
  if(AT24C02_Read1Byte(0x04+(rom*10))==0)

⌨️ 快捷键说明

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