📄 yj.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 + -