搜索
bottom↓
回复: 6

PCF8591 AD的问题一个

[复制链接]

出0入0汤圆

发表于 2012-8-4 14:44:41 | 显示全部楼层 |阅读模式
本帖最后由 angrybulb 于 2012-8-4 20:13 编辑

小弟新来,刚学单片机,现在遇到个问题,我想实现PCF8591芯片的AD转换,先用通道4,然后再LCD上显示电压值,可是我烧进单片机后,无论怎样旋转电位器,显示的值都不会变,麻烦各位指点,O(∩_∩)O谢谢。

//----------------I2C.h--------
  1. #ifndef _I2C_H_
  2. #define _I2C_H_
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. //bit          bdata I2C_ERROR;

  6. sbit SCL        = P2^0;            //数据线
  7. sbit SDA        = P2^1;                   //时钟线

  8. extern void I2C_Start();
  9. extern void I2C_Stop();
  10. extern void Slave_ACK();
  11. extern void Slave_NOACK();
  12. extern void I2C_SendByte(uchar wd);
  13. extern uchar I2C_ReceiveByte();

  14. #endif
复制代码
//-----------------delay.h---------------
#ifndef        _DEALY_H_
#define _DEALY_H_
#define uchar unsigned char
#define uint  unsigned int
//#define Delay4us()        { _nop_();_nop_();_nop_();_nop_();}
extern  void delay(uint z);
extern         void delay4us();
#endif

//-----------------LCD1602.h------------
  1. #ifndef _LCD1602_H_
  2. #define _LCD1602_H_
  3. #define uchar unsigned char
  4. #define uint  unsigned int
  5. sbit  RS = P1^0;                //LCD复位端
  6. sbit  RW = P1^1;                //LCD读写位
  7. sbit  EN = P2^5;            //LCD使能端

  8. extern bit LCD_Busy();
  9. extern void LCD_Pos(uchar pos);
  10. extern void LCD_Wcmd(uchar cmd);
  11. extern void LCD_Wdat(uchar str);
  12. extern void LCD_Init();
  13. extern void Display_String(uchar Line_Addr, uchar s[]);
  14. #endif
