找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6062|回复: 3
打印 上一主题 下一主题
收起左侧

PCF8591 ADC电压采样

[复制链接]
跳转到指定楼层
楼主
ID:86791 发表于 2015-7-26 11:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. -------------------------------------------------------
  2. 文件名: IIC_drv.c
  3. 描述: IIC通信驱动c文件
  4. 作者:
  5. =========================================================
  6. -----------------------------------------------------------------------------------------------------------*/
  7. #include "IIC_drv.h"

  8. /**********************************************
  9. 功能:
  10.     起始信号
  11. 输入参数:
  12.     无
  13. 输出参数:
  14.     无
  15. 返回值:
  16. **********************************************/
  17. static void Start(void)
  18. {
  19.         Sda = 1;
  20.         Scl = 1;
  21.         Sda = 0;
  22. }

  23. /**********************************************
  24. 功能:
  25.     停止信号
  26. 输入参数:
  27.     无
  28. 输出参数:
  29.     无
  30. 返回值:
  31. **********************************************/
  32. static void Stop(void)
  33. {
  34.         Sda = 0;
  35.         Scl = 1;
  36.         Sda = 1;
  37. }

  38. /**********************************************
  39. 功能:
  40.     应答位
  41. 输入参数:
  42.     无
  43. 输出参数:
  44.     无
  45. 返回值:
  46.         设备是否应答
  47.         1:应答;0:应答
  48. **********************************************/
  49. static unsigned char Respons(void)
  50. {
  51.         unsigned char OverTime = 0;  //超时
  52.         unsigned char TempFlag = 0;
  53.         OverTime = 0;
  54.     Sda = 1;     //释放数据线
  55.     Scl = 1;
  56.         while(1)
  57.         {
  58.                 if(Sda)   //应答信号没来
  59.                 {
  60.                         if(OverTime++ > 200)
  61.                         {
  62.                            TempFlag = 0;   //应答信号长时间没有来,认为无应答
  63.                            break;
  64.                         }
  65.                 }
  66.                 else
  67.                 {
  68.                     TempFlag = 1;    ///检测到应答信号
  69.                         break;
  70.                 }
  71.         }
  72.         Scl = 0;
  73.         return 1;
  74. }

  75. /**********************************************
  76. 功能:
  77.     非应答位
  78. 输入参数:
  79.     无
  80. 输出参数:
  81.     无
  82. 返回值:
  83. **********************************************/
  84. static void NoRespons(void)  //非应答
  85. {
  86.     Sda = 1;     //释放数据线
  87.     Scl = 1;
  88.         Scl = 0;
  89. }

  90. /**********************************************
  91. 功能:
  92.     写字节
  93. 输入参数:
  94.     temp: 要写的字节参数
  95. 输出参数:
  96.     无
  97. 返回值:
  98. **********************************************/
  99. static void WriteByte(unsigned char temp)
  100. {
  101.         unsigned char i;
  102.         Scl = 0;
  103.         for(i = 0;i < 8;i++)
  104.         {
  105.                 Sda = temp & 0x80;
  106.                 temp <<= 1;
  107.                 Scl = 1;    //scl拉高,准备写数据
  108.                 Scl = 0;   //scl拉低,写数据完成
  109.         }
  110. }

  111. /**********************************************
  112. 功能:
  113.     读字节
  114. 输入参数:
  115.     无
  116. 输出参数:
  117.     无
  118. 返回值:
  119.     读取的字节
  120. **********************************************/
  121. static unsigned char ReadByte(void)
  122. {
  123.         unsigned char i;
  124.         unsigned char x = 0;
  125.         for(i = 0;i < 8;i++)
  126.         {
  127.                 Scl = 1;
  128.                 x <<= 1;
  129.                 x |= (unsigned char)Sda;
  130.                 Scl = 0;        
  131.         }
  132.         return x;
  133. }

  134. /**********************************************
  135. 功能:
  136.     写数据到对应设备
  137. 输入参数:
  138.     device:   设备地址
  139.     parameter:参数
  140.     temp:     写入的内容
  141. 输出参数:
  142.     无
  143. 返回值:
  144. **********************************************/
  145. void WriteIIC(unsigned char device,unsigned char parameter,unsigned char temp)
  146. {
  147.         Start();
  148.         WriteByte(device);
  149.         if(Respons())
  150.         {
  151.                 WriteByte(parameter);
  152.                 if(Respons())
  153.                 {
  154.                         WriteByte(temp);
  155.                         if(Respons())
  156.                         {
  157.                                 Stop();
  158.                         }
  159.                         else
  160.                         {
  161.                                 Stop();
  162.                         }
  163.                 }
  164.                 else
  165.                 {
  166.                         Stop();
  167.                 }
  168.         }
  169.         else
  170.         {
  171.                 Stop();
  172.         }
  173. }

  174. /**********************************************
  175. 功能:
  176.     从对应设备读取数据
  177. 输入参数:
  178.     device:   设备地址
  179.     parameter:参数
  180. 输出参数:
  181.     无
  182. 返回值:
  183.     读取的内容
  184. **********************************************/
  185. unsigned char ReadIIC(unsigned char device,unsigned char parameter)
  186. {
  187.         unsigned char x;
  188.         Start();
  189.         WriteByte(device);
  190.         if(Respons())
  191.         {
  192.                 WriteByte(parameter);
  193.                 if(Respons())
  194.                 {
  195.                         Start();
  196.                         WriteByte(device | 0x01);
  197.                         if(Respons())
  198.                         {
  199.                                 x = ReadByte();
  200.                                 NoRespons();
  201.                                 Stop();
  202.                         }
  203.                         else
  204.                         {
  205.                                 Stop();
  206.                         }
  207.                 }
  208.                 else
  209.                 {
  210.                         Stop();
  211.                 }
  212.         }
  213.         else
  214.         {
  215.                 Stop();
  216.         }
  217.         return x;
  218. }

  219.         
