?? main.c
字號:
#include "reg52.h" //晶振可以用11.0592MHZ,如果用串口的話
//提示:在調(diào)試程序的時候晶振用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口模擬數(shù)據(jù)口
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 // 接收和發(fā)送緩存區(qū)的深度
#define NUM1 7 // 接收和發(fā)送緩存區(qū)的深度
unsigned char idata sendbuf[NUM]; // 數(shù)據(jù)發(fā)送緩沖區(qū)
unsigned char idata receivebuf[NUM1]; // 數(shù)據(jù)接收緩沖區(qū)
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;//無傳感器標(biāo)志
else
okqi=1;//有傳感器標(biāo)志
sendbuf[0]=0X80;//起始符
// sendbuf[1]=0X01;//本機(jī)地址
sendbuf[1]=P1&0X0F;//本機(jī)地址
//receivebuf[3]=0x00;uartflasT=1;//上電發(fā)送測試數(shù)據(jù)
okmea=1;//測量
MeasureMode=1;
while (1)
{
if(uartflasR==1)//接收命令處理
{
if(rnum>3) //接收數(shù)據(jù)應(yīng)大于4字節(jié),否則帔格式不對
if(receivebuf[0]==sendbuf[1]) //本機(jī)地址才處理
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)//發(fā)送命令處理
{
//sendbuf[0]=0X80;//起始符
//sendbuf[1]=0X01;//本機(jī)地址
switch(receivebuf[3])//命令處理
{
case 0x11:{//測量濕度和溫度命令
sendbuf[2]=0;//字節(jié)數(shù)1
sendbuf[3]=11;//字節(jié)數(shù)2
sendbuf[4]=0x11;//命令碼
sendbuf[5]=0x12;//濕度數(shù)據(jù)
sendbuf[6]=dhum[0];
sendbuf[7]=dhum[1];
sendbuf[8]=dhum[2];
sendbuf[9]=dhum[3];
sendbuf[10]=0x13;//溫度數(shù)據(jù)
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;//字節(jié)數(shù)1
sendbuf[3]=6;//字節(jié)數(shù)2
sendbuf[4]=0x11;//命令碼
sendbuf[5]=0x12;//濕度數(shù)據(jù)
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;//字節(jié)數(shù)1
sendbuf[3]=6;//字節(jié)數(shù)2
sendbuf[4]=0x11;//命令碼
sendbuf[5]=0x13;//溫度數(shù)據(jù)
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;//字節(jié)數(shù)1
sendbuf[3]=1;//字節(jié)數(shù)2
sendbuf[4]=0x00;//命令碼
sendbuf[5]=okqi;//傳感器標(biāo)志
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:{//讀濕度數(shù)據(jù)
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:{//讀溫度數(shù)據(jù)
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;
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: timer0
// 定時器0中斷函數(shù)
// 函數(shù)功能: 計時
//--------------------------------------------------------------------------------------------------
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:;
}*/
}
}
//--------------------------------------------------------------------------------------------------
// 函數(shù)名稱: uart
// 定時器0中斷函數(shù)
// 函數(shù)功能: 計時
//--------------------------------------------------------------------------------------------------
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++;
}
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -