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

📄 test00.asm

📁 几个单片机程序
💻 ASM
字号:
#include <stdio.h>
#include <at89x51.h>

#define DI 	P2_5
#define	RW	P2_6
#define	E	P2_7
#define DSDIP	P3_2
#define CTRL	P3_0

unsigned int k=0;
code unsigned char  num[16]={0x0c,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0x74,0x3c,0x7c,0x04,0xff};
code unsigned char	close[6]={0xc2,0x32,0xf2,0xca,0xa2,0x22};
//unsigned char  time[4],time[2],day[2],time[5],tem1[5],tem2[5],mark,sec=0,flag;
unsigned char  time[13],tem1[5],tem2[5],mark,sec=0,flag;
void delay()
{
	long int i;
 	for(i=0;i<100;i++);
}

unsigned char creatdata(unsigned char d)
{
	unsigned char temp,re=0;
	temp=(d%2)*128;
    re+=temp;
	temp=(d/2)%2*64;
	re+=temp;
	temp=(d/4)%2*32;
	re+=temp;
	temp=(d/8)%2*16;
	re+=temp;
	temp=(d/16)%2*8;
	re+=temp;
	temp=(d/32)%2*4;
	re+=temp;
	temp=(d/64)%2*2;
	re+=temp;
	temp=(d/128)%2*1;
	re+=temp;

    return re;
}

void lcd_command(unsigned char lcd_data)
{
	 lcd_data=creatdata(lcd_data);

     DI=0;
	 DI=0;
     RW=0;
     RW=0;
     E=1;
     E=1;
     P0=lcd_data;
	 P0=lcd_data;
     E=0;

     E=0;
     delay();

}

void lcd_data(int lcd_data)
{

     DI=1;
	 DI=1;
     RW=0;
     RW=0;
     E=1;
     E=1;
     P0=lcd_data;
	 P0=lcd_data;


     E=0;

     E=0;

	   delay();

}

void delaytime(unsigned char i)
{
	while(--i);
}

unsigned   char  RestDS(void)
{
 unsigned char isexist;
 DSDIP=0;
 delaytime(140);//526uS
 delaytime(140);

 DSDIP=1;
 //等待15~60us
 delaytime(26);
 isexist=DSDIP;//取得ds18b20是否存在
 delaytime(100);//106uS

 return(isexist);
}

unsigned char ReadDS(void)
{
 unsigned char  i,t,value=0;
 for(i=8;i>0;i--)
 {
  value>>=1;
  DSDIP=0;
  t++;//2us
  DSDIP=1;
  t++;//2us
  t++;//2us
  t++;//2us t++;//2us
  if(DSDIP) value|=0x80;
  delaytime(25);

 }
 return(value);
}

void writeDS(unsigned char val)
{
  unsigned char i;
  for(i=8;i>0;i--)
  {
  DSDIP=0;
  DSDIP=val&0x01;//每次写1位,通过val右移得到
  delaytime(20);//延时34us(15~60us采样时间)
  DSDIP=1;//释放总线
  val>>=1;//计算的同时会产生一个2us的时间间隙
  }
 delaytime(3);//2次写的时间间隙要大于1us
}


float ReadTemp(void)
{
  unsigned int temp;
  unsigned char lowbit,highbit;
  float dTemp=0;
  RestDS();//复位ds18b20
  writeDS(0xcc);//跳过ROM
  writeDS(0x44);//发出温度转换命令
  //------
   RestDS();
  writeDS(0xcc);//跳过ROM
  writeDS(0xBE);//读暂存存贮器
  lowbit=ReadDS();//取得低8位
  highbit=ReadDS();//取得高8位
  temp=highbit<<8;
  temp=temp+lowbit;//合成16位的二进制数
 /*
 判断前5位,是否为:
 1:负
 0:正
 */

  //---------
   dTemp=temp*0.0625;//得到带小数点的实际温度
   temp=dTemp;//temp为int型,dTemp为float型,强制去掉小数
  /*全局变量分别返回个,十,百,符号位*/
   tem1[0]=temp/100;//得到百位
   tem1[1]=(temp-tem1[0]*100)/10;//得到十位
   tem1[2]=temp-tem1[0]*100-tem1[1]*10;//得到个位
   tem1[3]=(dTemp-temp)*10;//得到小数位
   tem1[4]=(dTemp-temp)*100-tem1[3]*10;
  return(dTemp);
}

