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

📄 yj.c

📁 本程序采用的是keilc51编程器
💻 C
字号:
#define uchar unsigned char
#define uint  unsigned int

#include "reg52.h"
#include "intrins.h"
#include "string.h"
#include "AD0831.h"
#include "diceng1602.h"
#include "DS18B20qudong.h"


sbit LED=P2^0;


sbit key1 = P2^4;
uchar counter = 0;



struct SRspGetData //21h:数据采集命令响应
    {
		uchar  lHead[4];	 //4
		uchar  iStart[2];	 //2
		uchar  cLength[2];	 //2
     	uchar  iDestNum[2];        //目的站编号,	2
     	uchar  iSourceNum[2];      //源站编号		2
     	uchar  cPackageType;      //包类型=2Bh 	1
     	uchar  cPackageCtrl;      //包控制要求 	1
     	uchar  iCmdSequenceNum[2]; //应答序列编号 2
     	uchar  cTData[2];        //温度数据,2个字节
        uchar  cHData;      //湿度数据,1个字节
	    uchar  iFcs[2];
		uchar  iEnd[2];
     }DataPack;


uchar command = 0;
uchar i=0;
uchar cRcv_Stat1=0;
uchar iRcv_Nmb1;
uchar iRcv_Nmb_Max;
union zhongjian2
	{
  		uint i;
  		uchar ii[2];
	}exchange_data2;

void InitT0()
{
   
   //TMOD = 0x21;//定时器0工作于方式1.    16位   TMOD在串行中断初始化中已经设置过
   TH0 = 0x3C;
   TL0 = 0xB0;
   TR0 = 1;//定时器启动

   //EA = 1;//开总中断  在串行中断初始化中已经设置过
   ET0 = 1;//允许定时器0中断

   LED = 1;
}

void timer() interrupt 1
{
   counter++;
   if( counter == 14)
   	  {
	     counter = 0;
         LED = ~LED;//脉冲取反
         TH0 = 0x3C;//重装
         TL0 = 0xB0; 
	  }
}


void SendDat(uchar c)
{
	key1 = 1;//要发送数据前,把485DIP角置高。因为此位为高时485为发送状态
	SBUF=c;
    while(TI==0);//等待TI变高
    TI=0;   
	key1 = 0;//发送完了以后,此位置0.为接收状态
		
		
}	

void InitRXD(void)
{
   TMOD=0x21;	//确定定时器工作模式
   TH1=0xFD;															
   TL1=0xFD;	//定时初值
   PCON&=0x80;	//SMOD=1
   TR1=1;		//开启定时器1
   SCON=0x50;	//串口工作方式1	
   RI = 0;
   TI = 0;	
   key1 = 0;//////////////////////////////////接收状态
   
   EA = 1;//开总中断
   ES = 1;//允许串行口中断
   PS = 1;//串行口中断优先级高
}




void Rxd() interrupt 4
{ 
	
	//uchar k;   
	uchar  new_data,last_data,last_last_data;
  	uchar  cRcv_Data1[50];
      {
		switch(cRcv_Stat1)
	    {
	      case 0:
	      	if(RI);//接收数据;
	        new_data=SBUF; 
			   //
	        if(last_last_data==0x00 && last_data==0x02 && new_data==0xa6)
	          {
	          
	            cRcv_Data1[5]=new_data;            
	            cRcv_Data1[4]=last_data;
	            cRcv_Data1[3]=last_last_data;
	            cRcv_Data1[2]=0x00;
	            cRcv_Data1[1]=0x00;
	            cRcv_Data1[0]=0x00;
	             
	            iRcv_Nmb1=6;
	            cRcv_Stat1=1;       //是帧头
	                      
	          } 
	          else              //
	          {
				last_last_data=last_data;          
	          	last_data=new_data;
	            cRcv_Stat1=0;
	          } 

	         
	        break;	      
	     case 1:
	      	if(RI);//接收数据;
	        cRcv_Data1[iRcv_Nmb1]=SBUF;   //帧数据
	        if(iRcv_Nmb1==6)
	        	exchange_data2.ii[0]=cRcv_Data1[iRcv_Nmb1];
	        if(iRcv_Nmb1==7)
	        	exchange_data2.ii[1]=cRcv_Data1[iRcv_Nmb1];//计算有效数据长度,以此作为帧判断的第一步

	        if(iRcv_Nmb1==exchange_data2.i+11) //判长度---1
	        {
	          	iRcv_Nmb_Max=iRcv_Nmb1;    //接收完一帧
	          	cRcv_Stat1=0;             //准备下一帧的接收
	          	iRcv_Nmb1=0;  
	 
				if((cRcv_Data1[iRcv_Nmb_Max]==0x0a)&&(cRcv_Data1[iRcv_Nmb_Max-1]==0x0d))//判结束字---2
				{
					for(i=0;i<=iRcv_Nmb_Max;i++)   //接收数据回送,以便调试
	          		{
						//SendDat(cRcv_Data1[i]);
			  		} 
					if(cRcv_Data1[iRcv_Nmb_Max-7]==0x20)
					{
					  command=0x20;			//receive正确的命令
					}
				}
				else
				{
					cRcv_Stat1=0;
					
				}
	    
	        }
	        else 
	        {
	          if(iRcv_Nmb1>50)
	          {
	            cRcv_Stat1=0;
				       
			  }  
	          iRcv_Nmb1++;   //帧数据
	        }
	        break;
	        
	    default:
	       cRcv_Stat1=0;
	       break;
	                                
	    }   
		  
		   RI=0;  
	}    
}

