找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4405|回复: 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, 下载次数: 148)
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表