unsigned char check_key()
{
	unsigned char key;
	P3_3=1;
	P1=0x7f;
	P3_4=0;

	if(P1!=0x7f)
	{
		key=P1;
		while(P1!=0x7f);
		return key;
	}
	P3_4=1;
	P1=0xff;
	P3_3=0;
	if(P1!=0xff)
	{
		key=P1;
		while(P1!=0xff);
		return key;
	}

	return 0;
}

void gettem()
{
	 ReadTemp();//取得ds18b20温度
	lcd_command(0x03);
	lcd_command(0xc0);
    lcd_data(num[12]);
	lcd_data(num[tem1[0]]);
	lcd_data(num[tem1[1]]);
	lcd_data(num[tem1[2]]);
	lcd_data(num[11]);
	lcd_data(num[tem1[3]]);
	lcd_data(num[tem1[4]]);
	lcd_data(num[13]);
}
void check_time()
{
    time[4]=time[4]>1?1:time[4];
	if(time[4]==1)
	{
		time[5]=time[5]>2?2:time[5];
	}
	if(time[4]==0&&time[5]==2)
	{
		time[6]=time[6]>2?2:time[6];
		if(time[6]==2)
		{
			 time[7]=time[7]>8?8:time[7];
		}
	}
	else
	{
		time[6]=time[6]>3?3:time[6];
		if(time[6]==3)
		{
			 if((time[4]==0&&(time[5]==4||time[5]==6||time[5]==9))||(time[4]==1&&time[5]==1))
			 {
			 	time[7]=0;
			 }
			 else  time[7]=time[7]>1?1:time[7];
		}
	}
	time[8]=time[8]>2?2:time[8];
	if(time[8]==2)
	{
		time[9]=time[9]>4?4:time[9];
	}
	time[11]=time[11]>5?5:time[11];
}

void time_back(unsigned char b[])
{
	unsigned char i;
	for(i=0;i<12;i++)
	{
		time[i]=b[i];
	}
}