复制代码
//-----------------这是main.c-----------
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include"delay.h"
  4. #include"I2C.h"
  5. #include"LCD1602.h"

  6. //------------------------------------------
  7. uchar FirstLine[16]={" . V            "};
  8. uchar TempData[8];
  9. bit ADFlag;


  10. //------------------------------------------
  11. void Init_Timer1();
  12. uchar ReadADC(uchar Chl);
  13. void disp();
  14. //------------------------------------------

  15. void Init_Timer1()
  16. {
  17. TMOD |= 0x10;                             
  18. TH1=0xff;                      
  19. TL1=0x00;
  20. EA=1;                       
  21. ET1=1;                     
  22. TR1=1;  
  23. }

  24. uchar ReadADC(uchar Chl)
  25. {
  26.        uchar Data;
  27.            I2C_Start();        //写入芯片地址
  28.            I2C_SendByte(0x90);
  29.            Slave_ACK();
  30.            I2C_SendByte(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
  31.                                   //Chl的值分别为0、1、2、3,分别代表1-4通道
  32.            Slave_ACK();
  33.            I2C_Start();
  34.            I2C_SendByte(0x91);    //读入地址
  35.            Slave_ACK();
  36.            Data=I2C_ReceiveByte();    //读数据
  37.            SCL=0;
  38.            Slave_NOACK();
  39.            I2C_Stop();
  40.            return Data;   //返回值
  41. }

  42. void disp()
  43. {
  44.         FirstLine[0]='0'+TempData[6];
  45.         FirstLine[2]='0'+TempData[7];

  46.         Display_String(0x00,FirstLine);
  47. }

  48. void main()
  49. {
  50.          uchar ADtemp;                //定义中间变量
  51.          LCD_Init();
  52.          Init_Timer1();
  53.          while(1)
  54.          {
  55.            if(ADFlag)      //定时采集输入模拟量
  56.        {
  57.                    ADFlag=0;

  58.            /*        ADtemp=ReadADC(0);
  59.                 TempData[0]=(ReadADC(0))/50;//处理0通道电压显示
  60.                   TempData[1]=((ReadADC(0))%50)/10;
  61.          
  62.         ADtemp=ReadADC(1);
  63.                 TempData[2]=(ReadADC(1))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  64.                   TempData[3]=((ReadADC(1))%50)/10;
  65.                  
  66.         ADtemp=ReadADC(2);
  67.                 TempData[4]=(ReadADC(2))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  68.                   TempData[5]=((ReadADC(2))%50)/10;           */
  69.                  
  70.         ADtemp=ReadADC(3);
  71.                 TempData[6]=(ReadADC(3))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
  72.                   TempData[7]=((ReadADC(3))%50)/10;
  73.                  
  74.         disp();       
  75.                 }
  76.          }
  77. }

  78. void Timer1_isr() interrupt 3 using 1//定时器1执行数码管动态扫描
  79. {

  80. static uint j;
  81. TH1=0xfb;                //重新赋值
  82. TL1=0x00;
  83. j++;
  84. if(j==200)
  85.     {j=0;ADFlag=1;} //定时置位AD采样标志位
  86. }
  87. //------------------------------------------
复制代码
//--------------------这是I2C.c---------------------
  1. #include<reg51.h>
  2. #include"delay.h"
  3. #include"I2C.h"


  4. void I2C_Start()
  5. {
  6.         SDA = 0;
  7.         SCL = 1;
  8.         delay4us();
  9.         SDA = 0;
  10.         delay4us();
  11.         SCL = 0;       
  12. }

  13. void I2C_Stop()
  14. {
  15.         SDA = 0;
  16.         SCL = 1;
  17.         delay4us();
  18.         SDA = 1;
  19.         delay4us();
  20.         SCL = 0;
  21. }

  22. void Slave_ACK()
  23. {
  24.         SDA = 0;
  25.         SCL = 1;
  26.         delay4us();
  27.         SCL = 0;
  28.         SDA = 1;       
  29. }

  30. void Slave_NOACK()
  31. {
  32.         SDA = 1;
  33.         SCL = 1;
  34.         delay4us();
  35.         SCL = 0;
  36.         SDA = 0;
  37. }

  38. //----------------写一个字节 -------------------
  39. void I2C_SendByte(uchar wd)
  40. {
  41.         uchar i,Temp;
  42.         Temp = wd;
  43.         for(i = 0;i < 8;i++)
  44.         {
  45.                 Temp = Temp << 1;
  46.                 SCL = 0;
  47.                 delay4us();
  48.                 SDA = CY;
  49.                 delay4us();
  50.                 SCL = 1;
  51.                 delay4us();
  52.         }       
  53.         SCL = 0;
  54.         delay4us();
  55.         SDA = 1;
  56.         delay4us();
  57. }

  58. //----------------读取一个字节------------------
  59. uchar I2C_ReceiveByte()
  60. {
  61.         uchar i,k;
  62.         SCL = 0;
  63.         delay4us();
  64.         SDA = 1;
  65.         delay4us();
  66.         for(i = 0;i < 8; i++)
  67.         {
  68.                 SCL = 1;
  69.                 delay4us();
  70.                 k = ( k<<1 ) | SDA;
  71.                 SCL = 0;
  72.                 delay4us();
  73.         }
  74.         return k;
  75. }
  76. //----------------------------------------------
复制代码
//--------------这是LCD1602.c----------
  1. #include<reg51.h>
  2. #include<delay.h>
  3. #include<LCD1602.h>

  4. //----------------------------------------------
  5. //LCD初始化
  6. //----------------------------------------------
  7. void LCD_Init()
  8. {
  9.         LCD_Wcmd(0x38);           //8位数据长度 5X7像素字体
  10.         delay(1);
  11.         LCD_Wcmd(0x01);           //清屏
  12.         delay(1);               
  13.         LCD_Wcmd(0x06);           //字符进入模式:屏幕不动,字符后移
  14.         delay(1);
  15.         LCD_Wcmd(0x0c);           //显示开,关光标
  16.         delay(1);               
  17. }
  18. //----------------------------------------------
  19. //LCD忙检查
  20. //----------------------------------------------
  21. bit LCD_Busy()
  22. {
  23.         bit LCD_Status;
  24.         RS = 0;
  25.         RW = 1;
  26.         EN = 1;
  27.         delay(1);
  28.         LCD_Status = P0;
  29.         EN = 0;
  30.         return LCD_Status;       
  31. }
  32. //----------------------------------------------
  33. //LCD写命令
  34. //----------------------------------------------
  35. void LCD_Wcmd(uchar cmd)
  36. {
  37.         while((LCD_Busy() & 0x80) == 0x80);
  38.         RS = 0;
  39.         RW = 0;
  40.         EN = 0;
  41.         P0 = cmd;
  42.         EN = 1;
  43.         delay(1);
  44.         EN = 0;       
  45. }

  46. //---------------------------------------------
  47. //设置液晶显示位置
  48. //---------------------------------------------
  49. void LCD_Pos(uchar pos)
  50. {
  51.         LCD_Wcmd(pos | 0x80);
  52. }
  53. //----------------------------------------------
  54. //LCD写入数据
  55. //----------------------------------------------
  56. void LCD_Wdat(uchar str)
  57. {
  58.         while((LCD_Busy() & 0x80) == 0x80);
  59.         RS = 1;
  60.         RW = 0;
  61.         EN = 0;
  62.         P0 = str;
  63.         EN = 1;
  64.         delay(1);
  65.         EN = 0;
  66. }
  67. //--------------------------------------------------------
  68. //在LCD指定的行上显示字符串
  69. //---------------------------------------------------------
  70. void Display_String(uchar Line_Addr, uchar s[])
  71. {
  72.         uchar k;
  73.         LCD_Pos(Line_Addr);
  74.         for(k = 0; k < 16; k++)
  75.         {
  76.                 LCD_Wdat(s[k]);
  77.         }       
  78. }
  79. //----------------------------------------------
复制代码
//--------------------------这是delay.c---------------
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #include"delay.h"
  4. void delay(uint z)
  5. {
  6.         uint x,y;
  7.         for(x = z;x>0;x--)
  8.                 for(y = 110;y>0;y--);
  9. }

  10. void delay4us()
  11. {
  12.         _nop_();
  13.         _nop_();
  14.         _nop_();
  15.         _nop_();
  16. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2012-8-4 15:34:45 | 显示全部楼层
亲,第一次发帖给点面子啊

出0入0汤圆

发表于 2012-8-4 16:55:09 | 显示全部楼层
现象描述不清楚。。LCD上显示什么值, 全00?   最好首次写测试模块的测试,在程序里插入一个1S一闪的指示灯,万一程序跑死机了,还可以看出来是否是程序跑飞了。

出0入0汤圆

发表于 2012-8-4 18:11:15 | 显示全部楼层
读AD  先0x90后0x91   再看下手册吧

出0入0汤圆

 楼主| 发表于 2012-8-4 19:58:34 | 显示全部楼层
Bungy 发表于 2012-8-4 18:11
读AD  先0x90后0x91   再看下手册吧

哦,发现了,修改下试试看

出0入0汤圆

 楼主| 发表于 2012-8-4 20:00:26 | 显示全部楼层
slzm40 发表于 2012-8-4 16:55
现象描述不清楚。。LCD上显示什么值, 全00?   最好首次写测试模块的测试,在程序里插入一个1S一闪的指示 ...

嗯,我没说清楚,显示是5.0V;
测试模块的程序是写在main函数里面吗?

出0入0汤圆

发表于 2012-8-5 00:02:12 | 显示全部楼层
看下SDA和SCL有没有接反,查一下硬件、
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 17:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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