📄 main.c
字号:
#include "reg52.h" //晶振可以用11.0592MHZ,如果用串口的话
//提示:在调试程序的时候晶振用12MHZ
#include "stdio.h"
#include "string.h"
#include "math.h"
#include "intrins.h"
//#include "bcd.h"
//#include "SHTXX_iic.c"
/**********************************************************************************/
#define uchar unsigned char
#define BIT7 0X80
#define BIT6 0X40
#define BIT5 0X20
#define BIT4 0X10
#define BIT3 0X08
#define BIT2 0X04
#define BIT1 0X02
#define BIT0 0X01
sbit SDA=P1^6; // 将p1.6口模拟数据口
bdata uchar canmea;
float hum,tem;float ftem;
uchar aaa,dhum[4],dtem[4];
int count,second;
uchar MeasureMode;
uchar rnum,tnum,tlen;uchar uartflasR,uartflasT;
#define NUM 20 // 接收和发送缓存区的深度
#define NUM1 7 // 接收和发送缓存区的深度
unsigned char idata sendbuf[NUM]; // 数据发送缓冲区
unsigned char idata receivebuf[NUM1]; // 数据接收缓冲区
void TxData ();
void Inituart();
void InitSHTXX();
void Inittimer0();
float CalculateHum();
float CalculateTem();
void MeasureTem();
void MeasureHum();
void measure();
/*****************************************MAIN START ******************************/
void main(void)
{
uchar okqi;
int dat;//int i;
uchar okmea;
// uchar aaa;
Inittimer0();
second=1;
while(second){}//上电延时
Inituart();
InitSHTXX();
if (F0==1)
okqi=0;//无传感器标志
else
okqi=1;//有传感器标志
sendbuf[0]=0X80;//起始符
// sendbuf[1]=0X01;//本机地址
sendbuf[1]=P1&0X0F;//本机地址
//receivebuf[3]=0x00;uartflasT=1;//上电发送测试数据
okmea=1;//测量
MeasureMode=1;
while (1)
{
if(uartflasR==1)//接收命令处理
{
if(rnum>3) //接收数据应大于4字节,否则帔格式不对
if(receivebuf[0]==sendbuf[1]) //本机地址才处理
switch(receivebuf[3]) //命令处理
{
case 0x12:
case 0x13:
case 0x11:{okmea=1;/*P0=~P0;*/}break;//测量湿度和温度命令
case 0x00:{uartflasT=1;}break;//检测命令
default:;
}
uartflasR=0;
}
if(uartflasT==1)//发送命令处理
{
//sendbuf[0]=0X80;//起始符
//sendbuf[1]=0X01;//本机地址
switch(receivebuf[3])//命令处理
{
case 0x11:{//测量湿度和温度命令
sendbuf[2]=0;//字节数1
sendbuf[3]=11;//字节数2
sendbuf[4]=0x11;//命令码
sendbuf[5]=0x12;//湿度数据
sendbuf[6]=dhum[0];
sendbuf[7]=dhum[1];
sendbuf[8]=dhum[2];
sendbuf[9]=dhum[3];
sendbuf[10]=0x13;//温度数据
sendbuf[11]=dtem[0];
sendbuf[12]=dtem[1];
sendbuf[13]=dtem[2];
sendbuf[14]=dtem[3];
/*sendbuf[6]=0x07;
sendbuf[7]=0x06;
sendbuf[8]=0x05;
sendbuf[9]=0x04;
sendbuf[11]=0x00;
sendbuf[12]=0x02;
sendbuf[13]=0x09;
sendbuf[14]=0x08;*/
sendbuf[15]=sendbuf[5]^sendbuf[6]^sendbuf[7]^sendbuf[8]^sendbuf[9]
^sendbuf[10]^sendbuf[11]^sendbuf[12]^sendbuf[13]^sendbuf[14];
sendbuf[16]=0x7F;//停止符
tlen=17;
}break;
case 0x12:{//测量湿度命令
sendbuf[2]=0;//字节数1
sendbuf[3]=6;//字节数2
sendbuf[4]=0x11;//命令码
sendbuf[5]=0x12;//湿度数据
sendbuf[6]=dhum[0];
sendbuf[7]=dhum[1];
sendbuf[8]=dhum[2];
sendbuf[9]=dhum[3];
sendbuf[10]=sendbuf[5]^sendbuf[6]^sendbuf[7]^sendbuf[8]^sendbuf[9];
sendbuf[11]=0x7F;//停止符
tlen=12;
}break;
case 0x13:{//测量温度命令
sendbuf[2]=0;//字节数1
sendbuf[3]=6;//字节数2
sendbuf[4]=0x11;//命令码
sendbuf[5]=0x13;//温度数据
sendbuf[6]=dtem[0];
sendbuf[7]=dtem[1];
sendbuf[8]=dtem[2];
sendbuf[9]=dtem[3];
sendbuf[10]=sendbuf[5]^sendbuf[6]^sendbuf[7]^sendbuf[8]^sendbuf[9];
sendbuf[11]=0x7F;//停止符
tlen=12;
}break;
case 0x00:{//检测命令
sendbuf[2]=0;//字节数1
sendbuf[3]=1;//字节数2
sendbuf[4]=0x00;//命令码
sendbuf[5]=okqi;//传感器标志
sendbuf[6]=0x7F;//停止符
tlen=7;
}break;
default:;
}
uartflasT=0;
tnum=0;
SBUF=sendbuf[tnum];tnum++;
}
if(okmea==1)
if(okqi==0)
{
receivebuf[3]=0x00;uartflasT=1;okmea=0;
}
else
switch(MeasureMode)
{
case 1:{//启动测量湿度
MeasureHum();
/* aaa=0x12;
TxData();
if(F0==1)
aaa=0xaa;//无器件
else
aaa=0x55;//有器件
TxData();
*/ /*TH0=0Xca;
TL0=0X00;//11.0592MHz 15mS
TR0=1;*/
count=0;
MeasureMode++;}break;
case 2:if(count==2)
{MeasureMode++;count=0;}break;//等待延时
case 3:{//读湿度数据
if(SDA==0) //等待测量完毕
{
canmea=0;
hum=CalculateHum();
dat=floor(hum*100);
dhum[0]=floor(hum/10);//十位
ftem=1000;ftem=fmod(dat,ftem);
dhum[1]=floor(ftem/100);//个位
dat=ftem;ftem=100;ftem=fmod(dat,ftem);
dhum[2]=floor(ftem/10);//十分一位
dat=ftem;ftem=10;ftem=fmod(dat,ftem);
dhum[3]=floor(ftem);//百分一位
/* for(p=dhum,i=0;i<4;i++,p++)
{aaa=*p;TxData();}
*/ MeasureMode++;
}
}break;
case 4:if(count==2)
{MeasureMode++;count=0;}break;//等待延时
case 5:{//启动测量温度
MeasureTem();
/* aaa=0x13;
TxData();
if(F0==1)
aaa=0xaa;//无器件
else
aaa=0x55;//有器件
TxData();
*/ /*TH0=0X28;
TL0=0X00;//11.0592MHz 60mS
TR0=1;*/
count=0;
MeasureMode++;}break;
case 6:if(count==4)
{MeasureMode++;count=0;}break;//等待延时
case 7:{//读温度数据
if(SDA==0)//等待测量完毕
{
canmea=0;
tem=CalculateTem();
// dat=fsign(tem/100);
// p=&tem;aaa=*p;
if (tem<0)
{dtem[0]=0x0f;//符号位
tem=fabs(tem);
}
else
{tem=fabs(tem);
ftem=100;
ftem=fmod(tem,ftem);
dtem[0]=floor(ftem);//百位
}
dtem[1]=floor(tem/10);//十位
ftem=10;
ftem=fmod(tem,ftem);
dtem[2]=floor(ftem);//个位
ftem=fmod(ftem*10,10);
dtem[3]=floor(ftem);//十分一位
/* for(p=dtem,i=0;i<4;i++,p++)
{aaa=*p;TxData();}
*/ MeasureMode=1;uartflasT=1;okmea=0;/*P0=~P0;*/
}
}break;
default:;
}
}
}
/*************************************Rmain END *******************************/
/**************************************Measure START ******************************/
/*void measure(void)
{
}
/**************************************Measure END ******************************/
/*void TxData (void)
{
SBUF=aaa;
while(TI==0);
TI=0;
}*/
void Inituart(void)
{
TMOD = 0x21; //timer1 working mode 1
TL1 = 0xfd; //fb=9600 for 18.432mhz Fosc,and ...
TH1 = 0xfd; //fd=9600 for 11.0592mhz Fosc
SCON = 0x50; //uart mode 3,ren==1
//PCON = 0x80; //smod=0
TR1 = 1; //start timer1
ES=1;
}
void Inittimer0(void)
{
TMOD = 0x21; //timer0 working mode 1
TL0 = 0x00; //
TH0 = 0xb8; //20ms for 11.0592mhz Fosc
TR0 = 1; //start timer1
ET0=1;EA=1;
}
//--------------------------------------------------------------------------------------------------
// 函数名称: timer0
// 定时器0中断函数
// 函数功能: 计时
//--------------------------------------------------------------------------------------------------
void timer0 (void) interrupt 1 using 2
{
TH0=0Xb8;
TL0=0X00;//11.0592MHz 20mS
if (MeasureMode==2)count++;
if (MeasureMode==4)count++;
if (MeasureMode==6)count++;
second++;
if (second==100)
{
second=0;
/* switch(MeasureMode)
{
case 4:{MeasureMode++;}break;
case 0:{MeasureMode++;}break;
default:;
}*/
}
}
//--------------------------------------------------------------------------------------------------
// 函数名称: uart
// 定时器0中断函数
// 函数功能: 计时
//--------------------------------------------------------------------------------------------------
void uart (void) interrupt 4 using 0
{
uchar dsbuf;
if(RI==1)
{
RI=0;dsbuf=SBUF;
switch(dsbuf)
{
case 0X80:{rnum=0;}break;
case 0X7F:{uartflasR=1;}break;
// case 0Xaa:{SBUF=0x55;tlen=0;}break;
default:{receivebuf[rnum]=dsbuf;
rnum++;}
}
}
if(TI==1)
{
TI=0;
if (tnum<tlen)
{SBUF=sendbuf[tnum];tnum++;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -