1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4594|回復(fù): 1
收起左側(cè)

51單片機PCF8591 AD采集電壓0-5v,數(shù)碼管顯示,精確到小數(shù)點后3位

[復(fù)制鏈接]
ID:370205 發(fā)表于 2018-7-12 14:50 | 顯示全部樓層 |閱讀模式
這個是我做的課設(shè),雖然不是很高級的程序,但是想分享給那些需要的小伙伴。

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit sda=P2^0;        //I2C串行數(shù)據(jù)  
  6. sbit scl=P2^1;        ////I2C串行時鐘
  7. sbit dula=P2^6;
  8. sbit wela=P2^7;
  9. uchar code table[]={

  10.                 0x3F,  //"0"
  11.                 0x06,  //"1"
  12.                 0x5B,  //"2"
  13.                 0x4F,  //"3"
  14.                 0x66,  //"4"
  15.                 0x6D,  //"5"
  16.                 0x7D,  //"6"
  17.                 0x07,  //"7"
  18.                 0x7F,  //"8"
  19.                 0x6F,  //"9"
  20.                 0x77,  //"A"
  21.                 0x7C,  //"B"
  22.                 0x39,  //"C"
  23.                 0x5E,  //"D"
  24.                 0x79,  //"E"
  25.                 0x71,  //"F"
  26.                          };       
  27. uchar code table1[]={ 0xbf,0x86,0xdb,0xcf,0xe6,0xed };        //帶小數(shù)點的0-5
  28. void delay()  //5us
  29. {_nop_();}
  30. void delay1(uint z)//1ms
  31. {
  32.         uint x,y;
  33.         for(x=z;x>0;x--)
  34.                 for(y=114;y>0;y--);       
  35. }
  36. void display(uchar value)
  37. {   uchar a,b,c,d;
  38.    
  39.        
  40.     a=value*196/10000; // 個位
  41.         b=value*196/1000%10;  //小數(shù)點后一位
  42.         c=value*196/100%10;          //小數(shù)點后兩位
  43.         d=value*196/10%10;         //小數(shù)點后三位

  44.         dula=1;
  45.         P0=table1[a];  //顯示帶小數(shù)點的個位
  46.         dula=0;
  47.         P0=0xff;
  48.         wela=1;
  49.         P0=0xfe;
  50.         wela=0;
  51.         delay1(1);

  52.         dula=1;
  53.         P0=table[b];
  54.         dula=0;
  55.         P0=0xff;
  56.         wela=1;
  57.         P0=0xfd;
  58.         wela=0;
  59.         delay1(1);

  60.         dula=1;
  61.         P0=table[c];
  62.         dula=0;
  63.         P0=0xff;
  64.         wela=1;
  65.         P0=0xfb;
  66.         wela=0;
  67.         delay1(1);

  68.         dula=1;
  69.         P0=table[d];
  70.         dula=0;
  71.         P0=0xff;
  72.         wela=1;
  73.         P0=0xf7;
  74.         wela=0;
  75.         delay1(1);
  76. }
  77. void start()   //I2C起始信號,線為高電平期間,SDA線由高電平向低電平的變化表示起始信號;
  78. {
  79.         scl=1;
  80.         _nop_();
  81.         sda=1;
  82.         delay();
  83.         sda=0;
  84.         delay();
  85.         scl=0;
  86.         _nop_();
  87. }
  88. void stop()        //SCL線為高電平期間,SDA線由低電平向高電平的變化表示終止信號。  
  89. {
  90.         scl=1;
  91.         _nop_();
  92.         sda=0;
  93.         delay();
  94.         sda=1;
  95.         delay();
  96. }
  97. void respons() //I2C主機發(fā)送應(yīng)答
  98. {
  99.         scl=1;//拉高時鐘總線 讓從機從SDA線上讀走 主機的應(yīng)答信號                  
  100.         _nop_();
  101.         sda=0;//應(yīng)答為0
  102.         delay();
  103.         scl=0; //釋放SDA數(shù)據(jù)總線。
  104.         _nop_();
  105. }
  106. void norespons()  //I2C檢測從機應(yīng)非答
  107. {
  108.         scl=1;//時鐘總線為高電平期間可以讀取從機應(yīng)答信號          
  109.         _nop_();
  110.         sda=1;        //非應(yīng)答為1
  111.         delay();
  112. }
  113. void init()         //初始化
  114. {
  115.         scl=1;
  116.         _nop_();
  117.         sda=1;
  118.         _nop_();
  119. }
  120. void write_byte(uchar dat)          //I2C發(fā)送一個字節(jié)         
  121. {
  122.         uchar i,temp;
  123.         temp=dat;
  124.         for(i=0;i<8;i++)
  125.         {
  126.                 scl=0;        //釋放sda數(shù)據(jù)總線
  127.                 _nop_();
  128.                 if((temp&0x80)==0x80)        //1000 0000 高位發(fā)送
  129.                         sda=1;         
  130.                 else
  131.                         sda=0;          
  132.                 scl=1; //從機從SDA線上讀走信號,就是已發(fā)送          
  133.                 _nop_();
  134.                 temp<<=1; //高位移除
  135.         }
  136.         scl=0;
  137.         _nop_();
  138. }
  139. uchar read_byte()           //I2C讀一個字節(jié)
  140. {
  141.         uchar dat,i;
  142.         sda=1;
  143.         _nop_();
  144.         scl=0;
  145.         _nop_();
  146.         for(i=0;i<8;i++)
  147.         {
  148.                 scl=1; //時鐘總線為高電平期間可以讀取從機應(yīng)答信號          
  149.                 _nop_();
  150.                 if(sda)
  151.                         dat|=0x01; //0000 0001         主機讀取 高位信號存入dat的低位
  152.                 if(i<7)
  153.                          dat<<=1;        //左移一位,方便下一次讀取數(shù)據(jù)
  154.                 scl=0;
  155.                 _nop_();       
  156.         }
  157.         return dat;
  158. }
  159. void DAC_write(uchar dat)        // DAT,發(fā)送給PCF8591轉(zhuǎn)換的數(shù)字量
  160. {
  161.         start();          //I2C總線起始
  162.         write_byte(0x90); //發(fā)送PCF8591地址加讀寫方向位0(寫)
  163.         respons();                   //發(fā)送成功(應(yīng)答)                 
  164.         write_byte(0x40);  //發(fā)送控制字節(jié)DAC輸出使能
  165.         respons();                   //發(fā)送成功(應(yīng)答)
  166.         write_byte(dat);   //發(fā)送數(shù)字量交由PCF8591轉(zhuǎn)為模擬量AOUT腳輸出                  
  167.         respons();                   //發(fā)送成功(應(yīng)答)
  168.         stop();                          // //I2C總線停止

  169. }
  170. uchar ADC_read(uchar com)
  171. {
  172.         uchar dat;
  173.         dat=com;
  174.         start();
  175.         write_byte(0x90); //地址選擇字 10010000 寫 ,發(fā)送第一字節(jié)
  176.         respons();
  177.         write_byte(com);   //發(fā)送控制字節(jié)
  178.         respons();           //發(fā)送應(yīng)答
  179.         start();
  180.         write_byte(0x91);  //改變讀寫方向(讀)
  181.         respons();
  182.         dat=read_byte();  //把讀取的值賦給形參
  183.         norespons();
  184.         stop();
  185.         return dat;
  186. }
  187. void main()
  188. {
  189.         uchar i=0,ad_value;
  190.         init();
  191.         while(1)
  192.         {
  193.                
  194.                 ad_value=ADC_read(0x40);
  195.                
  196.        
  197.                 display(ad_value);
  198.                
  199.                 delay1(1);
  200.         }
  201. }
復(fù)制代碼

所有資料51hei提供下載:
AD電壓采集.zip (16.28 KB, 下載次數(shù): 76)



回復(fù)

使用道具 舉報

ID:381414 發(fā)表于 2018-8-3 10:41 | 顯示全部樓層
沒有鎖存器怎么辦呢?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表