void PutOutData()
{
        SendDat(DataPack.lHead[0]);//前导   00000000
		SendDat(DataPack.lHead[1]);
		SendDat(DataPack.lHead[2]);
		SendDat(DataPack.lHead[3]);
		
		SendDat(DataPack.iStart[0]);	 //起始位  02A6
		SendDat(DataPack.iStart[1]);

		SendDat(DataPack.cLength[0]);	 //长度    000b
     	SendDat(DataPack.cLength[1]);

		
		SendDat(DataPack.iDestNum[0]);        //目的站编号,	2    4000
     	SendDat(DataPack.iDestNum[1]);
		
		SendDat(DataPack.iSourceNum[0]);      //源站编号		2    0001
     	SendDat(DataPack.iSourceNum[1]);
		
		SendDat(DataPack.cPackageType);      //包类型=2Bh 	1    21
     	SendDat(DataPack.cPackageCtrl);      //包控制要求 	1    00
     	
		SendDat(DataPack.iCmdSequenceNum[0]); //应答序列编号 2     0000
		SendDat(DataPack.iCmdSequenceNum[1]);

		
	  

//传送数据
////////////////////////////////////////////////////////////////////////////////////////////
        SendDat(DataPack.cTData[0]);        //温度数据,2个字节   先送高位 后送低位   
        SendDat(DataPack.cTData[1]);
	   
	    SendDat(DataPack.cHData);           //湿度数据,1个字节
////////////////////////////////////////////////////////////////////////////////////////////	   
	 
     	
	    
		SendDat(DataPack.iFcs[0]);        //校验FCS 1234
		SendDat(DataPack.iFcs[1]);

		SendDat(DataPack.iEnd[0]);        //结束符 0D0A
		SendDat(DataPack.iEnd[1]); 
		  
}

void main()
{	
	    uint  TemperatureData;
		uchar TemperatureMSB;
		uchar TemperatureLSB;
		uchar ADValue;
	
	    LED = 0;   //初始化LED口
		
		InitRXD();//初始化串行口并开启中断 
		InitT0();//初始化定时器0
				   
		DataPack.lHead[0]=0x00;	 //前导   00000000
		DataPack.lHead[1]=0x00;
		DataPack.lHead[2]=0x00;
		DataPack.lHead[3]=0x00;
		
		DataPack.iStart[0]=0x02;	 //起始位    02A6
		DataPack.iStart[1]=0xA6;

		DataPack.cLength[0]=0x00;	 //长度    000b
     	DataPack.cLength[1]=0x0b;
		
		DataPack.iDestNum[0]=0x40;        //目的站编号,	2    4000
     	DataPack.iDestNum[1]=0x00;
		
		DataPack.iSourceNum[0]=0x00;      //源站编号		2    0001
     	DataPack.iSourceNum[1]=0x01;
		
		DataPack.cPackageType=0x21;      //包类型=2Bh 	1    21
     	DataPack.cPackageCtrl=0x00;      //包控制要求 	1    00
     	
		DataPack.iCmdSequenceNum[0]=0x00; //应答序列编号 2     0000
		DataPack.iCmdSequenceNum[1]=0x00;

     	
	    
		DataPack.iFcs[0]=0x12;        //校验FCS 1234
		DataPack.iFcs[1]=0x34;

		DataPack.iEnd[0]=0x0D;        //结束符 0D0A
		DataPack.iEnd[1]=0x0A; 

	while(1)
	{	  
	   
	   ADValue = ADConv();//得到湿度数据
	   
	   TemperatureData=ReadTemperature();//得到温度数据
	   TemperatureLSB=TemperatureData&0xFF;
	   TemperatureMSB=(TemperatureData>>8)&0xFF;

	   DataPack.cTData[0]=TemperatureMSB;        //温度数据,2个字节.   先送高位,后送低位   
       DataPack.cTData[1]=TemperatureLSB;
	   
	   DataPack.cHData=ADValue;           //湿度数据,1个字节
	   
	   if( command==0x20 ) 
       
	      {
		      PutOutData();  
			  command=0;
		  }   

	 
	}
}

⌨️ 快捷键说明

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