久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

PCF8591(AD-DA)芯片-51單片機程序

作者:佚名   來源:本站原創   點擊數:  更新時間:2013年10月29日   【字體:
注:
     PCF8591  是8位AD-DA芯片   轉換數據0---5  對應 0--255
    通信協議IIC
    模擬量輸出值和電壓的關系:   輸出電壓=(參考電壓-基點電位)/255
 
//以下是源碼如果在網頁上顯示格式錯亂可以從這里下載: http://www.zg4o1577.cn/f/8591c.rar
//12MHZ晶振
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#include "IIC.h"  //i2c庫函數
code uchar seg[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};    //數碼管碼表
code uchar tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};      //數碼管位選
sbit bz=P3^3;   //喇叭位
uchar outdata; //模擬量輸出值
sbit k1=P1^2 ;   //模擬量輸出者增加
sbit k2=P1^1;   //模擬量輸出者減少 
void delay(uint k)    //延時子函數
{
while(k--);
}
  
void key1()    //模擬輸出值增加
{
if(k1==0)
{
delay(1000);
if(k1==0)
outdata++;
}
 }
void key2()     //模擬輸出值減少
{
if(k2==0)
{
delay(1000);
if(k2==0)
outdata--;
}
 }

void ADCinshow(uchar dd)   //模擬量輸入值顯示
{
   P0=seg[dd/100];
   P2=tab[7];
   delay(8);
   P0=0xff;                             //顯示消影
   P2=0xff;
   P0=seg[dd%100/10];
   P2=tab[6];
   delay(8);
   P0=0xff;
   P2=0xff;
   P0=seg[dd%10];
   P2=tab[5];
   delay(8);
   P0=0xff;
   P2=0xff;
}
 
void ADCoutshow(uchar k)    //模擬量輸出值顯示
{
 P0=seg[k/100];
 P2=tab[2];
 delay(8);
 P0=0xff;
 P2=0xff;
 P0=seg[k%100/10];
 P2=tab[1];
 delay(8);
 P0=0xff;
 P2=0xff;
 P0=seg[k%10];
 P2=tab[0];
 delay(8);
 P0=0xff;
 P2=0xff;
 }
//------------------主函數----------------
void main()
{
   uchar val;      //模擬量讀取值變量 
   uint cnt=0;             //設置喇叭報警延時變量  
   while(1)
   {   key1();
       key2();
      val=readADC(3);   //讀取通道3的轉換值
   ADCinshow(val);
     if(writeDAC(outdata)!=0);    //模擬量輸出值
   ADCoutshow(outdata);
      if(val>200)      //模擬量輸入值超過200  喇叭報警
   {
  cnt++;
  if(cnt>2)
  {
  bz=~bz;
   cnt=0;
  }
    }
    else
    bz=1;
   }
}
 
//IIC庫函數---------------------------------------------------------------

sbit scl=P3^0;    //IIC 時鐘線
sbit sda=P3^1;    //IIC 數據線
uchar ack;     //應答位

void delay_nop()  //延時約5us
{
 _nop_(); _nop_(); _nop_(); _nop_(); _nop_();
}
void iic_start()   //啟動IIC總線
{
   sda=1;
   _nop_();
   scl=1;    //時鐘線高電平期間,數據線下降沿產生啟動信號
   delay_nop();    //5us延時
   sda=0;
  delay_nop(); 
   scl=0;      //釋放總線開始準備接受/發送數據
    _nop_();
  _nop_();
}
void iic_stop()     //停止IIC總線
{
   sda=0;
   _nop_();     //時鐘線高電平期間,數據線上升沿產生停止信號
   scl=1;
    delay_nop(); 
   sda=1;
   delay_nop(); 
}
void iic_sendbyte(uchar byte)    //IIC發送一個字節命令
{
  uchar i;
  for(i=0;i<8;i++)
  {
 if((byte<<i)&0x80)sda=1;    //把發送字節最高位放入數據線
 else sda=0;      //發送字節中數據左移一位
 _nop_();      
 scl=1;          //時鐘線至高位 ,數據保持穩定
  delay_nop(); 
 scl=0;          //釋放開始下一個數據發送
  }
  sda=1;           //發送完,釋放數據線開始接受應答
  _nop_();
  _nop_();
  scl=1;         //時鐘線至高位
  _nop_();
  _nop_();
  _nop_();
  if(sda==1)ack=0;         //應答判斷
  else ack=1;
  scl=0;
  _nop_();
  _nop_();
 }
 
uchar iic_receive()  //IIC接受一個字節
{
   uchar i;
   uchar byte=0;
   sda=1;                        //數據線釋放開始接受
   for(i=0;i<8;i++)
   {
   scl=0;        //時鐘線置低開始接受數據
   delay_nop(); 
   scl=1;          //時鐘線置高,接受數據
    _nop_(); _nop_();
    byte=byte<<1;       
   if(sda==1)byte=byte+1;     //數據左移1位      
   _nop_();
   _nop_();
 }
 scl=0;        //接受完釋放總線
 _nop_();
 _nop_();
 return byte;       //返回接受值
}
void iic_noack()  //非應答
{
 sda=1;
 _nop_();
 _nop_();
  _nop_();
 scl=1;
  delay_nop(); 
 scl=0;
 _nop_();
 _nop_();
}
uchar readADC(uchar chl)    //ADC轉換子函數 選擇通道chl
{
 uchar value;
 iic_start();
 iic_sendbyte(0x90);    //發送寫方向
 if(ack==0)return 0;
 iic_sendbyte(0x40|chl);    //控制命令
 if(ack==0)return 0;
 iic_start();
 iic_sendbyte(0x91);     //發送讀方向
 if(ack==0)return 0;
 value=iic_receive();     //接受轉換數據
 iic_noack();
 iic_stop();
 return value;         //返回轉換值
 }

uchar writeDAC(uchar da)    //模擬量輸出值函數
{
  iic_start();
  iic_sendbyte(0x90);
  if(ack==0)return 0;
  iic_sendbyte(0x40);
  if(ack==0)return 0;
  iic_sendbyte(da);
  if(ack==0)return 0;
  iic_stop();
  return 1;         //正常輸出返回值1  異常返回值0
}
 
//--------------------------------------------------------------------

 
關閉窗口

相關文章

主站蜘蛛池模板: a毛片| 欧美黄色片 | 色姑娘av| 亚洲欧美日韩国产综合 | 国产人久久人人人人爽 | 一区二区三区久久久 | 91久久精品国产 | 国产精品色 | 欧美精品在线免费观看 | 久久久精品亚洲 | 国产精品精品久久久 | 亚洲区一区二区 | 免费av观看 | 国产午夜精品一区二区三区嫩草 | 老司机精品福利视频 | 91社区在线观看 | 欧美日韩精品 | 亚洲日本一区二区三区四区 | 五月天婷婷狠狠 | 91视视频在线观看入口直接观看 | 欧美一区二区在线观看 | 亚洲人成在线观看 | 99re在线播放 | 日韩在线免费视频 | 一区日韩 | 亚洲综合一区二区三区 | 欧美成人免费在线 | 国产精品揄拍一区二区久久国内亚洲精 | 日韩α片| www久久av | 粉嫩粉嫩芽的虎白女18在线视频 | 成人精品鲁一区一区二区 | 精品久久久久久久久久久久久久 | 91高清视频在线观看 | 国产一级特黄aaa大片评分 | 91亚洲国产成人久久精品网站 | 91精品国产乱码久久久久久久 | 午夜精品一区二区三区在线观看 | 色婷婷av一区二区三区软件 | 91玖玖 | www国产成人免费观看视频,深夜成人网 |