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

📄 bdz.c

📁 该系统是一个温度测控系统,传感器采用tlc549,内付有proteus的仿真图形,可以模拟外围电路,程序采用c,开发环境是keil c.
💻 C
字号:
#include "reg52.h"
#include "math.h"
#include "intrins.h"
#define byte unsigned char
#define uint unsigned int
#define WRITE 0xA0   //写地址
#define READ 0xA1    //读地址
#define OV_TIM 250
#define HI 0xf8
#define LO 0x2f  //12m 1ms  6m 2ms   //扫描速度降低一倍
#define TRUE 1
#define FALSE 0
sbit DAS=P2^0;
sbit CLS=P2^1;
#define tem_xiax_addr 10   //iic中的地址
#define tem_shax_addr 20
#define time_addr 30

sbit time_led=P2^2;
sbit mod_led=P2^3;
sbit daiji_led=P2^4;
sbit com0=P2^5;
sbit com1=P2^6;
sbit com2=P2^7;
sbit JDQ=P0^7;
sbit SET=P3^4;
sbit ADD=P3^5;
sbit SUB=P3^6;
sbit MOD=P3^7;   

sbit FMQ=P1^7;

sbit CLK=P0^0; //ad
sbit DA=P0^1;
sbit CS=P0^2;

#define duan P1
#define tem_lc_xiax 50
#define tem_lc_shax 230
 byte caij,count,caij;
	 uint k=60000,j=10000,xiax_linshi;
    uint tem_shax,tem_xiax;	 
byte iic[2],t2=0,t1=0,t0=0,cai_flag=0,tem_now,n,cai_N;  
bit flag=0; 
code byte smg[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xA7,0xA1,0x86,0x8E};

/*================================24C02部分===============================================================*/
/*----------------------------------------------------------------------
IIC启动信号
----------------------------------------------------------------------*/ 
   void  I_start(void)
 {
		DAS=1;
		CLS=1;
		DAS=0;
		CLS=0;
}
/*---------------------------------------------------------------------------
IIC停止信号
----------------------------------------------------------------------------*/
void I_stop(void)
{
	CLS=0;
	DAS=0;
	CLS=1;
	DAS=1;
	CLS=0;  
}
void  I_init(void)
{
	CLS=0;
	I_stop();
}
/*-------------------------------------------------------------------------
IIC时钟信号   
函数返回一个IIC数据线上的值
--------------------------------------------------------------------------*/
bit I_clock(void)  //发送的数据咱存在sample中
{
	bit sample;
	CLS=1;
	sample=DAS;
	CLS=0;
	return(sample);
}
/*---------------------------------------------------------------------------
向IIC器件发送一个字节数据  参数:I_data
返回应答位信号,为1表示发送成功,为0表示发送失败
-----------------------------------------------------------------------------*/
bit  I_send(byte I_data)
{
	register byte i;
	for(i=0;i<8;i++)
	{
		if(I_data&0x80)
   		       	 DAS=1;
   		       	else DAS=0;
   		       	I_data=I_data<<1;
   		       	I_clock();
	 }
	 DAS=1;
	 return(~I_clock());   //返回应答信号,为1表示发送成功,为0表示发送失败
}
/*-----------------------------------------------------------------------------
接受一个IIC器件发送过来的字节数据,参数无
返回  字节数据
--------------------------------------------------------------------------------*/
byte  I_receive(void)
{
   	byte I_data=0;
   	register byte i;
   	for(i=0;i< 8;i++)
   	       {
   	       	I_data=I_data*2;
   	       	_nop_();
   	       	if(I_clock())
   	           I_data=I_data+1;
   	       	   _nop_();
   	       	   _nop_();
   	       	   _nop_();
   	       }
   	      return(I_data);
}
/*-----------------------------------------------------------------------------
接受IIC器件数据后的应答信号   参数无,返回无
--------------------------------------------------------------------------------*/
void  I_Ack(void)
   	{
   		DAS=0;
   		I_clock();
   		DAS=1;
   	} 
/*----------------------------------------------------------------------------
调用函数:  I_start  无参数,无返回值  I_send :函数原形 
bit function I_send(byte I_data) 返回0,1   
参数:Address   要写入的IIC器件单元地址   返回:1,0
功能:写入器件地址和器件单元地址,等待想IIC器件发送数据
----------------------------------------------------------------------------*/
bit  E_address(byte Address)
{
   	I_start();
   	if(I_send(WRITE))    //发送写地址
   	   return (I_send(Address));  //写入器件控制单元地址
   	   else 
   	     return(FALSE);
}

/*---------------------------------------------------------------------------
从IIC器件读数据块  存入EAROMImage[]中
参数:t   为数据块的首地址
返回:  位数据   为1表示成功,0表示失败
--------------------------------------------------------------------------*/ 
bit E_read_block(byte t,byte block_size,byte *EAROMImage)   //t起始地址
{   
   	 	register byte i;  
   	 	byte j;
   	 	j=0;
   	 	i=t+block_size;
   	 	
   	 	if(E_address(t))   //发送器件地址
   	 	{
   	 		I_start();
   	 		if(I_send(READ))   //
   	 		{
   	 		    for(;t<=i; t++)
   	 			{
   	 		        EAROMImage[j++]= (I_receive());
   	 				if(t!=i)
   	 				I_Ack();
   	 				else
   	 				{   I_clock();
   	 				    I_stop();
   	 			    }
   	 	        }
    	        return(TRUE);
            }
            else
            {
    	       I_stop();
	           return(FALSE);
            }
        }
        else
        {
           I_stop();
           return(FALSE);
        }
}

