找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5144|回复: 6
收起左侧

BMP180基于MSP430F149的气压海拔1602显示

[复制链接]
ID:341530 发表于 2019-3-17 10:59 | 显示全部楼层 |阅读模式
#include <msp430x14x.h>
#include"IIC.h"
typedef unsigned char uchar;
typedef unsigned int  uint;

#define SCL_H P2OUT |= BIT1
#define SCL_L P2OUT &= ~BIT1
#define SDA_H P2OUT |= BIT0
#define SDA_L P2OUT &= ~BIT0

#define SDA_IN  P2DIR &= ~BIT0   //SDA改成输入模式
#define SDA_OUT P2DIR |= BIT0    //SDA变回输出模式
#define SDA_val P2IN&BIT0        //SDA的位值

#define TRUE    1
#define FALSE   0

/*******************************************
函数名称:delay
功    能:延时约15us的时间
参    数:无
返回值  :无
********************************************/
void delay(void)
{
    uchar i;

        for(i = 0;i < 15;i++)
          _NOP();
}       
/****************************
初始化IIC//新加
********************************/
void IIC_180Init(void)
{   

    SCL_H;  //SCL = 1;
  _NOP();_NOP();
    SDA_H;  //SDA = 1;
   _NOP();_NOP();   
}

/*******************************************
函数名称:start
功    能:完成IIC的起始条件操作
参    数:无
返回值  :无
********************************************/
void start(void)
{
        SCL_H;//拉时钟据线
        SDA_H;//拉高数据线
        delay();//延时
        SDA_L;//产生下降沿
        delay();//延时
        SCL_L;//拉低时钟线
        delay();
}
/*******************************************
函数名称:stop
功    能:完成IIC的终止条件操作
参    数:无
返回值  :无
********************************************/
void stop(void)
{
        SDA_L;//拉低数据线
        delay();//延时
        SCL_H;//拉高时钟线
        delay();//延时
        SDA_H;//产生上升沿
        delay();          
}
/***********************************
IIC接受ACK信号
**********************************/
uchar IIC_ReceiveACK(void)
{
   uchar ACK,SDA_K;

    SDA_H;     //SDA=1;//要读低电平需先拉高再读,否则读到的是错误数据,很重要!
    SCL_H;     //SCL=1;
   _NOP();_NOP();
    SDA_IN;
    SDA_K=SDA_val;
    if (SDA_K==1)  //SDA为高
    {
        ACK = 1;   
    }
    else ACK = 0;  //SDA为低


    SCL_L;    //SCL = 0;//SCL为低电平时SDA上的数据才允许变化,为传送下一个字节做准备
     _NOP();_NOP();

    return ACK;                 
}
/************************************
iic发送ACK
**********************************/
void IIC_SendACK(uchar ack)
{
    if (ack == 1)
    {SDA_H;}
    else if (ack == 0)
    {SDA_L;}
    //SDA = ack;
    SCL_H;   //SCL = 1;
      _NOP();_NOP();
    SCL_L;   //SCL = 0;
      _NOP();_NOP();
}
/*******************************
IIC发送字节数据
*********************/
uchar IIC_SendByte(uchar dat)
{
    uchar i;
    uchar bResult=1;

    SCL_L;     //SCL = 0;//拉低时钟线
      _NOP();_NOP();     

    for( i=0;i<8;i++ ) //一个SCK,把dat一位一位的移送到SDA上
    {
        if( (dat<<i)&0x80 )
        {SDA_H; }  //SDA = 1;//先发高位
        else {SDA_L;}  //SDA = 0;
    _NOP();_NOP();

        SCL_H;  //SCL = 1;
        _NOP();_NOP();
        SCL_L;  //SCL = 0;
     _NOP();_NOP();
    }

    bResult=IIC_ReceiveACK(); //发送完一个字节的数据,等待接受应答信号

    return bResult;  //返回应答信号
}
/*******************************
IIC读数据
************************************/
uchar IIC_ReadByte(void)
{
    uchar dat,SDA_K;
    uchar i;

    SCL_H;     //SCL = 1;//始终线拉高为读数据做准备
       _NOP();_NOP();

    for( i=0;i<8;i++ )
    {
        dat <<= 1;
        SDA_IN;
        SDA_K=SDA_val;

        //dat = dat | (SDA_K);
        if(SDA_K)dat=dat|0x01;
   _NOP();_NOP();

        SCL_L;   //SCL = 0;
     _NOP();_NOP();   
        SCL_H;   //SCL = 1;
     _NOP();_NOP();  
    }
    return dat;
}

/*******************************************
函数名称:write1
功    能:向IIC总线发送一个1
参    数:无
返回值  :无
********************************************/
void write1(void)
{
        SDA_H;
        delay();
        SCL_H;
        delay();
        SCL_L;                               
        delay();
}
/*******************************************
函数名称:write0
功    能:向IIC总线发送一个0
参    数:无
返回值  :无
********************************************/
void write0(void)
{
        SDA_L;
        delay();
        SCL_H;
        delay();                         
        SCL_L;                               
        delay();
}
/*******************************************
函数名称:write1byte
功    能:向IIC总线发送一个字节的数据
参    数:wdata--发送的数据
返回值  :无
********************************************/
void write1byte(uchar wdata)
{
        uchar i;

        for(i = 8;i > 0;i--)
        {
                if(wdata & 0x80)        write1();
                else                             write0();
                wdata <<= 1;
        }                  
       
        SDA_H;
        _NOP();   
}
/*******************************************
函数名称:writeNbyte
功    能:向IIC总线发送N个字节的数据
参    数:outbuffer--指向发送数据存放首地址
          的指针
          n--数据的个数
返回值  :发送是否成功的标志:1--成功,0--失败
********************************************/
uchar writeNbyte(uchar * outbuffer,uchar n)
{
        uchar i;

        for(i = 0;i < n;i++)
        {
                write1byte(* outbuffer);
                if(check())      
                {
                        outbuffer++;                       
                }
                else
                {
                        stop();
                        return FALSE;
                }
        }

        stop();
        return TRUE;                       
}


显示气压温度海拔.rar

49.8 KB, 下载次数: 149, 下载积分: 黑币 -5

回复

使用道具 举报

ID:323277 发表于 2019-3-18 09:27 | 显示全部楼层
用msp430f149 串口通信编写lcd12864的显示程序有没有
回复

使用道具 举报

ID:521781 发表于 2019-4-25 21:16 | 显示全部楼层
这个程序都包括了吗?
回复

使用道具 举报

ID:521781 发表于 2019-4-26 21:50 | 显示全部楼层
这个程序可以用到MSP430 里吗
回复

使用道具 举报

ID:521781 发表于 2019-4-26 21:51 | 显示全部楼层
这个程序会在1602上显示吗
回复

使用道具 举报

ID:261045 发表于 2019-5-17 22:36 | 显示全部楼层
谢谢,不知道能不能用,先下载来看看再说!谢谢楼主!
回复

使用道具 举报

ID:933780 发表于 2021-6-6 15:54 | 显示全部楼层

谢谢楼主! 最近在研究怎么使用IIC
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表