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

標題: AT89C52單片機+PCF8591AD轉換 源程序 [打印本頁]

作者: 金華千跡落竹    時間: 2020-8-9 09:28
標題: AT89C52單片機+PCF8591AD轉換 源程序
PCF8951AD轉換與單片機進行通信,數碼管的數值小于30,則LED燈會亮,采用的是IIC通信方式。





單片機源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include"pcf8591.h"
  4. #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
  5. bit   bdata SystemError;                //從機錯誤標志位
  6. #define uchar unsigned char
  7. #define uint  unsigned int
  8. #define        PCF8591_WRITE        0x90
  9. #define        PCF8591_READ         0x91
  10. #define  NUM  4                     //接收和發送緩存區的深度
  11. uchar idata receivebuf[NUM];    //數據接收緩沖區

  12. void delay(int ms)
  13. {
  14.     while(ms--)
  15.         {
  16.       uchar i;
  17.           for(i=0;i<250;i++)  
  18.            {
  19.             _nop_();                           
  20.                 _nop_();
  21.                 _nop_();
  22.                 _nop_();
  23.            }
  24.         }
  25. }               
  26. //-------------------------------------------------------------------
  27. // 函數名稱: iic_start()
  28. // 函數功能: 啟動I2C總線子程序
  29. //-------------------------------------------------------------------
  30. void iic_start(void)
  31. { //時鐘保持高,數據線從高到低一次跳變,I2C通信開始
  32.         SDA = 1;     
  33.         SCL = 1;
  34.         delayNOP();      // 延時5us
  35.            SDA = 0;
  36.         delayNOP();
  37.     SCL = 0;
  38. }
  39. //-------------------------------------------------------------------
  40. // 函數名稱: iic_stop()
  41. // 函數功能: 停止I2C總線數據傳送子程序
  42. //-------------------------------------------------------------------
  43. void iic_stop(void)
  44. {         
  45.         SDA = 0;              //時鐘保持高,數據線從低到高一次跳變,I2C通信停止
  46.         SCL = 1;
  47.         delayNOP();
  48.         SDA = 1;
  49.         delayNOP();
  50.     SCL = 0;
  51. }
  52. //------------------------------------------------------------------
  53. // 函數名稱: iicInit_()
  54. // 函數功能: 初始化I2C總線子程序
  55. //------------------------------------------------------------------
  56. void iicInit(void)
  57.    {
  58.    SCL = 0;
  59.    iic_stop();        
  60.    }  
  61. //-------------------------------------------------------------------
  62. // 函數名稱: slave_ACK
  63. // 函數功能: 從機發送應答位子程序
  64. //-------------------------------------------------------------------
  65. void slave_ACK(void)
  66. {
  67.         SDA = 0;  
  68.         SCL = 1;
  69.         delayNOP();        
  70.         SCL = 0;
  71. }
  72. //-------------------------------------------------------------------
  73. // 函數名稱: slave_NOACK
  74. // 函數功能: 從機發送非應答位子程序,迫使數據傳輸過程結束
  75. //-------------------------------------------------------------------
  76. void slave_NOACK(void)
  77. {
  78.         SDA = 1;
  79.         SCL = 1;
  80.         delayNOP();
  81.         SDA = 0;
  82.     SCL = 0;  
  83. }
  84. //-------------------------------------------------------------------
  85. // 函數名稱: check_ACK
  86. // 函數功能: 主機應答位檢查子程序,迫使數據傳輸過程結束
  87. //-------------------------------------------------------------------
  88. void check_ACK(void)
  89. {            
  90.     SDA = 1;        // 將SDA設置成輸入,必須先向端口寫1
  91.         SCL = 1;
  92.         F0 = 0;
  93.         delayNOP();   
  94.         if(SDA == 1)    // 若SDA=1表明非應答,置位非應答標志F0
  95.     F0 = 1;
  96.            SCL = 0;
  97. }
  98. //-------------------------------------------------------------------
  99. // 函數名稱: IICSendByte
  100. // 入口參數: ch
  101. // 函數功能: 發送一個字節
  102. //-------------------------------------------------------------------
  103. void IICSendByte(uchar ch)

  104. {
  105.           unsigned char idata n=8;     // 向SDA上發送一位數據字節,共八位

  106.         while(n--)
  107.         {
  108.         if((ch&0x80) == 0x80)    // 若要發送的數據最高位為1則發送位1
  109.            {
  110.                          SDA = 1;    // 傳送位1
  111.                         SCL = 1;
  112.                     delayNOP();
  113.                 //        SDA = 0;        
  114.                         SCL = 0;
  115.            }
  116.                 else
  117.                 {  
  118.                         SDA = 0;    // 否則傳送位0
  119.                         SCL = 1;
  120.                         delayNOP();
  121.                           SCL = 0;
  122.                 }
  123.                 ch = ch<<1;    // 數據左移一位
  124.         }
  125. }
  126. //-------------------------------------------------------------------
  127. // 函數名稱: IICreceiveByte
  128. // 返回接收的數據
  129. // 函數功能: 接收一字節子程序
  130. //-------------------------------------------------------------------
  131. uchar IICreceiveByte(void)
  132. {
  133.         uchar idata n=8;     // 從SDA線上讀取一上數據字節,共八位
  134.         uchar tdata=0;
  135.         while(n--)
  136.         {
  137.            SDA = 1;
  138.            SCL = 1;
  139.            tdata =tdata<<1;                    //左移一位
  140.                    if(SDA == 1)
  141.                   tdata = tdata|0x01;   // 若接收到的位為1,則數據的最后一位置1
  142.                 else
  143.                   tdata = tdata&0xfe;   // 否則數據的最后一位置0
  144.            SCL = 0;
  145.          }

  146.          return(tdata);
  147. }
  148. //-------------------------------------------------------------------
  149. // 函數名稱: DAC_PCF8591
  150. // 入口參數: slave_add從機地址,n要發送的數據個數
  151. // 函數功能: 發送n位數據子程序
  152. //-------------------------------------------------------------------
  153. void DAC_PCF8591(uchar controlbyte,uchar w_data)
  154. {   
  155.         
  156.         iic_start();                    // 啟動I2C
  157.         delayNOP();

  158.         IICSendByte(PCF8591_WRITE);     // 發送地址位
  159.         check_ACK();                    // 檢查應答位
  160.     if(F0 == 1)
  161.          {
  162.                 SystemError = 1;
  163.                 return;                     // 若非應答,置錯誤標志位
  164.      }
  165.     IICSendByte(controlbyte&0x77);        //Control byte
  166.         check_ACK();                    //檢查應答位
  167.     if(F0 == 1)
  168.          {
  169.                 SystemError = 1;
  170.                 return;                    // 若非應答,置錯誤標志位
  171.          }
  172.     IICSendByte(w_data);               //data byte
  173.         check_ACK();                  // 檢查應答位
  174.     if(F0 == 1)
  175.          {
  176.                 SystemError = 1;
  177.             return;   // 若非應答表明器件錯誤或已壞,置錯誤標志位SystemError
  178.          }
  179.         iic_stop();         // 全部發完則停止
  180.         delayNOP();
  181.         delayNOP();
  182.         delayNOP();
  183.         delayNOP();        
  184. }

  185. //-------------------------------------------------------------------
  186. // 函數名稱: ADC_PCF8591
  187. // 入口參數: controlbyte控制字
  188. // 函數功能: 連續讀入4路通道的A/D轉換結果到receivebuf
  189. //-------------------------------------------------------------------
  190. void ADC_PCF8591(uchar controlbyte)
  191. {
  192.     uchar idata receive_da,i=0;

  193.         iic_start();

  194.         IICSendByte(PCF8591_WRITE);        //控制字
  195.         check_ACK();
  196.         if(F0 == 1)
  197.         {
  198.                 SystemError = 1;
  199.                 return;
  200.         }

  201.         IICSendByte(controlbyte);        //控制字
  202.         check_ACK();
  203. ……………………

  204. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼



PCF8591.zip

434.8 KB, 下載次數: 39, 下載積分: 黑幣 -5






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 亚洲成a人片 | 精品九九| 99在线资源 | 婷婷五月色综合 | 青青久在线视频 | 另类在线 | 九九综合 | 视频一区在线 | 日韩中文在线视频 | 日韩一级二级片 | 亚洲成人网在线观看 | 求个av网址 | 日韩精品视频在线观看一区二区三区 | 欧美一区免费 | 黄色在线观看国产 | 天天操天天操 | 久久久久久久综合 | 日本视频中文字幕 | 又爽又黄axxx片免费观看 | 中文字幕一区二区三 | 中文字幕日韩在线观看 | 亚洲美女视频 | 成人午夜影院 | 99免费| 色综合视频 | 男女视频在线观看网站 | 国产一区精品在线 | 中文字幕一区二区三区四区五区 | 国产一区二区三区久久 | 北条麻妃99精品青青久久主播 | 亚洲午夜精品 | 日韩中文字幕在线观看 | 中文字幕久久精品 | 欧美综合在线观看 | 成人av鲁丝片一区二区小说 | 国产成人影院 | 成人精品久久久 | 日韩一三区 | 一区精品国产欧美在线 | 一级毛片视频在线观看 | 欧美日韩在线免费 |