/*---------------------------------------------------------------------
  延时程序
----------------------------------------------------------------------*/
void  wait_5ms(void)
  {
	register uint i;
	for(i=0;i<1000;i++)
	 _nop_();
   }
/*----------------------------------------------------------------------------
功能将EAROMImage[]数组写入IIC器件
参数:   i    器件首地址
返回:   0,1
-----------------------------------------------------------------------------*/
bit E_write_block(byte i,byte block_size,byte *EAROMImage)   //i起始地址
{       register byte t;
        byte j;
        j=0;
        t=i+block_size;
	
	    for(;i<=t; i++)
	    {
		   if(E_address(i)&&I_send(EAROMImage[j++]))
		   {
			   I_stop();
			   wait_5ms();
		   }
	       else
	       return(FALSE);
        }
        return(TRUE);
}

 
/*---------------------------------------------------------------------------
延时  
参数:  t    返回:无
-------------------------------------------------------------------------*/
void delay(uint t)
{
    uint i,j;
    for(i=0; i<t;i++)
    for(j=0;j<10;j++);
}

/*---------------------------------------------------------------------------
功能:  将参数save里的值写入  以t为首地址的IIC器件
参数:  t  首地址   save 要保存的变量
返回:  无
---------------------------------------------------------------------------*/
write(unsigned char t,unsigned int save,byte *Imagew)
{   
	//	XBF=0;
        Imagew[0] = save/256;   //高位
     
        Imagew[1] = save-(save/256)*256;   //低位
        if( E_write_block(t,1,Imagew))
        _nop_();
      //  XBF=1;     //写保护
}

/*---------------------------------------------------------------------------
功能: 将24C02中的存放的数据转化成十进制,存入save中,
参数:  g   表示IIC器件中的首地址
返回:  uint 数据
-----------------------------------------------------------------------------*/
unsigned  int read(unsigned char g,byte *Imager)
{
	unsigned int save=0;
   // XBF=0;
    if(E_read_block(g,1,Imager))
    {  
		uint i = Imager[0],t=Imager[1];
        save = ((i * 256) +t); 
       // XBF=1;    //写保护
    }   
	return(save);
}
/*========================================================================================================*/
void js(int sav)   //计算
{	
      t2=sav/100;	
   	  t1=(sav%100)/10;
  	  t0=sav%10;
}
/*---------------------------------------------
功能:  修改数据  10进制
参数: min  下限   max  上限    save  初始值
返回: save  最终值
注意: 按键没有q0,q1,q2区别,while 循环中wg=0;
-----------------------------------------------*/
int jiajian(int min,int max,int savx)    //加减,上限,下限
{   
	 bit i=1;
 	 int j=0,x=0;
 	 js(savx);
     delay(1500);
     while(i)
     {  
          if((SUB==1)&&(ADD==1))   //没有键按下时,X一直记数
          { j=0;x=x+1;
		  }
          else {j=j+1;x=0;}       //有键按下时,J一直记数
	      if(ADD==0)
	      {
	 	     delay(100);
	         if(ADD==0)   //有加按下
	         {   if(j<15)  
	             savx=savx+1;    
	             if((j>=15)&&(j<30))
	             savx=savx+10;
	             if(j>=30)
	             savx=savx+100;
             }
          }
          if(SUB==0)
          {
              delay(100);  //有减按下
              if(SUB==0)
              {
    	           if(j<15)
    	           savx=savx-1;
    	           if((j>=15)&&(j<30))
    	           savx=savx-10;
    	           if(j>=30)
    	           savx=savx-100;
              }
          }
          if(savx>max)    //如果数值大于上限,不再加
          savx=max;
          if(savx<min)    //如果数值小于下限,不再减
          savx=min;
          js(savx);       
          if(SET==0)     
          {
              delay(100);
              if(SET==0) 	
               i=0;      //退出循环
          }  
          if(x>=25)
          {i=0; savx=OV_TIM;}  //一定时间内没有键按下,退出循环,返回OV_TIM
          delay(1200);	
      }
      return(savx);
}

