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

📄 5.c

📁 由单片机、DS18B20、DS1302、1602等组成时间温度显示系统。有Proteus图和C语言程序
💻 C
📖 第 1 页 / 共 2 页
字号:
		write_1302_reg(add,timeBCD[i]); //将时间数据写入1302对应的寄存器
		add+=2; //地址移动,确保地址为偶数
	}
	write_1302_reg(0x8e,0x80); //允许写
}
/*================================================================= =*/

/* 读取当前时间 */
/*======================= ===========================================*/
void read_1302_time(unsigned char time[])
{
	unsigned char i; 
	unsigned char add=0x81; //设置地址add初值(秒),奇数为只读
	bdata unsigned char l,h; //单位变量,分别存放时间数据(8421BCD码)的低4位和高4位,用以进行十进制转换
	write_1302_reg(0x8e,0x00); //禁止写
	for(i=0;i<7;i++)
	{
		time[i]=read_1302_reg(add); //将时间数据(8421BCD码)从1302对应的寄存器中读出
		l=time[i]&0x0f; //l存放time的低4位,即个位
		h=(time[i]>>4)&0x0f; //h存放time的高4位,即十位
		time[i]=h*10+l; //时间数据以十进制形式放进time[i]中
		add+=2; //地址移动,确保地址为奇数
	}
}
/*======================================================================================*/

/* 启动/停止计时,gate=0时启动计时,gate!=0时停止计时 */
/*=====================================================================================*/
void on_off_1302(unsigned char ch)
{
	unsigned char temp;
	if(ch)
	{
		temp=read_1302_reg(0x80); //将秒当前值读入temp暂存
		temp=temp|0x80; //将秒数据最高位置1
		write_1302_reg(0x80,temp); //将置1后的秒数据写入秒寄存器,以定止计时
	}
	else
	{
		temp=read_1302_reg(0x80); //将秒当前值读入temp暂存
		temp=temp&0x80; //将秒数据最高位置0
		write_1302_reg(0x80,temp); //将最高位置0后的秒数据写入秒寄存器,以启动计时
	}
}
/*=====================================================================================*/

/* 时间显示方式设置,ch=0时为24小时格式,ch!=0时为12小时格式 */
/*=========================================================================================*/
void hour_mode_1302(unsigned char ch)
{
	unsigned char temp;
	if(ch)
	{
		temp=read_1302_reg(0x85); //将小时当前值读入temp暂存
		temp=temp|0x80; //将小时数据最高位置1
		write_1302_reg(0x84,temp); //将置1后的小时数据写入小时寄存器,变为12小时格式
	}
	else
	{
		temp=read_1302_reg(0x85); //将小时当前值读入temp暂存
		temp=temp&0x80; //将小时数据最高位置0
		write_1302_reg(0x84,temp); //将最高位置0后的小时数据写入小时寄存器,变为24小时格式
	}
}
/*=========================================================================================*/
/*=========================================================================================*/
//**********转换计算***************
/*
void cover()
{
	led[0]=times[0]%10;
	led[1]=times[0]/10;
//led[0]=times[0]&0x0f;
//	led[1]=times[0]>>4;
	led[2]=times[1]&0x0f;
	led[3]=times[1]>>4;
	led[4]=times[2]&0x0f;
	led[5]=times[2]>>4;
	led[6]=times[3]&0x0f;
	led[7]=times[3]>>4;
	led[8]=times[4]&0x0f;
	led[9]=times[4]>>4;
	led[10]=times[5];
	led[11]=times[6]&0x0f;
	led[12]=times[6]>>4;
}
  */
//**********转换计算***************
void cover()
{
	led[0]=times[0]%10;
	led[1]=times[0]/10;
	led[2]=times[1]%10;
	led[3]=times[1]/10;
	led[4]=times[2]%10;
	led[5]=times[2]/10;
	led[6]=times[3]%10;
	led[7]=times[3]/10;
	led[8]=times[4]%10;
	led[9]=times[4]/10;
	led[10]=times[5];
	led[11]=times[6]%10;
	led[12]=times[6]/10;
}
//********显示时间的函数**************//
void display_dat() //显示时间和温度的函数
{
	LCD_write_int(12,0,led[10]);//显示星期
	LCD_write_int(0,0,2000+times[6]); //显示年份
	LCD_en_dat('-');
	LCD_write_int(5,0,led[9]); //显示月份
	LCD_write_int(6,0,led[8]);
	LCD_en_dat('-');
	LCD_write_int(8,0,led[7]); //显示日期
	LCD_write_int(9,0,led[6]);
	LCD_write_int(0,1,led[5]); //显示小时
	LCD_write_int(1,1,led[4]);
	LCD_en_dat(':');
	LCD_write_int(3,1,led[3]); //显示分钟
	LCD_write_int(4,1,led[2]); 
	LCD_en_dat(':');
	LCD_write_int(6,1,led[1]); //显示秒
	LCD_write_int(7,1,led[0]);
}
//*================================================*/
void delay(unsigned char i) //延时函数
{
	unsigned char j;
	while(i--)
	for(j=101;j>1;j--);
}
//*******************************
void key_scan()
{ 
	unsigned char X,Y,Z,k=key;
	P2=0x0f; //先对P2置数行扫描
	if(P2!=0x0f) //判断是否有键按下
	{ 
		delay(5); //延时,软件去干扰
		if(P2!=0x0f) //确认按键按下X = P3;
		{
			X=P2; //保存行扫描时有键按下时状态
			P2=0xf0; //列扫描
			delay(5);
			Y=P2; //保存列扫描时有键按下时状态
			Z=X|Y; //取出键值
			switch ( Z ) //判断键值(那一个键按下)
			{ 
				case 0xe7: k=1;break; //秒
				case 0xd7: k=5;break; //月
				case 0xb7: k=9;break;//设温
				case 0x77: k=13;break;//确定
				case 0xeb: k=2;break;//分
				case 0xdb: k=6;break;//星期
				case 0xbb: k=10;break;//定时
				case 0x7b: k=14;break; //退出
				case 0xed: k=3;break;//时
				case 0xdd: k=7;break; //年
				case 0xbd: k=11;break; //递增
				case 0x7d: k=15;break; //取消
				case 0xee: k=4;break; //日
				case 0xde: k=8;break; //闹钟
				case 0xbe: k=12;break; //递减
				case 0x7e: k=16;break; //开关
			}
			key=k-1;
		}
	}
	P2=0xff;
}
//******************温度定时调整*****************************//
void change_time(unsigned char i)
{ 
	unsigned char tem=0,temp_time=0,low=0,high=0;
	if(i<=6)
	{
		CLEARSCREEN;
		if(i==0) 
		{
			
			LCD_write_string(0,0,"Change second:");
		} //修改秒
		key=16;
		delay(250);
		while(1)
		{
			key_scan();
			if(key<8)
			{
				tem=(tem*10)+key;
				if((i==0 || i==1) && tem>59) tem=59;//确保修改的数据不超出限制,
				if((i==2 ) && tem>23) tem=23; //比如分不能超过60,月不能超过12等。
				if(i==3 && tem>31) tem=31; //如超过限制,则定为最大
				if(i==4 && tem>12) tem=12;
				if(i==5 && tem>7)
				{ 
		        	if(key<=6 && key!=0)tem=key;
		        	else tem=6;
		    	}
				delay(200);
				key=16;
	 	     }
			if(key==12 )
			{
				
				CLEARSCREEN;//设置好以后清屏
				break; //确定
			}
			if(key==13) //取消	
			{
				tem/=10;
				key=16;
				delay(200);
			}
			if(key==14)return; //退出
			if(temp_time!=tem)
			{
				LCD_write_char(8,1,' '); //实时显示修改的数据
				if(i==6)
				{
					LCD_write_int(9,1,20);
					LCD_en_dat(tem/10+0x30);
					LCD_en_dat(tem%10+0x30);
				}
				else
				{
				  	LCD_write_int(10,1,tem/10);
					LCD_write_int(11,1,tem%10);
				}
				temp_time=tem;
			}
			delay(100);
			read_1302_time(times);
			LCD_write_string(0,1,"Now: ");
			if(i==0)	//显示秒
			{
				led[0]=times[0]%10;
				led[1]=times[0]/10;
				LCD_write_int(4,1,led[1]); 
				LCD_write_int(5,1,led[0]);
			}	
		}
	read_1302_time(times);
    times[i]=tem;
    write_1302_time(times); //把数据写进1302
	}
	if(i==8)  //设置温度
	{
		CLEARSCREEN;
		LCD_write_string(0,0,"set temperature:");
		key=16;
		while(1)
		{
			key_scan();
			tem=(tem*10)+key;
			if(tem>128)tem=128;
			if(low!=tem)
			{
				low=tem;
				LCD_write_string(0,1,"low:");
				LCD_write_int(4,1,low);
			}
			if(low==0)LCD_write_int(4,1,low);
			if(key==12 )
			{
				key=16;
				tem=0;
				break; //确定
				
			}
			if(key==13) //取消	
			{
				tem/=10;
				key=16;
				delay(200);
			}			
		}
		
		while(1)
		{
			key_scan();
			tem=(tem*10)+key;
			if(tem>128)tem=128;
			high=tem;
			LCD_write_string(8,1,"high:");
			if(key==12 )
			{
				
				CLEARSCREEN;
				tem=0;
				key=16;
				break; //确定
				
			}
			if(key==13) //取消	
			{
				tem/=10;
				key=16;
				delay(200);
			}			
		}
		
		LCD_write_int(13,1,high);
	}
}
//*************************************************
void main() //主函数
{
	LCD_init();
	write_1302_time(times);
	while(1)
	{
		read_1302_time(times); //读ds1302的时间
		key_scan(); //扫描键盘
		if(key<10) //如果键盘值小于7则进入修改界面
		{
			change_time(key);
			key=16;
		}
		delay(30);
		alarm_speaker=1;
		delay(170);
		read_temp();     //读出18B20温度数据
		work_temp();     //处理温度数据
		cover();
		display_dat();//显示时间和温度
	}	
}

⌨️ 快捷键说明

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