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

📄 com.c

📁 1820显示温度(LED(595))C语言版 通过串口设定温度和读取当前温度
💻 C
字号:
#include<reg51.h>
#include <intrins.h>

#define  uint  unsigned int
#define uchar unsigned char
/*端口定义*/
#define LED P0					/*实际温度值输出端口定义*/

#define NOP _nop_()

 uint temp=40;
 uint t1=41;

sbit CLK=P0^7;
sbit DAT=P0^4;
sbit DCLK=P0^6;

sbit key=P1^0;

uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xff};//0-9,-,全灭
sbit  tem_in=P2^6;				/*温度读取端口*/
sbit  heat1=P2^0;                                //加热控制端口1

uchar temp_h,temp_l;			/*温度值变量*/
uchar flag1;					/*正负标志位*/
uchar temper,temper_set;

void initcom(void);
void send_char(unsigned char txd);
void tmpchange(void);
void sendbyte(uchar byte);
void delay2(uint  j);//延时
void display(uchar number);
 void delays(uint n);

//串口初始化
void initcom(void)
{
	TMOD = 0x20;			// 定时器1工作于8位自动重载模式, 用于产生波特率
	TH1 = 0x0F3;				// 波特率2400
	TL1 = 0x0F3;


	SCON = 0x50;			// 设定串行口工作方式 
	PCON=0; //波特率不翻倍 
//PCON &= 0xef;			// 波特率不倍增

        ES=1;      //允许串行口中断
	TR1 = 1;				// 启动定时器1
	IE|= 0x90;				// enable serial interrupt,禁止other中断
//		IE= 0x9F;				// enable serial interrupt,禁止other中断
//	IE = 0x00;				// 禁止任何中断
    EA=1; //开总中断
//	 IT0=1;
//	 EX0=1;
}


void send_char(unsigned char txd)
// 传送一个字符
{
	SBUF = txd;
	while(!TI);				// 等特数据传送
	TI = 0;					// 清除数据传送标志
}


 //======595显示程序===============================================
void sendbyte(uchar byte)
{
        uchar num,i;
        num=tab[byte];

   for(i=0;i<8;i++)
        {
         CLK=0;
         DAT=num&0x80;
         num=num<<1;

         CLK=1;
         }

}


void delay2(uint  j)//延时
{ uchar m;
for(;j>0;j--)
{
for(m=0;m<=250;m++)
 {;}
}
}

void display(uchar number)
{
 uchar sw,gw;
 DCLK=0;
 sw=number/10;
 gw=number-10*sw;

 sendbyte(sw);
 sendbyte(gw);
  DCLK=0;
  delay2(150);
 //out595();
 DCLK=1;
}
//=====================================================================
 /**********************************延时1S整*******************************/
 void delays(uint n)
{
  unsigned char i,j,k,l;
  for(l=n;l>0;l--)

  for(k=100;k>0;k--)

  for(i=20;i>0;i--)

  for(j=248;j>0;j--);

}


//************************************
/*====================================
函数功能:延时 
入口参数:
 说  明 :送1迟202us
=====================================*/

void delay(unsigned int count)
{
	unsigned int i;
	while(count)
	{
		i=200;
		while(i>0)i--;
		count--;
	}
}

/*====================================
函数功能:延时 us
入口参数:
 说  明 :
=====================================*/

void Delay_us(uchar n)
{
	uchar i;
	i=0;
	while(i<n)
	{i++;}
	return;
}

/*====================================
函数功能:DS18B20重设
入口参数:无
 说  明 :
=====================================*/

void dsreset(void)
{
	unsigned int i;
	tem_in=0;
	i=103;
	while(i>0)i--;
	tem_in=1;
	i=4;
	while(i>0)i--;
}

/*====================================
函数功能:直接读一字节程序
入口参数:无
 说  明 :返回结果
=====================================*/

uchar ReadByte(void){
	uchar i,k;
	i=8;
	k=0;
	while(i--)
	{
		tem_in=1;
		Delay_us(1);
		tem_in=0;
		k=k>>1;
		tem_in=1;
		NOP;
		if(tem_in)k |= 0x80;
		Delay_us(4);
	}
	return(k);
}

