基于MSP430F149与BH1750FVI进行光强度的值在LCD1602显示

发布者:心连心意最新更新时间:2015-09-08 来源: eefocus关键字:MSP430F149  BH1750FVI  LCD1602 手机看文章 扫描二维码
随时随地手机看文章
BH1750FVI是IIC总线协议的数字型光强度传传感器集成电路,以下是它程序:

#include "io430x14x.h"
typedef unsigned int uint;
typedef unsigned char uchar;

#define SCL_H P3OUT |= BIT6//此IO在硬件上需要更改
#define SCL_L P3OUT &= ~BIT6
#define SDA_H P3OUT |= BIT7
#define SDA_L P3OUT &= ~BIT7

#define SDA_IN  P3DIR &= ~BIT7   //SDA改成输入模式
#define SDA_OUT P3DIR |= BIT7    //SDA变回输出模式
#define SDA_VAL P3IN&BIT7        //SDA的位值

#define DataDir     P4DIR
#define DataPort    P4OUT    
#define Busy     0x80
#define CtrlDir     P5DIR
#define CLR_RS P5OUT&=~BIT0    //RS = P5.0 
#define SET_RS P5OUT|=BIT0 
#define CLR_RW P5OUT&=~BIT1 //RW = P5.1
#define SET_RW P5OUT|=BIT1 
#define CLR_EN P5OUT&=~BIT2 //EN = P5.2 
#define SET_EN P5OUT|=BIT2 

#define _NOP()  __no_operation()
#define SlaveAddress 0x46  //定义器件在IIC总线中的从地址,根据ALT  ADDRESS地址引脚不同修改
                                //ALT  ADDRESS引脚接地时地址为0xA6,接电源时地址为0x3A
unsigned char ge,shi,bai,qian,wan;  //显示变量
int dis_data; 
uchar BUF[8];
void Delay5us(void)
{
    uchar i;
   
 for(i = 0;i < 15;i++);
   _NOP();

void Delay5ms(void)
{
    uint i=40000;
    while (i != 0)
    {
        i--;
    }
}

void delay(uint x)
{
  uchar i;
  while(x--)for(i=0;i<125;i++);
}

void BH1750_Start()
{
  SDA_H;                    //拉高数据线
  SCL_H;                    //拉高时钟线
  Delay5us();                 //延时
  SDA_L;                    //产生下降沿
  Delay5us();                 //延时
  SCL_L;                    //拉低时钟线
}
void BH1750_Stop()
{
  SDA_L;                    //拉低数据线
  SCL_H;                    //拉高时钟线
  Delay5us();                 //延时
  SDA_H;                    //产生上升沿
  Delay5us();                 //延时
}

void BH1750_SendACK(void)
{
  SDA_L;                  //写应答信号
  _NOP();_NOP();
  SCL_H;                    //拉高时钟线
  Delay5us();                  //延时
  SCL_L;                    //拉低时钟线
  _NOP();_NOP();
  SDA_H;
  Delay5us();                 //延时
}

void mnack(void)
{
  SDA_H;
  _NOP(); _NOP();
  SCL_H;
  Delay5us();
  SCL_L;
  _NOP(); _NOP();
  SDA_L;  
  Delay5us();      
}

uchar BH1750_RecvACK()
{
  uchar ack;
 
  SDA_H;
  _NOP(); _NOP();
  SCL_H;
  _NOP(); _NOP();
  SDA_IN;
  _NOP(); _NOP();
  ack = SDA_VAL;   //读入SDA数值
  SCL_L;
  Delay5us();
  SDA_OUT;
  if(ack)    return 0;
  else            return  1;
}

void write1(void)
{
  SDA_H;
  //Delay5us();
  SCL_H;
  Delay5us();
  SCL_L;    
  Delay5us();
}

void write0(void)
{
  SDA_L;
 // Delay5us();
  SCL_H;
  Delay5us();   
  SCL_L;    
  Delay5us();
}
void BH1750_SendByte(unsigned char dat)
{
    unsigned char i;
   
    for (i = 0; i < 8; i++)
    {        //8位计数器
       if(dat&0x80)
         write1();
       else
         write0();
       dat <<= 1;              //移出数据的最高位
    }
    BH1750_RecvACK();
}

unsigned char BH1750_RecvByte()
{
  unsigned char i;
  unsigned char dat = 0,flag;
 
  SDA_H;                     //使能内部上拉,准备读取数据,
  for (i = 0; i < 8; i++)
  {       //8位计数器
    //SDA_H;
    //Delay5us();
    SCL_H;
    SDA_IN;
    Delay5us();
    flag=SDA_VAL;
    dat <<= 1;
    if(flag)
      dat|=0x01;
    SDA_OUT;
    SCL_L;
    Delay5us();
  }
  return dat;
}
[page] 
void Single_Write_BH1750(unsigned char REG_Address)
{
 BH1750_Start();                  //起始信号
 BH1750_SendByte(SlaveAddress);   //发送设备地址+写信号
 BH1750_SendByte(REG_Address);    //内部寄存器地址,请参考中文pdf22页
 //  BH1750_SendByte(REG_data);       //内部寄存器数据,请参考中文pdf22页
 BH1750_Stop();                   //发送停止信号
}
void Init_BH1750()
{
  Single_Write_BH1750(0x01); 
}

void Multiple_Read_BH1750(void)
 
 unsigned char i; 
 BH1750_Start();                          //起始信号
 BH1750_SendByte(0x47);         //发送设备地址+读信号
 
 for (i = 0; i < 3; i++)                      //连续读取6个地址数据,存储中BUF
  BUF[i] = BH1750_RecvByte();          //BUF[0]存储0x32地址中的数据
  if (i == 3) { 
  
 
       mnack();                //最后一个数据需要回NOACK
  }
  else {
   
       BH1750_SendACK();                //回应ACK
  }
 }
 BH1750_Stop();                          //停止信号
 Delay5ms();
}
void conversion(unsigned int 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 WaitForEnable(void) 
    
    DataDir &= 0x00;  
 
    CLR_RS;
    SET_RW;
    _NOP();
    SET_EN;
    _NOP();
    _NOP();
 
    while((P4IN & Busy)!=0);  //检测忙标志   //STA7为0 允许读写操作使能则退出循环

    CLR_EN;

    DataDir |= 0xFF;  //将P4口切换为输出状态   
   
void WriteCommandLCM(unsigned char CMD,uchar Attribc)
    
    if(Attribc)
      WaitForEnable(); 
    CLR_RS;
    CLR_RW;
    _NOP();
    DataPort = CMD;
    _NOP(); 
    SET_EN;
    _NOP();
    _NOP();
    CLR_EN;
    

void WriteDataLCM(unsigned char dataW)
    
  WaitForEnable();  
  SET_RS;
  CLR_RW;
  _NOP();
  DataPort = dataW;
  _NOP(); 
  SET_EN;
  _NOP();
  _NOP();
  CLR_EN;
 
void InitLcd()    

  CtrlDir |= 0x07;                 //控制线端口设为输出状态
  DataDir  = 0xFF;                 //数据端口设为输出状态
  WriteCommandLCM(0x38,0); 
  delay(15);
  WriteCommandLCM(0x08,1);
  delay(1);
  WriteCommandLCM(0x01,1); 
  delay(1);
  WriteCommandLCM(0x06,1); 
  delay(1);
  WriteCommandLCM(0x0c,1);
  delay(1);
  
void DisplayOneChar(unsigned char X,unsigned char DData)
     
   X |= 0x80;        
  WriteCommandLCM(X,0);  
  WriteDataLCM(DData);  
}

void inmaindispaly()
{
  uint temp;
  dis_data=BUF[0];
  dis_data=(dis_data<<8)+BUF[1];//合成数据
 
  temp=dis_data;
 
  conversion(temp);         //计算数据和显示
  DisplayOneChar(0,'L');
  DisplayOneChar(1,'i');
  DisplayOneChar(2,'g');
  DisplayOneChar(3,'h');
  DisplayOneChar(4,'t');
  DisplayOneChar(5,':');
 
  DisplayOneChar(7,wan); //显示数据
  DisplayOneChar(8,qian); 
  DisplayOneChar(9,bai);
  DisplayOneChar(10,shi);
  DisplayOneChar(11,ge);
 
  DisplayOneChar(13,'l'); ////显示数单位
  DisplayOneChar(14,'x');

 

 

int main( void )
{
  P4DIR=0XFF;
  P5DIR|=0X07;
  P3DIR|=0XC0;
  WDTCTL = WDTPW + WDTHOLD;// Stop watchdog timer to prevent time out reset
   delay(20);     //延时200ms 
  InitLcd();           //初始化LCD
  Init_BH1750();       //初始化BH1750
 
  while(1)
  {
    Single_Write_BH1750(0x01);   // power on
    Single_Write_BH1750(0x10);   // H- resolution mode
   
    delay(180);              //延时180ms
   
    Multiple_Read_BH1750();       //连续读出数据,存储在BUF中
   
   
    inmaindispaly();
    delay(1000);

  }
}

关键字:MSP430F149  BH1750FVI  LCD1602 引用地址:基于MSP430F149与BH1750FVI进行光强度的值在LCD1602显示

上一篇:MSP430F44X单片机SPI接口驱动C语言程序
下一篇:MSP430F149单片机的内部定时器A定时1秒钟实现LED闪烁

推荐阅读最新更新时间:2024-03-16 14:30

【C51】源码 5 -- LCD 1602 显示字符
LCD 1602,正式说法叫 LCM 1602(包括了一些外围电路),一般用来显示简单的字符,也可以通过自定义的方式 造字 。 刚学会基本的字符显示,仅仅是字符显示就大量应用了各种指令格式,姑且在这个阶段写个程序,总结一下: 程序功能:在 LCD 正中央显示字符: Hello World 、 By Fate 注:LCD 1602 的使用: http://gaebolg.blog.163.com/blog/static/198269068201231665524137/ 附上源码:(初出茅庐,难免有写的不好的地方,仅作备份之用,欢迎指点,喷子退散 ) /*----------------------------------
[单片机]
MSP430F149的串口RS232接口
1、 概述 具有同步串口模式(SPI),异步通信模式(UART)。 作异步通信时,P3.4,P3.5,P3.6,P3.7第二功能分别是UTXD0, URXD0, UTXD1, UTXD2 2、 使用方法概述 2.1 程序架构 配置寄存器设置工作模式 { 设置IO口为第二功能作为串口收发引脚; 使能串口收发功能; 选择每帧数据位为7或8; 选择波特率发生器时钟源; 配置波特率(查表得出值再配置UxBR0, UxBR1,UxMCTL); 软件清除串口复位位(SWRST); 若采用中断方式则使能接受、发送中断 } 编写接受/发送程序,可采用查询方式或中断方式。同51单片机不同的是,UTXIFG,
[单片机]
PIC16F1933点亮LCD1602(汇编)
; ; TEST-GPIO ; ; FileName: main.S ; Dependencies: p16f1933.h ; ; Processor: PIC16F1933 ; ; Complier: GPASM ; ; Company: xx ; ; Author: Perry.Peng@xx.com ; ; just do a demonstration of pic16f1933. ; ; Features used: ; - GPIO ; - Timer1 ; ; Description: ; demo program. ; ; Notes: ; -
[单片机]
基于MSP430F149的应用实例
#include msp430x14x.h #include in430.h #include stdio.h #define RS 0x01 //寄存器选择信号(1--Command, 0--data) #define RW 0x02 //读/写选择信号 #define EN 0x04 //使能信号 #define BIT_0 0x01 #define BIT_1 0x02 #define BIT_2 0x04 #define BIT_3 0x08 #define BIT_4 0x10 #define BIT_5 0x20 #define BIT_6 0x40 #define
[单片机]
MSP430F149单片机实现温控仪
  引言   温度控制对于工业和日常生活等领域都具有广阔的应用前景,很多应用领域,需要精度较高的恒温控制,由于其控制具有非线性、时滞性和不确定性,用传统的控制达不到好的控制效果。模糊控制是一种基于规则的控制,它直接采用语言型控制规则,出发点是现场操作人员的控制经验或相关专家的知识,其鲁棒性强,干扰和参数变化对控制效果的影响被大大减弱,所以特别适合于0~100℃温度的精确控制。   MSP430系列单片机是一个16位的、具有精简指令集的、超低功耗的混合型单片机。MSP430F149单片机采用了精简指令(RISC),具有丰富的寻址方式(7种源操作数寻址、4种目的操作数寻址)、简洁的27条内核指令以及大量的模拟指令,大量的寄存器以及
[单片机]
<font color='red'>MSP430F149</font>单片机实现温控仪
采用AT89C51+ADC0832+LCD1602的电子称设计
电子称设计,主要用于菜市场的电子称,可以设置价格,根据价格和重量计算出金额,该设计采用了Proteus仿真软件,采用AT89C51为主控,采用ADC0832芯片来进行ADC的转换,采用LCD1602显示屏显示,同时设计了矩阵键盘用于输入价格。设计难度3颗星(满星为5颗)。 首先设计电路图,由于模块不多,所以接口可以随意分配,电路仿真图如下图1。 设计时需要一步一步进行设计,一般设计开始尽量将人机交互的模块优先级调高。这里呢就优先对LCD1602进行设计,驱动程序如下: void wrc(uint8 c) { delay(1); rs=0; rw=0; e=0; P0=c; e=1; del
[单片机]
采用AT89C51+ADC0832+<font color='red'>LCD1602</font>的电子称设计
pic 单片机DS18B20采样 LCD1602显示
#include 1602.h #include 18b20.h #include main.h __CONFIG(0X0B31); main() { char msg = { Temperature: , .C }; delay_us2 (40, 40); delay_us2 (100, 200); initial(); while(1) { start_convert(); change_to_ascii (get_temp (), &msg ); display2(&msg ,&msg ); } } //------------------
[单片机]
基于硅压式传感器和MSP430F149单片机的电子血压计设计
  1 引言   测量血压的传统仪器是机械式水银血压计,电子血压计近几年才在市场上出现。电子血压计与传统血压计相比,虽然操作简单、使用方便,但准确性、稳定性往往不太理想。本设计力求准确、稳定,以适用于老年人或病人随时监测自己血压情况及临床医学检测。   2 系统的硬件设计   本设计采用Motorola公司的MPX53GC硅压式传感器和TI公司MSP430F149单片机为主要器件, 构成电子血压计,系统构成如图1。系统由MCU、 传感器、LCD液晶显示器、操作面板、充放气控制 电路、气泵和气阀、蜂鸣器、存贮器、电源等部分 构成。      2.1 微处理器的选择   单片机是整个系统的大脑,它不仅要对系统进 行
[单片机]
基于硅压式传感器和<font color='red'>MSP430F149</font>单片机的电子血压计设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved