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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4180|回復: 1
收起左側

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

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

單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int
  5. sbit sda=P2^0;        //I2C串行數據  
  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 };        //帶小數點的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;  //小數點后一位
  42.         c=value*196/100%10;          //小數點后兩位
  43.         d=value*196/10%10;         //小數點后三位

  44.         dula=1;
  45.         P0=table1[a];  //顯示帶小數點的個位
  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主機發送應答
  98. {
  99.         scl=1;//拉高時鐘總線 讓從機從SDA線上讀走 主機的應答信號                  
  100.         _nop_();
  101.         sda=0;//應答為0
  102.         delay();
  103.         scl=0; //釋放SDA數據總線。
  104.         _nop_();
  105. }
  106. void norespons()  //I2C檢測從機應非答
  107. {
  108.         scl=1;//時鐘總線為高電平期間可以讀取從機應答信號          
  109.         _nop_();
  110.         sda=1;        //非應答為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發送一個字節         
  121. {
  122.         uchar i,temp;
  123.         temp=dat;
  124.         for(i=0;i<8;i++)
  125.         {
  126.                 scl=0;        //釋放sda數據總線
  127.                 _nop_();
  128.                 if((temp&0x80)==0x80)        //1000 0000 高位發送
  129.                         sda=1;         
  130.                 else
  131.                         sda=0;          
  132.                 scl=1; //從機從SDA線上讀走信號,就是已發送          
  133.                 _nop_();
  134.                 temp<<=1; //高位移除
  135.         }
  136.         scl=0;
  137.         _nop_();
  138. }
  139. uchar read_byte()           //I2C讀一個字節
  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; //時鐘總線為高電平期間可以讀取從機應答信號          
  149.                 _nop_();
  150.                 if(sda)
  151.                         dat|=0x01; //0000 0001         主機讀取 高位信號存入dat的低位
  152.                 if(i<7)
  153.                          dat<<=1;        //左移一位,方便下一次讀取數據
  154.                 scl=0;
  155.                 _nop_();       
  156.         }
  157.         return dat;
  158. }
  159. void DAC_write(uchar dat)        // DAT,發送給PCF8591轉換的數字量
  160. {
  161.         start();          //I2C總線起始
  162.         write_byte(0x90); //發送PCF8591地址加讀寫方向位0(寫)
  163.         respons();                   //發送成功(應答)                 
  164.         write_byte(0x40);  //發送控制字節DAC輸出使能
  165.         respons();                   //發送成功(應答)
  166.         write_byte(dat);   //發送數字量交由PCF8591轉為模擬量AOUT腳輸出                  
  167.         respons();                   //發送成功(應答)
  168.         stop();                          // //I2C總線停止

  169. }
  170. uchar ADC_read(uchar com)
  171. {
  172.         uchar dat;
  173.         dat=com;
  174.         start();
  175.         write_byte(0x90); //地址選擇字 10010000 寫 ,發送第一字節
  176.         respons();
  177.         write_byte(com);   //發送控制字節
  178.         respons();           //發送應答
  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. }
復制代碼

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



回復

使用道具 舉報

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

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产小网站 | 久久人人网 | 免费国产视频 | 亚洲一区在线免费观看 | 中文字幕av在线 | 国产女人与拘做受视频 | 日日日日操| 欧美精品 在线观看 | 久久人人爽人人爽人人片av免费 | 毛片网站免费观看 | 视频一区二区在线观看 | 一区二区在线免费观看 | 欧美黄色一区 | 91亚洲国产成人久久精品网站 | 热久久性| av网站在线播放 | 91资源在线播放 | 国产高清在线观看 | 一区观看| 欧美日韩综合视频 | 韩日在线视频 | 精品视频亚洲 | www.887色视频免费 | 国产日韩欧美 | 一级黄色片免费在线观看 | 一级黄a| 91精品国产美女在线观看 | 久久中文免费视频 | 欧美99 | 午夜看电影在线观看 | 国产91亚洲精品一区二区三区 | 亚洲精品久久久久久一区二区 | jizz在线免费观看 | 亚洲精品白浆高清久久久久久 | 九九久久免费视频 | 欧美精品 在线观看 | 人人精品 | 久久不卡| 免费一区 | 中文字幕男人的天堂 | 日本天堂视频在线观看 |