/*====================================
函数功能:向B20写一字节
入口参数:待写数据
 说  明 :
=====================================*/

void tmpwrite(unsigned char dat)
{	unsigned int i;
	unsigned char j;
	bit testb;
	for(j=1;j<=8;j++)
	{	testb=dat&0x01;
		dat=dat>>1;
		if(testb)
		{	tem_in=0;i++;i++;
			tem_in=1;
			i=8;while(i>0)i--;
		}
		else
		{
			tem_in=0;
			i=8;while(i>0)i--;
			tem_in=1;i++;i++;
		}
	}
}

//////////////////////////////////////////////////////////////
void tmpchange(void)
{
	dsreset();						/*复位*/
	delay(1);
	tmpwrite(0xcc);					//跳过序列号命令
       // delay(200);
	tmpwrite(0x44);					//转换命令
}

/*====================================
函数功能:将温度值读出来并转化为显示数组
入口参数:
 说  明 :调用 ReadByte();
=====================================*/

void tmp(void)
{
	float dis;
//	uchar tempbuf;
	dsreset();
	delay(1);
	tmpwrite(0xcc);
	tmpwrite(0xbe);
	temp_l=ReadByte();				//低位在前
	temp_h=ReadByte();				//高位在后

	flag1=temp_h&0xf8;
	if(flag1)
	{
		temp_h=~temp_h;
		if(temp_l==0)temp_h++;		//若低8位全为0且温度为负,取补时就要向高位进1
		temp_l=~temp_l+1;
	}
	dis=(temp_h*256+temp_l)/16;

	//dis=25.34;						//调试用
        // dis=2;
         temper=(uchar)dis;


}

//================================================
//================温度控制开始========
void system_heat(uint temperature)
{

 if(temper<=temperature)
          {
		  heat1=0;
          tmpchange();					//启动温度转换/
	  delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
	tmp();							//温度显示和报警/
          display(temper);
          }
        else if(temper>temperature)
        {
		heat1=1;
        tmpchange();					//启动温度转换/
	  delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
	tmp();							//温度显示和报警/
          display(temper);
		  }	
 
}
//--------------串口接收从电脑发来的数据------------------//
void chuankou() interrupt 4 using 1//串口接收数据,中断方式
{
if(RI!=0)
{
    RI=0;
   // receive=SBUF;
    ES=0; 
   temp=SBUF;


   
   if(temp==0x0e)
   {
  //   tmpchange();					//启动温度转换/
  //              delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
//	tmp();							//读取温度转换结果/

  //      display(temper);
//		 send_char(temper);
// 		 system_heat(t1);
t1=30;send_char(temp);
   }
	  else{ t1=temp;send_char(temp);}

    
   ES=1;
   
   }
   
}


/*void key_scan() interrupt 0 using 2
{
		 if(!key)
           {
		   delay2(2);
           if(!key)
	    {	tmpchange();					//启动温度转换/
               delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
	tmp();							//读取温度转换结果/

         display(temper);
		 send_char(temper);
	
		
        // delays(1); 
		  }
	}
}
*/
///===========================================
main()
{
   	
    initcom();
	LED=0xff;
	P2=0x00;
        P1=P1&0x01;
        heat1=1;
	while(RI!=1)
        { 
		    system_heat(t1);
	 if(!key)
           {
		   delay2(2);
           if(!key)
	    {	tmpchange();					//启动温度转换/
               delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
	tmp();							//读取温度转换结果/

         display(temper);
		 send_char(temper);
//		 system_heat(t1);
        // delays(1); 
		  }
	}
	/* if(RI)
	 {
	 RI=0;
	 t1=SBUF;
	 if(t1==0x02)
	 {
	 system_heat(40);}
	    if(temp==0x0e)
   {
   	tmpchange();				//启动温度转换
               delays(1);     // 发出转换温度的指令后要等至少750mS(12位精度),才能发读温度指令,如果发早了,就读到了芯片上电后预设的85度这个数。
	tmp();						//读取温度转换结果

         display(temper);
		 send_char(temper);
   }
   else system_heat(t1);

	 }*/


        }
}


⌨️ 快捷键说明

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