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

📄 max197.c

📁 实现用C51单片机完成对A/D转换芯片MAX197的控制
💻 C
字号:
 /*while(1)
{delay(1000)
  temp=_crol_(temp,1);		//循环左移函数 ,包含在intrins文件中。
  P1=temp;
}*/
#include<reg52.h>		//<>表示先找库的,再找工程文件夹的;“”先找工程文件夹的,再找库的;
#include<absacc.h>
#include<1602LCD.h>
#include<intrins.h>
#define  uchar unsigned  char 
#define  uint  unsigned  int 
#define  ulong unsigned long

#define  addata  P0
uchar   m,t0,t1,flag,flag1,flag2,ADH,ADL,ADH0,ADL0;
int     u;
ulong   sum;

uchar  code  wel[]={"-temperature?--"};//液晶显示字符
uchar  code  pt[]={"----Pt100?----"};
uchar  code  K[]={"----K?----"};
uchar  code  LM35[]={"----LM35----"};

uchar code num[]={"0123456789"};
uchar data ad_data[2]={0x00,0x00}; //用于存储AD转换后的数据
ulong data temperature[]={0x00,0x00,0x00};
uint  data dis[]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};	              //要显示的数
sbit P14=P1^4;
sbit P15=P1^5;
sbit P13=P1^3;
sbit  OE=P2^6;


//控制MAX197转换的端口 ,送模拟信号输入端口地址,启动转换
sbit    MAX197_CS=P1^6;
sbit    HBEN=P1^7;           
sbit    wr=P3^6;
sbit    rd=P3^7;

//控制热电偶数据输入端口
sbit   SO=P1^0;          //串行数据输出端
sbit   CS=P1^1;	           //片选信号,低电平串行接口有效
sbit   SCK=P1^2;         //串行时钟输入端 

void display(uint m);
//void delay1(uint c);//delay1()函数声明
void delay(uint z);	//delay()函数声明
void  admax197();
void  K_read();
void  init();
void  display3();
void  display2();
void  display1();
void  main() 
{  
   init();
   while(1)
	   {	      		
		 if(P14&&P15!=0)	 //LM35
		 {
		  
		  	admax197();
			display1();
    	 }
		 	 
		 if (P14==0)		 //PT100
		 {
		 	delay(10);
				if(P14==0)
				 {
				  while(flag!=1) 
				  {
				  		 admax197();
				 		 display2();
				   }	
				}
		  }
	   	 if (P15==0)			  //K
		 {
		  	delay(10);
				if(P15==0)
				{
				  K_read();
				  display3();
				}
		   
			
}	   
}
}


void init()		 //初始化
{
	P0=0xff;
	P1=0xff;
	P2=0x00;
	P3=0xff; 

	 delay(255); //启动等待,等LCM进入工作状态
	 LCMInit(); //LCM初始化
	 delay(5); //延时片刻(可不要)
	 ReadDataLCM(); //测试用句无意义 
	 DisplayListChar(0,0,wel);	  //0列0行开始显示

	TMOD=0x01;
//	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
//	TH1=(65536-50000)/256;
	TL1=(65536-50000)%256;
	EA=1;
	ET0=1; 
//	ET1=1;
	TR0=1;
//	TR1=1;
}

void delay(uint z)              //延时子程序,z=1时延时1ms
{
	uint x,y;
	for(x=z;x>0;x--)
	   for(y=110;y>0;y--);
}

void  admax197()		  	 // AD转换使用通道0 ----LM35;
{	 
       
	 P0=0x50;
	 MAX197_CS=0;
	 _nop_();
	 wr=0;
	 _nop_();
	 wr=1;
	 _nop_();
	 _nop_();
	 while(INT0==1);
	 HBEN=0;
	 rd=0;
	 ad_data[0]=addata ;
      HBEN=1;
	 ad_data[1]=addata&0x0f;
	sum=ad_data[1]*256+ad_data[0];
	 rd=1;	  
}



 
void timer0() interrupt 1  //定时器0溢出中断50ms定时
{
	
	TH0=(65536-50000)/256;
	TL0=(65536-50000)%256;
	t0++;
	if(t0==1000)				//定时50s
	{
	 	t0=0;
		flag=1;
	}
}