复制代码

---------------------------------------------------------
文件名: digitron_drv.c
描述: 数码管模块驱动c文件
作者:
=========================================================
-----------------------------------------------------------------------------------------------------------*/
#include "digitron_drv.h"

code uint8 Segment[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
code uint8 Select[] = {0xff,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

/**********************************************
功能:
    输出位选字节和段码字节
输入参数:
    SelectByte:  位选字节
    SegmentByte: 段码字节
输出参数:
    无
返回值:
**********************************************/
static void DigOutput(uint8 SelectByte, uint8 SegmentByte)
{
    uint8 i;
   
        DIG_SHCP = 0;
        DIG_STCP = 0;

        for(i=0; i<8; i++)
        {
            if(SegmentByte&0x80)
        {
                DIG_DATA = 1;
        }
                else
        {
                    DIG_DATA = 0;
        }
                _nop_();
                DIG_SHCP = 1;
                _nop_();
                DIG_SHCP = 0;
                _nop_();
                SegmentByte <<= 1;
        }
        for(i=0; i<8; i++)
        {
            if(SelectByte&0x80)
                DIG_DATA = 1;
                else
                    DIG_DATA = 0;
                _nop_();
                DIG_SHCP = 1;
                _nop_();
                DIG_SHCP = 0;
                _nop_();
                SelectByte <<= 1;
        }
        DIG_STCP = 1;
        _nop_();
        DIG_STCP = 0;
        _nop_();
}

/**********************************************
功能:
    在某位显示自定义段码
输入参数:
    DigSelect: 数码管位选择(1——8,即最右到最左)
    CustomSeg: 自定义段码值
输出参数:
    无
返回值:
**********************************************/
void DigShowCustom(uint8 DigSelect, uint8 CustomSeg)
{
    if(0<DigSelect<9)
    {
        DigOutput(Select[DigSelect],CustomSeg);
    }
}

/**********************************************
功能:
    在某位显示数字
输入参数:
    DigSelect: 数码管位选择(1——8,即最右到最左)
    Number:    数字(0——9)
    Dp:        小数点(1:显示;0:不显示)
输出参数:
    无
返回值:
**********************************************/
void DigShowNumber(uint8 DigSelect, uint8 Number, bit Dp)
{
    if((0<DigSelect<9)&&(Number<10))
    {
        if(Dp)
            {
            DigOutput(Select[DigSelect],(Segment[Number]&~0x80));
            }
            else
            {
            DigOutput(Select[DigSelect],(Segment[Number]|0x80));
            }
    }
}


/**********************************************
功能:
    初始化数码管,使数码管全灭
输入参数:
    无
输出参数:
    无
返回值:
**********************************************/
void DigInit(void)
{
    DIG_DATA = 0;
        DIG_SHCP = 0;
        DIG_STCP = 0;
    DigOutput(0x00,0xff);
}
#include "PCF8591_AD_drv.h"

/**********************************************
功能:
    配置PCF8591的工作模式
输入参数:
    anlog_sw:  模拟信号输出开关
    input_model:  模拟输入模式设置
    auto_increment: 通道自动增量设置
    AD_channel:模拟转换通道设置
输出参数:
    无
返回值:
    配置完成后的控制字节
**********************************************/

unsigned char model_set(bit anlog_sw,unsigned char input_model,bit auto_increment,unsigned char AD_channel)
{
        unsigned char Control_Key;
        Control_Key = 0x00;
        if(anlog_sw)
        {
                Control_Key |= 0x40;
        }
        input_model = input_model << 4;
        Control_Key |= input_model;
        if(auto_increment)
        {
                Control_Key |= 0x04;
        }
        Control_Key |= AD_channel;
        return Control_Key;
}



---------------------------------------------------------
文件名: PCF8591_AD.c
描述: AD采集温度,光照强度变化
作者:
=========================================================
-----------------------------------------------------------------------------------------------------------*/
#include <reg52.h>
#include "digitron_drv.h"
#include "IIC_drv.h"
#include "PCF8591_AD_drv.h"

/**********************************************
功能:
    数码管显示
输入参数:
    Data: 数据
输出参数:
    无
返回值:
**********************************************/
void Display(unsigned int Data1,unsigned int Data2)
{
        DigShowNumber(8,Data1/100,0);
        DigShowNumber(7,Data1%100/10,0);
        DigShowNumber(6,Data1%10,0);
        
        DigShowNumber(3,Data2/100,0);
        DigShowNumber(2,Data2%100/10,0);
        DigShowNumber(1,Data2%10,0);
}  

/*---------------------------------------------------------------------------------------------------------*/
/**********************************************
    主函数
**********************************************/
void main()
{
        unsigned char model;
        unsigned char hot,light;
        while(1)
        {
                model = model_set(anlog_output_off,anlog_model_0,auto_increment_off,anlog_channel_0);
                hot = ReadIIC(0x90,model);

                model = model_set(anlog_output_off,anlog_model_0,auto_increment_off,anlog_channel_1);
                light = ReadIIC(0x90,model);

                Display(hot,light);
        }
}

好东西值得拥有

PCF8591 ADC电压采样.pdf

2.81 MB, 下载次数: 54, 下载积分: 黑币 -5

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:91448 发表于 2015-10-1 16:38 | 只看该作者
谢谢分享。。。
回复

使用道具 举报

板凳
ID:285225 发表于 2018-2-26 22:56 | 只看该作者
谢谢分享
回复

使用道具 举报

地板
ID:273583 发表于 2018-4-10 06:53 | 只看该作者
谢谢 !锐志开发板上就用的这个,就是不见开发板的视频教程!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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