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

📄 2402test.lst

📁 时钟是用微控制器
💻 LST
📖 第 1 页 / 共 5 页
字号:
 256   2        if((I2C_data<<i)&0x80)
 257   2        {
 258   3         I2C_Send_Bit_1();
 259   3        }
 260   2        else
 261   2        {
 262   3         I2C_Send_Bit_0();
 263   3        }
 264   2       }
 265   1      }
 266          /********************************************************************************************
 267          * 函数名称:I2C_Read8Bit()
 268          * 功    能:从I2C总线接收8bit数据
 269          * 入口参数:无
 270          * 出口参数:返回值为从I2C总线上接收到的8bit数据
 271          ********************************************************************************************/
 272          uint8 I2C_Read8Bit(void)reentrant
 273          {
 274   1       uint8 I2C_data=0,i;
 275   1       for(i=0;i<8;i++)
 276   1       {
 277   2        SDA=1;
 278   2        SCL=1;
 279   2        I2C_Delay(10);
 280   2        F0=SDA;
 281   2        I2C_Delay(10);
 282   2        SCL=0;
 283   2        if(F0==1)
 284   2        {
 285   3         I2C_data=I2C_data<<1;
 286   3         I2C_data=I2C_data|0x01;
 287   3        }
 288   2        else
 289   2        {
 290   3         I2C_data=I2C_data<<1;
 291   3        }
 292   2       }
 293   1       return I2C_data;
 294   1      }
 295          /********************************************************************************************
 296          * 函数名称:AT24C02_Write1Byte()
 297          * 功    能:向AT24C02指定地址上写入1字节数据
 298          * 入口参数:AT24C02_Address   AT24C02内的地址
 299          *           AT24C02_1Byte     将要写入AT24C02的1字节数据
 300          * 出口参数:无
 301          ********************************************************************************************/
 302          void AT24C02_Write1Byte(uint8 AT24C02_Address,uint8 AT24C02_1Byte)
 303          {
C51 COMPILER V8.05a   2402TEST                                                             07/02/2008 20:45:43 PAGE 6   

 304   1       bit AckTemp=1;
 305   1       I2C_Start();
 306   1       I2C_Write8Bit(AT24C02_WriteDeviceAddress);
 307   1       AckTemp=I2C_Check_Ack();
 308   1       I2C_Write8Bit(AT24C02_Address);
 309   1       AckTemp=I2C_Check_Ack();
 310   1       I2C_Write8Bit(AT24C02_1Byte);
 311   1       AckTemp=I2C_Check_Ack();
 312   1       I2C_Stop();
 313   1      }
 314          /********************************************************************************************
 315          * 函数名称:AT24C02_Read1Byte()
 316          * 功    能:从AT24C02指定地址上读出1字节数据
 317          * 入口参数:AT24C02_Address   AT24C02内的地址
 318          * 出口参数:从AT24C02指定地址上读出的1字节数据
 319          ********************************************************************************************/
 320          uint8 AT24C02_Read1Byte(uint8 AT24C02_Address)
 321          {
 322   1       bit AckTemp=1;
 323   1       uint8 AT24C02_1Byte;
 324   1       I2C_Start();
 325   1       I2C_Write8Bit(AT24C02_WriteDeviceAddress);
 326   1       AckTemp=I2C_Check_Ack();
 327   1       I2C_Write8Bit(AT24C02_Address);
 328   1       AckTemp=I2C_Check_Ack();
 329   1       I2C_Start();
 330   1       I2C_Write8Bit(AT24C02_ReadDeviceAddress);
 331   1       AckTemp=I2C_Check_Ack();
 332   1       AT24C02_1Byte=I2C_Read8Bit();
 333   1       AckTemp=I2C_Check_Ack();
 334   1       I2C_Stop();
 335   1       return AT24C02_1Byte;
 336   1      }
 337          /*******************设置定时值程序*********************************************************/
 338          void Set_alarm(unsigned char m,unsigned char sel,bit a) //根据选择调整的相应项目加1并写入DS1302
 339          {
 340   1       signed char address,item,item2;
 341   1       signed char max,mini;
 342   1       if(sel==7){address=0x0B;max=59;mini=0;}     //秒7
 343   1       if(sel==6){address=0x0A;max=59;mini=0;}     //分钟6
 344   1       if(sel==5){address=0x09;max=23;mini=0;}     //小时5
 345   1       if(sel==4){address=0x08;max=7;mini=1;}      //星期4  
 346   1       if(sel==3){address=0x07;max=31;mini=0;}     //日3
 347   1       if(sel==2){address=0x06;max=12;mini=0;}     //月2
 348   1       if(sel==1){address=0x05;max=99;mini=0;}     //年1
 349   1       if(sel==8){address=0x04;max=99;mini=0;}     //键号值
 350   1       address=address+(m*10);                     //选择定时项组
 351   1       if(a==0)                                    //如果a是0则表示现在键入的是十位数据
 352   1       {
 353   2        AT24C02_Write1Byte(address,0x00);          //将个位的数据清0防止数值范围计算有错
 354   2        item=DT;                                   //键值数给十位
 355   2        item2=0;                                   //个位填入0
 356   2       }
 357   1       else                                        //否则是个位数据
 358   1       {
 359   2        if(sel==4)
 360   2        {
 361   3         item=0;
 362   3        }
 363   2        else
 364   2        {
 365   3         item=(AT24C02_Read1Byte(address))/16;     //先读出 十位 数据
C51 COMPILER V8.05a   2402TEST                                                             07/02/2008 20:45:43 PAGE 7   

 366   3        }
 367   2        item2=DT;                                  //键值放入 个位
 368   2       }
 369   1       item=(item)*10+(item2);                     //将 十位 和 个位 数据合成
 370   1       if(item>max)
 371   1       item=mini;                                  //查看数值有效范围
 372   1       if(item<mini)
 373   1       item=max;
 374   1       AT24C02_Write1Byte(address,(item/10)*16+item%10);//转换成16进制写入24C00
 375   1       if(DT==0x12)
 376   1       {
 377   2        AT24C02_Write1Byte(address,0xff);
 378   2       }
 379   1      }
 380          //===================================DS18B20驱动===========================================
 381          sbit DQ=P2^0;     // 定义DS18B20数据线
 382          /*******************延时函数***********************************************************/
 383          void Delay(int num)
 384          {
 385   1       while(num--) ;
 386   1      }
 387          /*******************初始化ds1820***********************************************************/
 388          void Init_DS18B20(void)
 389          {
 390   1       unsigned char x=0;
 391   1       DQ=1;          //DQ复位
 392   1       Delay(8);      //稍做延时
 393   1       DQ=0;          //单片机将DQ拉低
 394   1       Delay(80);     //精确延时大于480us
 395   1       DQ=1;          //拉高总线
 396   1       Delay(14);
 397   1       x=DQ;          //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 398   1       Delay(20);
 399   1      }
 400          /*******************读一个字节***********************************************************/
 401          unsigned char ReadOneChar(void)
 402          {
 403   1       unsigned char i=0;
 404   1       unsigned char dat=0;
 405   1       for(i=8;i>0;i--)
 406   1       {
 407   2        DQ=0;              // 给脉冲信号
 408   2        dat>>=1;
 409   2        DQ=1;              // 给脉冲信号
 410   2        if(DQ)
 411   2        dat|=0x80;
 412   2        Delay(4);
 413   2       }
 414   1       return(dat);
 415   1      }
 416          /*******************写一个字节***********************************************************/
 417          void WriteOneChar(unsigned char dat)
 418          {
 419   1       unsigned char i=0;
 420   1       for(i=8;i>0;i--)
 421   1       {
 422   2        DQ=0;
 423   2        DQ=dat&0x01;
 424   2        Delay(5);
 425   2        DQ=1;
 426   2        dat>>=1;
 427   2       }
C51 COMPILER V8.05a   2402TEST                                                             07/02/2008 20:45:43 PAGE 8   

 428   1      }
 429          /*******************读取温度***********************************************************/
 430          unsigned int ReadTemperature(void)
 431          {
 432   1       unsigned char a=0;
 433   1       unsigned char b=0;
 434   1       unsigned int t=0;
 435   1       float tt=0;
 436   1       Init_DS18B20();
 437   1       WriteOneChar(0xCC);   //跳过读序号列号的操作
 438   1       WriteOneChar(0x44);   //启动温度转换
 439   1       Init_DS18B20();
 440   1       WriteOneChar(0xCC);   //跳过读序号列号的操作
 441   1       WriteOneChar(0xBE);   //读取温度寄存器
 442   1       a=ReadOneChar();      //读低8位
 443   1       b=ReadOneChar();      //读高8位
 444   1       t=b;
 445   1       t<<=8;
 446   1       t=t|a;
 447   1       tt=t*0.0625;
 448   1       t=tt*10+0.5;          //放大10倍输出并四舍五入
 449   1       return(t);
 450   1      }
 451          /*******************写一个字节***********************************************************/
 452          void printTemperature(void)
 453          {
 454   1       unsigned int i=0;
 455   1       unsigned char a=0,b=0,c=0;
 456   1       i=ReadTemperature();   //读温度并送显
 457   1       a=i/100;
 458   1       if(a>0x06)
 459   1       {
 460   2        print(0xc0,"--.-");
 461   2       }
 462   1       else
 463   1       {      
 464   2        print2(0xc1,a+0x30);  //显示温度十位
 465   2        b=i/10-a*10;
 466   2        print2(0xc2,b+0x30);  //个位
 467   2        print(0xc3,".");      //"."
 468   2        c=i-a*100-b*10;
 469   2        print2(0xc4,c+0x30);  //小位1位
 470   2       }              
 471   1       print2(0xc5,0x00);
 472   1       print(0xc6,"C");       //度C
 473   1      }
 474          //=================================DS1302时钟驱动===========================================//
 475          //注释DS1302寄存器
 476          // DS1302内部RAM分址:00 = 0xc0(写) = 0xc1(读)  奇数是读,偶数是写
 477          /*******************定义DS1302时钟接口******************************************************/
 478          sbit clock_clk=P3^5;    //ds1302_clk(时钟线)
 479          sbit clock_dat=P3^6;    //ds1302_dat(数据线)
 480          sbit clock_Rst=P3^7;    //ds1302_Rst(复位线)
 481          /*******************定义累加器A中的各位*****************************************************/
 482          
 483          sbit a0=ACC^0;
 484          sbit a1=ACC^1;
 485          sbit a2=ACC^2;
 486          sbit a3=ACC^3;
 487          sbit a4=ACC^4;
 488          sbit a5=ACC^5;
 489          sbit a6=ACC^6;
C51 COMPILER V8.05a   2402TEST                                                             07/02/2008 20:45:43 PAGE 9   

 490          sbit a7=ACC^7;
 491          /*******************定义全局变量*********************************************************/
 492          //unsigned char yy,mo,dd,xq,hh,mm,ss;//定义时间映射全局变量(专用寄存器)
 493          
 494          bit w=0;     //调时标志位
 495          /*******************1302驱动程序(底层协议)***********************************************/
 496          void clock_out(unsigned char dd)
 497          {
 498   1       ACC=dd;
 499   1       clock_dat=a0;clock_clk=1;clock_clk=0;
 500   1       clock_dat=a1;clock_clk=1;clock_clk=0;
 501   1       clock_dat=a2;clock_clk=1;clock_clk=0;
 502   1       clock_dat=a3;clock_clk=1;clock_clk=0;
 503   1       clock_dat=a4;clock_clk=1;clock_clk=0;
 504   1       clock_dat=a5;clock_clk=1;clock_clk=0;
 505   1       clock_dat=a6;clock_clk=1;clock_clk=0;
 506   1       clock_dat=a7;clock_clk=1;clock_clk=0;
 507   1      }
 508          /*******************DS1302写入字节(底层协议)**********************************************/
 509          unsigned char clock_in(void)
 510          {
 511   1       clock_dat=1;
 512   1       a0=clock_dat;
 513   1       clock_clk=1;clock_clk=0;a1=clock_dat;
 514   1       clock_clk=1;clock_clk=0;a2=clock_dat;
 515   1       clock_clk=1;clock_clk=0;a3=clock_dat;
 516   1       clock_clk=1;clock_clk=0;a4=clock_dat;
 517   1       clock_clk=1;clock_clk=0;a5=clock_dat;
 518   1       clock_clk=1;clock_clk=0;a6=clock_dat;
 519   1       clock_clk=1;clock_clk=0;a7=clock_dat;

⌨️ 快捷键说明

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