历史上的今天

今天是:2024年09月18日(星期三)

正在发生

2020年09月18日 | 51单片机PCF8591 DA转换源码

发布者:明石轩 来源: 51hei关键字:51单片机  PCF8591  DA转换 手机看文章 扫描二维码
随时随地手机看文章

单片机源程序如下:

/**********************51实验开发板例程************************

*  平台:HJ-C52 + Keil U4 + STC89C52RD

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

/*-----------------------------------------------

  名称:IIC协议 PCF8591ADDA转换                  

  内容:此程序通过IIC协议对DAAD芯片操作, 并输出模拟量,用LED亮度渐变指示

------------------------------------------------*/

#include    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义

#include //包含NOP空指令函数_nop_();


#define AddWr 0x90   //写数据地址

#define AddRd 0x91   //读数据地址


sbit RST=P2^4;   //关掉时钟芯片输出

sbit Sda=P2^0;      //定义总线连接端口

sbit Scl=P2^1;

sbit Fm=P2^3;          //FM

sbit dula=P2^6;

sbit wela=P2^7;

bit ADFlag;          //定义AD采样标志位

unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表

data unsigned char  Display[8];//定义临时存放数码管数值

/*------------------------------------------------

                    延时程序

------------------------------------------------*/

void mDelay(unsigned char j)

{

  unsigned int i;

  for(;j>0;j--)

     {

          for(i=0;i<125;i++)

             {;}

          }

  }

/*------------------------------------------------

                    初始化定时器1

------------------------------------------------*/

void Init_Timer1(void)

{

TMOD |= 0x10;                             

TH1=0xff;                              /* Init value */

TL1=0x00;

//PT1=1;                   /* 优先级    */

EA=1;                      /* interupt enable */

ET1=1;                     /* enable timer1 interrupt */

TR1=1;  

}

/*------------------------------------------------

                    启动IIC总线

------------------------------------------------*/

  void Start(void)

  {

   Sda=1;

   _nop_();

   Scl=1;

   _nop_();

   Sda=0;

   _nop_();

   Scl=0;

  }



/*------------------------------------------------

                    停止IIC总线

------------------------------------------------*/

  void Stop(void)

  {

   Sda=0;

   _nop_();

   Scl=1;

   _nop_();

   Sda=1;

   _nop_();

   Scl=0;

   }



/*------------------------------------------------

                   应答IIC总线

------------------------------------------------*/

   void Ack(void)

   {

    Sda=0;

        _nop_();

        Scl=1;

        _nop_();

        Scl=0;

        _nop_();

        }



/*------------------------------------------------

                 非应答IIC总线

------------------------------------------------*/

        void NoAck(void)

        {

         Sda=1;

         _nop_();

         Scl=1;

         _nop_();

         Scl=0;

         _nop_();

         }



/*------------------------------------------------

              发送一个字节

------------------------------------------------*/

         void Send(unsigned char Data)

         {

          unsigned char BitCounter=8;

          unsigned char temp;


          do

            {

                 temp=Data;

                 Scl=0;

                 _nop_();

                 if((temp&0x80)==0x80)

                    Sda=1;

                 else

                    Sda=0;


                        Scl=1;

                        temp=Data<<1;

                        Data=temp;

                        BitCounter--;

                  }

          while(BitCounter);

              Scl=0;

          }



/*------------------------------------------------

               读入一个字节并返回

------------------------------------------------*/

          unsigned char Read(void)

          {

           unsigned char temp=0;

           unsigned char temp1=0;

           unsigned char BitCounter=8;


           Sda=1;

           do

             {

                  Scl=0;

          _nop_();

                  Scl=1;

                  _nop_();

                  if(Sda)

                     temp=temp|0x01;

                  else

                     temp=temp&0xfe;


                  if(BitCounter-1)

                     {

                          temp1=temp<<1;

                          temp=temp1;

                          }

                          BitCounter--;

                         }

                while(BitCounter);

                return(temp);

          }


/*------------------------------------------------

                    写入DA数模转换值

------------------------------------------------*/

          void DAC(unsigned char Data)

          {

                   Start();

                   Send(AddWr); //写入芯片地址

                   Ack();

                   Send(0x40);  //写入控制位,使能DAC输出

                   Ack();

                   Send(Data);  //写数据

                   Ack();

                   Stop();

                 

           }


