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

📄 last.c

📁 单片机控制的温度计。有报警功能。 记时
💻 C
字号:
#include <reg52.h>
#include <intrins.h>
#include <math.h>
sbit s1 = P1^3;	     //数码管位控用于片选LED信号
sbit s2 = P1^1;	
sbit s3 = P1^2;
sbit s4 = P1^0;
sbit bell = P2^7;     //BELL
sbit key1 = P1^4;    //key1
sbit key2 = P1^5;	 //key2 
sbit key3 = P3^6;	 //key3 
sbit key4 = P3^7;	 //key4 
sbit Clk_549 = P2^2;   //时钟口线
sbit DataOut = P2^1; //数据输出口线
sbit Cs_549 = P2^0; //片选
//#-----------------------------

#define    Wait1us        {_nop_();}
#define    Wait2us        {_nop_();_nop_();}
#define    Wait4us        {Wait2us;Wait2us;}
#define    Wait8us        {Wait4us;Wait4us;}
#define    Wait30us       {Wait8us;Wait8us;Wait8us;Wait4us;Wait2us;}

unsigned char code table0[]={0xc0, 0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//无小数点
unsigned char led[4];
unsigned int a1=20,a2=30;
unsigned int i,m;
unsigned int tmp;
unsigned int min=30,sec=0,hour=8,htemp=0;
unsigned int ds_hour=0,ds_min=0,ds_sec=0,ds_temp1=0;
bit ds_flag = 0,ds_start = 0,timechange=0,ds_start_flag=0,js_flag=0,js_start =0  ;
unsigned char mod = 0 , key = 0;
unsigned long int js_temp =0 , ds_temp = 0 ;

//------------------------------
unsigned int code table_tmp[]={9942,9757,9581,9412,9250,9094,8945,8800,8661,8527,8396,8270,8148,8030,7914,7802,7693,7587,7484,7383,7285,7188,7094,7003,6913,6825,6738,6654,6571,6490,6410,6332,6255,6179,6105,6031,5960,5889,5819,5750,5683,5616,5550,5485,5421,5358,5296,5234,5173,5113,5054,4995,4937,4880,4823,4767,4711,4656,4602,4548,4495,4442,4389,4337,4286,4235,4184,4134,4084,4035,3986,3937,3889,3841,3793,3746,3699,3652,3606,3560,3514,3469,3423,3378,3333,3289,3245,3201,3157,3113,3070,3026,2983,2941,2898,2855,2813,2771,2729,2687,2645,2604,2562,2521,2479,2438,2397,2356,2315,2275,2234,2193,2153,2112,2072,2032,1991,1951,1911,1871,1831,1791,1751,1711,1671,1631,1591,1551,1511,1470,1430,1390,1350,1310,1270,1230,1189,1149,1108,1068,1027,987,946,905,864,823,782,741,699,658,616,574,532,490,448,405,363,320,277,233,190,146,102,57,13,0};

//-------------------------------
void delay_ms(unsigned int i)      // ims延时
{ 
	unsigned int j;
	for(;i>0;i--);
	for(j=0;j<110;j++);
}

unsigned char getkey()
{
	if(key1==0){delay_ms(1);if(key1==0){i=0;while(key1==0)
	{ delay_ms(3000);i++;} if( i> 10) {return(10);} else {return(1);}}}
	if(key4==0){delay_ms(1);if(key4==0){while(key4==0); return(4);}}
    if(key2==0){delay_ms(1);if(key2==0){while(key2==0); return(2);}}
    if(key3==0){delay_ms(1);if(key3==0){while(key3==0); return(3);}}
	return(0);
}


//--------------------------------
//AD转换电路
unsigned char adc_549()
{

	unsigned char ConvertValue = 0;
    unsigned char i;
/*    Cs_549 = 1; //芯片复位
    Cs_549 = 0;
    Cs_549 = 1;
    Clk_549 = 0;
    Wait4us;
    Cs_549 = 0; //芯片起始
    Wait4us; //等待延时
    for (i = 0; i < 8; i ++) //输入采样转换时钟
      {
            Clk_549 = 1;
            Clk_549 = 0;
      }		 */
    Cs_549 = 1; //开始转换
	Clk_549 = 0;
    Wait30us; //等待转换结束
    Cs_549 = 0; //读取转换结果
    
    Wait4us;
    for (i = 0; i < 8; i ++) //
      {
            Clk_549 = 1;
            ConvertValue <<= 1;
			ConvertValue |= DataOut;
			Clk_549 = 0;
      }
    Cs_549 = 1;
    return (ConvertValue); //
}




void display()
{
    P1|=0x0f;   //lit off all led
    P0=0xff;
    s4=0;
    P0=table0[led[0]];
    delay_ms(1);
    
    P1|=0x0f;   //lit off all led
    P0=0xff;
    s3=0;
    P0=table0[led[1]];
    delay_ms(1);
    
    P1|=0x0f;   //lit off all led
    P0=0xff;
    s2=0;
    P0=table0[led[2]]&0x7f;
    delay_ms(1);
    
    P1|=0x0f;   //lit off all led
    P0=0xff;
    s1=0;
    P0=table0[led[3]];
    delay_ms(1);
    
    P1|=0x0f;   //lit off all led
    P0=0xff;
    delay_ms(1);
    delay_ms(1);
}

void settemp()
{
while(1)
{
	key =getkey();
	if(key==4){break;}
	if(key==2){a1++;}
	if(key==3){a1--;}
	led[3]=a1/10 ;
	led[2]=a1%10;
	led[1]=10;
	led[0]=10;
	display();
	
	if(key==1){	  		  

	while(1)
	{
	key = getkey();
	if(key==2){a2++;}
	if(key==3){a2--;}
    led[3]= 10;
    led[2]= 10;
    led[1]=a2/10;
    led[0]=a2%10;
    display();
	if(key==1){break;}  		  
	}  }
}
}


void setds()
{
	 while(1)
	{
	ds_start_flag=0;
	key=getkey();
	if(key==4){break;}
	if(key==2){if(ds_hour < 24) ds_hour++;ds_start_flag=1;}
	if(key==3){if(ds_hour >= 1) ds_hour--;ds_start_flag=1;}
    led[3]=ds_hour/10 ;
    led[2]=ds_hour%10;
	led[1]=10;
	led[0]=10;
	display(); 
	if(key==1)
	{ 		  
	
		while(1)
		{
		
			key = getkey();
			if(key==2){if(ds_min<60) ds_min++;ds_start_flag=1;}
			if(key==3){if(ds_min >=1) ds_min--;ds_start_flag=1;}
			led[3]=10 ;
			led[2]=10;
			led[1]=ds_min/10;
			led[0]=ds_min%10;
			display();
			if(key==1){break;}
		}
		if(ds_start_flag ==1) ds_start = 1;
	}
	}
}	


void settime()
{
 	while(1)
	{
	key=getkey();
    if(key==4){break;}
	if(key==2){if(hour < 24) hour++;}
	if(key==3){if(hour >= 1) hour--;}
	led[3]=hour/10 ;
	led[2]=hour%10;
	led[1]=10;
	led[0]=10;
	display();
	if(key==1)
	{		  
 
		while(1)
		{
		   	key=getkey();
			if(key==2){if(min < 60) min++;}
			if(key==3){if(min >= 1) min--;}
			led[3]=10 ;
			led[2]=10 ;
			led[1]=min/10;
			led[0]=min%10;
			display();
			if(key==1){break;}
		}
	}
	}
}






void timer0()interrupt 1
{
bell=~bell;delay_ms(100);
TH0=0;TL0=0;
if (tmp>=(a1*100)) TR0=0;
}

void timer1()interrupt 3
{
	htemp++;
	TH1=0xdc;
	TL1=0x00;
//	if(htemp==1) 
	if(htemp == 100)
	{
		htemp	=	0	;
		sec++;
		ds_flag = 1;
		js_flag = 1;
		if(sec == 60)
		{
			sec	=	0	;			
			min++;
			if(min == 60)
			{
				min = 0;
				hour++;
				if(hour == 24) hour =0;				

			}
		}
	}
}


//#-----------------------

void showtemp()
{
/*	float temp,k;
	tmp=adc_549();
//	if( fabs(tmp-tmp2) > 1 )   //过滤消除变化太快。
	{
	                //AD转换,调用子程序
	temp=(float)tmp;	            //转换数据类型
	k=log(temp/(255.0-temp));
	temp=k/3380+1/298.15;
	temp=1/temp-273.15;
	tmp=(unsigned int)(temp*100);//转换成4位整数
	}


	if (tmp>=(a2*100))bell=0;
    else if(tmp<(a1*100)) TR0=1;
		 else bell=1;

	
    led[3]=tmp/1000;
	led[2]=tmp%1000/100;
	led[1]=tmp%100/10;
	led[0]=tmp%10;
	for(i=0;i<50;i++)display();	 
}

//---------

void showtime()
{

	key=getkey();
	if(key==4){timechange = ~timechange;}
	if(timechange == 1)
	{
		led[3]=(min/10)%10;
		led[2]=min%10;
		led[1]=(sec/10)%10;
		led[0]=sec%10;
	}
	else{
	led[3]=(hour/10)%10;
	led[2]=hour%10;
	led[1]=(min/10)%10;
	led[0]=min%10;
	}

	for(i=0;i<50;i++) display();	
}	
//------------

void showds()
{
		

	key=getkey();
	if(key==4){timechange = ~timechange;}	

	if(ds_start == 1)
	{
		if(ds_flag ==1)
		{
			ds_flag = 0;
			ds_temp++;
		}
	}
	
	ds_temp1=ds_hour*3600+ds_min*60+ds_sec;
	ds_temp1=ds_temp1-ds_temp;



	if(timechange == 1)
	{
    led[3]=ds_temp1/3600/10;
	led[2]=ds_temp1/3600%10;
	led[1]=ds_temp1%3600/60/10;
	led[0]=ds_temp1%3600/60%10;
	}else
	{
    led[3]=ds_temp1%3600/60/10;
	led[2]=ds_temp1%3600/60%10;
	led[1]=ds_temp1%3600%60/10;
	led[0]=ds_temp1%3600%60%10;
	}
	for(i=0;i<50;i++) display();
	if(ds_temp1 == 0 & ds_start == 1)
	{
		ds_start = 0;
		ds_temp = 0;
		ds_hour=0;
		ds_min=0;
		ds_sec=0;
		
//		TR0=1;
				 
		 while(1)
		 {
		   for(i=0;i<5000;i++){_nop_();}		   
		   bell=~bell;
		   key=getkey();
		   if(key==4){break;}
		   delay_ms(3000);
		   led[3]=0;
		   led[2]=0;
		   led[1]=0;
		   led[0]=0;
		   for(i=0;i<50;i++) display();	 
		 } 		  			
	}	  
	 */
		
}


//---------------------

void showjs()
{
		
	
	key=getkey();
	if(key==4){ timechange = ~timechange;}
	if(key==2){js_start = ~js_start;}
	if(key==3){js_temp = 0;}
		
	if(js_start == 1)
	{
		if(js_flag ==1)
		{
			js_flag = 0;
			js_temp ++;
		}
	}
	
	if(timechange == 0)
	{
    led[3]=js_temp%3600/60/10;
	led[2]=js_temp%3600/60%10;
	led[1]=js_temp%3600%60/10;
	led[0]=js_temp%3600%60%10;
	}else
	{
    led[3]=js_temp/3600/10;
	led[2]=js_temp/3600%10;
	led[1]=js_temp%3600/60/10;
	led[0]=js_temp%3600/60%10;
	}
	for(i=0;i<50;i++) display();
	
} 


//---------------------

void showmode()
{
	if(mod ==0)	showtemp();
//	if(mod==1) showtime();
//	if(mod==2) showds();
	if(mod == 3) showjs();

}
void mode_edit()
{
	if ( mod == 0) settemp();
	if  (mod ==1 ) settime();
	if	(mod == 2) setds();

}

//---------------


//--------------- 


//---------------
void main()
{
    TMOD=0x11;EA=1;
	ET0=1;TH0=0x00;TL0=0x00;TR0=0;
	ET1=1;TH1=0xdc;TL1=0x00;TR1=1;

	while(1)
	{ 
		key = getkey();
		if(key == 1){mod = (mod + 1) % 4;}
		if(key ==10 ){mode_edit();}
		showmode();			
	}

}




⌨️ 快捷键说明

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