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

📄 2402test.lst

📁 基于单片机和液晶2402的数字钟     包含电路图及源码
💻 LST
📖 第 1 页 / 共 4 页
字号:
 275   2      		I2C_Delay(10);
 276   2      		SCL=0;
 277   2      		if(F0==1){
 278   3      			I2C_data=I2C_data<<1;
 279   3      			I2C_data=I2C_data|0x01;
 280   3      		}
 281   2      		else{
 282   3      			I2C_data=I2C_data<<1;
 283   3      		}
 284   2      	}
 285   1          return I2C_data;
 286   1      }
 287          /********************************************************************************************
 288          * 函数名称:AT24C02_Write1Byte()
 289          * 功    能:向AT24C02指定地址上写入1字节数据
 290          * 入口参数:AT24C02_Address   AT24C02内的地址
 291          *           AT24C02_1Byte     将要写入AT24C02的1字节数据
 292          * 出口参数:无
 293          *********************************************************************************************/
 294          void AT24C02_Write1Byte(	uint8 AT24C02_Address,
 295          							uint8 AT24C02_1Byte){
 296   1        bit AckTemp=1;  
 297   1        I2C_Start();
 298   1        I2C_Write8Bit(AT24C02_WriteDeviceAddress);
 299   1        AckTemp=I2C_Check_Ack();
 300   1        I2C_Write8Bit(AT24C02_Address);                   
 301   1        AckTemp=I2C_Check_Ack();
 302   1        I2C_Write8Bit(AT24C02_1Byte);                 
 303   1        AckTemp=I2C_Check_Ack();
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 6   

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

 366          /*****************************************************************************/
 367          
 368          
 369          
 370          //===================================DS18B20驱动===========================================//
 371          sbit DQ   = P2 ^ 0;                      // 定义DS18B20数据线
 372          
 373          /******************************************************************************/
 374          void Delay(int num)//延时函数
 375          {
 376   1      	while(num--) ;
 377   1      }	
 378          /******************************************************************************/
 379          void Init_DS18B20(void)//初始化ds1820
 380          {
 381   1      	unsigned char x=0;
 382   1      	DQ = 1;    //DQ复位
 383   1      	Delay(8);  //稍做延时
 384   1      	DQ = 0;    //单片机将DQ拉低
 385   1      	Delay(80); //精确延时 大于 480us
 386   1      	DQ = 1;    //拉高总线
 387   1      	Delay(14);
 388   1      	x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 389   1      	Delay(20);
 390   1      }
 391          /******************************************************************************/
 392          unsigned char ReadOneChar(void)//读一个字节
 393          {
 394   1      	unsigned char i=0;
 395   1      	unsigned char dat = 0;
 396   1      	for (i=8;i>0;i--)
 397   1      	{
 398   2      		DQ = 0; // 给脉冲信号
 399   2      		dat>>=1;
 400   2      		DQ = 1; // 给脉冲信号
 401   2      		if(DQ)
 402   2      		dat|=0x80;
 403   2      		Delay(4);
 404   2      	}
 405   1      	return(dat);
 406   1      }
 407          
 408          /******************************************************************************/
 409          void WriteOneChar(unsigned char dat)//写一个字节
 410          {
 411   1      	unsigned char i=0;
 412   1      	for (i=8; i>0; i--)
 413   1      	{
 414   2      		DQ = 0;
 415   2      		DQ = dat&0x01;
 416   2      		Delay(5);
 417   2      		DQ = 1;
 418   2      		dat>>=1;
 419   2      	}
 420   1      }
 421          /******************************************************************************/
 422          unsigned int ReadTemperature(void)//读取温度
 423          {
 424   1      	unsigned char a=0;
 425   1      	unsigned char b=0;
 426   1      	unsigned int t=0;
 427   1      	float tt=0;
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 8   

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

 490          void clock_out(unsigned char dd){
 491   1      	ACC=dd;
 492   1      	clock_dat=a0; clock_clk=1; clock_clk=0;
 493   1      	clock_dat=a1; clock_clk=1; clock_clk=0;
 494   1      	clock_dat=a2; clock_clk=1; clock_clk=0;
 495   1      	clock_dat=a3; clock_clk=1; clock_clk=0;
 496   1      	clock_dat=a4; clock_clk=1; clock_clk=0;
 497   1      	clock_dat=a5; clock_clk=1; clock_clk=0;
 498   1      	clock_dat=a6; clock_clk=1; clock_clk=0;
 499   1      	clock_dat=a7; clock_clk=1; clock_clk=0;
 500   1      }
 501          /*****************************************************************************/
 502          //DS1302写入字节(底层协议)
 503          unsigned char clock_in(void){
 504   1      	clock_dat=1;
 505   1      	a0=clock_dat;
 506   1      	clock_clk=1; clock_clk=0; a1=clock_dat;
 507   1      	clock_clk=1; clock_clk=0; a2=clock_dat;
 508   1      	clock_clk=1; clock_clk=0; a3=clock_dat;
 509   1      	clock_clk=1; clock_clk=0; a4=clock_dat;
 510   1      	clock_clk=1; clock_clk=0; a5=clock_dat;
 511   1      	clock_clk=1; clock_clk=0; a6=clock_dat;
 512   1      	clock_clk=1; clock_clk=0; a7=clock_dat;
 513   1      	return(ACC);
 514   1      }
 515          /*****************************************************************************/
 516          //DS1302写数据(底层协议)
 517          void write_clock(unsigned char ord, unsigned char dd){
 518   1      	clock_clk=0;
 519   1      	clock_Rst=0;
 520   1      	clock_Rst=1;
 521   1      	clock_out(ord);
 522   1      	clock_out(dd);
 523   1      	clock_Rst=0;
 524   1      	clock_clk=1;
 525   1      }
 526          /*****************************************************************************/
 527          //DS1302读数据(底层协议)
 528          unsigned char read_clock(unsigned char ord){
 529   1      	unsigned char dd=0;
 530   1      	clock_clk=0;
 531   1      	clock_Rst=0;
 532   1      	clock_Rst=1;
 533   1      	clock_out(ord);
 534   1      	dd=clock_in();
 535   1      	clock_Rst=0;
 536   1      	clock_clk=1;
 537   1      	return(dd);
 538   1      }
 539          /*****************************************************************************/
 540          //调时程序
 541          void Set_time(unsigned char sel,bit a){ //根据选择调整的相应项目加1并写入DS1302
 542   1        signed char address,item,item2;
 543   1        signed char max,mini;
 544   1        write_clock(0x8e,0x00);//允许写操作
 545   1        if(sel==7)  {address=0x80; max=59;mini=0;}     //秒7
 546   1        if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟6
 547   1        if(sel==5)  {address=0x84; max=23;mini=0;}    //小时5
 548   1        if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期4  
 549   1        if(sel==3)  {address=0x86; max=31;mini=0;}    //日3
 550   1        if(sel==2)  {address=0x88; max=12;mini=0;}    //月2
 551   1        if(sel==1)  {address=0x8c; max=99; mini=0;}    //年1
C51 COMPILER V6.12  2402TEST                                                               08/29/2007 22:42:54 PAGE 10  

 552   1        if (a == 0){//如果a是0则表示现在键入的是 十位 数据
 553   2        	write_clock(address,0x00);//将 个位 的数据清0 防止数值范围计算有错
 554   2          item = DT;//键值数给 十位
 555   2      	item2 = 0;// 个位 填入 0

⌨️ 快捷键说明

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