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

📄 kcsj.c

📁 单片机开发温度测量,温度上下限报警.定时器报警,秒表,跑表,以及万年历.
💻 C
字号:
#include <reg52.h>
#include <math.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int  

code uchar table[11] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};
uchar led[4];
uchar decimal=0;	 //小数点
uchar up=32,down=15;
uchar kk=0;
bit  md,setflag; 
unsigned long overflow=0,cnt; //定时器1和2的溢出变量
uchar sec=11,hour=0,min=26,month=9,day=17,xq,dingshil,dingshih;//时间(秒,分,时),秒表(高位,低位)
uint  year=2007;
uchar displays=0;
unsigned char table1[13]={31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char table2[13]={31,29,31,30,31,30,31,31,30,31,30,31};
/************************/
sbit clock = P2^2; //时钟口线
sbit dataout = P2^1; //数据输出口线
sbit cs = P2^0;//片选口线

sbit s3 = P1^3;
sbit s2 = P1^1;
sbit s1 = P1^2;
sbit s0 = P1^0;

sbit bell=P2^7;
/***********************/
sbit set = P1^4;
sbit add = P1^5;
sbit dec = P3^6;

sbit change =P3^7;



void delay_us()//AD转换延时
{
     uint i;
	 for(i=0;i<3;i++);
}

void delay_ms()//动态扫描延时
{
     uint i;
	 for(i=0;i<100;i++);
}
void display(void)
{
    P1|=0x0f;   //lit off all led
    P0=0xff;
    s0=0;
    P0=table[led[0]];
    delay_ms();
    
    P1|=0x0f;   //lit off all led
    P0=0xff;
    s1=0;
    P0=table[led[1]];
    delay_ms();
    
    P1|=0x0f;   //lit off all led
    P0=0xff;
    s2=0;
    P0=table[led[2]]+decimal;
    delay_ms();
    
    P1|=0x0f;   //lit off all led
    P0=0xff;
    s3=0;
    P0=table[led[3]];
    delay_ms();
    
   P1|=0x0f;   //lit off all led
    P0=0xff;
}

void keyscan()
{   
    kk++;
   if(kk==3)
   kk=0;
}

void ttchange()
{  displays++;
   if(displays==6) 	
	displays=0;
} 

uchar adc()
{
     uchar i,value = 0;
     clock = 0;
	 cs = 1;
	 delay_us();
	 cs = 0;
	 for(i=0;i<8;i++)
	 {
	     value <<= 1;
 		 clock = 1;
		 if(dataout == 1)
		    value |=0x01;
		 clock = 0;
	 }
	 cs = 1;
	 return value;
}

void towset()
{ if(set==0) {while(set==0);setflag=~setflag;}

} 

uint xqwork()
{
   uint b,days,i;
   if((year%4)==0&&(year%100)!=0)
                           { 
						     for(i=0;i<month-1;i++) 
	                         days+=table2[i];
	                        }
                         else
                             {  
							 for(i=0;i<month-1;i++)
	                       days+=table1[i];	 
	                           }
	                      days+=day;
	                      b=year-1+(unsigned int)((year-1)/4)-(unsigned int)((year-1)/100)+(unsigned int)((year-1)/400)+days;
                            xq=b%7;
							days=0;
		return(xq);	
}

void timer1(void) interrupt 1   // 定时器 
{
  overflow++; 
  if(overflow==3300) {sec++;overflow=0;md=~md;} 
}

void timer2(void) interrupt 3    
{
  cnt++;
  if(cnt==36)
  {
  dingshil++;
  cnt=0;
  if(dingshil==100)
    {
     dingshih++;
	 dingshil=0;
    }
  }
}

///////////主函数//////////
main()    
{ 
     uchar tmp;
	 uint j=20;
	 float temp,k;  
  
  TMOD=0x22; //计时器中断设置
  TH0=6;
  TL0=6;       //定时时间T=256-6=250 U
  TH1=6;
  TL1=6; 
  ET0=1;
  ET1=1;
  EA=1;
  TR0=1;
 

 

 while(1)
 {	 
   if(change==0){ while(change==0); ttchange(); }
  	   
   if(displays==0)  //displays的初值是0
    { 
	  TR1=0;
	  if(md==0) decimal=0x80;
      else decimal=0;
      led[0]=min%10;	//分
      led[1]=min/10;	//分
	  led[2]=hour%10;	//小时
	  led[3]=hour/10; 	//小时
	  towset();	 //设置时间,若无按键,跳过
	  if(setflag){				   //setflag没有设初
	          if(add==0){while(add==0);min++;if(min==60){hour++;min=0;}}
			  if(dec==0){while(dec==0);if(min==0){if(hour==0) hour=23;else hour--;min=59;} else min--;}
	          }
	  else {if(add==0){while(add==0);hour++;if(hour==24){day++;hour=0;}}
			  if(dec==0){while(dec==0);if(hour==0){day--;hour=23;} else hour--;}
           	}
     }
	if(displays==1)	//显示日月
   	{  
	  TR1=0;
	  decimal=0x80;
	  led[0]=day%10;
      led[1]=day/10;
	  led[2]=month%10;
	  led[3]=month/10;
	  towset();	 //设置时间,若无按键,跳过 
	  if(setflag){
	          if(add==0){while(add==0);day++;
			     if(month==2&&((year%4)==0&&(year%100)!=0)&&day==30){day=1;month++;}  
                  else if(month==2&&day==29){day=1;month++;}
                   else if((month==4||month==6||month==9||month==11)&&day==31){day=1;month++;}
                    else if(day==32){day=1;month++;}
					}
			  if(dec==0){while(dec==0);day--;
			     if(month==3&&((year%4)==0&&(year%100)!=0)&&day==0){day=29;month--;}
				  else if(month==3&&day==0){day=28;month--;}
				  else if((month==5||month==7||month==10||month==12)&&day==0){day=30;month--;}
				  else if(day==0){day=31;month--;}
				  }
	          }
	  else 	  {if(add==0){while(add==0);month++;if(month==13){year++;month=1;}}
			  if(dec==0){while(dec==0);month--;if(month==0){year--;month=12;}}
              }
	}
	if(displays==2)  //显示星期
	{   
	  TR1=0;
	  decimal=0;
	  xq=xqwork();
      led[0]=xq;
      led[1]=table[10];
	  led[2]=table[10];
	  led[3]=table[10];

	}
 	if(displays==3)  //显示年份
	{   
	  TR1=0;
	  decimal=0;
      led[0]=year%10;
      led[1]=(year%100)/10;
	  led[2]=(year/100)%10;
	  led[3]=(year/100)/10; 
	          if(add==0){while(add==0);year++;}
			  if(dec==0){while(dec==0);year--;}

	}
	if(displays==4)  //定时
	{   decimal=0x80;
      led[0]=dingshil%10;
      led[1]=dingshil/10;
	  led[2]=dingshih%10;
	  led[3]=dingshih/10; 
	          if(add==0){while(add==0);TR1=0;}
			  if(dec==0){while(dec==0);TR1=1;}
			  if(set==0){while(set==0);TR1=0;dingshil=0;dingshih=0;}
	}
	if(displays==5)
	{ 
	  TR1=0;
	  if(set==0) 
	    { while(set==0);
            keyscan();
	    }

       if(kk==0)	 //kk的初值是零,以下是温度计算
   	      {     tmp = adc();
 			    temp = (float)tmp;
				k = log(temp/(255-temp));
				temp = k/3380 + 1/298.15;
				temp = 1/temp -270.15;
			    j = (uint)(temp*100);
                led[3] = j/1000;
				led[2] = j/100%10;
				led[1] = j/10%10;
				led[0] = j%10;
				decimal=0x80;
				j/=100;
           }
       if(kk==1)
        {  decimal=0;
	    if(add==0) {while(add==0);up++; }
	    if(dec==0) {while(dec==0);up--; }
        led[0]=(up%10);
	    led[1]=(up%100)/10;
        led[2]=led[3]=10;
        display();
        }  
     if(kk==2) 
     { decimal=0;
	   if(add==0) {while(add==0);down++; }
	   if(dec==0) {while(dec==0);down--; }
       led[0]=down%10;
	   led[1]=(down%100)/10;	 
  	  led[2]=led[3]=10;
       display();
      }
	              
   }
     if (sec>=60) {sec=0;min++;}     //时间转化
     if (min>=60) {min=0;hour++;} 
     if (hour>=24){hour=0;day++;}
   	if(month==2&&((year%4)==0&&(year%100)!=0)&&day==30)day=1;  
       else if(month==2&&day==29)day=1;
       else if((month==4||month==6||month==9||month==11)&&day==31)day=1;
       else if(day==32)day=1;
	 if (month>=13){ month=1;year++;}	 
	 if(j>=up||j<=down)	   bell=0;  
	   else bell=1;					
	  display();
   } 
  
}
  

  

⌨️ 快捷键说明

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