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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5353|回復: 4
收起左側

求幫助 pcf8591+stc8051+lcd1602仿真加單片機程序有問題

[復制鏈接]
ID:183655 發表于 2017-8-13 18:46 | 顯示全部樓層 |閱讀模式
通過調節電位器實現ad轉換,由1602顯示,程序只選擇了通道二,需要可以自行修改。
1.png

0.png

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

  6. /*====================================
  7. 自定義類型名
  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串行數據
  17. sbit SCL = P2^1;   //I2C串行時鐘
  18. //sbit DU  = P2^6;   //數碼管段選
  19. //sbit WE  = P2^7;   //數碼管位選
  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寫
  25. sbit LCD_EN=P3^4;           //lcd1602使能
  26. uchar AD_Value;        //存儲AD轉換回的數字量



  27. /*函數聲明*/
  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. 共陰極數碼管段選碼
  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                -         .          關顯示
  52. 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
  53.                    };
  54. */
  55. /*====================================
  56. 數碼管位選碼
  57. ====================================*/
  58. /*
  59.                                   //第1位        2位          3位         4位   5位        6位          7位        8位
  60. uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//數碼管位碼
  61. */

  62. /*LCD函數*/
  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. /*寫命令  寫一個字節*/
  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. /*寫數據  寫一個字節*/
  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 設置初始化*/
  98. void lcd_set_init()
  99. {
  100.     lcd_write_cmd(0x01);  //清屏
  101.         lcd_write_cmd(0x38);         //設置16*2顯示模式
  102.         lcd_write_cmd(0x0f);         //開顯示,不顯示光標,光標不閃爍
  103.         lcd_write_cmd(0x06);          //讀寫一個字符后地址指針加一
  104.         lcd_write_cmd(0x80);  //數據指針設置
  105. }

  106. /*====================================
  107. 函數:void Delay_Ms(INT16U ms)
  108. 參數:ms,毫秒延時形參
  109. 描述:12T 51單片機自適應主時鐘毫秒級延時函數
  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. 函數:void Delay5us()
  121. 描述:12T 51單片機5微秒延時函數自適應時鐘(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. 函數:void Display(INT8U Value)
  135. 參數:Value,顯示值 取值0-255
  136. 描述:LCD1602顯示函數可顯示一個字節的數
  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];                          //第一位數碼管
  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];                          //第二位數碼管
  167.         WE = 0;
  168.         Delay_Ms(5);
  169. //-------------------------------
  170.         DU = 1;
  171.         P0 = table[Value%10];                //顯示個位
  172.         DU = 0;
  173.                                                                
  174.         P0 = 0xff;                                        //清除斷碼

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

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

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

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

  243. /*====================================
  244. 函數:Test_ACK()
  245. 返回:0為非應答 1為應答
  246. 描述:I2C檢測從機應答
  247. ====================================*/
  248. bit Test_ACK()         // 檢測從機應答
  249. {
  250.         SCL = 1;//時鐘總線為高電平期間可以讀取從機應答信號
  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. 函數:I2C_send_byte(uchar byte)
  266. 參數:byte 要發送的字節
  267. 描述:I2C發送一個字節
  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. 函數:I2C_read_byte()
  297. 返回:讀取的字節
  298. 描述:I2C讀一個字節
  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. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

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



回復

使用道具 舉報

ID:389518 發表于 2018-8-30 21:28 | 顯示全部樓層
仿真圖不是pcf8591的
回復

使用道具 舉報

ID:880853 發表于 2021-2-18 12:55 | 顯示全部樓層
好資料,找了好久了
回復

使用道具 舉報

ID:1031469 發表于 2022-6-6 10:03 | 顯示全部樓層
下載下來試了一下,很不錯的資料,
回復

使用道具 舉報

ID:155507 發表于 2022-6-6 23:34 | 顯示全部樓層
程序分享出來給需要的人作參考
51 pcf8591 1602.jpg

  1. #include <stdio.h>

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

  7. /*====================================
  8. 自定義類型名
  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串行數據
  18. sbit SCL = P2^1;   //I2C串行時鐘
  19. //sbit DU  = P2^6;   //數碼管段選
  20. //sbit WE  = P2^7;   //數碼管位選
  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寫
  26. sbit LCD_EN=P3^4;           //lcd1602使能
  27. uchar AD_Value;        //存儲AD轉換回的數字量



  28. /*函數聲明*/
  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. 共陰極數碼管段選碼
  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                -         .          關顯示
  53. 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71, 0x40, 0x80, 0x00
  54.                                 };
  55. */
  56. /*====================================
  57. 數碼管位選碼
  58. ====================================*/
  59. /*
  60.                                 //第1位        2位          3位         4位   5位        6位          7位        8位
  61. uchar code T_COM[] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f};//數碼管位碼
  62. */

  63. /*LCD函數*/
  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. /*寫命令  寫一個字節*/
  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. /*寫數據  寫一個字節*/
  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 設置初始化*/
  98. void lcd_set_init()
  99. {
  100.         lcd_write_cmd(0x33);  //
  101.         lcd_write_cmd(0x38);         //設置16*2顯示模式
  102.         lcd_write_cmd(0x01);  //清屏
  103.         lcd_write_cmd(0x0f);         //開顯示,不顯示光標,光標不閃爍
  104.         lcd_write_cmd(0x06);          //讀寫一個字符后地址指針加一
  105.         lcd_write_cmd(0x80);  //數據指針設置
  106. }

  107. /*====================================
  108. 函數:void Delay_Ms(INT16U ms)
  109. 參數:ms,毫秒延時形參
  110. 描述:12T 51單片機自適應主時鐘毫秒級延時函數
  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. 函數:void Delay5us()
  122. 描述:12T 51單片機5微秒延時函數自適應時鐘(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. 函數:void Display(INT8U Value)
  136. 參數:Value,顯示值 取值0-255
  137. 描述:LCD1602顯示函數可顯示一個字節的數
  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];                          //第一位數碼管
  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];                          //第二位數碼管
  169.         WE = 0;
  170.         Delay_Ms(5);
  171. //-------------------------------
  172.         DU = 1;
  173.         P0 = table[Value%10];                //顯示個位
  174.         DU = 0;
  175.                                                                
  176.         P0 = 0xff;                                        //清除斷碼

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

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

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

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

  245. /*====================================
  246. 函數:Test_ACK()
  247. 返回:0為非應答 1為應答
  248. 描述:I2C檢測從機應答
  249. ====================================*/
  250. bit Test_ACK()         // 檢測從機應答
  251. {
  252.         SCL = 1;//時鐘總線為高電平期間可以讀取從機應答信號
  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. 函數:I2C_send_byte(uchar byte)
  268. 參數:byte 要發送的字節
  269. 描述:I2C發送一個字節
  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. 函數:I2C_read_byte()
  299. 返回:讀取的字節
  300. 描述:I2C讀一個字節
  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數據*/
  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. }


復制代碼






回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 国产激情视频 | 国产一区二区在线播放 | 亚洲一区二区精品视频在线观看 | 国产精品一区二区三区四区 | 成人综合在线视频 | 鸳鸯谱在线观看高清 | 久久久久久久夜 | 夜夜久久 | 九九久久精品视频 | 99久久中文字幕三级久久日本 | 国产精品久久久久久久久久久免费看 | 麻豆a级片 | 美女黄网| 综合色播| 一级片成人 | 欧洲一级毛片 | 日日骚av | 欧美亚洲日本 | 中文字幕欧美一区 | 91色视频在线 | 超碰日本 | 久久久久国产成人精品亚洲午夜 | 成人亚洲一区 | 日本午夜免费福利视频 | 国产视频一区在线 | 免费观看一级特黄欧美大片 | 亚洲一区二区久久 | 啪啪毛片 | 亚洲福利一区二区 | 国产精品亚洲精品久久 | 久久1区| 久久亚洲国产精品 | 午夜在线| 精品国产欧美日韩不卡在线观看 | 国产黄色电影 | 99精品久久 | 国产精品久久久久久影视 | 国产欧美日韩综合精品一区二区 | 成人精品在线观看 | 视频一区在线观看 | 亚洲色欧美另类 |