//void timer1() interrupt 3
//{TH1=(65536-50000)/256;
  // TL1=(65536-50000)%256;
  // t1++;
//		if(t1==2000)		//定时100s
//	{
//	 	t1=0;
//		flag1=1;
//	}			
//}


void display1()
{
	 
	 uint i;
	 uchar x;
	temperature[0]=10000*sum/4095;
	DisplayListChar(0,0,LM35);	  //0列0行开始显示
	
	dis[0]=temperature[0]/1000;
    dis[4]=temperature[0]%1000;
    dis[1]=dis[4]/100;
    
	
	dis[4]=dis[4]%100;
    dis[2]=dis[4]/10;
    dis[3]=dis[4]%10;

		x=10;
 		
		for(i=3,x=10;i>=0;i--)
 			{
			   if(x==8) 
				  {
					DisplayOneChar(x,1,'.');x--;
				   }
 			   DisplayOneChar(x, 1, num[dis[i]]);
 	           x--;
			}
}

void display2()
{
	 uint i;
	 uchar x;
	 temperature[1]=sum;		//要改的
	 DisplayListChar(0,0,pt);	    //0列0行开始显示

	dis[0]=temperature[1]/51;
    dis[4]=temperature[1]%51;
    dis[4]=dis[4]*10;
    dis[1]=dis[4]/51;
    dis[4]=dis[4]%51;
    dis[4]=dis[4]*10;
    dis[2]=dis[4]/51;	
   
  	x=10;
 		
		for(i=2,x=10;i>=0;i--)
 			{
			   if(x==8) 
				  {
					DisplayOneChar(x,1,'.');x--;
				   }
 			   DisplayOneChar(x, 1, num[dis[i]]);
 	           x--;
			}
}

 void display3()
  {
	 uint i;
	 uchar x;
	temperature[0]=100*1023.75*u/4095;         //要改的
	
	dis[0]=temperature[0]/100000;
    dis[7]=temperature[0]%100000;
    dis[1]=dis[7]/10000;
    dis[7]=dis[7]%10000;
    dis[2]=dis[7]/1000;
    dis[7]=dis[7]%1000;
    dis[3]=dis[7]/100;
	dis[7]=dis[7]%100;
	dis[4]=dis[7]/10;
	dis[5]=dis[7]%10;
	 x=10;
	for(i=5,x=10;i>=0;i--)
 			{
			   if(x==8) 
				  {
					DisplayOneChar(x,1,'.');x--;
				   }
 			   DisplayOneChar(x, 1, num[dis[i]]);
 	           x--;
			}
}

/*…………热电偶信号处理…………*/

void K_read(void)
{
	unsigned char i,j;

	ADH=ADL=0;
	SCK=0;
	CS=0;

	SCK=1;
	CS=0;
	SCK=0;               /*输出数据D15*/
	SCK=1;

	for(i=4;i>0;i--)           /*读取转换结果高4位*/
	{
		SCK=0;
		ADH0=SO;
	
		if(ADH0==1)
			{ADH=ADH<<1;
			 ADH=ADH||0x01;
			 }
		else
		ADH=ADH<<1;	           /*数据位左移*/
		SCK=1;
	
	}
	 
	for(j=8;j>0;j++)     
	                           /*读取转换结果低8位*/
	{
		SCK=0;
		ADL0=SO;

		 if(ADL0==1)
			{ADL=ADL<<1;
			 ADL=ADL||0x01;
			 }
		else
		ADL=ADL<<1;   /*数据左移*/
		SCK=1;
	}
	SCK=0;
	flag2=SO;  		/*读取D2断偶标志*/
	SCK=1;
	SCK=0;	 	 /*输出数据D0*/
	CS=1;
	delay(10);
	 u=ADH*256+ADL;
}
    

//			 温度值= 1 023.75 ×转换后的数字量/ 4 095

	










⌨️ 快捷键说明

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