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

📄 text1.c

📁 数码管显示温度与时间
💻 C
字号:
#include <at89x52.h>
#include <intrins.h>

unsigned char code LED_DATA[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //0~9数字数据
unsigned char code TEM_DATA[11]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10,0x46}; //加有小数点的数据
unsigned char time[2],dis_buff[4],temp[4];
unsigned int i,b,ti,F;
unsigned char set;
static unsigned int tr0,tr1; //定时器定时变量
char tdata;
bit S;	 //标志当前是否显示的是温度
sbit k1=P1^0;	//调整模式		
sbit k2=P1^1;	//+按钮
sbit k3=P1^2;	//-按钮
sbit k4=P1^3;  //(未使用)
sbit SLED=P3^3;  //秒指示灯
sbit PLED=P3^1;  //显示温度时作小数点 (显示时间时作点)
sbit di1=P3^4;
sbit di2=P3^5;
sbit di3=P3^6;
sbit di4=P3^7;
void w_1302 (unsigned char add,unsigned char dat);  //对指定的寄存器写数据,add寄存器地址,dat数据
unsigned char r_1302 (unsigned char add);  //读指定的寄存器数据,返回值为十进制数
void init_ds1302 (void); 
get_18b20 (void);

void init_key (void)
{
set=1;
 k1=1;
 k2=1;
 k3=1;
}



void get_time ()
{
 time[0]=r_1302 (0x83);//读秒
 time[1]=r_1302 (0x85);//读分

}

void time_updata ()
{
 dis_buff[0]=LED_DATA[time[1]/10];
 if (dis_buff[0]==LED_DATA[0]) dis_buff[0]=0xff;	//时间第一位是0的话,就不显示
 dis_buff[1]=LED_DATA[time[1]%10];
 dis_buff[2]=LED_DATA[time[0]/10];
 dis_buff[3]=LED_DATA[time[0]%10];
}

void get_temp ()
{
  F=get_18b20 ();
  temp[0]=F/1000;//温度十位值
  temp[1]=(F%1000)/100;//温度个位值
  temp[2]=((F%1000)%100)/10;//温度小数位值
}

void temp_updata ()
{ 
 dis_buff[0]=LED_DATA[temp[0]];
 if (dis_buff[0]==LED_DATA[0]) dis_buff[0]=0xff; //温度第一位是0的话,就不显示
 dis_buff[1]=LED_DATA[temp[1]];
 dis_buff[2]=LED_DATA[temp[2]];
 dis_buff[3]=TEM_DATA[10]; //显示℃符号
}

void displayscanf (void) interrupt 1 using 0		//定时器0中断服务程序,用于数码管动态显示扫描
{		  
  tr0++;
  TH0=0xcd; //刷新周新6.5ms
   TL0=0x38;
  if (tr0==77) {SLED=~SLED;PLED=SLED;tr0=0;} //LED每秒闪一次
  if (set!=0)  //判断当前是否是调时模式
  {
   if (set==1) {SLED=0;PLED=1;} //调整小时时,SLED灯亮
   if (set==2) {SLED=1;PLED=0;}//调整分钟时,PROT灯亮
   }
   if (S==1) {SLED=1;PLED=0;}	 //判断当前是否显示的是温度
   i++;
	  if (i==4) i=0; //扫描完一圈后,从新开始!
	 if (i==0) {P0=dis_buff[0];di1=0;}
	 if (i!=0) di1=1;
	 
	 if (i==1) {P0=dis_buff[1];di2=0;}
	 if (i!=1) di2=1;
	 
	 if (i==2) {P0=dis_buff[2];di3=0;}
	 if (i!=2) di3=1;
	 
	 if (i==3) {P0=dis_buff[3];di4=0;}
	 if (i!=3) di4=1;
}

void dis_other (void) interrupt 3 using 0  //控制分时显示
{
  tr1++;
  TH1=0x00;	//定时最大值32.76ms
  TL1=0x00;
  if (tr1>1000) tr1=0;
  if ((tr1>610)&&(tr1<1000))	//每20秒显示一次温度
    {
	  S=1;
	  temp_updata ();
	}
	 else 
	   {
	    time_updata ();
	    S=0;
		}
} 



void key_delay (unsigned int m)	 //按键消抖动
{
   unsigned char t;
   t=10;
   while (m--)
    {
	while (t--); 
	 }
}

void set_time (void)	 //调整时间函数
{
  if (k1==0)
   {
   	key_delay (500);
	 if  (k1==0)
	  {
	   set++;
	   if (set!=0) TR1=0; //停止显示温度
	   if (set==3) 
	   {
	    set=0; //退出时间调整模式
		TR1=1; //恢复每30秒显示一次温度
		w_1302 (0x8e,0x00); //禁止写保护
		w_1302 (0x80,0x00); //将秒复位
		w_1302 (0x8e,0x80);//允许写保护
		}
	   while(!k1);	 //等待热键释放
      }
   }

   if (set!=0)
     {
	   if (k2==0)
	    {
		  key_delay (20);
		   if (k2==0)
		     {
			   while (k2==0);
			 if (set==1)	//调时
			   {
				tdata=r_1302 (0x85);
				tdata++;
				if (tdata>23) tdata=0;
				tdata=(tdata/10)*16+tdata%10;  //把十进制数转换为BCD码准备写入DS1302	
				w_1302 (0x8e,0x00); //禁止写保护
				w_1302 (0x84,tdata); //将调整后的数据写入DS1302
				time[1]=r_1302 (0x85);//重新读时
				time_updata ();
				w_1302 (0x8e,0x80);	//允许写保护
			 	}
		if (set==2)	//调分
			   {
				tdata=r_1302 (0x83);
				tdata++;
				if (tdata>59) tdata=0;
				tdata=(tdata/10)*16+tdata%10;  //把十进制数转换为BCD码准备写入DS1302	
				w_1302 (0x8e,0x00); //禁止写保护
				w_1302 (0x82,tdata); //将调整后的数据写入DS1302
				time[0]=r_1302 (0x83);//重新读时
				time_updata ();
				w_1302 (0x8e,0x80);	//允许写保护
			 	}
			 }
		}
	}
	   if (k3==0)
	    {
		  key_delay (20);
		   if (k3==0)
		     {
			   while (k3==0);
			 if (set==1)	//调时
			   {
				tdata=r_1302 (0x85);
				tdata--;
				if (tdata<0) tdata=23;
				tdata=(tdata/10)*16+tdata%10;  //把十进制数转换为BCD码准备写入DS1302	
				w_1302 (0x8e,0x00); //禁止写保护
				w_1302 (0x84,tdata); //将调整后的数据写入DS1302
				time[1]=r_1302 (0x85);//重新读时
				time_updata ();
				w_1302 (0x8e,0x80);	//允许写保护
			 	}
		if (set==2)	//调分
			   {
				tdata=r_1302 (0x83);
				tdata--;
				if (tdata<0) tdata=59;
				tdata=(tdata/10)*16+tdata%10;  //把十进制数转换为BCD码准备写入DS1302	
				w_1302 (0x8e,0x00); //禁止写保护
				w_1302 (0x82,tdata); //将调整后的数据写入DS1302
				time[0]=r_1302 (0x83);//重新读时
				time_updata ();
				w_1302 (0x8e,0x80);	//允许写保护
			 	}
			 }
		}
}

main ()
{
 P0=0X00;  //第一次上电时做测试数码管用
 P3=0X00;
 key_delay (300); //延时
 P0=0xff;
 P3=0xff;
 init_key (); // 按键初始化(全出高电平)
 init_ds1302 (); //时间芯片初始化
 TMOD=0x11;
 TH0=0xcd; //定时6.5ms
 TL0=0x38; 
 TH1=0x00; //定时最大值
 TL1=0x00;
 EA=1;
 ET0=1;
 ET1=1;
 TR0=1;
 TR1=1;
 P3=0XFF;  //关闭显示
  i=0;
  set=0;
 while (1)
  {
   get_time();
   get_temp ();
   set_time ();
  }
}




⌨️ 快捷键说明

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