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

專注電子技術(shù)學(xué)習(xí)與研究
當(dāng)前位置:單片機(jī)教程網(wǎng) >> MCU設(shè)計(jì)實(shí)例 >> 瀏覽文章

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

作者:佚名   來源:本站原創(chuàng)   點(diǎn)擊數(shù):  更新時(shí)間:2013年10月29日   【字體:
注:
     PCF8591  是8位AD-DA芯片   轉(zhuǎn)換數(shù)據(jù)0---5  對(duì)應(yīng) 0--255
    通信協(xié)議IIC
    模擬量輸出值和電壓的關(guān)系:   輸出電壓=(參考電壓-基點(diǎn)電位)/255
 
//以下是源碼如果在網(wǎng)頁上顯示格式錯(cuò)亂可以從這里下載: 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庫函數(shù)
code uchar seg[]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60};    //數(shù)碼管碼表
code uchar tab[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};      //數(shù)碼管位選
sbit bz=P3^3;   //喇叭位
uchar outdata; //模擬量輸出值
sbit k1=P1^2 ;   //模擬量輸出者增加
sbit k2=P1^1;   //模擬量輸出者減少 
void delay(uint k)    //延時(shí)子函數(shù)
{
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;
 }
//------------------主函數(shù)----------------
void main()
{
   uchar val;      //模擬量讀取值變量 
   uint cnt=0;             //設(shè)置喇叭報(bào)警延時(shí)變量  
   while(1)
   {   key1();
       key2();
      val=readADC(3);   //讀取通道3的轉(zhuǎn)換值
   ADCinshow(val);
     if(writeDAC(outdata)!=0);    //模擬量輸出值
   ADCoutshow(outdata);
      if(val>200)      //模擬量輸入值超過200  喇叭報(bào)警
   {
  cnt++;
  if(cnt>2)
  {
  bz=~bz;
   cnt=0;
  }
    }
    else
    bz=1;
   }
}
 
//IIC庫函數(shù)---------------------------------------------------------------

sbit scl=P3^0;    //IIC 時(shí)鐘線
sbit sda=P3^1;    //IIC 數(shù)據(jù)線
uchar ack;     //應(yīng)答位

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

uchar writeDAC(uchar da)    //模擬量輸出值函數(shù)
{
  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
}
 
//--------------------------------------------------------------------

 
關(guān)閉窗口

相關(guān)文章

主站蜘蛛池模板: 国产精品久久久久久影院8一贰佰 | 久久久精彩视频 | 日韩av在线免费 | 亚洲综合视频 | 日韩一区二区三区在线视频 | 国产情侣激情 | 91精品午夜窝窝看片 | 91精品国产一区二区三区香蕉 | 欧美一区二区在线看 | av香蕉| 毛片网站免费观看 | 亚洲国产中文字幕 | 日韩免费看片 | 久久精品1 | 国产激情网站 | 欧美1页 | 亚洲成人国产综合 | 91电影院 | 欧美成人一区二免费视频软件 | 欧美a级成人淫片免费看 | 亚洲视频免费观看 | 成人av网站在线观看 | 福利视频网站 | 精品久久久久久久久久久久久久 | 欧美在线成人影院 | 国产农村妇女精品一区 | 国产精品91久久久久久 | 拍拍无遮挡人做人爱视频免费观看 | 久久大陆 | 欧美日韩1区2区 | 国产97人人超碰caoprom | 国产成人精品一区二区三 | 婷婷色国产偷v国产偷v小说 | 日本三级电影在线观看视频 | 亚洲在线电影 | 日韩精品一区二区三区中文字幕 | 国产成人91视频 | 日本在线一区二区 | 亚洲精品456 | 国产二区视频 | 91文字幕巨乱亚洲香蕉 |