?? 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 + -