在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例C/C++网络编程 → A/D转换程序(pcf8591)

A/D转换程序(pcf8591)

C/C++网络编程

下载此实例
  • 开发语言:C/C++
  • 实例大小:6.08KB
  • 下载次数:9
  • 浏览次数:110
  • 发布时间:2020-03-21
  • 实例类别:C/C++网络编程
  • 发 布 人:lanzhujiang123
  • 文件格式:.c
  • 所需积分:2
 相关标签: Pc 程序 转换

实例介绍

【实例简介】IIC协议 PCF8591ADDA转换
【实例截图】

【核心代码】


/*-----------------------------------------------
  名称:IIC协议 PCF8591ADDA转换
  内容:此程序通过IIC协议对DAAD芯片操作,读取电位器的电压,并输出模拟量,用LED亮度渐变指示
------------------------------------------------*/
 #include<reg52.h>    //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
 #include <intrins.h> //包含NOP空指令函数_nop_();

 #define AddWr 0x90   //写数据地址 
 #define AddRd 0x91   //读数据地址						mn

 
 sbit Sda=P1^2;       //定义总线连接端口
 sbit Scl=P1^1;

 bit ADFlag;          //定义AD采样标志位
unsigned char code Datatab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//7段数共阴码管段码表
data unsigned int  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 int ReadADC(unsigned char Chl)
	  {
       unsigned int Data;
		   Start();        //写入芯片地址
		   Send(AddWr);
		   Ack();
 		   Send(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
		                  //Chl的值分别为0、1、2、3,分别代表1-4通道
		   Ack();
		   Start();
		   Send(AddRd);    //读入地址
		   Ack();
		   Data=Read();    //读数据
           Data=Data*196;
			Data=Data/100;	
		   Scl=0;
		   NoAck();
		   Stop();
		   return Data;   //返回值
	  }

/*------------------------------------------------
                   主程序
------------------------------------------------*/
	void main()
	{
	 unsigned char num;                   //DA数模输出变量
    unsigned char ADtemp;                //定义中间变量
     Init_Timer1();

	 while(1)
	      { 
           DAC(num);       //DA输出,可以用LED模拟电压变化
		   num  ;          //累加,到256后溢出变为0,往复循环。显示在LED上亮度逐渐变化
		   mDelay(120);     //延时用于清晰看出变化
		   if(ADFlag)      //定时采集输入模拟量
           {
   		ADFlag=0;

   		ADtemp=ReadADC(0);
		Display[0]=Datatab[(ReadADC(0))/100]|0x80;//处理0通道电压显示
  		Display[1]=Datatab[((ReadADC(0))%100)/10];
  	
       // ADtemp=ReadADC(1);
	//	Display[2]=Datatab[((ReadADC(1))/100)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  	//	Display[3]=Datatab[((ReadADC(1))%100)/10];
  		
       // ADtemp=ReadADC(2);
	//	Display[4]=Datatab[((ReadADC(2))/100)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  	//	Display[5]=Datatab[((ReadADC(2))%100)/10];
  		
       // ADtemp=ReadADC(3);
	//	Display[6]=Datatab[((ReadADC(3))/100)]|0x80;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  	//	Display[7]=Datatab[((ReadADC(3))%100)/10];
  		

		   }
	   }
	}

/*------------------------------------------------
                   定时器中断程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3 using 1//定时器1执行数码管动态扫描
{

 static unsigned int count,j;
 TH1=0xfb;		//重新赋值
 TL1=0x00;
 j  ;
 if(j==300) 
    {j=0;ADFlag=1;} //定时置位AD采样标志位
	 
    P0=Display[count];//用于动态扫描数码管
    P2=count;
    count  ;
   if(count==8)     //表示扫描8个数码管
      count=0;

 
} 


标签: Pc 程序 转换

实例下载地址

A/D转换程序(pcf8591)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警