资源预览内容
第1页 / 共13页
第2页 / 共13页
第3页 / 共13页
第4页 / 共13页
第5页 / 共13页
第6页 / 共13页
第7页 / 共13页
第8页 / 共13页
第9页 / 共13页
第10页 / 共13页
亲,该文档总共13页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
超级终端显示效果: 程序代码: /* 用 STM32F103C8 调试 GY-30 串口展示光强度 SDA: GPIOB0 SCL: GPIOB1 */ #include stm32f10 x.h #include BH1750.h #include usart1.h ucharBUF8;/接收数据缓存区 intdis_data;/变量 intmcy; /* * 函数名:main * 描述: 主函数 * 输入:无 * 输出: 无 */ int main(void) float temp; /* 配置系统时钟为 72M */ SystemInit(); USART1_Config();/串口配置 USART1_printf(USART1, rn 这是一个开始 rn); GPIOConfig(); Init_BH1750();/初始化 BH1750 Delay_mms(180);/延时 180ms while(1) Single_Write_BH1750(0 x01);/ power on Single_Write_BH1750(0 x10);/ H- resolution mode Delay_mms(800);/延时 180ms mread();/连续读出数据,存储在 BUF 中 dis_data=BUF0; dis_data=(dis_dataSR while( USART_GetFlagStatus(USART1,USART_FLAG_TC)!= SET); /不停地检查串口发 送是否完成的标志位 TC,一直检测到标志为完成,才进入一下步的操作,避免出错 return (ch); /* * 函数名:itoa * 描述 :将整形数据转换成字符串 * 输入 :-radix =10 表示 10 进制,其他结果为 0 * -value 要转换的整形数 * -buf 转换后的字符串 * -radix = 10 * 输出 :无 * 返回 :无 * 调用 :被 USART1_printf()调用 */ static char *itoa(int value, char *string, int radix) int i, d; int flag = 0; char *ptr = string; /* This implementation only works for decimal numbers. */ if (radix != 10) *ptr = 0; return string; if (!value) *ptr+ = 0 x30; *ptr = 0; return string; /* if this is a negative value insert the minus sign. */ if (value 0; i /= 10) d = value / i; if (d | flag) *ptr+ = (char)(d + 0 x30); value -= (d * i); flag = 1; /* Null terminate the string. */ *ptr = 0; return string; /* NCL_Itoa */ /* * 函数名:USART1_printf * 描述:格式化输出,类似于 C 库中的 printf,但这里没有用到 C 库 * 输入:-USARTx 串口通道,这里只用到了串口 1,即 USART1 *-Data要发送到串口的内容的指针 *-.其他参数 * 输出:无 * 返回:无 * 调用:外部调用 *典型应用 USART1_printf( USART1, rn this is a demo rn ); *USART1_printf( USART1, rn %d rn, i ); *USART1_printf( USART1, rn %s rn, j ); */ void USART1_printf(USART_TypeDef* USARTx, uint8_t *Data,.) const char *s; int d; char buf16; va_list ap; va_start(ap, Data); while ( *Data != 0)/ 判断是否到达字符串结束符 if ( *Data = 0 x5c )/ switch ( *+Data ) case r:/回车符 USART_SendData(USARTx, 0 x0d); Data +; break; case n:/换行符 USART_SendData(USARTx, 0 x0a); Data +; break; default: Data +; break; else if ( *Data = %) / switch ( *+Data ) case s:/字符串 s = va_arg(ap, const char *); for ( ; *s; s+) USART_SendData(USARTx,*s); while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) = RESET ); Data+; break; case d:/十进制 d = va_arg(ap, int); itoa(d, buf, 10); for (s = buf; *s; s+) USART_SendData(USARTx,*s); while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) = RESET ); Data+; break; default: Data+; break; /* end of else if */ else USART_SendData(USARTx, *Data+); while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) = RESET ); /GY-30C 文件 /即是 BH1750FVI 芯片 #include BH1750.h void GPIOConfig(void) GPIO_InitTypeDef GPIO_InitStruct; /*开启 GPIOB 的外设时钟*/ RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE); GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = sda|scl ; GPIO_Init(GPIOB, void Delay_5us(void) uint16_t i=0; uint16_t timer = 5; while(timer-) i=10; while(i-); void Delay_mms(uint16_t tmp) uint16_t i=0; while(tmp-) i=12000; while(i-); /*开始信号*/ void BH1750_Start() GPIO_SetBits(GPIOB, sda);/拉高数据线 GPIO_SetBits(GPIOB, scl);/拉高时钟线 Delay_5us();/延时 GPIO_ResetBits(GPIOB, sda);/产生下降沿 Delay_5us();/延时 GPIO_ResetBits(GPIOB, scl);/拉低时钟线 /*停止信号*/ void BH1750_Stop() GPIO_ResetBits(GPIOB, sda);/拉低数据线 GPIO_SetBits(GPIOB, scl);/拉高时钟线 Delay_5us();/延时 GPIO_SetBits(GPIOB, sda);/产生上升沿 Delay_5us();/延时 /* 发送应答信号 入口参数:ack (0:ACK 1:NAK) */ void BH1750_SendACK(int ack) GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = sda; GPIO_Init(GPIOB, if(ack = 1)/写应答信号 GPIO_SetBits(GPIOB, sda); else if(ack = 0) GPIO_ResetBits(GPIOB, sda); else return; GPIO_SetBits(GPIOB, scl);/拉高时钟线 Delay_5us();/延时 GPIO_ResetBits(GPIOB, scl);/拉低时钟线 Delay_5us();/延时 /* 接收应答信号 */ int BH1750_RecvACK() GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;/*这里一定要设成输入上拉,否则 不能读出数据*/ GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStruct.GPIO_Pin = sda; GPIO_Init(GPIOB, GPIO_SetBits(GPIOB, scl);/拉高时钟线 Delay_5us();/延时 if(GPIO_ReadInputDataBit( GPIOB, sda ) =1 )/读应答信号 mcy = 1 ; else mcy = 0 ; GPIO_ResetBits(GPIOB, scl);/拉低时钟线 Delay_5us();/延时 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init( GPIOB, return mcy; /* 向 IIC 总线发送一个字节数据 */ void BH1750_SendByte(uchar dat) uchar i; for (i=0; i8; i+)/8 位计数器 if( 0X80 else GPIO_ResetBits( GPIOB, sda); dat = 1; GPIO_SetBits(GPIOB, scl);/拉高时钟线 Delay_5us();/延时 GPIO_ResetBits(GPIOB, scl);/拉低时钟线 Delay_5us();/延时 BH1750_RecvACK(); uchar BH1750_RecvByte() uchar i; uchar dat = 0; uchar bit; GPIO_InitTypeDef GPIO_InitStruct; GPIO_InitStruct.GPIO_M
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号