历史上的今天

今天是: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通信协议控制有上下位机程序

推荐阅读

苹果说今年的 iPhone 阵容上运行的是最智能、最强大的手机芯片。而从苹果的介绍来看,这个说法并没有什么不妥。新款 iPhone 使用的是 A12 仿生芯片,它代表了苹果 A 系列处理器的一次重要升级。 根据苹果的说法,A12 仿生处理器包含一个六核的 CPU、一个四核的 GPU 和新一代八核神经网络引擎(作为对比,去年的 A11 仿生芯片只有双核)。A1...
5G基站年内将达上万个,武汉抢占5G制高点 如果说电力是工业化的血液的话,那么网络连接就是工业化的神经。纵观世界一流城市,都拥有一流电网及通信网络。孙元章教授认为:“‘电’与‘网’的交织,可打通能源互联网的上下游,实现整个能源生态链共赢。” 这与武汉市构建地基性布局不谋而合,除了建设世界一流城市电网,目前武汉还在打造一张世界一流...
本文用LOTO示波器和5A的电流探头来实验两种常见类型的保险丝的保护曲线。一种是熔断型的,另一种是自恢复型的。我们通常需要在一些电路中对电流过大的情况做保护,比如防止用户把输出源短路,比如防止用户对电路灌入大电流烧毁。这种情况下,我们需要在需要保护的电路中串入保险丝。熔断型的保险丝原理是当电流增大,保险丝的温度升高,打到额定电流后烧断...
9月10日,海柔创新东莞沙田新工厂乔迁仪式正式举行。海柔创新联合创始人&COO房冰、现场约四十位员工代表与供应商伙伴共同见证了此次新工厂的落成时刻。沙田工厂剪彩现场图此次搬迁的新工厂位于东莞市沙田镇,占地18000平,机器人年产能可达10000台。工厂现有员工200余人,将承担海柔创新产品生产制造、供应链、质量等职能。房冰在致辞中讲到:“2016年,海柔创新...

史海拾趣

问答坊 | AI 解惑

我该学什么?

我的工作是搞水利工程的,现在都是自动化控制,就是用通过计算机来控制诸如闸门,电机啊等的开与关,我现在不知道该学什么? 请各为高手赐教,谢谢,另外,我在学校里学习的是C#语言,不知道能不能在现在的工作中应用?也就是说我能不能用C#语言写程序? 谢 ...…

查看全部问答∨

模拟地和数字地处理

就是一般单片机有,外围的元器件接地怎么判断是接模拟地,还是数字地?是根据元器件的性质,还是看通过的信号?…

查看全部问答∨

程序在Windwos CE运行变慢

有一个程序,在Windows Mobile上运行都很正常,可是在CE上运行就很慢,只是偶尔会运行正常下? 这是什么问题?找了很久,也用Sleep()可是不能解决? 大家帮帮忙,谢谢!…

查看全部问答∨

pda被识别为移动硬盘,请问如何解决

pda通过USB连接到PC,被识别为移动硬盘, 通过activesync检测时报USB错误 刚开始学wince编程,问题比较多,请大家多多指教…

查看全部问答∨

高手帮忙啊,关于CBitmapButton问题.

我在头文件中定义了一个CBitmapButton的对象 m_btn,然后我在OnInitDialog()函数中先m_btn.Create创建了一下,再用m_btn.LoadBitmaps(...)把位图加到按纽上;再调用m_btn.AutoLoad(..)为什么不能实现一个位图按纽在对话框上呢,求高手指点一下.先谢 ...…

查看全部问答∨

[交友贴]......

msn: wince.net@hotmail.com 杭州 wince开发…

查看全部问答∨

TI推出0.9V供电的低电压MSP430单片机

基本资源包括:两个16位定时器一个超低功耗8位AD一个8比特DA最多支持11个IO口基本特性如下:Ultra-Low Supply Voltage (ULV) Range0.9 V to 1.5 V (1 MHz)1.5 V to 1.65 V (4 MHz)Low Power ConsumptionActive Mode (AM): 45 μA/MHz (1.3 V)Standb ...…

查看全部问答∨

icl7135时钟输入频率对测试结果有影响吗

我用launchpad产生125k的频率,但是由于DCO并不是精确的1Mhz,产生出来的频率为133khz,这个对ICL7135测试的AD频率有影响吗,我看了网上的资料,好像这个频率只是影响转换速率,不会影响结果,各位帮我解决一下这个问题吧…

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

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

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

换一换 更多 相关热搜器件
随便看看

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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