/*------------------------------------------------

                 读取AD模数转换的值,有返回值

------------------------------------------------*/

          unsigned char ReadADC(unsigned char Chl)

          {

       unsigned char Data;

                   Start();        //写入芯片地址

                   Send(AddWr);

                   Ack();

                   Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加

                                  //Chl的值分别为0、1、2、3,分别代表1-4通道

                   Ack();

                   Start();

                   Send(AddRd);    //读入地址

                   Ack();

                   Data=Read();    //读数据

                   Scl=0;

                   NoAck();

                   Stop();

                   return Data;   //返回值

[1] [2]
关键字:51单片机  PCF8591  DA转换 引用地址:51单片机PCF8591 DA转换源码

上一篇:单片机汇编 设晶振频率为11.0592M,串口工作方式1
下一篇:rs485 16路继电器控制板 仿modbus通信协议控制有上下位机程序

推荐阅读

世界物联网博览会在无锡举行,智能交通与车联网成为焦点之一。在此期间,全球第一个城市级车路协同平台——“车联网(LTE-V2X)城市级示范应用”首次集中展示。 在物博会期间,一个重要的合作宣布也引发了汽车和无线通信行业的关注:中国移动研究院、中移物联网有限公司和Qualcomm发布了符合3GPP Release 14 LTE-V2X直接通信的路侧单元(RSU),以求共...
一、写在前面之前开发STM32,大家常见的就是使用寄存器、或者标准外设库进行开发。但是,从15、16年开始,ST逐渐停止了对标准外设库的更新和维护,转向了HAL和LL库。·SPL:Standard Peripheral Library标准外设库·HAL:Hardware Abstraction Layer硬件抽象层库·LL:Low-layer底层库我写STM32CubeMX系列教程有两个原因:1.停止标准库更新,使用STM32...
摘要:设计了基于FPGA 与ARM 芯片的数据采集系统,FPGA 负责控制A/D 转换器,保证了采样精度与处理速度,ARM 负责逻辑控制及与上位机交互的实现,并将采集到的数据通过USB 高速上传至主机进行实时处理。对模拟数据采集的测试结果达到了较高的采样精度和速度,验证了整个系统的高速性和可行性。随着计算机技术与现代工业系统的发展,工业领域中对数据...
在...CMSISDeviceSTSTM32F10x中的stm32f10x.h,然后在结构体IRQn_Type找到对应单片机型号的代码片段。比如STM32F103C8T6属于STM32F10X_MD,那对应的中断源为:再比如STM32F103ZET6对应的是STM32F10X_HD

史海拾趣

问答坊 | AI 解惑

瑞萨MCU在汽车仪表及CAN/LIN应用中的解决方案

 瑞萨科技于2003年4月由日立制作所和三菱电机的半导体部门合并成立,致力于提供移动通信、汽车电子以及PC/AV(数码家电)领域的半导体解决方案。在全球汽车半导体市场中,瑞萨占有7.1%的市场份额,排名第四位;在日本市场中占据第一位,市场份额为 ...…

查看全部问答∨

ARM9嵌入式系统设计与开发教程

正在学习ARM9嵌入式系统,觉的不错,大家来分享一下…

查看全部问答∨

耳机修理

本帖最后由 jameswangsynnex 于 2015-3-3 19:57 编辑 耳机坏了,拆开发现左声道与地短路了,但是左声道好用,右声道却是坏的!! 请高手指点! …

查看全部问答∨

控制类方面

本帖最后由 paulhyde 于 2014-9-15 09:43 编辑 智能小车  …

查看全部问答∨

自制"心跳"显示机(初级版)

大家好,刚刚玩液晶,一直对动态波形的显示很有兴趣,于是买书看了几天,学会了画线,画圆,而且很想知道医用脉搏检测的原理,于是做了一个最简单的.家里只能找到这些东西,没有时间去做精细的设计,以后到赛格去买,慢慢完善,这次仅作原理验证,希望大家不要 ...…

查看全部问答∨

求:PC机彩信收发源码

如题!我公司想开发一款通过GPRS Modem在PC机上进行彩信收发的软件,寻求合作。 MSN:commcomponent@hotmail.com…

查看全部问答∨

嵌入式软件用到的测试工具都需要花钱买吗?

由于我现在正在给一个项目做软件测试,这个项目的程序是C实现的,而且是嵌入式开发项目。ps:我是在校学生,给老师干活~ 看到了很多工具,例如VcTester,codetest,UniText,Logiscope等等 ms很多都是只提供共享版和商业版,感觉下载测试软件比一 ...…

查看全部问答∨

tps767d301 给F28335供电问题

大家好!   我用F28335做了一块板子,电源用tps767d301来供电,内核电压1.9V与I/O电压3.3V都完全正常,程序不运行时TI_tps767d301芯片温度正常,但是一开始仿真运行程序是,其温度急剧升高,以致烫手,请问这是什么原因?电源电路完全照 ...…

查看全部问答∨

为什么我的eww格式文件打不开

我用iar打开eww格式文件,但是什么都看不到,不能正常打开,难道不是用iar打开的? 还是因为我的是win7系统?  …

查看全部问答∨

不知道错误出在哪了 求大侠帮忙

我的CCs在设置好,保存启动时出现Error  adding memory map range :End  address  is beyond target memory length 大侠们帮一忙 小弟谢谢了…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

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

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved