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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 5248|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

求幫助 pcf8591+stc8051+lcd1602仿真加單片機(jī)程序有問(wèn)題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
通過(guò)調(diào)節(jié)電位器實(shí)現(xiàn)ad轉(zhuǎn)換,由1602顯示,程序只選擇了通道二,需要可以自行修改。




單片機(jī)源程序如下:
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define MAIN_Fosc                11059200UL        //宏定義主時(shí)鐘HZ
  4. #define PCF8591_ADDR        0x90                //PCF8591地址
  5. #define DACOUT_EN                0x40                //DAC輸出使能

  6. /*====================================
  7. 自定義類(lèi)型名
  8. ====================================*/
  9. typedef unsigned char INT8U;
  10. typedef unsigned char uchar;
  11. typedef unsigned int uint;
  12. typedef unsigned int INT16U;
  13. /*====================================
  14. 硬件接口位聲明
  15. ====================================*/
  16. sbit SDA = P2^0;   //I2C串行數(shù)據(jù)
  17. sbit SCL = P2^1;   //I2C串行時(shí)鐘
  18. //sbit DU  = P2^6;   //數(shù)碼管段選
  19. //sbit WE  = P2^7;   //數(shù)碼管位選
  20. sbit LED1= P1^0;   //讀取AD的值是否成功(亮成功,滅失敗)
  21. sbit LED2= P1^1;   //DAC成功輸出(亮成功,滅失敗)
  22. sbit BEEP= P2^3;   //蜂鳴器引腳定義
  23. sbit LCD_RS=P3^5;           //lcd1602讀
  24. sbit LCD_RW=P3^6;           //lcd1602寫(xiě)
  25. sbit LCD_EN=P3^4;           //lcd1602使能
  26. uchar AD_Value;        //存儲(chǔ)AD轉(zhuǎn)換回的數(shù)字量



  27. /*函數(shù)聲明*/
  28. bit ADC_Read(uchar CON);
  29. bit DAC_OUT(uchar DAT);
  30. void Delay_Ms(INT16U ms);
  31. void Delay5us();
  32. void Display(INT8U Value);
  33. void I2C_init();
  34. uchar I2C_read_byte();
  35. void I2C_send_byte(uchar byte);
  36. void I2C_Start();
  37. void I2C_Stop();
  38. void lcd_read_busy();
  39. void lcd_set_init();
  40. void lcd_write_cmd(uchar cmd);
  41. void  lcd_write_dat(uchar dat);
  42. bit Test_ACK();
  43. void Master_ACK(bit i);

  44. /*====================================
  45. 共陰極數(shù)碼管段選碼
  46. ====================================*/
  47. /*
  48. uchar code table[]={
  49. //0                1         2     3     4     5     6     7     8
  50. 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
  51. //9     A     B           C         D           E         F                -         .          關(guān)顯示
  52. 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
  53.                    };
  54. */
  55. /*====================================
  56. 數(shù)碼管位選碼
  57. ====================================*/
  58. /*
  59.                                   //第1位        2位          3位         4位   5位        6位          7位        8位
  60. uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//數(shù)碼管位碼
  61. */

  62. /*LCD函數(shù)*/
  63. /*判斷忙不忙,忙則等待 */
  64. void lcd_read_busy()
  65. {
  66.         uchar busy;
  67.         P0=0xff;
  68.         LCD_RS=0;
  69.         LCD_RW=1;
  70.         do{
  71.                 LCD_EN=1;
  72.                 busy=P0;
  73.                 LCD_EN=0;
  74.         }while(busy&0x80);
  75.         

  76. }
  77. /*寫(xiě)命令  寫(xiě)一個(gè)字節(jié)*/
  78. void lcd_write_cmd(uchar cmd)
  79. {
  80.         lcd_read_busy();   //判斷忙不忙
  81.         LCD_RS=0;
  82.         LCD_RW=0;
  83.         P0=cmd;
  84.         LCD_EN=1;
  85.         LCD_EN=0;
  86. }
  87. /*寫(xiě)數(shù)據(jù)  寫(xiě)一個(gè)字節(jié)*/
  88. void  lcd_write_dat(uchar dat)
  89. {
  90.         lcd_read_busy();//判斷忙不忙
  91.         LCD_RS=1;
  92.         LCD_RW=0;
  93.         P0=dat;
  94.         LCD_EN=1;
  95.         LCD_EN=0;
  96. }
  97. /*LCD1602 設(shè)置初始化*/
  98. void lcd_set_init()
  99. {
  100.     lcd_write_cmd(0x01);  //清屏
  101.         lcd_write_cmd(0x38);         //設(shè)置16*2顯示模式
  102.         lcd_write_cmd(0x0f);         //開(kāi)顯示,不顯示光標(biāo),光標(biāo)不閃爍
  103.         lcd_write_cmd(0x06);          //讀寫(xiě)一個(gè)字符后地址指針加一
  104.         lcd_write_cmd(0x80);  //數(shù)據(jù)指針設(shè)置
  105. }

  106. /*====================================
  107. 函數(shù):void Delay_Ms(INT16U ms)
  108. 參數(shù):ms,毫秒延時(shí)形參
  109. 描述:12T 51單片機(jī)自適應(yīng)主時(shí)鐘毫秒級(jí)延時(shí)函數(shù)
  110. ====================================*/
  111. void Delay_Ms(INT16U ms)
  112. {
  113.      INT16U i;
  114.          do{
  115.               i = MAIN_Fosc / 96000;
  116.                   while(--i);   //96T per loop
  117.      }while(--ms);
  118. }

  119. /*====================================
  120. 函數(shù):void Delay5us()
  121. 描述:12T 51單片機(jī)5微秒延時(shí)函數(shù)自適應(yīng)時(shí)鐘(11.0592M,12M,22.1184M)
  122. ====================================*/
  123. void Delay5us()
  124. {
  125.         #if MAIN_Fosc == 11059200
  126.                 _nop_();
  127.         #elif MAIN_Fosc == 12000000
  128.                 _nop_();
  129.         #elif MAIN_Fosc == 22118400
  130.                 _nop_(); _nop_(); _nop_();
  131.         #endif
  132. }

  133. /*====================================
  134. 函數(shù):void Display(INT8U Value)
  135. 參數(shù):Value,顯示值 取值0-255
  136. 描述:LCD1602顯示函數(shù)可顯示一個(gè)字節(jié)的數(shù)
  137. ====================================*/
  138. void Display(INT8U Value)
  139. {        uchar bai,shi,ge;
  140.         bai=Value/100;
  141.         shi=Value/10%10;
  142.         ge=Value%10;
  143.         lcd_set_init();
  144.         lcd_write_dat(bai+'0');
  145.         lcd_write_dat(shi+'0');
  146.         lcd_write_dat(ge+'0');        
  147. }
  148. /*
  149. void Display(INT8U Value)
  150. {
  151. //------------------------------
  152.         DU = 1;
  153.         P0 = table[Value/100];        //管顯示百位
  154.         DU = 0;

  155.         P0 = 0xff;                                  //清除斷碼

  156.         WE = 1;
  157.         P0 = T_COM[0];                          //第一位數(shù)碼管
  158.         WE = 0;
  159.         Delay_Ms(5);
  160. //-------------------------------
  161.         DU = 1;
  162.         P0 = table[Value%100/10]; //顯示十位
  163.         DU = 0;

  164.         P0 = 0xff;                                  //清除斷碼

  165.         WE = 1;
  166.         P0 = T_COM[1];                          //第二位數(shù)碼管
  167.         WE = 0;
  168.         Delay_Ms(5);
  169. //-------------------------------
  170.         DU = 1;
  171.         P0 = table[Value%10];                //顯示個(gè)位
  172.         DU = 0;
  173.                                                                
  174.         P0 = 0xff;                                        //清除斷碼

  175.         WE = 1;
  176.         P0 = T_COM[2];                                //第三位數(shù)碼管
  177.         WE = 0;
  178.         Delay_Ms(5);
  179. }
  180. */
  181. /*====================================
  182. 函數(shù):I2C_init()
  183. 描述:I2C總線初始化
  184. ====================================*/
  185. void I2C_init()
  186. {
  187.         SDA = 1;   //數(shù)據(jù)總線高
  188.         _nop_();
  189.         SCL = 1;   //時(shí)鐘總線高
  190.         _nop_();
  191. }

  192. /*====================================
  193. 函數(shù):I2C_Start()
  194. 描述:I2C起始信號(hào)
  195. ====================================*/
  196. void I2C_Start()  
  197. {
  198.         SCL = 1;
  199.         _nop_();
  200.         SDA = 1;
  201.         Delay5us();
  202.         SDA = 0;
  203.         Delay5us();
  204. }

  205. /*====================================
  206. 函數(shù):I2C_Stop()
  207. 描述:I2C停止信號(hào)
  208. ====================================*/
  209. void I2C_Stop()
  210. {
  211.         SDA = 0;
  212.         _nop_();
  213.         SCL = 1;
  214.         Delay5us();
  215.         SDA = 1;
  216.         Delay5us();
  217. }

  218. /*====================================
  219. 函數(shù):Master_ACK(bit i)
  220. 參數(shù):i 為0時(shí)發(fā)送非應(yīng)答 為1時(shí)發(fā)送應(yīng)答
  221. 描述:I2C主機(jī)發(fā)送應(yīng)答
  222. ====================================*/
  223. void Master_ACK(bit i)        
  224. {
  225.         SCL = 0; // 拉低時(shí)鐘總線允許SDA數(shù)據(jù)總線上的數(shù)據(jù)變化
  226.         _nop_(); // 讓總線穩(wěn)定
  227.         if (i)         //如果i = 1 那么拉低數(shù)據(jù)總線 表示主機(jī)應(yīng)答
  228.         {
  229.                 SDA = 0;
  230.         }
  231.         else         
  232.         {
  233.                 SDA = 1;         //發(fā)送非應(yīng)答
  234.         }
  235.         _nop_();//讓總線穩(wěn)定
  236.         SCL = 1;//拉高時(shí)鐘總線 讓從機(jī)從SDA線上讀走 主機(jī)的應(yīng)答信號(hào)
  237.         _nop_();
  238.         SCL = 0;//拉低時(shí)鐘總線, 占用總線繼續(xù)通信
  239.         _nop_();
  240.         SDA = 1;//釋放SDA數(shù)據(jù)總線。
  241.         _nop_();
  242. }

  243. /*====================================
  244. 函數(shù):Test_ACK()
  245. 返回:0為非應(yīng)答 1為應(yīng)答
  246. 描述:I2C檢測(cè)從機(jī)應(yīng)答
  247. ====================================*/
  248. bit Test_ACK()         // 檢測(cè)從機(jī)應(yīng)答
  249. {
  250.         SCL = 1;//時(shí)鐘總線為高電平期間可以讀取從機(jī)應(yīng)答信號(hào)
  251.         Delay5us();
  252.         if (SDA)
  253.         {
  254.                 SCL = 0;
  255.                 I2C_Stop();
  256.                 return(0);
  257.         }
  258.         else
  259.         {
  260.                 SCL = 0;
  261.                 return(1);
  262.         }
  263. }

  264. /*====================================
  265. 函數(shù):I2C_send_byte(uchar byte)
  266. 參數(shù):byte 要發(fā)送的字節(jié)
  267. 描述:I2C發(fā)送一個(gè)字節(jié)
  268. ====================================*/
  269. void I2C_send_byte(uchar byte)
  270. {
  271.         uchar i;
  272.         for(i = 0 ; i < 8 ; i++)
  273.         {
  274.                 SCL = 0;
  275.                 _nop_();
  276.                 if (byte & 0x80)        //
  277.                 {
  278.                         SDA = 1;
  279.                         _nop_();
  280.                 }
  281.                 else
  282.                 {
  283.                         SDA = 0;
  284.                         _nop_();
  285.                 }
  286.                 SCL = 1;
  287.                 _nop_();
  288.                 byte <<= 1;
  289.         }
  290.         SCL = 0;
  291.         _nop_();
  292.         SDA = 1;
  293.         _nop_();        
  294. }

  295. /*====================================
  296. 函數(shù):I2C_read_byte()
  297. 返回:讀取的字節(jié)
  298. 描述:I2C讀一個(gè)字節(jié)
  299. ====================================*/
  300. uchar I2C_read_byte()
  301. {
  302.         uchar i, dat;
  303.         SCL = 0 ;
  304.         _nop_();
  305.         SDA = 1;
  306.         _nop_();
  307.         for(i = 0 ; i < 8 ; i++)
  308.         {
  309.                 SCL = 1;
  310.                 _nop_();
  311.                 dat <<= 1;         
  312.                 if (SDA)
  313.                 {
  314.                         dat |= 0x01;  
  315.                 }
  316.                 _nop_();
  317.                 SCL = 0;
  318.                 _nop_();
  319.         }
  320.         return(dat);
  321. }

  322. /*DAC輸出*/
  323. bit DAC_OUT(uchar DAT)
  324. {
  325.         I2C_Start();
  326.         I2C_send_byte(PCF8591_ADDR+0);
  327.         if (!Test_ACK())
  328.         {
  329.                 return(0);
  330.         }
  331.         I2C_send_byte(DACOUT_EN);        //DA輸出使能
  332.         if (!Test_ACK())
  333.         {
  334.                 return(0);
  335.         }
  336.         I2C_send_byte(DAT);
  337.         if (!Test_ACK())
  338.         {
  339.                 return(0);
  340. ……………………

  341. …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
51 pcf8591 1602.zip (25.78 KB, 下載次數(shù): 149)



分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:389518 發(fā)表于 2018-8-30 21:28 | 只看該作者
仿真圖不是pcf8591的
回復(fù)

使用道具 舉報(bào)

板凳
ID:880853 發(fā)表于 2021-2-18 12:55 | 只看該作者
好資料,找了好久了
回復(fù)

使用道具 舉報(bào)

地板
ID:1031469 發(fā)表于 2022-6-6 10:03 | 只看該作者
下載下來(lái)試了一下,很不錯(cuò)的資料,
回復(fù)

使用道具 舉報(bào)

5#
ID:155507 發(fā)表于 2022-6-6 23:34 | 只看該作者
程序分享出來(lái)給需要的人作參考


  1. #include <stdio.h>

  2. #include <reg52.h>
  3. #include <intrins.h>
  4. #define MAIN_Fosc                11059200UL        //宏定義主時(shí)鐘HZ
  5. #define PCF8591_ADDR        0x90                //PCF8591地址
  6. #define DACOUT_EN                0x40                //DAC輸出使能

  7. /*====================================
  8. 自定義類(lèi)型名
  9. ====================================*/
  10. typedef unsigned char INT8U;
  11. typedef unsigned char uchar;
  12. typedef unsigned int uint;
  13. typedef unsigned int INT16U;
  14. /*====================================
  15. 硬件接口位聲明
  16. ====================================*/
  17. sbit SDA = P2^0;   //I2C串行數(shù)據(jù)
  18. sbit SCL = P2^1;   //I2C串行時(shí)鐘
  19. //sbit DU  = P2^6;   //數(shù)碼管段選
  20. //sbit WE  = P2^7;   //數(shù)碼管位選
  21. sbit LED1= P1^0;   //讀取AD的值是否成功(亮成功,滅失敗)
  22. sbit LED2= P1^1;   //DAC成功輸出(亮成功,滅失敗)
  23. sbit BEEP= P2^3;   //蜂鳴器引腳定義
  24. sbit LCD_RS=P3^5;           //lcd1602讀
  25. sbit LCD_RW=P3^6;           //lcd1602寫(xiě)
  26. sbit LCD_EN=P3^4;           //lcd1602使能
  27. uchar AD_Value;        //存儲(chǔ)AD轉(zhuǎn)換回的數(shù)字量



  28. /*函數(shù)聲明*/
  29. bit ADC_Read(uchar CON);
  30. bit DAC_OUT(uchar DAT);
  31. void Delay_Ms(INT16U ms);
  32. void Delay5us();
  33. void Display(INT8U Value, INT8U  col );
  34. void I2C_init();
  35. uchar I2C_read_byte();
  36. void I2C_send_byte(uchar byte);
  37. void I2C_Start();
  38. void I2C_Stop();
  39. void lcd_read_busy();
  40. void lcd_set_init();
  41. void lcd_write_cmd(uchar cmd);
  42. void  lcd_write_dat(uchar dat);
  43. bit Test_ACK();
  44. void Master_ACK(bit i);

  45. /*====================================
  46. 共陰極數(shù)碼管段選碼
  47. ====================================*/
  48. /*
  49. uchar code table[]={
  50. //0                1         2     3     4     5     6     7     8
  51. 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F,
  52. //9     A     B           C         D           E         F                -         .          關(guān)顯示
  53. 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
  54.                                 };
  55. */
  56. /*====================================
  57. 數(shù)碼管位選碼
  58. ====================================*/
  59. /*
  60.                                 //第1位        2位          3位         4位   5位        6位          7位        8位
  61. uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//數(shù)碼管位碼
  62. */

  63. /*LCD函數(shù)*/
  64. /*判斷忙不忙,忙則等待 */
  65. void lcd_read_busy()
  66. {
  67.         uchar busy;
  68.         P0=0xff;
  69.         LCD_RS=0;
  70.         LCD_RW=1;
  71.         do{
  72.                 LCD_EN=1;
  73.                 busy=P0;
  74.                 LCD_EN=0;
  75.         }while(busy&0x80);

  76. }
  77. /*寫(xiě)命令  寫(xiě)一個(gè)字節(jié)*/
  78. void lcd_write_cmd(uchar cmd)
  79. {
  80.         lcd_read_busy();   //判斷忙不忙
  81.         LCD_RS=0;
  82.         LCD_RW=0;
  83.         P0=cmd;
  84.         LCD_EN=1;
  85.         LCD_EN=0;
  86. }
  87. /*寫(xiě)數(shù)據(jù)  寫(xiě)一個(gè)字節(jié)*/
  88. void  lcd_write_dat(uchar dat)
  89. {
  90.         lcd_read_busy();//判斷忙不忙
  91.         LCD_RS=1;
  92.         LCD_RW=0;
  93.         P0=dat;
  94.         LCD_EN=1;
  95.         LCD_EN=0;
  96. }
  97. /*LCD1602 設(shè)置初始化*/
  98. void lcd_set_init()
  99. {
  100.         lcd_write_cmd(0x33);  //
  101.         lcd_write_cmd(0x38);         //設(shè)置16*2顯示模式
  102.         lcd_write_cmd(0x01);  //清屏
  103.         lcd_write_cmd(0x0f);         //開(kāi)顯示,不顯示光標(biāo),光標(biāo)不閃爍
  104.         lcd_write_cmd(0x06);          //讀寫(xiě)一個(gè)字符后地址指針加一
  105.         lcd_write_cmd(0x80);  //數(shù)據(jù)指針設(shè)置
  106. }

  107. /*====================================
  108. 函數(shù):void Delay_Ms(INT16U ms)
  109. 參數(shù):ms,毫秒延時(shí)形參
  110. 描述:12T 51單片機(jī)自適應(yīng)主時(shí)鐘毫秒級(jí)延時(shí)函數(shù)
  111. ====================================*/
  112. void Delay_Ms(INT16U ms)
  113. {
  114.         INT16U i;
  115.         do{
  116.                 i = MAIN_Fosc / 96000;
  117.                 while(--i);   //96T per loop
  118.         }while(--ms);
  119. }

  120. /*====================================
  121. 函數(shù):void Delay5us()
  122. 描述:12T 51單片機(jī)5微秒延時(shí)函數(shù)自適應(yīng)時(shí)鐘(11.0592M,12M,22.1184M)
  123. ====================================*/
  124. void Delay5us()
  125. {
  126.         #if MAIN_Fosc == 11059200
  127.         _nop_();
  128.         #elif MAIN_Fosc == 12000000
  129.         _nop_();
  130.         #elif MAIN_Fosc == 22118400
  131.         _nop_(); _nop_(); _nop_();
  132.         #endif
  133. }

  134. /*====================================
  135. 函數(shù):void Display(INT8U Value)
  136. 參數(shù):Value,顯示值 取值0-255
  137. 描述:LCD1602顯示函數(shù)可顯示一個(gè)字節(jié)的數(shù)
  138. ====================================*/
  139. void Display(INT8U Value, INT8U  col )
  140. {        uchar bai,shi,ge;
  141.         bai=Value/100;
  142.         shi=Value/10%10;
  143.         ge=Value%10;
  144.         //lcd_set_init();
  145.         lcd_write_cmd(0x80+col);
  146.         lcd_write_dat(bai+'0');
  147.         lcd_write_dat(shi+'0');
  148.         lcd_write_dat(ge+'0');       
  149. }
  150. /*
  151. void Display(INT8U Value)
  152. {
  153. //------------------------------
  154.         DU = 1;
  155.         P0 = table[Value/100];        //管顯示百位
  156.         DU = 0;

  157.         P0 = 0xff;                                  //清除斷碼

  158.         WE = 1;
  159.         P0 = T_COM[0];                          //第一位數(shù)碼管
  160.         WE = 0;
  161.         Delay_Ms(5);
  162. //-------------------------------
  163.         DU = 1;
  164.         P0 = table[Value%100/10]; //顯示十位
  165.         DU = 0;

  166.         P0 = 0xff;                                  //清除斷碼

  167.         WE = 1;
  168.         P0 = T_COM[1];                          //第二位數(shù)碼管
  169.         WE = 0;
  170.         Delay_Ms(5);
  171. //-------------------------------
  172.         DU = 1;
  173.         P0 = table[Value%10];                //顯示個(gè)位
  174.         DU = 0;
  175.                                                                
  176.         P0 = 0xff;                                        //清除斷碼

  177.         WE = 1;
  178.         P0 = T_COM[2];                                //第三位數(shù)碼管
  179.         WE = 0;
  180.         Delay_Ms(5);
  181. }
  182. */
  183. /*====================================
  184. 函數(shù):I2C_init()
  185. 描述:I2C總線初始化
  186. ====================================*/
  187. void I2C_init()
  188. {
  189.         SDA = 1;   //數(shù)據(jù)總線高
  190.         _nop_();
  191.         SCL = 1;   //時(shí)鐘總線高
  192.         _nop_();
  193. }

  194. /*====================================
  195. 函數(shù):I2C_Start()
  196. 描述:I2C起始信號(hào)
  197. ====================================*/
  198. void I2C_Start()  
  199. {
  200.         SCL = 1;
  201.         _nop_();
  202.         SDA = 1;
  203.         Delay5us();
  204.         SDA = 0;
  205.         Delay5us();
  206. }

  207. /*====================================
  208. 函數(shù):I2C_Stop()
  209. 描述:I2C停止信號(hào)
  210. ====================================*/
  211. void I2C_Stop()
  212. {
  213.         SDA = 0;
  214.         _nop_();
  215.         SCL = 1;
  216.         Delay5us();
  217.         SDA = 1;
  218.         Delay5us();
  219. }

  220. /*====================================
  221. 函數(shù):Master_ACK(bit i)
  222. 參數(shù):i 為0時(shí)發(fā)送非應(yīng)答 為1時(shí)發(fā)送應(yīng)答
  223. 描述:I2C主機(jī)發(fā)送應(yīng)答
  224. ====================================*/
  225. void Master_ACK(bit i)       
  226. {
  227.         SCL = 0; // 拉低時(shí)鐘總線允許SDA數(shù)據(jù)總線上的數(shù)據(jù)變化
  228.         _nop_(); // 讓總線穩(wěn)定
  229.         if (i)         //如果i = 1 那么拉低數(shù)據(jù)總線 表示主機(jī)應(yīng)答
  230.         {
  231.                 SDA = 0;
  232.         }
  233.         else         
  234.         {
  235.                 SDA = 1;         //發(fā)送非應(yīng)答
  236.         }
  237.         _nop_();//讓總線穩(wěn)定
  238.         SCL = 1;//拉高時(shí)鐘總線 讓從機(jī)從SDA線上讀走 主機(jī)的應(yīng)答信號(hào)
  239.         _nop_();
  240.         SCL = 0;//拉低時(shí)鐘總線, 占用總線繼續(xù)通信
  241.         _nop_();
  242.         SDA = 1;//釋放SDA數(shù)據(jù)總線。
  243.         _nop_();
  244. }

  245. /*====================================
  246. 函數(shù):Test_ACK()
  247. 返回:0為非應(yīng)答 1為應(yīng)答
  248. 描述:I2C檢測(cè)從機(jī)應(yīng)答
  249. ====================================*/
  250. bit Test_ACK()         // 檢測(cè)從機(jī)應(yīng)答
  251. {
  252.         SCL = 1;//時(shí)鐘總線為高電平期間可以讀取從機(jī)應(yīng)答信號(hào)
  253.         Delay5us();
  254.         if (SDA)
  255.         {
  256.                 SCL = 0;
  257.                 I2C_Stop();
  258.                 return(0);
  259.         }
  260.         else
  261.         {
  262.                 SCL = 0;
  263.                 return(1);
  264.         }
  265. }

  266. /*====================================
  267. 函數(shù):I2C_send_byte(uchar byte)
  268. 參數(shù):byte 要發(fā)送的字節(jié)
  269. 描述:I2C發(fā)送一個(gè)字節(jié)
  270. ====================================*/
  271. void I2C_send_byte(uchar byte)
  272. {
  273.         uchar i;
  274.         for(i = 0 ; i < 8 ; i++)
  275.         {
  276.                 SCL = 0;
  277.                 _nop_();
  278.                 if (byte & 0x80)        //
  279.                 {
  280.                         SDA = 1;
  281.                         _nop_();
  282.                 }
  283.                 else
  284.                 {
  285.                         SDA = 0;
  286.                         _nop_();
  287.                 }
  288.                 SCL = 1;
  289.                 _nop_();
  290.                 byte <<= 1;
  291.         }
  292.         SCL = 0;
  293.         _nop_();
  294.         SDA = 1;
  295.         _nop_();       
  296. }

  297. /*====================================
  298. 函數(shù):I2C_read_byte()
  299. 返回:讀取的字節(jié)
  300. 描述:I2C讀一個(gè)字節(jié)
  301. ====================================*/
  302. uchar I2C_read_byte()
  303. {
  304.         uchar i, dat;
  305.         SCL = 0 ;
  306.         _nop_();
  307.         SDA = 1;
  308.         _nop_();
  309.         for(i = 0 ; i < 8 ; i++)
  310.         {
  311.                 SCL = 1;
  312.                 _nop_();
  313.                 dat <<= 1;          
  314.                 if (SDA)
  315.                 {
  316.                         dat |= 0x01;  
  317.                 }
  318.                 _nop_();
  319.                 SCL = 0;
  320.                 _nop_();
  321.         }
  322.         return(dat);
  323. }

  324. /*DAC輸出*/
  325. bit DAC_OUT(uchar DAT)
  326. {
  327.         I2C_Start();
  328.         I2C_send_byte(PCF8591_ADDR+0);
  329.         if (!Test_ACK())
  330.         {
  331.                 return(0);
  332.         }
  333.         I2C_send_byte(DACOUT_EN);        //DA輸出使能
  334.         if (!Test_ACK())
  335.         {
  336.                 return(0);
  337.         }
  338.         I2C_send_byte(DAT);
  339.         if (!Test_ACK())
  340.         {
  341.                 return(0);
  342.         }
  343.         I2C_Stop();
  344.         return(1);       
  345. }

  346. /*讀AD數(shù)據(jù)*/
  347. bit ADC_Read(uchar CON)
  348. {
  349.         I2C_Start();
  350.         I2C_send_byte(PCF8591_ADDR+0);
  351.         if (!Test_ACK())
  352.         {
  353.                 return(0);
  354.         }
  355.         I2C_send_byte(CON);
  356.         Master_ACK(0);
  357.         I2C_Start();
  358.         I2C_send_byte(PCF8591_ADDR+1);
  359.         if (!Test_ACK())
  360.         {
  361.                 return(0);
  362.         }
  363.         AD_Value = I2C_read_byte();
  364.         Master_ACK(0);
  365.         I2C_Stop();
  366.         return(1);       
  367. }

  368. void main()
  369. {
  370.         I2C_init();
  371.         lcd_set_init();
  372.         while(1)
  373.         {               
  374.                 //單端輸入,讀出通道2的值
  375.                 if (ADC_Read(0x01))            LED1 = 0;        else        LED1 = 1;       
  376.                 if (DAC_OUT(AD_Value))        LED2 = 0;        else        LED2 = 1;
  377.                 Display(AD_Value,0);
  378.                 if (ADC_Read(0x02))            LED1 = 0;        else        LED1 = 1;       
  379.                 if (DAC_OUT(AD_Value))        LED2 = 0;        else        LED2 = 1;
  380.                 Display(AD_Value,8);
  381.                 if (ADC_Read(0x03))        LED1 = 0;        else        LED1 = 1;       
  382.                 if (DAC_OUT(AD_Value))        LED2 = 0;        else        LED2 = 1;
  383.                 Display(AD_Value,0x40);
  384.                 if (ADC_Read(0x04))        LED1 = 0;        else        LED1 = 1;       
  385.                 if (DAC_OUT(AD_Value))        LED2 = 0;        else        LED2 = 1;
  386.                 Display(AD_Value,0x48);
  387.                 if (AD_Value > 150)        BEEP = 0;        else        BEEP = 1;
  388.                 Delay_Ms(100);
  389.         }       
  390. }


復(fù)制代碼






回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产一区二区视频 | 亚洲高清网 | 亚洲人成在线观看 | 亚洲免费在线观看 | 国产精品1区2区 | 日韩av在线一区二区 | 亚洲 中文 欧美 日韩 在线观看 | 国产一级在线 | 综合久久综合久久 | 亚洲欧美日韩在线 | 99久久婷婷 | 搞av.com | 国产1区2区| 成人国产在线视频 | 久久亚洲一区 | 久久在线 | a级大片免费观看 | 成人综合视频在线观看 | 日韩精品一区二区三区视频播放 | av在线视| 国产精品美女www爽爽爽视频 | 国产综合久久 | 国产欧美精品一区二区三区 | 欧美一级在线观看 | 欧美a在线 | 日日日色| 日韩日韩日韩日韩日韩日韩日韩 | 日本一区高清 | 日日夜夜天天久久 | 成人国产精品视频 | 亚洲欧美日韩中文字幕一区二区三区 | 亚洲一区视频在线播放 | 久一精品| 中文字幕亚洲欧美日韩在线不卡 | 久久99精品久久久久久噜噜 | 青青草中文字幕 | 一区二区三区中文字幕 | av在线播放免费 | 91tv在线观看 | 国产色网站 | 久久精品久久久 |