void tem_back(unsigned char b[])
{
	unsigned char i;
	for(i=0;i<5;i++)
	{
		tem2[i]=b[i];
	}
	lcd_command(0x03);
	lcd_command(0xc9);
	lcd_data(num[tem2[0]]);
	lcd_data(num[tem2[1]]);
	lcd_data(num[tem2[2]]);
	lcd_data(num[11]);
	lcd_data(num[tem2[3]]);
	lcd_data(num[tem2[4]]);

}
unsigned char set_time()
{
	unsigned char  j=0,index=0,index_1=0,time_bak[12];
	int i=0;
	TR0=0;
	lcd_command(0x03);
	delay();
	lcd_command(0x80+index_1);
   for(i=0;i<12;i++)
   {
   	time_bak[i]=time[i];
   }

   while(1)
   {

          i++;
		  if(i>=1000)
		  {
		  		gettem();
				lcd_command(0x03);
				delay();
				lcd_command(0x80+index_1);
				i=0;
		  }
		   j=0;

			switch (check_key())
	 	    {
			    case  0xbf : time[index]=1;
					  j=1;
					  break;
				case  0xdf : time[index]=3;
						j=1;
					  break;
	 			 case  0xef : time[index]=5;
				 		j=1;
					  break;
				case  0xf7 : time[index]=7;
						j=1;
					  break;
				case  0xfb : time[index]=9;
						j=1;
					  break;
			    case  0x3f : time[index]=0;
						j=1;
					  break;
			    case  0x5f : time[index]=2;
					j=1;
					  break;
				  case  0x6f : time[index]=4;
				  		j=1;
					  break;
				  case  0x77 : time[index]=6;
				  		j=1;
					  break;
				  case  0x7b : time[index]=8;
				  		j=1;
					  break;
				   case  0x7d:k=0;sec=0;TR0=1;return 0;

				   case  0xfd:time_back(time_bak);k=0;sec=0;TR0=1;return 0;
			}


	        if(j==1)
			{

			    check_time();
				lcd_command(0x03);
				delay();
				lcd_command(0x80+index_1);
				lcd_data(num[time[index]]);
				index++;
				index_1++;
				if(index_1==4||index_1==7||index_1==10||index_1==13)index_1++;
				if(index==10)index=11;
				else if(index_1==16)
				{
					index_1=0;
					index=0;
				}
				j=0;
				lcd_command(0x03);
				delay();
				lcd_command(0x80+index_1);

			}


	}

}
unsigned char	set_tem()
{
	unsigned char tem_bak[5], j,	index=0,index_1=9;
	int i=0;

	lcd_command(0x03);
	delay();
	lcd_command(0xc0+index_1);

    for(i=0;i<5;i++)
	{
		tem_bak[i]=tem2[i];
	}

	while(1)
   {

   		   if(time[10]!=flag)
			{
					flag=time[10];
					lcd_command(0x03);
				    lcd_command(0x8d);
					lcd_data(num[time[10]]);
					lcd_data(num[time[11]]);
					lcd_data(num[time[12]]);

					gettem();
					lcd_command(0x03);
					delay();
					lcd_command(0xc0+index_1);
					i=0;

           }
          i++;
		  //if(i>=1000)
		  //{

		 // }
		   j=0;

			switch (check_key())
	 	    {
			    case  0xbf : tem2[index]=1;
					  j=1;
					  break;
				case  0xdf : tem2[index]=3;
						j=1;
					  break;
	 			 case  0xef : tem2[index]=5;
				 		j=1;
					  break;
				case  0xf7 : tem2[index]=7;
						j=1;
					  break;
				case  0xfb : tem2[index]=9;
						j=1;
					  break;
			    case  0x3f : tem2[index]=0;
						j=1;
					  break;
			    case  0x5f : tem2[index]=2;
						j=1;
					  break;
				  case  0x6f : tem2[index]=4;
				  		j=1;
					  break;
				  case  0x77 : tem2[index]=6;
				  		j=1;
					  break;
				  case  0x7b : tem2[index]=8;
				  		j=1;
					  break;
				   case  0x7d:k=0;sec=0;return 0;

				   case  0xfd:tem_back(tem_bak);k=0;sec=0;TR0=1;return 0;
			}


	        if(j==1)
			{


				lcd_command(0x03);
				delay();
				lcd_command(0xc0+index_1);
				lcd_data(num[tem2[index]]);
				index++;
				index_1++;
				if(index_1==12)index_1++;
				else if(index_1==15)
				{
					index_1=9;
					index=0;
				}
				j=0;
				lcd_command(0x03);
				delay();
				lcd_command(0xc0+index_1);

			}


	}


}

void tem_ctrl()
{
 	unsigned int t1,t2;

	t1=tem1[0]*100+tem1[1]*10+tem1[2]+tem1[3]*0.1;
	t2=tem2[0]*100+tem2[1]*10+tem2[2]+tem2[3]*0.1;
	if(t1>=t2)
	{
		CTRL=1;
	}
	else
	{
		CTRL=0;
	}


}

