51单片机PCF8591 DA转换源码

发布者:明石轩最新更新时间:2020-09-18 来源: 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通信协议控制有上下位机程序

推荐阅读最新更新时间:2024-11-17 01:18

51单片机教程(三):单片机串口通信实例
简介:上讲介绍并应用了单片机内部定时器和中断,并给出了实例。这一讲将介绍单片机上的串口通信。通过该讲,读者可以掌握单片机上串口的工作原理和如何通过程序来对串口进行设置,并根据所给出的实例实现与PC 机通信。 一、原理简介 51 单片机内部有一个全双工串行接口。什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行;既可接收又可发送,但不能同时进行的称为半双工;能同时接收和发送的串行口称为全双工串行口。串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信。其缺点是传输速度较低。 与之前一样,首先我们来了解单片机串口相关的寄存器。 SBUF 寄存器:它是两个
[单片机]
<font color='red'>51单片机</font>教程(三):单片机串口通信实例
51单片机学习历程《二》——数码管的显示
数码管的使用非常广泛,有段锁存和位锁存,段锁存来显示你想显示的数字,位锁存用来定位某个数码管,这样就能被你控制显示花样的东西了,非常有趣! 实例一: 八个数码管从左到右分别显示0,1,2,3.。。。,7。 示例二:电话号码滚动显示
[单片机]
<font color='red'>51单片机</font>学习历程《二》——数码管的显示
51单片机+74HC595驱动数码管程序
这里是电路图: 完整的源码和图纸下载地址: http://www.51hei.com/bbs/dpj-20392-1.html 下面是51单片机驱动74hc595芯片的程序: #include reg52.h //包含51单片机的头文件 #include stdio.h #define uint unsigned int #define uchar unsigned char //sbit sin_595 =P1^0; //sbit rclk_595 =P1^1; //sbit sclk_595 =P1^2; //sbit s_clr =P1^3; sbit a_cp_595
[单片机]
<font color='red'>51单片机</font>+74HC595驱动数码管程序
6位数字显示频率计数器电路及51单片机源程序
1.频率计算器功能 利用AT89S51单片机的T0、T1的定时计数器功能,来完成对输入的信号进行频率计数,计数的频率结果通过8位动态数码管显示出来。要求能够对0-250KHZ的信号频率进行准确计数,计数误差不超过±1HZ。 2.电路原理图 3.程序设计内容 (1).定时/计数器T0和T1的工作方式设置,由图可知,T0是工作在计数状态下,对输入的频率信号进行计数,但对工作在计数状态下的T0,最大计数值为fOSC/24,由于fOSC=12MHz,因此:T0的最大计数频率为250KHz。对于频率的概念就是在一秒只数脉冲的个数,即为频率值。所以T1工作在定时状态下,每定时1秒中到,就停止T0的计数,而从T0的计数单元中读取计数
[单片机]
6位数字显示频率计数器电路及<font color='red'>51单片机</font>源程序
基于STC51单片机超声波测距
基于STC51单片机超声波测距精简设计只需三个元件(测距模块暂且算做是一个元件吧) 1.所需元件:STC单片机+超声波模块+4位共阳数码管 2.原理:单片机向测距模块trig脚发送20us的高电平触发测距,Echo 测距结束时会输出高电平,电平时长为超声波信号往返时间之和。Echo 脚开始输出高电平时启动定时计数器计时,当Echo 脚高电平结束时停止计数,根据定时器的时间可算出距离。 3.连接:单片机插在面包板上数码管直接插在单片机上面(引脚一一对应见原理图)测距模块trig脚接P5.4Echo 脚接P5.5 实物图 参考C程序代码如下: /*********************************
[单片机]
基于STC<font color='red'>51单片机</font>超声波测距
51单片机C语言调用汇编子程序的简便方法
1、在汇编文件中,程序前边加上如下三句话就可以: PUBLIC _delay, _binrlc ;定义公用子程序名,这里定义了两个子程序(有下划线) LUOYUAN SEGMENT CODE ;程序段命名,LUOYUAN,叫啥名都可以 RSEG LUOYUAN 下边放子程序(程序名要下划线,其它标号不要下划线) ;汇编语言文件 PUBLIC _delay, _binrlc;定义子程序名 LUOYUAN SEGMENT CODE ;命名LUOYUAN的程序段 RSEG LUOYUAN _delay: MOV P1,#55H MOV R2,#30H DJNZ R2,$ RET
[单片机]
51单片机对LCD1602液晶显示的驱动控制设计
利用串行A/D转换器TLC549对输入信号电压源进行采集转换成数字信号给51单片机,经单片机进行数据处理后给1602液晶显示。 误差小于1%. #include #include #define uint unsigned int #define uchar unsigned char uchar LCD[6]; //电压数据转换成LCD1602液晶字符显示 uint Volt; sbit DO= P1^0; //时钟 sbit CS= P1^1; //片选 sbit CLK = P1^2; //数据输出 sbit RS = P2^0; //1602液晶数据/命令选择端 sbit RW = P2^1; //1602液晶读写端
[单片机]
<font color='red'>51单片机</font>对LCD1602液晶显示的驱动控制设计
基于AT89S51单片机的冲床控制器的设计
本文介绍了一种用Atmel89S51单片机仿真PLC控制的方法,设计适合刚性离合器冲床的控制器,介绍了用光电隔离的输入输出电路的基本构成和工作原理,重点介绍了内部键盘显示电路的设计思想,同时给出了冲床控制的电器原理图。 系统硬件配置以AT89S51单片机为核心。AT89S51是一个低功耗,高性能CMOS 8位单片机,片内含4Kb ISP(In-system programmable)可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,内置看门狗(WDT)电路。 功能强大的AT89S51可为许多嵌入式控制应用系统
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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