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

📄 wannianli.lst

📁 3208LED电子钟的程序及编译文件
💻 LST
📖 第 1 页 / 共 2 页
字号:
 228   2      		DQ = 0; // 给脉冲信号
 229   2      		dat>>=1;
 230   2      		DQ = 1; // 给脉冲信号
 231   2      		if(DQ)
 232   2      		dat|=0x80;
 233   2      		Delay(4);
 234   2      	}
 235   1      	return(dat);
 236   1      }
 237          /******************************************************************************/
 238          void WriteOneChar(unsigned char dat)//写一个字节
 239          {
 240   1      	unsigned char i=0;
 241   1      	for (i=8; i>0; i--)
C51 COMPILER V6.12  WANNIANLI                                                              07/04/2007 21:12:52 PAGE 5   

 242   1      	{
 243   2      		DQ = 0;
 244   2      		DQ = dat&0x01;
 245   2      		Delay(5);
 246   2      		DQ = 1;
 247   2      		dat>>=1;
 248   2      	}
 249   1      }
 250          /******************************************************************************/
 251          unsigned int ReadTemperature(void)//读取温度
 252          {
 253   1      	unsigned char a=0;
 254   1      	unsigned char b=0;
 255   1      	unsigned int t=0;
 256   1      	float tt=0;
 257   1      	Init_DS18B20();
 258   1      	WriteOneChar(0xCC); // 跳过读序号列号的操作
 259   1      	WriteOneChar(0x44); // 启动温度转换
 260   1      	Init_DS18B20();
 261   1      	WriteOneChar(0xCC); //跳过读序号列号的操作
 262   1      	WriteOneChar(0xBE); //读取温度寄存器
 263   1      	a=ReadOneChar();  //读低8位
 264   1      	b=ReadOneChar(); //读高8位
 265   1      	t=b;
 266   1      	t<<=8;
 267   1      	t=t|a;
 268   1      	tt=t*0.0625;
 269   1      	t= tt*10+0.5; //放大10倍输出并四舍五入
 270   1      	return(t);
 271   1      }
 272          /******************************************************************************/
 273          uchar printTemperature(void){//写一个字节
 274   1      	unsigned int i=0;
 275   1      	unsigned char a=0,b=0,c=0;
 276   1      	i=ReadTemperature();//读温度并送显
 277   1      	a=i/100;
 278   1      	b=i/10-a*10;
 279   1      	i = a*10 + b;
 280   1      	return i;		
 281   1      }
 282          /**********************************************************************************************/	
 283          void Beeplll(void){//BELL 闹钟声音 
 284   1      	uint a;//定义变量用于发声的长度设置
 285   1      	Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
 286   1      	for(a=2500;a>0;a--){//第一个声音的长度
 287   2      		Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
 288   2      		Delay(10);//音调设置延时
 289   2      	}
 290   1      	for(a=100;a>0;a--){//同上
 291   2      		Bell_Out = ~Bell_Out;  //
 292   2      		Delay(6);//音调设置延时
 293   2      	}
 294   1      	Bell_Out = 1;
 295   1      }
 296          /**********************************************************************************************/	
 297          void Beep(void){//BELL-扬声器--整点报时 
 298   1      	uchar a;//定义变量用于发声的长度设置
 299   1      	Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
 300   1      	for(a=60;a>0;a--){//第一个声音的长度
 301   2      		Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
 302   2      		Delay(100);//音调设置延时
 303   2      	}
C51 COMPILER V6.12  WANNIANLI                                                              07/04/2007 21:12:52 PAGE 6   

 304   1      	for(a=100;a>0;a--){//同上
 305   2      		Bell_Out = ~Bell_Out;
 306   2      		Delay(80);//
 307   2      	}
 308   1      	for(a=100;a>0;a--){//同上
 309   2      		Bell_Out = ~Bell_Out;
 310   2      		Delay(30);//
 311   2      	}
 312   1      }
 313          /**********************************************************************************************/	
 314          void Beep_set(void){//BELL -扬声器--确定设置
 315   1      	uchar a;//定义变量用于发声的长度设置
 316   1      	Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
 317   1      	for(a=250;a>0;a--){//第一个声音的长度
 318   2      		Bell_Out = ~Bell_Out;//取反扬声器驱动口,以产生音频
 319   2      		Delay(20);//音调设置延时
 320   2      	}
 321   1      	for(a=100;a>0;a--){//同上
 322   2      		Bell_Out = ~Bell_Out;
 323   2      		Delay(80);//
 324   2      	}
 325   1      }	
 326          /**********************************************************************************************/	
 327          void Beep_key(void){//-扬声器--按键音
 328   1      	uchar a;//定义变量用于发声的长度设置
 329   1      	Led_EA = 1;//关列显示驱动,防止屏幕出现乱码
 330   1      	for(a=100;a>0;a--){//声音的长度
 331   2      		Bell_Out = ~Bell_Out;
 332   2      		Delay(50);//音调设置延时
 333   2      	}
 334   1      }
 335          /**********************************************************************************************/	
 336          void clock_out(unsigned char dd){ //-1302驱动程序(底层协议)
 337   1      	ACC=dd;
 338   1      	clock_dat=a0; clock_clk=1; clock_clk=0;
 339   1      	clock_dat=a1; clock_clk=1; clock_clk=0;
 340   1      	clock_dat=a2; clock_clk=1; clock_clk=0;
 341   1      	clock_dat=a3; clock_clk=1; clock_clk=0;
 342   1      	clock_dat=a4; clock_clk=1; clock_clk=0;
 343   1      	clock_dat=a5; clock_clk=1; clock_clk=0;
 344   1      	clock_dat=a6; clock_clk=1; clock_clk=0;
 345   1      	clock_dat=a7; clock_clk=1; clock_clk=0;
 346   1      }
 347          /**********************************************************************************************/	
 348          unsigned char clock_in(void){ //-DS1302写入字节(底层协议)
 349   1      	clock_dat=1;
 350   1      	a0=clock_dat;
 351   1      	clock_clk=1; clock_clk=0; a1=clock_dat;
 352   1      	clock_clk=1; clock_clk=0; a2=clock_dat;
 353   1      	clock_clk=1; clock_clk=0; a3=clock_dat;
 354   1      	clock_clk=1; clock_clk=0; a4=clock_dat;
 355   1      	clock_clk=1; clock_clk=0; a5=clock_dat;
 356   1      	clock_clk=1; clock_clk=0; a6=clock_dat;
 357   1      	clock_clk=1; clock_clk=0; a7=clock_dat;
 358   1      	return(ACC);
 359   1      }
 360          /**********************************************************************************************/	
 361          uchar read_clock(uchar ord){ //-DS1302读数据(底层协议)
 362   1      	uchar dd=0;
 363   1      	clock_clk=0;
 364   1      	clock_Rst=0;
 365   1      	clock_Rst=1;
C51 COMPILER V6.12  WANNIANLI                                                              07/04/2007 21:12:52 PAGE 7   

 366   1      	clock_out(ord);
 367   1      	dd=clock_in();
 368   1      	clock_Rst=0;
 369   1      	clock_clk=1;
 370   1      	return(dd);
 371   1      }
 372          /**********************************************************************************************/	
 373          void write_clock(uchar ord, uchar dd){ //-DS1302写数据(底层协议)
 374   1      	clock_clk=0;
 375   1      	clock_Rst=0;
 376   1      	clock_Rst=1;
 377   1      	clock_out(ord);
 378   1      	clock_out(dd);
 379   1      	clock_Rst=0;
 380   1      	clock_clk=1;
 381   1      }
 382          /**********************************************************************************************/	
 383          void Set_time(unsigned char sel,unsigned char a){ //根据选择调整的相应项目加1并写入DS1302-调时用加1程序
 384   1        signed char address,item;
 385   1        signed char max,mini;
 386   1        //if(sel==7)  {address=0x80; max=0;mini=0;}     //秒7
 387   1        if(sel==6)  {address=0x82; max=59;mini=0;}    //分钟6
 388   1        if(sel==5)  {address=0x84; max=23;mini=0;}    //小时5
 389   1        if(sel==3)  {address=0x86; max=31;mini=1;}    //日3
 390   1        if(sel==2)  {address=0x88; max=12;mini=1;}    //月2
 391   1        if(sel==1)  {address=0x8c; max=99; mini=0;}    //年1
 392   1        if(sel==4)  {address=0x8a; max=7;mini=1;}    //星期4 
 393   1        if(sel==200)  {address=0xc2+a*6; max=6;mini=0;}    //MODE 
 394   1        if(sel==201)  {address=0xc2+a*6+2; max=23;mini=0;}    //星期4 
 395   1        if(sel==202)  {address=0xc2+a*6+4; max=59;mini=0;}    //星期4 
 396   1         
 397   1        //读取1302某地址上的数值转换成10进制赋给item 
 398   1        item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
 399   1        if(Add_Key == 0){	 key_off ();//等待键放开
 400   2        	item++;//数值加1
 401   2      	Beep_key();//调时提示音
 402   2        }
 403   1        if(Add2_Key == 0){ key_off ();//等待键放开
 404   2        	item--;//数值减1
 405   2      	Beep_key();//调时提示音
 406   2        }  
 407   1        if(item>max) item=mini;//查看数值有效范围   
 408   1        if(item<mini) item=max;           
 409   1        write_clock(0x8e,0x00);//允许写操作
 410   1        write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
 411   1        if(sel == 6 && (Add_Key == 0 || Add2_Key == 0)){
 412   2        	write_clock(0x80,0x00);//秒值=0
 413   2        }
 414   1        write_clock(0x8e,0x80);//写保护,禁止写操作  
 415   1      }
 416          /**********************************************************************************************/	
 417          void Init_1302(void){//-设置1302的初始时间(2007年1月1日00时00分00秒星期一)
 418   1      	uchar f;
 419   1      	if(read_clock(0xc1) != 0xaa){
 420   2      		write_clock(0x8e,0x00);//允许写操作
 421   2      		write_clock(0x8c,0x07);//年
 422   2      		write_clock(0x8a,0x01);//星期
 423   2      		write_clock(0x88,0x01);//月
 424   2      		write_clock(0x86,0x01);//日
 425   2      		write_clock(0x84,0x00);//小时
 426   2      		write_clock(0x82,0x00);//分钟
 427   2      		write_clock(0x80,0x00);//秒
C51 COMPILER V6.12  WANNIANLI                                                              07/04/2007 21:12:52 PAGE 8   

 428   2      		write_clock(0x90,0xa5);//充电	
 429   2      		write_clock(0xc0,0xaa);//写入初始化标志RAM(第00个RAM位置)
 430   2      		for(f=0;f<60;f=f+2){//清除闹钟RAM位为0
 431   3      			write_clock(0xc2+f,0x00);
 432   3      		}
 433   2      		write_clock(0x8e,0x80);//禁止写操作
 434   2      	}
 435   1      }
 436          /**********************************************************************************************/	
 437          void clearRAM (void){//寄存器清空函数-32个寄存器清空(0x00)
 438   1      	uchar a;//定义变量用于清空数据指针
 439   1      	for(a=0;a<32;a++){//指向32个寄存器
 440   2      		Ledplay[a] = 0;//将指向的寄存器清空
 441   2      	}
 442   1      }
 443          /**********************************************************************************************/	
 444          void putin (uchar u){//字符载入函数-将字符装入显示寄存器
 445   1      	uchar a = 0;//定义变量用于数据提取指针
 446   1      	do{		
 447   2      		Ledplay[bn] = no[u][a];//将二维数组中的一组数据放入显示缓冲区
 448   2      		a++;//换下一个提取字节	
 449   2      		bn++;//换下一个显示缓冲字节			
 450   2      	}
 451   1      	while(no[u][a] != 0);//当显示数据为0时结束循环
 452   1      	bn++;//换下一个显示缓冲字节
 453   1      	Ledplay[bn] = 0;//显示一列的空位,便于字符区分	
 454   1      }
 455          /**********************************************************************************************/	
 456          void display (void){//点阵屏驱动函数-32*8点阵显示驱动
 457   1      	uchar ac,aa=7;//定义两个数据变量
 458   1      	for(ac=0x28;ac<0x30;ac++){//扫描后两块LED屏(由于P1.5接扬声器所以高4位为2,旨在关声音)		
 459   2      		Led_E  = ac;//用ac值驱动使能列信号		
 460   2      		Led_24 = DL(Ledplay[aa+8]);//将显示寄存器数据写入2、4屏(嵌入DL汇编是为了翻转字节数据,如果接线正确可省

⌨️ 快捷键说明

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