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

📄 温测b.c

📁 基于80c51的温度采集测量系统
💻 C
字号:
#include "reg51.h"
#include "intrins.h"
#define uchar unsigned char
#define uint  unsigned int
unsigned char discode[]={0xc0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xff,0xbf,0xc6,0x89,0x9e};
unsigned char discode1[]={0x40,0x79,0x24,0x30,0x19,012,0x02,0x78,0x00,0x10};
unsigned char displaybuf[]={0,0,0,0,0};
unsigned char readdata[2]={0};
unsigned char k,timecount,n=0,count=0,second=0,minite=0,hour=1;
uint addr=0x00,addup,result,judgecount=0;
bit a=0;tmr1=0,d=0,dealen=0,sflag,b,judge=0,judgechange=0;
unsigned char i=0;
sbit DQ=P0^0;
sbit sda=P3^7;      
sbit scl=P3^6; 
sbit P05=P0^5;
//MCU初始化部分*************
void MCU_init();
//DS820************************
void DS1820_delay(unsigned int x);
void  writecommandtods18b20( uchar command );
uchar readdatafromds18b20();
void  resetpulse();
//IIC部分***************
void IIC_delay(uchar x);
void flash();
void x24c02_init();
void start(); 
void stop();
void writex(uchar j);
uchar readx();
void clock();
uchar x24c02_read(uchar address);
void x24c02_write(uchar address,uchar info);
void delay10ms(void);
//键盘处理函数
void keytr0_deal(uchar x)
{
  while((P3&0x3f)!=0x3f);
  switch(x)
  {
  case 0x3e: judgechange=1;b=1;displaybuf[0]=12;break;
  case 0x3d: judgechange=0;displaybuf[0]=13;break;
  case 0x3b: {
              if(judgechange)
			  {
              x24c02_write(2*addr,readdata[0]);
              x24c02_write(2*addr+1,readdata[1]);
			  addr++;addup=addr;
			  }
		  	  break;
			  }
  case 0x37:{ judgechange=0;
              if(addr==0) break;
              if(addup==addr)
              {if(addr>10)   displaybuf[0]=10;
	            else displaybuf[0]=addr;
               k=displaybuf[0];}
              if((addr-addup)<k)
              {
			  addup--;
              readdata[1]=x24c02_read(2*addup+1);
	          readdata[0]=x24c02_read(2*addup);
              
	          dealen=1;
	          displaybuf[0]--;
              }
	      break;
	    }
  case 0x2f:{
              judgechange=0;
              if(addr==0) break;
              if(addup==(addr-1)) {break;}
              if(addup<addr-1)
		{
                addup++;
		displaybuf[0]++;
                readdata[0]=x24c02_read(2*addup);
		readdata[1]=x24c02_read(2*addup+1);
		dealen=1;
		}
		break;
	     }
  case  0x1f: tmr1=1;judgechange=1;b=1;judgecount=0;addr=0;displaybuf[0]=14;break;
  default:  break;
  }
}
void change_deal(void)
{
  if(judgechange&&(!b))
  {
   timecount++;
   if(timecount==50)
    {
      b=1;
	  timecount=0;
      resetpulse();  
      writecommandtods18b20(0xcc);
      writecommandtods18b20(0xbe);
      readdata[0]=readdatafromds18b20();
	  readdata[1]=readdatafromds18b20();
      dealen=1;
  }
  }
  if(dealen==1) 
  {
  sflag=1;
      if((readdata[1] & 0xf8)!=0x00)
        {
          sflag=0;
          readdata[1]=~readdata[1];
          readdata[0]=~readdata[0];
          result=readdata[0]+1;
          readdata[0]=result;
          if(result>255)
            {
              readdata[1]+=1;
            }
        }
		if(sflag) displaybuf[1]=10;
		else  displaybuf[1]=11;	
    result=((readdata[1]*256+readdata[0])*0.0625)*10;
	dealen=0;
	}     
  displaybuf[2]=result/100;
  displaybuf[3]=result/10%10;
  displaybuf[4]=result%10;
}
void keytr1_deal(uchar x)
{
  while((P3&0x3f)!=0x3f);
  switch(x)
   {
   case 0x3d: judgechange=0;displaybuf[0]=13;tmr1=0;break;
   default: break;
   }
}
void display(void)
{
  P1=(0x08<<n);
  P2=discode[displaybuf[n]];
  n++;
  if(n==6) n=0;	
}

void main(void)
{
  MCU_init();
  x24c02_init();
  while(1)
  {
  if(tmr1) {TR0=0;TR1=1;}
    else {TR0=1;TR1=0;}
  if(judgechange&&b) 
  {
    resetpulse();
    writecommandtods18b20(0xcc);
    writecommandtods18b20(0x44);
	b=0;
  }	
  }  
}  
void t0(void) interrupt 1
{
  TH0=(65536-4000)/256;
  TL0=(65536-4000)%256;
  display();
  if((P3&0x3f)!=0x3f)    judgecount++;
  if((judgecount==25))  
  {
   judgecount=0;
   keytr0_deal(P3&0x3f);
  }
  change_deal();
  }
  void t1(void) interrupt 3
  {
  TH1=(65536-4000)/256;
  TL1=(65536-4000)%256;
  display();
  count++;
  if(count==250) /*{second++;count=0;}
  if(second==1) {minite++;second=0;}
  if(minite==1) {hour++;minite=0;}
  if(hour==1)*/
             { x24c02_write(2*addr,readdata[0]);
              x24c02_write(2*addr+1,readdata[1]);
			  addr++;addup=addr;
			  hour=0;
			  }
  if((P3&0x3f)!=0x3f) judgecount++;
  if((judgecount==25))  
  {
   judgecount=0;   
   keytr1_deal(P3&0x3f);
   }
   change_deal();
  }
//////////////////////////////////////////////////////////////////////////////////////////////////////
void DS1820_delay( unsigned int x )
{
     while( x-- );
}
void writecommandtods18b20( uchar command )
{
    uchar a;
    for( a=8; a>0; a-- )
    {
        DQ = 0;
       _nop_();            // dalay 5us;
       _nop_();
        _nop_();
        DQ = command&0x01;
		DS1820_delay(5);                   //dalay 60us;
        command >>= 1;
        DQ = 1;
       _nop_();            // dalay 5us;
      _nop_();
       _nop_();
    }
}
uchar readdatafromds18b20()
{
    uchar i;
    uchar da;
    for( i=8; i>0; i-- )
    {
        DQ = 0;
        _nop_();  
        da >>= 1;                  //delay 1us;
        DQ = 1;
        if (DQ)
            da |= 0x80;
        DS1820_delay(4);                       // dalay 50us;
       _nop_();            // dalay 5us;
       _nop_();
}
    return da;
}
void resetpulse()
{
loop:
    DQ = 1;
   _nop_();            // dalay 5us;
    _nop_();
   _nop_();
    _nop_();
    _nop_();
    DQ = 0;
    DS1820_delay(80);                   //delay >480us;
    DQ = 1;
    DS1820_delay(10);                    //delay = 100us;
    if( DQ )
       goto loop;
    DS1820_delay(20);
    DQ = 1;
    _nop_();            // dalay 5us;
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}
void IIC_delay(uchar x)
{  
	uint i;
	for(i=0;i<x;i++);
}

void flash()
{  ;  ; }
void x24c02_init()  //24c02初始化子程序
{
	scl=1; 
	flash(); 
	sda=1; 
	flash();
}
void start()        //启动I2C总线
{
	sda=1; 
	flash(); 
	scl=1; 
	flash(); 
	sda=0; 
	flash(); 
	scl=0; 
	flash();
}
void stop()         //停止I2C总线
{
	sda=0; 
	flash(); 
	scl=1; 
	flash(); 
	sda=1; 
	flash();
}
void writex(uchar j)  //写一个字节
{  
	uchar i,temp;
    temp=j;
    for (i=0;i<8;i++)
		{
			temp=temp<<1; 
			scl=0; 
			flash(); 
			sda=CY; 
			flash(); 
			scl=1; 
			flash();
		}

	scl=0; 
	flash(); 
	sda=1; 
	flash();
}
uchar readx()   //读一个字节
{
	uchar i,j,k=0;
	scl=0; 
	flash(); 
	sda=1;
    for (i=0;i<8;i++)
		{  
			flash(); 
			scl=1; 
			flash();
			if (sda==1) j=1;
			else j=0;
			k=(k<<1)|j;
			scl=0;
		}
	flash(); 
	return(k);
}
void clock()         //I2C总线时钟
{
	uchar i=0;
	scl=1; 
	flash();
	while ((sda==1)&&(i<255))i++;
	scl=0; 
	flash();
}

////////从24c02的地址address中读取一个字节数据/////

uchar x24c02_read(uchar address)
{
	uchar i;
	start(); 
	writex(0xa0);
	clock(); 
	writex(address);
	clock(); 
	start();
	writex(0xa1); 
	clock();
	i=readx(); 
	stop();
	IIC_delay(10);
	return(i);
}

//////向24c02的address地址中写入一字节数据info/////

void x24c02_write(uchar address,uchar info)
{
	EA=0;
	start(); 
	writex(0xa0);
	clock(); 
	writex(address);
	clock(); 
	writex(info);
	clock(); 
	stop(); 
	EA=1;
	IIC_delay(100);
}
void MCU_init()
{ 
  TMOD=0x11;
  TH0=(65536-4000)/256;
  TL0=(65536-4000)%256;
  ET0=1;
  TH1=(65536-4000)/256;
  TL1=(65536-4000)%256;
  ET1=1;
  TR1=0;
  EA=1;
  TR0=1;
}  

⌨️ 快捷键说明

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