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

📄 温度测量.c

📁 运用AT89C2O51单片机实现温度测量,测量精度1度.
💻 C
字号:
#include <REG2051.H>
#include <intrins.h> 

#define uchar unsigned char
#define uint signed int
#define uuchar signed char

#define k1 P3_1				//k1功能键
#define k2 P3_2				//k2加键
#define k3 P3_3				//k3复位键
#define bj P3_0				//定值输出
#define adk P3_7



uchar sec20,sec,xm0,xm1,xm2,ki,buffer[3],BitCounter,temp,Dat,dz,i,digit,Number[5]={1,2,3,4,5};     
uchar convert[10]={0x3F,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//0~9段码
uint Count,zzz,zzbl,t,v,jsz;
static uchar bdata ke,kee; 		//可位寻址的状态寄存器

sbit stada= P1^7; 			//Ls164串行数据
sbit sclk = P1^2; 			//Ls164串行时钟
sbit Sda= P3^5; 			//2401串行数据
sbit Scl= P3^4; 			//2401串行时钟
sbit LED1 = P1^3;			//数码管位驱动
sbit LED2 = P1^4;			//数码管位驱动
sbit LED3 = P1^5;			//数码管位驱动
sbit p36 = P3^6;
sbit k11=ke^0;
sbit k12=ke^1;
sbit k22=ke^2;
sbit k21=ke^3;
sbit k33=ke^4;
sbit k31=ke^5;
sbit jsz11=ke^6;
sbit jsz12=ke^7;
sbit jsf11=kee^0;
sbit jsf12=kee^1;
sbit b=kee^2;
sbit c=kee^3;
sbit d=kee^4;
sbit e=kee^5;
sbit cl=kee^6;

void delay(i);				//延时函数
void scanLED();				//显示函数
void timeToBuffer();		//显示转换函数
void Sen();					//74Ls164串并转换

void time();
void jpcl();
void fw();
void jy();
void adzhh();

/*起始条件*/
void Start(void)
{
	Sda=1;
	Scl=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	Sda=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();
}

/*停止条件*/   
void Stop(void)
{
	Sda=0;
	Scl=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	Sda=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
}

/*应答位*/
void Ack(void)
{
	Sda=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	Scl=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	Scl=0;
}

/*反向应答位*/
void NoAck(void)
{
	Sda=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	Scl=1;
	_nop_();_nop_();_nop_();_nop_();_nop_();
	Scl=0;
}

/*发送数据子程序,Data为要求发送的数据*/
void Send(uchar Data)
{
	uchar BitCounter=8; 				//位数控制
	uchar temp; 						//中间变量控制
	do
	{
		temp=Data;
		Scl=0;
		_nop_();_nop_();_nop_();_nop_();_nop_();
		if((temp&0x80)==0x80)			//如果最高位是1
		Sda=1;
		else
		Sda=0;
		_nop_();_nop_();_nop_();_nop_();_nop_();
		Scl=1;
		temp=Data<<1; 					//RLC
		Data=temp;
		BitCounter--;
	}
	while(BitCounter);
	Scl=0;
	_nop_();_nop_();_nop_();_nop_();_nop_();
}

/*读一个字节的数据,并返回该字节值*/
uchar Read(void) 
{
	uchar temp=0;
	uchar temp1=0;
	uchar BitCounter=8;
	Sda=1;
	do
	{
		Scl=0;
		_nop_();_nop_();_nop_();_nop_();_nop_();
		Scl=1;
		_nop_();_nop_();_nop_();_nop_();_nop_();
		if(Sda) 						//如果Sda=1
		temp=temp|0x01; 				//temp的最低位置1
		else
		temp=temp&0xfe; 				//否则temp的最低位清0
		if(BitCounter-1)
		{
			temp1=temp<<1;
			temp=temp1;
		}
		BitCounter--;
	}
	while(BitCounter);
	return(temp);
}

void WrToROM(uchar Data[],uchar Address,uchar Num)
{
	uchar i;
	uchar *PData;
	PData=Data;
	for(i=0;i<Num;i++)
	{
		Start(); 					//发送启动信号
		Send(0xa0); 				//发送SLA+W
		Ack();
		Send(Address+i); 			//发送地址
		Ack();
		Send(*(PData+i));
		Ack();
		Stop();
		delay(2000);
	}
}

void RdFromROM(uchar Data[],uchar Address,uchar Num)
{
	uchar i;
	uchar *PData;
	PData=Data;
	for(i=0;i<Num;i++)
	{
		Start();
		Send(0xa0);
		Ack();
		Send(Address+i);
		Ack();
		Start();
		Send(0xa1);
		Ack();
		*(PData+i)=Read();
		Scl=0;
		NoAck();
		Stop();
	}
}

void main()
{
	EA=1;		   			//开中断
  	TMOD=0x11; 				//设定时器0为计数,设定时器1定时
	ET0=1; 					//定时器0中断允许 
	ET1=1; 					//定时器1中断允许 
	TH0=0xD8;
	TL0=0xF0;				//设定时值为20000us(20ms)
	TH1=0x00;
	TL1=0x00;
	TR0=1;
	buffer[0]=0x06;	
	buffer[1]=0x3F;
	buffer[2]=0x4F;
	d=0;
	while(!d)
	{
		if (sec>2)
		d=1;
		scanLED();
	}
	RdFromROM(Number,0,5);
	zzz=Number[0]*256+Number[1];
	dz=Number[2];
	jsz=Number[3]*256+Number[4];
	LED1 = 1;
	LED2 = 1;
	LED3 = 1;
	k12=1;
	k22=1;
	k31=1;
	bj=1;
	d=1;
	jy();
	while(1)
	{
		adzhh();
		timeToBuffer();		//调用转换段码功能模块
	  	scanLED();			//调用显示函数
		jpcl();

	}
}

void delay(i)				//延时子程序					
{
    while(--i);
}

void scanLED()			     //显示功能模块
{
	Dat=buffer[2];
	Sen();
	LED1=0;
	delay(50);
	LED1=1;
	Dat=buffer[1];
	Sen();
	LED2=0;
	delay(50);
	LED2=1;
	Dat=buffer[0];
	Sen();
	LED3=0;
	delay(50);
	LED3=1;
}



void timeToBuffer()		   	 	//转换段码功能模块
{
	xm0=jsz/100;	
	xm1=(jsz-xm0*100)/10;
	xm2=jsz-xm0*100-xm1*10;
	buffer[0]=convert[xm2];	
	buffer[1]=convert[xm1];
	buffer[2]=convert[xm0];
	if (buffer[2]==0x3F)
	{
		buffer[2]=0x00;
		if (buffer[1]==0x3F)
		buffer[1]=0x00;
	}
}

void Sen()						//74Ls164串并转换		
{
    for( i=0; i<8;i++)  		//循环8次,转换一位
    {
		sclk=0;
        if((Dat&0x80)==0x80)	//依次转换各位数
		stada=1; 				
        else stada=0; 
		sclk=1;
		delay(3);
		sclk=0;
        digit=Dat<<1;        	//循环左移1位
		Dat=digit;
    }
}




void KeyAndDis_Time0(void) interrupt 1 using 1	//定时器0中断外理中键扫描和显示
{
	TR0=0;
	TH0=0xD8;
	TL0=0xF0;					//设定时值为20000us(20ms)
	time(); 
	TR0=1;
}

void time ()				  	//计时处理模块
{
	sec20++;

   	if (sec20>=50)       	// 50 * 20 ms = 1 s 
   	{
		cl=1;
  		sec20=0;
		e=~e;
		if (e==1)
    	sec++;				    //秒计时
    	if (sec>=200)		    //
    	{
			sec=0;
   		}
	}
}

void jpcl()
{
	k11=k1;
	if (!k12&&k11) 
	b=1;
	k12=k11;
	k11=k1;
	k21=k2;
	if (b==1)
	{
		while(b)
		{
			buffer[0]=0x77;	
			buffer[1]=0x77;
			buffer[2]=0x77;
			sec=0;
			c=0;
			while(!c)
			{
				if (sec>=2)
				{
					c=1;
				}
				scanLED();
			}
			c=0;
			zzbl=jsz;
			jsz=zzz;
			timeToBuffer();
			while(!c)
			{
				k11=k1;
				k21=k2;
				if (!k22&&k21) 
				{
					xm0++;
					if (xm0>9)
					xm0=0;
				}
				if (e==1)
				buffer[2]=0x40;
				else buffer[2]=convert[xm0];
				scanLED();
				if (!k12&&k11) 
				{
					c=1;	
				}
				k22=k21;
				k12=k11;
			}
			buffer[2]=convert[xm0];
			c=0;
			while(!c)
			{
				k11=k1;
				k21=k2;
				if (!k22&&k21) 
				{
					xm1++;
					if (xm1>9)
					xm1=0;
				}
				if (e==1)
				buffer[1]=0x40;
				else buffer[1]=convert[xm1];
				scanLED();
				if (!k12&&k11) 
				{
					c=1;	
				}
				k22=k21;
				k12=k11;
			}
			buffer[1]=convert[xm1];
			c=0;
			while(!c)
			{
				k11=k1;
				k21=k2;
				if (!k22&&k21) 
				{
					xm2++;
					if (xm2>9)
					xm2=0;
				}
				if (e==1)
				buffer[0]=0x40;
				else buffer[0]=convert[xm2];
				scanLED();
				if (!k12&&k11) 
				{
					c=1;
					b=0;
					zzz=xm0*100+xm1*10+xm2;
				}
				k22=k21;
				k12=k11;
			}
			buffer[0]=convert[xm2];
		}
		b=1;
		while(b)
		{
			buffer[0]=0x7C;	
			buffer[1]=0x7C;
			buffer[2]=0x7C;
			sec=0;
			c=0;
			while(!c)
			{
				if (sec>=2)
				{
					c=1;
				}
				scanLED();
			}
			c=0;
			jsz=dz;
			timeToBuffer();
			while(!c)
			{
				k11=k1;
				k21=k2;
				if (!k22&&k21) 
				{
					xm0++;
					if (xm0>1)
					xm0=0;
				}
				if (e==1)
				buffer[2]=0x40;
				else buffer[2]=convert[xm0];
				scanLED();
				if (!k12&&k11) 
				{
					c=1;	
				}
				k22=k21;
				k12=k11;
			}
			buffer[2]=convert[xm0];
			c=0;
			while(!c)
			{
				k11=k1;
				k21=k2;
				if (!k22&&k21) 
				{
					xm1++;
					if (xm1>9)
					xm1=0;
				}
				if (e==1)
				buffer[1]=0x40;
				else buffer[1]=convert[xm1];
				scanLED();
				if (!k12&&k11) 
				{
					c=1;	
				}
				k22=k21;
				k12=k11;
			}
			buffer[1]=convert[xm1];
			c=0;
			while(!c)
			{
				k11=k1;
				k21=k2;
				if (!k22&&k21) 
				{
					xm2++;
					if (xm2>9)
					xm2=0;
				}
				if (e==1)
				buffer[0]=0x40;
				else buffer[0]=convert[xm2];
				scanLED();
				if (!k12&&k11) 
				{
					c=1;
					b=0;
					dz=xm0*100+xm1*10+xm2;
					jsz=zzbl;
				}
				k22=k21;
				k12=k11;
			}
			buffer[1]=convert[xm2];	
		}

	}
}


void jy()
{
	TR0=0;
	Number[0]=zzz/256;
	Number[1]=zzz%256;
	Number[2]=dz;
	Number[3]=jsz/256;
	Number[4]=jsz%256;
	WrToROM(Number,0,5);
	delay(50);
	TR0=1;
}



void adzhh()
{
	if(cl==1)
	{
		TR0=0;
 		TR1=0;
		TH1=0x00;
		TL1=0x00;
		adk=1;
		delay(50);
		p36=0;
		i=0;
		adk=0;
		TR1=1;			
		while(~p36)
		{
			i++;
			if(i>=900)			//上限值
			p36=1;
		}
		TR1=0;
		t=TH1;
		t=t*256+TL1;
		jsz=(t-134)/31;
		TH0=0xD8;
		TL0=0xF0;
		TR0=1;
		cl=0;
	}	
}


⌨️ 快捷键说明

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