void main()
{
	int i=0;
	unsigned char kk=0;
    CTRL=1;
	lcd_command(0x01);
	lcd_command(0x3c);

	//lcd_command(0x17);
	lcd_command(0x0f);
	lcd_command(0x06);
	lcd_command(0x80);

	time[0]=2;
	time[1]=0;
	time[2]=0;
	time[3]=5;

	time[4]=0;
	time[5]=4;

	time[6]=2;
	time[7]=0;

	time[8]=1;
	time[9]=7;
	time[10]=10;
	time[11]=0;
	time[12]=3;
	flag=time[10];
	lcd_command(0x03);
	lcd_command(0xc8);
	lcd_data(num[12]);
	lcd_data(close[0]);
	lcd_data(close[1]);
	lcd_data(close[2]);
	lcd_data(close[3]);
	lcd_data(close[4]);
	lcd_data(close[5]);

	///lcd_data(num[tem2[0]]);
	//lcd_data(num[tem2[1]]);
	//lcd_data(num[tem2[2]]);
	//lcd_data(num[11]);
	//lcd_data(num[tem2[3]]);
//	lcd_data(num[tem2[4]]);
	lcd_data(num[13]);




	TMOD=0x00;

 	TL0=24;
    TH0=99;
    EA=1;
 	TR0=1;
	ET0=1;

    while(1){

				switch (check_key())
				{
					case	0x7d:kk=1;
							break;

					case	0xfd:kk=0;
							CTRL=1;
							break;

					case	0x7e:set_time();
							break;

					case	0xfe:
							if(kk==1)set_tem();
							break;

				}
				if(kk==1)
				{
					tem_ctrl();
					lcd_command(0x03);
					lcd_command(0xc9);
					lcd_data(num[tem2[0]]);
					lcd_data(num[tem2[1]]);
					lcd_data(num[tem2[2]]);
					lcd_data(num[11]);
					lcd_data(num[tem2[3]]);
					lcd_data(num[tem2[4]]);

				}
				else
				{
					lcd_command(0x03);
					lcd_command(0xc9);

					lcd_data(close[0]);
					lcd_data(close[1]);
					lcd_data(close[2]);
					lcd_data(close[3]);
					lcd_data(close[4]);
					lcd_data(close[5]);
				}
 	            if(time[10]!=flag)
			    {
					flag=time[10];
					lcd_command(0x03);
					lcd_data(num[time[0]]);
					lcd_data(num[time[1]]);
					lcd_data(num[time[2]]);
					lcd_data(num[time[3]]);

					lcd_data(num[11]);

				    lcd_data(num[time[4]]);
					lcd_data(num[time[5]]);

					lcd_data(num[11]);

					lcd_data(num[time[6]]);
					lcd_data(num[time[7]]);

					lcd_data(num[14]);

					lcd_data(num[time[8]]);
					lcd_data(num[time[9]]);
					lcd_data(num[time[10]]);
					lcd_data(num[time[11]]);
					lcd_data(num[time[12]]);

                }




			//	gettem();//取得ds18b20温度




	 }






}

void time0_int(void) interrupt 1
{
	k++;
	if(k>100&&k<200)time[10]=14;
	else time[10]=10;


	if(k>=200)
	{
		k=0;
		sec++;
		if(sec==60)
		{
			time[12]++;
			if(time[12]==10)
			{
				time[12]=0;
				time[11]++;
				if(time[11]==6)
				{
					time[11]=0;
					time[9]++;
					if(time[8]!=2&&time[9]==10)
					{
						time[9]=0;
						time[8]++;
						lcd_command(0xcc);
						lcd_data(num[time[8]]);
					}
					else if(time[8]==2&&time[9]==4)
					{
						time[9]=0;
						time[8]=0;
						time[1]++;
						if(time[7]==10)
						{
							time[7]=0;
							time[6]++;
						//	lcd_command(0x);

						}
						if(time[4]==0)
						{
							if((time[5]==1||time[5]==3||time[5]==5||time[5]==7||time[5]==8)&&time[6]==3&&time[7]==2)
							{
								time[6]=0;
								time[7]=1;
							    time[5]++;
							}
							if((time[5]==4||time[5]==6||time[5]==9)&&time[6]==3&&time[7]==1)
							{
								time[6]=0;
								time[7]=1;
							    time[5]++;
							}
							if((time[5]==2)&&time[6]==2&&time[7]==9)
							{
								time[6]=0;
								time[7]=1;
							    time[5]++;
							}

						}
						else if(time[4]==1)
						{
							if((time[5]==1)&&time[6]==3&&time[7]==1)
							{
								time[6]=0;
								time[7]=1;
							    time[5]++;
							}
							if((time[5]==2||time[5]==0)&&time[6]==3&&time[7]==2)
							{
								time[6]=0;
								time[7]=1;
							    time[5]++;
							}
						}
						if(time[5]==10)
						{
							time[5]=0;
							time[4]++;
						}
						if(time[4]==1&&time[5]==3)
						{
							time[4]=0;
							time[5]=1;
								time[3] ++;
								if(time[3]==10)
								{
									time[3]=0;
									time[2]++;
									if(time[2]==10)
									{
										time[2]=0;
										time[1]++;
										if(time[1]==10)
										{
											time[1]=0;
											time[0]++;
											if(time[0]==10)
											{
												time[0]=0;

											}
										}
									}
								}
							}
						}


					}

			}
			sec=0;
		}
    }
	TL0=24;
    TH0=99;

}

⌨️ 快捷键说明

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