/*---------------------------------------------------
功能:  将三位数码管对应的值读出后,修改,再写入
参数: 1  24C02器件地址,   min  下限   max  上限   vidao  自定义字符
返回: int型  修改后的值 
-------------------------------------------------------*/
int shd_3(int addrss,int min,int max)
{ 	int save=0,sav=0;
 	save=read(addrss,iic);
    js(save);
    delay(800);
    sav=jiajian(min,max,save);
	if(sav!=OV_TIM)
	{
		write(addrss,sav,iic);
	}
    return(sav);
}
byte caiji(void)
{
	byte cai=0,i;
	CS=1; _nop_();_nop_();
	CS=0;
	for(i=0;i<=7;i++)
	{	
		cai=cai<<1;
		CLK=0;
		_nop_();_nop_();CLK=1;
		cai|=(DA&0x01);
	}
	CS=1;
	return(cai);

}
byte zh(byte ca)
{
	byte tem_n;
	tem_n=(230-50)*ca/256+50;
  	return(tem_n);
}
void stin(void)
{		uint time;
	  	//uint time,tem_shax,tem_xiax;	 
      	tem_xiax=read(tem_xiax_addr,iic);     
        tem_shax=read(tem_shax_addr,iic);
		if((tem_xiax>230)||(tem_xiax<50))
		{
			tem_xiax=50;
		}
		if((tem_shax>230)||(tem_xiax<50)||(tem_shax<tem_xiax))
		{
			tem_shax=230;
		}
		time=read(time_addr,iic);
		if((time>999)||(time<0))
		{
			time=0;
		}
		JDQ=1;
		FMQ=1;
}
/*============================中断与主程序部分==============================================================*/
void T1_int() interrupt 3 using 3
{
	TH1=HI;
	TL1=LO;
   if(cai_N>=150)
	{
	    TH0=0;
		TL0=0;
		cai_N=0;
		cai_flag=1;
	}
	else
	cai_N++; 

    if((n>=1)&&(n<=3))
	switch(n)
	{
		case 1:
		duan|=0x7f;
		_nop_();_nop_();_nop_();_nop_();
		com0=0;com1=1;com2=1; //high
		duan=smg[t2];
	    _nop_();_nop_();_nop_();_nop_();
		break;
		case 2:
	    duan|=0x7f;
		_nop_();_nop_();_nop_();_nop_();
		com0=1;com1=0;com2=1; //high
		duan=smg[t1];
	    _nop_();_nop_();_nop_();_nop_();
		break;
		case 3:
		duan|=0x7f;
		_nop_();_nop_();_nop_();_nop_();
		com0=1;com1=1;com2=0; //high
		duan=smg[t0];
	    _nop_();_nop_();_nop_();_nop_();
		break;
	}
	n++;
	if(n>=4) n=1;
}
void init_t01(void)
{
	P0=0xff;P1=0xff;P2=0xff;P3=0xff;
	TH1 = HI;
  	TL1 = LO;
  	TH0=0;		   //| EA | |--| |--| | ES | | ET1 | |EX0| |ET0| |EX0|
  	TL0=0;                 // 1              0      1       0     0    0
  	TMOD = 0x11;     //| GATE | C/T | M1 | M2| GATE | C/T| M1| M2 |
  	IE=0x88;          //   0     0     0    1    0     1    0    1
    TR0=1;				//T1工作在定时器方式,T0工作在定时器方式
  	TR1=1;
}
main()
{
	
     I_init();   //IIC处处市
  	 init_t01();  //定时器,计数器初始化
  	 stin();     //读出2402中存储的数据
	
     while(1)
     {	
    	if(MOD==0)    
    	{ 	delay(200);        //2     
    	   	if(MOD==0)    //
    		{     //  mod_flag=1;         
            	    count++;
					if(count==1)
					{
						mod_led=0;
						xiax_linshi=shd_3(tem_xiax_addr,50,230);
						if(xiax_linshi!=OV_TIM)
						tem_xiax=xiax_linshi;
						mod_led=1;
					}
					if(count==2)
					{
						mod_led=0;
						if(xiax_linshi==OV_TIM)
						shd_3(tem_shax_addr,(tem_xiax+1),230);
						else
						shd_3(tem_shax_addr,(xiax_linshi+1),230);
						mod_led=1;
					}
					if(count==3)
					{
						mod_led=0;
						shd_3(time_addr,0,999);
						mod_led=1;
					}
					if(count==4)
					{
						mod_led=0;
						js(0);
						delay(20000);
						j=10000;
						count=0;
						JDQ=1;   //断开
						mod_led=1;
					}
			}
		}
	
		caij=caiji();
		tem_now=zh(caij);
		if((tem_now>230)&&(tem_now<50))
		{
			tem_now=0;
		}
    	js(tem_now);	   	
       	
		if(flag==1)
		{	JDQ=0;
			if(tem_now>=tem_shax)
			{	JDQ=1;
				FMQ=0; 
				cai_N=0;
				cai_flag=0;
				if(cai_flag==1)
				{FMQ=1;cai_flag=0;flag=0;}
			}
		}
		else
		{	JDQ=0;
			if(tem_now>=tem_shax)
			{	JDQ=1;
				FMQ=0; 
				cai_N=0;
				cai_flag=0;
				if(cai_flag==1)
				{FMQ=1;cai_flag=0;}
			}
		}		

		if(tem_now<tem_shax)
		{
			if((SET==0))
			{
				delay(200);
				if(SET==0)
				{	
					flag=1;
				}
			}
			else
			{
				flag=0;
		    }
	   }
	}
		
}  
     
/*=========================================================================================================*/

⌨️ 快捷键说明

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