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

📄 lcm_t.lst

📁 用51单片机设计的时钟电路(毕业论文)资料
💻 LST
📖 第 1 页 / 共 3 页
字号:
 244   1      	unsigned char i;
 245   1       	for(i=0;i<8;i++){
 246   2         		SID=bbyte&0x80; //取出最高位
 247   2       		SCLK=1;
 248   2         		SCLK=0;
 249   2         		bbyte<<=1; //左移
 250   2         	}  
 251   1      }
 252          
 253          /******************************************************************************/
 254          //延时(LCM占用)
 255          void delaynms(unsigned int di) {
 256   1      	unsigned int da,db;
 257   1       	for(da=0;da<di;da++);
 258   1         		for(db=0;db<10;db++);
 259   1      }
 260          	
 261          /*****************************************************************************/
 262          //清屏函数
 263          void lcm_clr(void){
 264   1      	lcm_w_test(0,0x01);
 265   1      	delaynms(40); //启动等待,等LCM讲入工作状态
 266   1      
 267   1      }
 268          
 269          /*****************************************************************************/
 270          //向LCM发送一个字符串,长度64字符之内。
 271          //应用:lcm_w_word("您好!"); 
 272          void lcm_w_word(unsigned char *str){
 273   1      		while(*str != '\0'){
 274   2      			lcm_w_test(1,*str++);
 275   2              }
 276   1      		*str = 0;
 277   1      }
 278          /******************************************************************************/
 279          void Delay(int num)//延时函数
 280          {
 281   1      	while(num--) ;
 282   1      }	
 283          /******************************************************************************/
 284          void Init_DS18B20(void)//初始化ds1820
 285          {
 286   1      	unsigned char x=0;
 287   1      	DQ = 1;    //DQ复位
 288   1      	Delay(8);  //稍做延时
 289   1      	DQ = 0;    //单片机将DQ拉低
 290   1      	Delay(80); //精确延时 大于 480us
 291   1      	DQ = 1;    //拉高总线
 292   1      	Delay(14);
 293   1      	x=DQ;      //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
 294   1      	Delay(20);
 295   1      }
 296          /******************************************************************************/
 297          unsigned char ReadOneChar(void)//读一个字节
 298          {
 299   1      	unsigned char i=0;
 300   1      	unsigned char dat = 0;
 301   1      	for (i=8;i>0;i--)
 302   1      	{
 303   2      		DQ = 0; // 给脉冲信号
C51 COMPILER V6.12  LCM_T                                                                  02/10/2007 00:13:53 PAGE 6   

 304   2      		dat>>=1;
 305   2      		DQ = 1; // 给脉冲信号
 306   2      		if(DQ)
 307   2      		dat|=0x80;
 308   2      		Delay(4);
 309   2      	}
 310   1      	return(dat);
 311   1      }
 312          
 313          /******************************************************************************/
 314          void WriteOneChar(unsigned char dat)//写一个字节
 315          {
 316   1      	unsigned char i=0;
 317   1      	for (i=8; i>0; i--)
 318   1      	{
 319   2      		DQ = 0;
 320   2      		DQ = dat&0x01;
 321   2      		Delay(5);
 322   2      		DQ = 1;
 323   2      		dat>>=1;
 324   2      	}
 325   1      }
 326          /******************************************************************************/
 327          unsigned int ReadTemperature(void)//读取温度
 328          {
 329   1      	unsigned char a=0;
 330   1      	unsigned char b=0;
 331   1      	unsigned int t=0;
 332   1      	float tt=0;
 333   1      	Init_DS18B20();
 334   1      	WriteOneChar(0xCC); // 跳过读序号列号的操作
 335   1      	WriteOneChar(0x44); // 启动温度转换
 336   1      	Init_DS18B20();
 337   1      	WriteOneChar(0xCC); //跳过读序号列号的操作
 338   1      	WriteOneChar(0xBE); //读取温度寄存器
 339   1      	a=ReadOneChar();  //读低8位
 340   1      	b=ReadOneChar(); //读高8位
 341   1      	t=b;
 342   1      	t<<=8;
 343   1      	t=t|a;
 344   1      	tt=t*0.0625;
 345   1      	t= tt*10+0.5; //放大10倍输出并四舍五入
 346   1      	return(t);
 347   1      }
 348          /*****************************************************************************/
 349          //声明
 350          void lcm_w_ss(void);void lcm_w_mm(void);
 351          void lcm_w_hh(void);void lcm_w_dd(void);
 352          void lcm_w_mo(void);void lcm_w_yy(void);void lcm_w_xq(void);
 353          unsigned char clock_in(void);
 354          void clock_out(unsigned char dd);
 355          void Init_1302(void);
 356          unsigned char read_clock(unsigned char ord);
 357          void read_clockS(void);
 358          void Set_time(unsigned char sel);
 359          void write_clock(unsigned char ord, unsigned char dd);
 360          void updata (void);
 361          /*****************************************************************************/
 362          //常用时钟数据读取
 363          void read_clockS(void){
 364   1      	ss = read_clock(0x81);//读取秒数据
 365   1      	mm = read_clock(0x83);//读取分钟数据
C51 COMPILER V6.12  LCM_T                                                                  02/10/2007 00:13:53 PAGE 7   

 366   1      	hh = read_clock(0x85);//小时
 367   1      	dd = read_clock(0x87);//日
 368   1      	mo = read_clock(0x89);//月
 369   1      	xq = read_clock(0x8b);//星期
 370   1      	yy = read_clock(0x8d);//年
 371   1      }
 372          /*****************************************************************************/
 373          //调时用加1程序
 374          void Set_time(unsigned char sel){ //根据选择调整的相应项目加1并写入DS1302
 375   1        signed char address,item;
 376   1        signed char max,mini;
 377   1        lcm_w_test(0,0x9a);
 378   1        lcm_w_word("调整");
 379   1        //if(sel==6)  {lcm_w_word("秒钟");address=0x80; max=0;mini=0;}     //秒7
 380   1        if(sel==5)  {lcm_w_word("分钟");address=0x82; max=59;mini=0;}    //分钟6
 381   1        if(sel==4)  {lcm_w_word("小时");address=0x84; max=23;mini=0;}    //小时5
 382   1        if(sel==3)  {lcm_w_word("星期");address=0x8a; max=7;mini=1;}    //星期4  
 383   1        if(sel==2)  {lcm_w_word("日期");address=0x86; max=31;mini=1;}    //日3
 384   1        if(sel==1)  {lcm_w_word("月份");address=0x88; max=12;mini=1;}    //月2
 385   1        if(sel==0)  {lcm_w_word("年份");address=0x8c; max=99; mini=0;}    //年1
 386   1        
 387   1        //读取1302某地址上的数值转换成10进制赋给item 
 388   1        item=((read_clock(address+1))/16)*10 + (read_clock(address+1))%16;
 389   1        if(KEY_2 == 0){
 390   2        	item++;//数加 1  
 391   2        }
 392   1        if(KEY_4 == 0){
 393   2        	item--;//数减 1 
 394   2        }
 395   1        if(item>max) item=mini;//查看数值有效范围   
 396   1        if(item<mini) item=max;           
 397   1        write_clock(0x8e,0x00);//允许写操作
 398   1        write_clock(address,(item/10)*16+item%10);//转换成16进制写入1302
 399   1        write_clock(0x8e,0x80);//写保护,禁止写操作 
 400   1        updata ();	//刷新数据
 401   1        lcm_w_mm();//刷新 分 
 402   1      }
 403          /*****************************************************************************/
 404          //设置1302的初始时间
 405          void Init_1302(void){//(2007年1月1日00时00分00秒星期一)
 406   1      	write_clock(0x8e,0x00);//允许写操作
 407   1      
 408   1      	write_clock(0x8c,0x07);//年
 409   1      	write_clock(0x8a,0x01);//星期
 410   1      	write_clock(0x88,0x01);//月
 411   1      	write_clock(0x86,0x01);//日
 412   1      	write_clock(0x84,0x00);//小时
 413   1      	write_clock(0x82,0x00);//分钟
 414   1      	write_clock(0x80,0x00);//秒
 415   1      	write_clock(0x90,0xa5);//充电	
 416   1      	write_clock(0x8e,0x80);//禁止写操作
 417   1      }
 418          /*****************************************************************************/
 419          //DS1302写数据(底层协议)
 420          void write_clock(unsigned char ord, unsigned char dd){
 421   1      	clock_clk=0;
 422   1      	clock_Rst=0;
 423   1      	clock_Rst=1;
 424   1      	clock_out(ord);
 425   1      	clock_out(dd);
 426   1      	clock_Rst=0;
 427   1      	clock_clk=1;
C51 COMPILER V6.12  LCM_T                                                                  02/10/2007 00:13:53 PAGE 8   

 428   1      }
 429          /*****************************************************************************/
 430          //1302驱动程序(底层协议)
 431          void clock_out(unsigned char dd){
 432   1      	ACC=dd;
 433   1      	clock_dat=a0; clock_clk=1; clock_clk=0;
 434   1      	clock_dat=a1; clock_clk=1; clock_clk=0;
 435   1      	clock_dat=a2; clock_clk=1; clock_clk=0;
 436   1      	clock_dat=a3; clock_clk=1; clock_clk=0;
 437   1      	clock_dat=a4; clock_clk=1; clock_clk=0;
 438   1      	clock_dat=a5; clock_clk=1; clock_clk=0;
 439   1      	clock_dat=a6; clock_clk=1; clock_clk=0;
 440   1      	clock_dat=a7; clock_clk=1; clock_clk=0;
 441   1      }
 442          /*****************************************************************************/
 443          //DS1302写入字节(底层协议)
 444          unsigned char clock_in(void){
 445   1      	clock_dat=1;
 446   1      	a0=clock_dat;
 447   1      	clock_clk=1; clock_clk=0; a1=clock_dat;
 448   1      	clock_clk=1; clock_clk=0; a2=clock_dat;
 449   1      	clock_clk=1; clock_clk=0; a3=clock_dat;
 450   1      	clock_clk=1; clock_clk=0; a4=clock_dat;
 451   1      	clock_clk=1; clock_clk=0; a5=clock_dat;
 452   1      	clock_clk=1; clock_clk=0; a6=clock_dat;
 453   1      	clock_clk=1; clock_clk=0; a7=clock_dat;
 454   1      	return(ACC);
 455   1      }
 456          /*****************************************************************************/
 457          //DS1302读数据(底层协议)
 458          unsigned char read_clock(unsigned char ord){
 459   1      	unsigned char dd=0;
 460   1      	clock_clk=0;
 461   1      	clock_Rst=0;
 462   1      	clock_Rst=1;
 463   1      	clock_out(ord);
 464   1      	dd=clock_in();
 465   1      	clock_Rst=0;
 466   1      	clock_clk=1;
 467   1      	return(dd);
 468   1      }
 469          /*****************************************************************************/
 470          //向LCM中填写 年 数据
 471          void lcm_w_yy(void){
 472   1      	//if(read_clock(0x8d) != yy){
 473   1      		yy = read_clock(0x8d);
 474   1      		lcm_w_test(0,0x83);
 475   1      		lcm_w_word("20");
 476   1      		lcm_w_test(0,0x84);
 477   1      		lcm_w_test(1,(yy/16)+0x30);	
 478   1      		lcm_w_test(1,yy%16+0x30);
 479   1      }	//}
 480          /*****************************************************************************/
 481          //向LCM中填写 月 数据
 482          void lcm_w_mo(void){
 483   1      	//if(read_clock(0x89) != mo){
 484   1      		mo = read_clock(0x89);
 485   1      		lcm_w_test(0,0x90);
 486   1      			if(mo/16 != 0){lcm_w_test(1,(mo/16)+0x30);}	//十位消隐
 487   1      			else{lcm_w_test(1,0x20);}//同上			
 488   1      		lcm_w_test(1,mo%16+0x30);
 489   1      		lcm_w_test(0,0x91);
C51 COMPILER V6.12  LCM_T                                                                  02/10/2007 00:13:53 PAGE 9   

 490   1      		lcm_w_word("月");
 491   1      }	//}
 492          /*****************************************************************************/
 493          //星期处理并送入LCM的指定区域
 494          void lcm_w_xq(void){
 495   1      	unsigned char sel;

⌨️ 快捷键说明

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