文档库 最新最全的文档下载
当前位置:文档库 › 三个传感器串口接收

三个传感器串口接收

#include
#include //Keil library
#include //Keil library
#include
#define uchar unsigned char
#define uint unsigned int
#define FOSC 11059200L
#define BAUD 9600UL
#define DataPort P0 //LCD1602数据端口
sbit SCL=P2^0; //IIC时钟引脚定义
sbit SDA=P2^1; //IIC数据引脚定义


int wen[]={'t','e','m','p','e','r',':'};
int shidu[]={'h','u','m','i','d','i','t','y',':'};
int guang[]={'b','e','a','m',':'};
#define SlaveAddress 0x46 //定义器件在IIC总线中的从地址,根据ALT ADDRESS地址引脚不同修改
#define ADC_FLAG 0x10 //ADC complete flag
#define ADC_START 0x08 //ADC start control bit
#define ADC_SPEEDLL 0x00 //540 clocks
#define ADC_SPEEDL 0x20 //360 clocks
#define ADC_SPEEDH 0x40 //180 clocks
#define ADC_SPEEDHH 0x60 //90 clocks
#define ADC_POWER 0x80 //ADC power control bit ,ADC_CONTR BCH name ADC_POWER SPEED1 SPEED0 ADC_FLAG ADC_START CHS2 CHS1 CHS0 //ALT ADDRESS引脚接地时地址为0x46,接电源时地址为0xB8
typedef unsigned char BYTE;
typedef unsigned short WORD1;
typedef unsigned int WORD;
sfr ADC_CONTR = 0xBC; //ADC control register 10111100
sfr ADC_RES = 0xBD; //ADC hight 8-bit result register 10111101
sfr ADC_LOW2 = 0xBE; //ADC low 2-bit result register 10111110
sfr P1ASF = 0x9D; //P1 secondary function control register
BYTE BUF[8]; //接收数据缓存区
uchar ge,shi,bai,qian,wan; //显示变量
int dis_data; //变量
BYTE ch = 0; //ADC channel NO.
void delay_nms(unsigned int k);

void Init_BH1750(void);
void InitUart();
void SendData(BYTE dat); ////////////
void Delay(WORD n);
void InitADC();
void conversion(uint temp_data);

void Single_Write_BH1750(uchar REG_Address); //单个写入数据
uchar Single_Read_BH1750(uchar REG_Address); //单个读取内部寄存器数据
void Multiple_Read_BH1750(); //连续的读取内部寄存器数据
//------------------------------------
void Delay5us();
void Delay5ms();
void BH1750_Start(); //起始信号
void BH1750_Stop(); //停止信号
void BH1750_SendACK(bit ack); //应答ACK
bit BH1750_RecvACK(); //读ack
void BH1750_SendByte(BYTE dat); //IIC单个字节写
BYTE BH1750_RecvByte(); //IIC单个字节读

//-----------------------------------

//*********************************************************
void conversion(uint temp_data) // 数据转换出 个,十,百,千,万
{
wan=temp_data/10000+0x30

;
temp_data=temp_data%10000; //取余运算
qian=temp_data/1000+0x30 ;
temp_data=temp_data%1000; //取余运算
bai=temp_data/100+0x30 ;
temp_data=temp_data%100; //取余运算
shi=temp_data/10+0x30 ;
temp_data=temp_data%10; //取余运算
ge=temp_data+0x30;
}

//毫秒延时**************************
void delay_nms(unsigned int k)
{
unsigned int i,j;
for(i=0;i{
for(j=0;j<121;j++)
{;}}
}


/**************************************
延时5微秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数,注意时钟过快时需要修改
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5us()
{
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}

/**************************************
延时5毫秒(STC90C52RC@12M)
不同的工作环境,需要调整此函数
当改用1T的MCU时,请调整此延时函数
**************************************/
void Delay5ms()
{
WORD1 n = 560;

while (n--);
}

/**************************************
起始信号
**************************************/
void BH1750_Start()
{
SDA = 1; //拉高数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 0; //产生下降沿
Delay5us(); //延时
SCL = 0; //拉低时钟线
}

/**************************************
停止信号
**************************************/
void BH1750_Stop()
{
SDA = 0; //拉低数据线
SCL = 1; //拉高时钟线
Delay5us(); //延时
SDA = 1; //产生上升沿
Delay5us(); //延时
}

/**************************************
发送应答信号
入口参数:ack (0:ACK 1:NAK)
**************************************/
void BH1750_SendACK(bit ack)
{
SDA = ack; //写应答信号
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}

/**************************************
接收应答信号
**************************************/
bit BH1750_RecvACK()
{
SCL = 1; //拉高时钟线
Delay5us(); //延时
CY = SDA; //读应答信号
SCL = 0; //拉低时钟线
Delay5us(); //延时

return CY;
}

/**************************************
向IIC总线发送一个字节数据
**************************************/
void BH1750_SendByte(BYTE dat)
{
BYTE i;

for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;

//移出数据的最高位
SDA = CY; //送数据口
SCL = 1; //拉高时钟线
Delay5us(); //延时
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
BH1750_RecvACK();
}

/**************************************
从IIC总线接收一个字节数据
**************************************/
BYTE BH1750_RecvByte()
{
BYTE i;
BYTE dat = 0;

SDA = 1; //使能内部上拉,准备读取数据,
for (i=0; i<8; i++) //8位计数器
{
dat <<= 1;
SCL = 1; //拉高时钟线
Delay5us(); //延时
dat |= SDA; //读数据
SCL = 0; //拉低时钟线
Delay5us(); //延时
}
return dat;
}

//*********************************

void Single_Write_BH1750(uchar REG_Address)
{
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress); //发送设备地址+写信号
BH1750_SendByte(REG_Address); //内部寄存器地址,
// BH1750_SendByte(REG_data); //内部寄存器数据,
BH1750_Stop(); //发送停止信号
}


void Multiple_read_BH1750(void)
{ uchar i;
BH1750_Start(); //起始信号
BH1750_SendByte(SlaveAddress+1); //发送设备地址+读信号

for (i=0; i<3; i++) //连续读取2个地址数据,存储中BUF
{
BUF[i] = BH1750_RecvByte(); //BUF[0]存储0x32地址中的数据
if (i == 3)
{

BH1750_SendACK(1); //最后一个数据需要回NOACK
}
else
{
BH1750_SendACK(0); //回应ACK
}
}

BH1750_Stop(); //停止信号
Delay5ms();
}


//初始化BH1750,根据需要请参考pdf进行修改****
void Init_BH1750()
{
Single_Write_BH1750(0x01);

}
//*********************************************************
//主程序********
//*********************************************************
void main()
{ int w=0;
int b;
char a;
char c;
char d;
char datas[5];
unsigned char I;
unsigned char K;
unsigned char M;
float temp;
delay_nms(100); //延时100ms
InitUart(); //Init UART, use to show ADC result
InitADC();
IE = 0x00; //Enable ADC interrupt and Open master interrupt switch
Init_BH1750(); //初始化BH1750
SCON=0x40;
TMOD=0X20;
TCON=0X40;
TI=1;
I=0;

while(1) //循环
{
if(w==0)
{
I=0;
while(I<5)
{
while(!TI);
SBUF=guang[I];
I++;
TI=0;
}
Single_Write_BH17

50(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
delay_nms(1800); //延时180ms
Multiple_Read_BH1750(); //连续读出数据,存储在BUF中
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];//合成数据,即光照数据
temp=(float)dis_data/1.2;
conversion(temp); //计算数据和显示

while(!TI);
SBUF=wan;
TI=0;
while(!TI);
SBUF=qian;
TI=0;
while(!TI);
SBUF=bai;
TI=0;
while(!TI);
SBUF=shi;
TI=0;
while(!TI);
SBUF=ge;
TI=0;
while(!TI);
SBUF=' ';
TI=0;
}


if(ch==0&&w==0)
{
ADC_CONTR &= !ADC_FLAG; //Clear ADC interrupt flag
//SendData(ch); //Show Channel NO.
b=(ADC_RES/16)*16+ADC_RES%16;
//SendData(b);
w++;
K=0;
while(K<9)
{
while(!TI);
SBUF=shidu[K];
K++;
TI=0;
}
a=b/100+'0';
c=b/10%10+'0';
d=b%10+'0';
SendData(a);
SendData(c);
SendData(d);

while(!TI);
SBUF=' ';
TI=0;
}
if (++ch > 1)
{ M=0;
while(M<5)
{
while(!TI);
SBUF=wen[M];
M++;
TI=0;
}
ADC_CONTR &= !ADC_FLAG; //SendData(ch); //Show Channel NO.
b=(ADC_RES/16)*16+ADC_RES%16; //SendData(b);
datas[0] = b/ 10000+'0';
datas[1] = b% 10000 / 1000+'0';
datas[2] = b % 1000 / 100+'0';
datas[3] = b % 100 / 10+'0';
datas[4] =b% 10+'0';
SendData(datas[0]);
SendData(datas[1]);
SendData(datas[2]);
SendData(datas[3]);
SendData(datas[4]);
ch = 0;
w=0;

while(!TI);
SBUF='\r';
TI=0;
while(!TI);
SBUF='\n';
TI=0;
}

ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;



}
}

void InitADC( )
{
P1ASF = 0x03; //Set all P1 as analog input port
ADC_RES = 0; //Clear previous result
ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START | ch;
Delay(2); //ADC power-on delay and Start A/D conversion
}

void InitUart()
{
SCON = 0x5a; //8 bit data ,no parity bit
TMOD = 0x20; //T1 as 8-bit auto reload
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set Uart baudrate
TR1 = 1; //T1 start running
}


void SendData(char dat)
{
while (!TI); //Wait for the previous data is sent
TI = 0; //Clear TI flag
SBUF = dat; //Se

nd current data
}

void Delay(WORD n)
{
WORD x;
while (n--)
{
x = 5000;
while (x--);
}
}




相关文档