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

📄 all.c

📁 温度监控系统 CPU是AT89C51 AD是TLC1543 外部存储器是24C64 传感器是PT1
💻 C
字号:
#include<intrins.h>
#include <reg51.h>
#define LCM_RS RS
#define LCM_RW RW
#define LCM_EN E
#define Busy 0x80
#define uchar unsigned char
#define uint unsigned int
#define DATAPORT P0
#define SomeNop(); _nop_();_nop_();_nop_();_nop_();_nop_();
sbit CLOCK=P1^2;
sbit D_IN=P1^3;
sbit D_OUT=P3^2;
sbit _CS=P3^3;
sbit E=P1^7;
sbit RW=P1^6;
sbit RS=P1^5;
sbit I2C_SDA=P1^1;
sbit I2C_SCK=P1^0;
sbit LIGHT=P3^4;
sbit COLUMN1=P2^0;
sbit COLUMN2=P2^1;
sbit LED=P3^1;



uchar AH;                           //A/D转换高2位
uchar AL;   
uchar TH[4],TL[4];uchar address=0x02;	
uchar high,low;
uint m=1;
int KEY;
uchar code str0[]={"TEMP("};
uchar code str1[]={"):"};
uchar code str2[]={"TL:"};
uchar code str3[]={"TH:"};
//uint temp;
bit   I2C_Start(void);
void  I2C_Stop(void);
void  I2C_Ack(void);
void  I2C_Nack(void);
bit   I2C_Send_Byte( uchar);
uchar I2C_Receive_Byte(void);
void  AT24C64_R(void *mcu_address,uint AT24C64_address,uint count);
void  AT24C64_W(void *mcu_address,uint AT24C64_address,uint count);
uint read1543(uchar port);
void showtempt(void);
void ReadStatusLCM(void);
void WriteCommandLCM(uchar WCLCM,uchar BusyC);
void WriteDataLCM(uchar WDLCM);
void DisplayOneChar(uchar X,uchar Y,uchar DData);
void DisplayListChar(uchar X,uchar Y,uchar *DData);
void InitLcd();
void keyboard(void);





void wait_5ms(void)   //***延时子程序***//
{
	uint con;
	for(con=0;con<1500;con++);
}
 
void wait_1s(void)   //***延时子程序***//
{
	uint con;
	for(con=0;con<30000;con++);
  	for(con=0;con<30000;con++);
}

void  Delay_10_uS(void)
{
	char i=10;
 	while(i--);
}
void Delay_N_mS( uint n_milisecond)  
{
	uchar i;
 	while(n_milisecond--)
 	{
 		i=37;
  		while(i--);
 	}
}

void delay(uint k)
{
	uint i,j;
	for(i=0;i<k;i++)
	{
		for(j=0;j<60;j++);
	}
}





//**AD转换并显示**//




void ad1543v_3(bit a1,bit a2,bit a3,bit a4)
{
	uchar i;
    AH=AL=0;                     
    CLOCK=0;
    _CS=0;
    for(i=0;i<6;i++)
    ;
    D_IN=a1;                         /*送入高位地址*/
    CLOCK=1;
    if(D_OUT==1)
       {
       	 (AH)+=1;
       	}
          (AH)=(AH)<<1;
           CLOCK=0;
           ;
           ;
           D_IN=a2; 
           ;                 /*送入次高位地址*/
           CLOCK=1;
           ;
     if(D_OUT==1)
        {
          (AH)+=1;
         }
           CLOCK=0;
           ;
           D_IN=a3;
           ;                  /*送入次低位地址*/
           CLOCK=1;
     if(D_OUT==1)
         {
           (AL)+=1;
          }
           (AL)=(AL)<<1;
           CLOCK=0;
           ;
           ;
           D_IN=a4;                  /*送入低位地址*/
           CLOCK=1;
           
     if(D_OUT==1)
         {
           (AL)+=1;
          }

     for(i=0;i<6;i++)                /*采样循环???*/
         {
       	   (AL)=(AL)<<1;
            CLOCK=0;
            ;
            ;
            CLOCK=1;
               if(D_OUT==1)
                  {
                     (AL)+=1;
                  }
          }
    CLOCK=0;
    ;
    ;
    _CS=1; 
    ;                          /*转换结束*/
}

uint adc(bit b1,b2,b3,b4)
{
    unsigned long h;
    uchar w;
    uint temp;
    ad1543v_3(b1,b2,b3,b4);
    h=(AH)*256+(AL);
    h=h*500;
    w=h/1024;      
    temp=w-110;
    return(temp);
}

uint read1543(uchar port) //从TLC1543读取采样值,形参port是采样的通道号
{
	uint data ad;
	uint data i;
    uchar data al=0,ah=0;
    CLOCK=0;
    _CS=0;
    port<<=4;
    for (i=0;i<4;i++) //把通道号打入1543
    {
    	D_IN=(bit)(port&0x80);CLOCK=1;CLOCK=0;
        port<<=1;
    }
    for (i=0;i<6;i++) //填充6个CLOCK
    {
    	CLOCK=1;CLOCK=0;
    }
    _CS=1;_nop_();_nop_();_CS=0; //等待AD转换
    for (i=0;i<2;i++) //取D9,D8
    {
    	D_OUT=1;
        CLOCK=1;
        ah<<=1;
        if (D_OUT) ah|=0x01;
        CLOCK=0;
    } 
	for (i=0;i<8;i++) //取D7--D0
    {
    	D_OUT=1;
        CLOCK=1;
        al<<=1;
        if (D_OUT) al|=0x01;
        CLOCK=0;
     } 
	_CS=1;                         
    ad=(uint)ah;ad<<=8;ad|=al; //得到AD值
    return (ad);
    delay(2500);
}

void Ten_to_String(uint h,uchar w[3])
{
	w[0]=h/100+0x30;
    w[1]=(h%100)/10+0x30;
    w[2]=h%10+0x30;       		
}
void showtempt(void)
{
	uchar v[4];uint h;
    //h=read1543(0x00);delay(1000);
    //h+=read1543(0x00);delay(1000);
    //h+=read1543(0x00);delay(1000);
    //h+=read1543(0x00);delay(1000);
    //h+=read1543(0x00);delay(1000);
   // h/=5;
   h=adc(0,0,0,0);
   h+=adc(0,0,0,0);
      h+=adc(0,0,0,0);
         h+=adc(0,0,0,0);
            h+=adc(0,0,0,0);
            h/=5;
   
    if(h>=low&&h<=high)
		{
			LIGHT=1;
		}
       	else 
        {
			LIGHT=0;
   		 }
	
    AT24C64_W((char *)h,address++,1);
    wait_1s;
    Ten_to_String(h,v);                      
 	DisplayListChar(8,0,v);	
}

//**显示程序**//
void ReadStatusLCM(void)
{ 
	do
	{
		DATAPORT=0xFF;
		LCM_RS=0;
		LCM_RW=1;
		LCM_EN=0;
		LCM_EN=0;
		LCM_EN=1;
	}
	while(DATAPORT&Busy);
	LCM_EN=1;
}

void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
	if(BusyC) ReadStatusLCM();
	DATAPORT=WCLCM;
	LCM_RS=0;
	LCM_RW=0;
	LCM_EN=0;
	LCM_EN=0;
	LCM_EN=1;delay(10);
}

void WriteDataLCM(uchar WDLCM)
{
	ReadStatusLCM();
	DATAPORT=WDLCM;
	LCM_RS=1;
	LCM_RW=0;
	LCM_EN=0;
	LCM_EN=0;
	LCM_EN=1;delay(10);
}

void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
	Y&=0x01;
	X&=0x0F;
	if(Y)X|=0x40;
	X|=0x80;
	WriteCommandLCM(X,0);
	WriteDataLCM(DData);	
}

void DisplayListChar(uchar X,uchar Y,uchar *DData)
{
	uchar ListLength=0;
	Y&=0x01;
	X&=0x0F;
	if(X<=15)
	{
		while(DData[ListLength])
		{
			DisplayOneChar(X,Y,DData[ListLength]);
			ListLength++;
			X++;
		}
	}
}

void InitLcd()
{
	WriteCommandLCM(0x01,1);
	WriteCommandLCM(0x02,1);
	WriteCommandLCM(0x38,1);
	WriteCommandLCM(0x06,1);
	WriteCommandLCM(0x0c,1);
}

//**24c64存取程序**//
bit I2C_Start(void)
{
	Delay_10_uS();
 	I2C_SDA =1;
 	Delay_10_uS();
 	I2C_SCK =1;
 	Delay_10_uS();
 	if ( I2C_SDA == 0) return 0;
 	if ( I2C_SCK == 0) return 0;
 	I2C_SDA = 0;
 	Delay_10_uS();
 	I2C_SCK = 0;
 	Delay_10_uS();
 	return 1;
}

void  I2C_Stop(void)
{
	Delay_10_uS();
 	I2C_SDA = 0;
 	Delay_10_uS();
 	I2C_SCK = 1;
 	Delay_10_uS();
 	I2C_SDA = 1;
 	Delay_10_uS();
}

void I2C_Ack(void)
{
	Delay_10_uS();
 	I2C_SDA=0;
 	Delay_10_uS();
 	I2C_SCK=1;
 	Delay_10_uS();
 	I2C_SCK=0;
 	Delay_10_uS();
}

void I2C_Nack(void)
{
	Delay_10_uS();
 	I2C_SDA=1;
 	Delay_10_uS();
 	I2C_SCK=1;
 	Delay_10_uS();
 	I2C_SCK=0;
 	Delay_10_uS();
}

bit I2C_Send_Byte( uchar d)
{
	uchar i = 8;
 	bit bit_ack;
 	while( i-- )
	{
		Delay_10_uS();
  		if ( d &0x80 )   I2C_SDA =1;
  		else             I2C_SDA =0;
  		Delay_10_uS();
  		I2C_SCK = 1;
  		Delay_10_uS();
  		I2C_SCK = 0;
  		d = d << 1;
 	}
 	Delay_10_uS();
 	I2C_SDA = 1;
 	Delay_10_uS();
 	I2C_SCK = 1;
 	Delay_10_uS();
 	bit_ack = I2C_SDA;
 	I2C_SCK =0;
 	Delay_10_uS();
 	return bit_ack;
}

uchar I2C_Receive_Byte(void)
{
	uchar i = 8, d;
 	Delay_10_uS();
 	I2C_SDA = 1;
 	while ( i--)
 	{
 		d = d << 1;
  		Delay_10_uS();
  		I2C_SCK =1;
  		if ( I2C_SDA ) d++;
  		Delay_10_uS();
  		I2C_SCK =0;
 	}
 	return d;
}

void AT24C64_W(void *mcu_address,uint AT24C64_address,uint count)
{
	while(count--)
 	{
 		I2C_Start();
  		I2C_Send_Byte( 0xa0);
  		I2C_Send_Byte(  AT24C64_address/256 );
  		I2C_Send_Byte( AT24C64_address %256 );
  		I2C_Send_Byte( *(uchar*)mcu_address );
  		I2C_Stop();
  		Delay_N_mS(10);       /* waiting for write cycle to be completed */
  		((uchar*)mcu_address)++;
  		AT24C64_address++;
  		Delay_N_mS(5);
 	}
}

void AT24C64_R(void *mcu_address,uint AT24C64_address,uint count)
{
	while(count--)
	{
		I2C_Start();
  		I2C_Send_Byte( 0xa0);
  		I2C_Send_Byte( AT24C64_address/256 );
  		I2C_Send_Byte( AT24C64_address % 256 );
  		I2C_Start();
  		I2C_Send_Byte( 0xa1 );
  		*(uchar*)mcu_address = I2C_Receive_Byte();
  		I2C_Nack();
  		I2C_Stop();
  		((uchar*)mcu_address)++;
  		AT24C64_address++;
 	}
}

//**键盘响应程序**//
void keyboard(void)                  
{
	uchar jz;   
	
	COLUMN1=0;                       /*查询第4行*/                    
 	COLUMN2=1;
 	Delay_N_mS(1);
 	KEY=~(P2)&0xf0;
 	Delay_N_mS(20);
 	
 	switch(KEY)
 	{  
 		
 		case 32:                      /*第4行第3列,报警上限值减一*/
 		{  
 			jz=1;
 			high--;
 	        break;
 	     }       
 	     case 64:                      /*第4行第2列,通道逆循环*/
 		{
 			jz=2;
 			switch(m)
 			{
 					case 1:m=3;break;
    				case 2:m--;break;
    				case 3:m--;break;     
        	}
        	break;
 	     }
 	     case 128:                      /*第4行第1列,报警下限值减一*/
 		{
 			jz=3;
 			low--;        
 	        break;
 	     }                              
 		default:                  
 		{                  	
 			jz=0;               
            break;
         } 
     }
     if(jz!=0)
     goto NEXT0;    
     else    
     {    	
     	COLUMN1=1;                   /*查询第3行*/
        COLUMN2=0;
        Delay_N_mS(1);
        KEY=~(P2)&0xf0;
        Delay_N_mS(20);
        switch(KEY)
        {        	         	
        
 	  		case 32:                  /*第3行第3列,报警上限值加一*/                        
    		{                 
    			                                
    			jz=4; 
    			high++;          	
			    break;
			}  
			case 64:                  /*第3行第2列,通道正循环*/                         
    		{                 
    			                               
    			jz=5;
    			switch(m)
    			{
    				case 1:m++;break;
    				case 2:m++;break;
    				case 3:m=1;break;	
    			} 
    			             	
			    break;
			}         
			case 128:                  /*第3行第1列,报警下限值加一*/                          
    		{                 
    			                                
    			jz=6;
    			low++;           	
			    break;
			}             
			default:               
			{           	     
				jz=0;               				            
			    break;
			}        
	    }     
		
		NEXT0: 
		P2=0xFF;
		AT24C64_W(&high,0x0,1);wait_1s;
		AT24C64_W(&low,0x1,1);wait_1s;
		Ten_to_String(low,TL);
    	Ten_to_String(high,TH);
    	DisplayListChar(3,1,TL);
		DisplayListChar(10,1,TH);
		DisplayOneChar(5,0,m+0x30); 
		Delay_N_mS(2500);

     }  
}

//**主程序**//
void main(void)
{   
	delay(500);
	InitLcd();
	AT24C64_R(&low,0x1,1);wait_1s;
	AT24C64_R(&high,0x0,1);wait_1s;
	Ten_to_String(low,TL);
    Ten_to_String(high,TH);
	
	DisplayOneChar(5,0,0x31);
	DisplayListChar(0,0,str0);
	DisplayListChar(6,0,str1);
	DisplayListChar(0,1,str2);
	DisplayListChar(7,1,str3);
	DisplayListChar(3,1,TL);
	DisplayListChar(10,1,TH);
	
	do
	{	
		showtempt();  
		keyboard();
	}	
	while(1);
}
	

⌨️ 快捷键说明

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