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

📄 jishiqi31.c

📁 DB18B20测温度的protues仿真和源代码
💻 C
字号:
#include<reg52.h>
#include"DS1302.h"
#define uint unsigned int
#define uchar unsigned char
sbit key1=P3^5;													 //按键一
sbit key2=P3^6;														 //按键二
sbit key3=P3^7;	
uchar dis[8];													 //按键三
uchar model,num=0,num2,sec,ms;										   			  
uchar shuzi[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};	 //显示数字0->10
//	   					 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
uchar code write_add[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
uchar code read_add[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
uchar date[]={1,1,1,5,12,1,11,0};
uchar time[]={0x01,0x01,0x01,0x05,0x0C,0x01,0x0b,0X00};
// 			---秒---分---时---日---月--星期--年--写保护---
void begin(void);						//初始设置
void delayms (uint);					//延时函数
void display1 (void);					 //时间输出
void display (void);					//输出
//void display2 (void);					//日期输出
//void display3 (void);
void keyscan();					 //按键检查	 
void exchange1(void);
void exchange2(void);
extern void set_RTC();
extern void read_time(uchar *time);
extern void write_time(uchar *time);
extern void write_1302(uchar add,uchar date);
void T1_time() interrupt 3				   //定时器1中断
{
	num++;
	if(40==num)
	{
		num=0;
		ms++;
		if(100==ms)
		{
			ms=0;
			sec++;
			if(100==sec)sec=0;
		}
	}
} 
void main()
{
	begin();
//	EA=1;
//	P0=0xaa;							//暂时没用
	RST=0;
	set_RTC() ;
	write_time(time);
	write_1302(0x80,time[0]);
	while(1)
	{
		read_time(time);			
		keyscan();                      //扫描键盘
		exchange2();
		display();                      //显示结果
	}
}
void delayms(uint m)                  //延时ms秒
{
	uint i,j;
	for(i=m;i>0;i--)
		for(j=120;j>0;j--);
}
uchar m=0;    
void display()
{
	switch (model)							       //模式选择
	{
		case 0: dis[0]=date[2]/10;		dis[1]=date[2]%10;		dis[2]=0x0a;	dis[3]=date[1]/10;
				dis[4]=date[1]%10;	dis[5]=0x0a;		dis[6]=date[0]/10;	dis[7]=date[0]%10;	break;
		case 1: dis[0]=date[6]/10;		dis[1]=date[6]%10;		dis[2]=0x0a;	dis[3]=date[4]/10;
				dis[4]=date[4]%10;	dis[5]=0x0a;		dis[6]=date[3]/10;	dis[7]=date[3]%10;	break;
		case 2: dis[0]=0x0b;		dis[1]=0x0b;		dis[2]=0x0b;		dis[3]=sec/10;
				dis[4]=sec%10;		dis[5]=0x0a;		dis[6]=ms/10;		dis[7]=ms%10; 		break;
		case 4:	if(m%3!=0)	 { dis[0]=0x0b;		dis[1]=0x0b;}
				else {dis[0]=date[2]/10;dis[1]=date[2]%10;}	dis[2]=0x0a;		dis[3]=date[1]/10;
				dis[4]=date[1]%10;	dis[5]=0x0a;		dis[6]=date[0]/10;	dis[7]=date[0]%10;	break;
		case 5: if(m%3!=0)	 { dis[3]=0x0b;		dis[4]=0x0b;}
				else{dis[3]=date[1]/10;dis[4]=date[1]%10;}dis[0]=date[2]/10;	dis[1]=date[2]%10;	
				dis[2]=0x0a;		dis[5]=0x0a;		dis[6]=date[0]/10;	dis[7]=date[0]%10;	break;
		case 6: if(m%3!=0)	 { dis[6]=0x0b;		dis[7]=0x0b;}
				else{dis[6]=date[0]/10;dis[7]=date[0]%10;}dis[0]=date[2]/10;	dis[1]=date[2]%10;	
				dis[2]=0x0a;		dis[3]=date[1]/10;	dis[4]=date[1]%10;	dis[5]=0x0a;		break;
		case 7: if(m%3!=0)	 { dis[0]=0x0b;		dis[1]=0x0b;}
				else{dis[0]=date[6]/10;dis[1]=date[6]%10;}	dis[2]=0x0a;		dis[3]=date[4]/10;
				dis[4]=date[4]%10;	dis[5]=0x0a;		dis[6]=date[3]/10;	dis[7]=date[3]%10;	break;
		case 8: if(m%3!=0)	 { dis[4]=0x0b;		dis[3]=0x0b;}
				else{dis[4]=date[4]%10;dis[3]=date[4]/10;}	dis[0]=date[6]/10;	dis[1]=date[6]%10;	
				dis[2]=0x0a;		dis[5]=0x0a;		dis[6]=date[3]/10;	dis[7]=date[3]%10;	break;
		case 9: if(m%3!=0)	 { dis[6]=0x0b;		dis[7]=0x0b;}
				else{dis[6]=date[3]/10;dis[7]=date[3]%10;}		dis[0]=date[6]/10;	dis[1]=date[6]%10;	
				dis[2]=0x0a;		dis[3]=date[4]/10;	dis[4]=date[4]%10;	dis[5]=0x0a;		break;
	}
	display1();	m++;
}
void display1 ()
{
	P2=0X01;    P1=shuzi[dis[0]];			delayms(5);	      P1=0XFF;			 //小时输出
	P2=0X02;	P1=shuzi[dis[1]];			delayms(5);	      P1=0XFF;	
	P2=0x04;    P1=shuzi[dis[2]];			delayms(5);		  P1=0XFF;
	P2=0X08;    P1=shuzi[dis[3]];			delayms(5);	      P1=0XFF;
	P2=0X10;	P1=shuzi[dis[4]];			delayms(5);		  P1=0XFF;			 // 分钟输出
	P2=0X20;    P1=shuzi[dis[5]];			delayms(5);	      P1=0XFF;
	P2=0X40;    P1=shuzi[dis[6]];			delayms(5);		  P1=0XFF;
	P2=0X80;	P1=shuzi[dis[7]];			delayms(5);		  P1=0XFF;			 //秒钟输出
}

void begin()
{								//开始设置   打开定时器
	TMOD=0X22;
//	TH0=(65536-45872)/256;
//	TL0=(65536-45872)%256;
	TH1=(256-250)%256;		   //初值
	TL1=(256-250)%256;
	EA=1;							//总中断  打开
//	ET0=1;
	ET1=1;							//定时器1中断打开
//	TR0=1;
	TR1=0;							  //打开定时器1

}
void keyscan()
{
	if(0==key2)                      //按键key2
	{
		delayms(10);
		if (0==key2)				  //是否按键
		{							     		   
			switch (model)			  // 时间显示
			{
			case 0:case 1:	model++;break;				   //下一模式				
			case 2:	model=0; break;			//回时间模式 				
			case 4: if(23!=date[2])date[2]++;	 	//日期显示	改变小时
					else date[2]=0;break;			  
			case 5: if(59!=date[1])date[1]++;	 //  改变分钟
			  		else date[1]=0;break;			 
			case 6:	if(59!=date[0])date[0]++;	//改变秒钟
					else date[0]=0;	break;	  
			case 7: date[6]++;break;		 //改变年		   
			case 8: if(12!=date[4])date[4]++;	 //改变月分
					else date[4]=1; break;						 
										 //以下为闰年日期问题
			case 9:	if(1==date[4]||3==date[4]||5==date[4]||7==date[4]||8==date[4]||10==date[4]||12==date[4])
					if(date[3]!=31)										  //改变日期
						date[3]++;								  
					else date[3]=1;
				else if(4==date[4] || 6==date[4] || 9==date[4] || 11==date[4])
					if(date[3]!=30)
						date[3]++;
					else date[3]=1;
				else if (2==date[4])
					if(date[6]%4==0&&date[6]%100!=0||date[6]%400==0)
						if(date[3]!=29)
							date[3]++;
						else date[3]=1;
					else if(date[3]!=28)
							date[3]++;
						else date[3]=1;break;	   //看上边
			}
		}										   //时间校准
		exchange1();
		write_time(time);
		read_time(time);
		exchange2();
		while(!key2) display();
	}
	if(0==key3)                      //按键key3		功能同上
	{
		delayms(10);
		if (0==key3)
		{
		switch(model)
		{
		case 1:case 2: model--;break;
		case 0:	model=2;break;
		case 4:	if(0!=date[2])date[2]--;
				else date[2]=23; break;
		case 5: if(0!=date[1])date[1]--;
				else date[1]=59;break;
		case 6:	if(0!=date[0])date[0]--;
				else date[0]=59;break;
		case 7:	date[6]--;break;
		case 8:	if(1!=date[4])date[4]--;
				else date[4]=12;break;
		case 9:	if(1==date[4]||3==date[4]||5==date[4]||7==date[4]||8==date[4]||10==date[4]||12==date[4])
					if(date[3]!=1)
						date[3]--;
					else date[3]=31;
				else if(4==date[4] || 6==date[4] || 9==date[4] || 11==date[4])
					if(date[3]!=1)
						date[3]--;
					else date[3]=30;
				else if (2==date[4])
					if(date[6]%4==0&&date[6]%100!=0||date[6]%400==0)
						if(date[3]!=1)
							date[3]--;
						else date[3]=29;
					else if(date[3]!=1)
							date[3]--;
						else date[3]=28;
				break;
			}
		}
		exchange1();
		write_time(time);
		read_time(time);
		exchange2();
		while(!key3) display();
	}
	if(key1==0)					 //是否按键1
	{
		delayms(10);
		if(0==key1)
		{
			switch (model)				//模式选择
			{
				case 0:model=4;break;		 //模式改变
				case 1:model=7;break;
				case 4:
				case 5:
				case 6:
				case 7:
				case 8:model++;break;
			//	case 6:model=0;break;
				case 9:model=0;break;
			//	case 3:break;
				case 2:if(num2==0){sec=0;ms=0;ET0=0;TR0=0;num2++;}
						else if(num2==1){ET0=1;	TR0=1;num2++;}
						else {ET0=0;TR0=0;num2=0;}break;
			}
		}
		while(!key1) display();
	}
} 
void exchange1()
{
	int i;
	for(i=0;i<7;i++)
		time[i]=date[i]/10*16+date[i]%10;
}
void exchange2()
{
	int i;
	for(i=0;i<7;i++)
		date[i]=(time[i]/16)*10+time[i]%16;
}
//---------------------以前程序-------------------
/*void time1()
{
	switch(date[5])
	{
		case 1:
		case 3: 
		case 5:
		case 7:
		case 8:
		case 10:							  
		case 12:if(date[4]>31)					 //是否到一月
				{
					date[4]=0;                  //月加一  
					date[5]++;
				}break;
		case 4:
		case 6:
		case 9:
		case 11:if(date[4]>30)					//同上
				{
					date[4]=0;
					date[5]++;
				}break;
		case 2:if(date[6]%4==0&&date[6]%100!=0||date[6]%400==0)	//是否为闰年
			   {
				   if(date[4]>29)							//29天一月
				   {
					   date[4]=0;
					   date[5]++;
				   }
			   }
				else 									//28天一月
				{	if(date[4]>28)
					{
						date[4]=0;
						date[5]++;
					}
				
				}break;	
		case 13:date[5]=1;date[6]++;break;				  //一年过去
		default :date[5]=1;break;						  //月份出错
	}
}  */ 
/*void display()
{	 
	switch (model)							       //模式选择
	{
		case 0:display1();break;				   //输出对应模式显示
		case 1:display2();break;
		case 4:case 5: case 6:display1();break;
		case 7: case 8: case 9: display2();break;
		case 2:display3();break;
		case 3:break;
	} 
} */
/*			 
void display1()
{
	P2=0X01;    P1=shuzi[date[2]/10];   	  delayms(5);	      P1=0XFF;			 //小时输出
	P2=0X02;	P1=shuzi[date[2]%10];      delayms(5);	      P1=0XFF;				 
	P2=0x04;    P1=0xbf;                  delayms(5);	   	 P1=0XFF;
	P2=0X08;    P1=shuzi[date[1]/10];   	  delayms(5);	     P1=0XFF;
	P2=0X10;	P1=shuzi[date[1]%10];      delayms(5);		   P1=0XFF;			 // 分钟输出
	P2=0x20;    P1=0xbf;    		      delayms(5);			P1=0xff;
	P2=0X40;    P1=shuzi[date[0]/10];   	  delayms(5);		  P1=0XFF;
	P2=0X80;	P1=shuzi[date[0]%10];      delayms(5);		  P1=0XFF;	       //秒钟输出
}
void display2()
{
	P2=0X01;    P1=shuzi[date[6]%100/10];  delayms(5);		  P1=0XFF;			  //年输出
	P2=0X02;	P1=shuzi[date[6]%10];      delayms(5);		  P1=0XFF;
	P2=0x04;    P1=0xbf;                  delayms(5);		  P1=0XFF;
	P2=0X08;    P1=shuzi[date[4]/10];   	  delayms(5);		  P1=0XFF;			   //月输出
	P2=0X10;	P1=shuzi[date[4]%10];      delayms(5);		  P1=0XFF;
	P2=0x20;    P1=0xbf;    		      delayms(5);		  P1=0XFF;
	P2=0X40;    P1=shuzi[date[3]/10];      delayms(5);		  P1=0XFF;			   //日输出
	P2=0X80;	P1=shuzi[date[3]%10];      delayms(5);		  P1=0XFF;
}
void display3()
{
	P2=0X08;    P1=shuzi[sec/10];   	   delayms(5);		  P1=0XFF;			   
	P2=0X10;	P1=shuzi[sec%10];        delayms(5);		  P1=0XFF;
	P2=0x20;    P1=0xbf;    			   delayms(5);		  P1=0XFF;
	P2=0X40;    P1=shuzi[ms/10];   	     delayms(5);		  P1=0XFF;			   
	P2=0X80;	P1=shuzi[ms%10];         delayms(5);		  P1=0XFF;
} */

⌨️ 快捷键说明

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