wain、huang 发表于 2013-5-22 22:36:01

菜鸟求助!求各位大神帮帮忙,关于PGF8591 AD转换程序的

本人菜鸟一枚,刚学51不久,买了个学习板,学到AD转换这感觉不是很理解,想弄个调节电位器单通道输入,AD转换电压值在LCD1602上显示出来,看的是郭天祥10天单片机教程,他教的是AD0804芯片的,我的开发板上是PGF8591芯片的,是AD/DA合在一起的-----背景交代完毕-----下面是我的程序,LCD显示就卡在 5.0 V这里了,不知道是转换出了问题还是显示出了问题,请各位大神抽空指点指点啊,这对我很重要,谢谢啊,换了其他通道就显示 0.0V


------------------------------------
            I2C.h
----------------------------------
#ifndef _I2C_H_
#define _I2C_H_
#define uchar unsigned char
#define uintunsigned int
//bit          bdata I2C_ERROR;

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

extern void I2C_Start();
extern void I2C_Stop();
extern void Slave_ACK();
extern void Slave_NOACK();
extern void I2C_SendByte(uchar wd);
extern uchar I2C_ReceiveByte();

#endif
---------------------------------------
            LCD1602.h
--------------------------------------
#ifndef _LCD1602_H_
#define _LCD1602_H_
#define uchar unsigned char
#define uintunsigned int
sbit EN=P3^4;

wain、huang 发表于 2013-5-23 17:00:31

求大神出现啊

wain、huang 发表于 2013-5-23 19:49:56

//-----------------delay.h---------------
#ifndef      _DEALY_H_
#define _DEALY_H_
#define uchar unsigned char
#define uintunsigned int
//#define Delay4us()      { _nop_();_nop_();_nop_();_nop_();}
externvoid delay(uint z);
extern         void delay4us();
#endif
----------------------------------
          delay.c
----------------------------------
void delay(uint z)
{
      uint x,y;
      for(x = z;x>0;x--)
                for(y = 110;y>0;y--);
}

void delay4us()
{
      _nop_();
      _nop_();
      _nop_();
      _nop_();
}
------------------------
          I2C.c
-------------------------
void I2C_Start()
{
      SDA = 1;
      SCL = 1;
      delay4us();
      SDA = 0;
      delay4us();
      SCL = 0;      
}

void I2C_Stop()
{
      SDA = 0;
      SCL = 1;
      delay4us();
      SDA = 1;
      delay4us();
      SCL = 0;
}

void Slave_ACK()
{
      SDA = 0;
      SCL = 1;
      delay4us();
      SCL = 0;      
}

void Slave_NOACK()
{
      SDA = 1;
      SCL = 1;
      delay4us();
      SCL = 0;
}

//----------------写一个字节 -------------------
void I2C_SendByte(uchar wd)
{
      uchar i,Temp;
      Temp = wd;
      for(i = 0;i < 8;i++)
      {
                Temp = Temp << 1;
                SCL = 0;
                delay4us();
                SDA = CY;
                delay4us();
                SCL = 1;
                delay4us();
      }      
      SCL = 0;
      delay4us();
      SDA = 1;
      delay4us();
}

//----------------读取一个字节------------------
uchar I2C_ReceiveByte()
{
         unsigned char temp=0;
           unsigned char temp1=0;
           unsigned char BitCounter=8;

           SDA=1;
           do
             {
                  SCL=0;
          _nop_();
                  SCL=1;
                  _nop_();
                  if(SDA)
                     temp=temp|0x01;
                  else
                     temp=temp&0xfe;

                  if(BitCounter-1)
                     {
                          temp1=temp<<1;
                          temp=temp1;
                          }
                          BitCounter--;
                       }
                while(BitCounter);
                return(temp);
}
//--------------------------------------
             LCD1602.c
----------------------------------------
//----------------------------------------------
//LCD初始化
//----------------------------------------------
void LCD_Init()
{
      LCD_Wcmd(0x38);         //8位数据长度 5X7像素字体
      delay(1);
      LCD_Wcmd(0x01);         //清屏
      delay(1);               
      LCD_Wcmd(0x06);         //字符进入模式:屏幕不动,字符后移
      delay(1);
      LCD_Wcmd(0x0c);         //显示开,关光标
      delay(1);               
}
//----------------------------------------------
//LCD忙检查
//----------------------------------------------
bit LCD_Busy()
{
      bit LCD_Status;
      RS = 0;
      RW = 1;
      EN = 1;
      delay(1);
      LCD_Status = P0;
      EN = 0;
      return LCD_Status;      
}
//----------------------------------------------
//LCD写命令
//----------------------------------------------
void LCD_Wcmd(uchar cmd)
{
      while((LCD_Busy() & 0x80) == 0x80);
      RS = 0;
      RW = 0;
      EN = 0;
      P0 = cmd;
      EN = 1;
      delay(1);
      EN = 0;      
}

//---------------------------------------------
//设置液晶显示位置
//---------------------------------------------
void LCD_Pos(uchar pos)
{
         LCD_Wcmd(pos | 0x80);
}
//----------------------------------------------
//LCD写入数据
//----------------------------------------------
void LCD_Wdat(uchar str)
{
         while((LCD_Busy() & 0x80) == 0x80);
      RS = 1;
      RW = 0;
      EN = 0;
      P0 = str;
      EN = 1;
      delay(1);
      EN = 0;
}
//--------------------------------------------------------
//在LCD指定的行上显示字符串
//---------------------------------------------------------
void Display_String(uchar Line_Addr, uchar s[])
{
      uchar k;
      LCD_Pos(Line_Addr);
      for(k = 0; k < 16; k++)
      {
                LCD_Wdat(s);
      }      
}
//----------------------------------------------
            main.c
----------------------------------------------
sbit led=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
uchar FirstLine={" . V            "};
uchar TempData;
bit ADFlag;


//------------------------------------------
void Init_Timer1();
uchar ReadADC(uchar Chl);
void disp();
//------------------------------------------

void Init_Timer1()
{
       TMOD |= 0x10;                           
       TH1=0xff;                     
       TL1=0x00;
       EA=1;                     
       ET1=1;                     
       TR1=1;
}

uchar ReadADC(uchar Chl)
{
                      unsigned char Data;
                   I2C_Start();      //写入芯片地址
                   I2C_SendByte(0x90);
                   Slave_ACK();
                   I2C_SendByte(0x40|Chl);//写入选择的通道,本程序只用单端输入,差分部分需要自行添加
               //Chl的值分别为0、1、2、3,分别代表1-4通道
                   Slave_ACK();
                   I2C_Start();
                   I2C_SendByte(0x91);    //读入地址
                   Slave_ACK();
                  
                   Data=I2C_ReceiveByte();    //读数据
                   SCL=0;
                   Slave_NOACK();
                   I2C_Stop();
                   return Data;   //返回值
}

void disp()
{
      FirstLine='0'+TempData;
      FirstLine='0'+TempData;

      Display_String(0x00,FirstLine);
}

void main()
{
         uchar ADtemp;                //定义中间变量
         LCD_Init();
         Init_Timer1();
         while(1)
         {
         if(ADFlag)      //定时采集输入模拟量
       {
                   ADFlag=0;

                                                                        
                        /*        ADtemp=ReadADC(0);
                TempData=(ReadADC(0))/50;//处理0通道电压显示
                  TempData=((ReadADC(0))%50)/10;          
         
      ADtemp=ReadADC(1);
                TempData=(ReadADC(1))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
                  TempData=((ReadADC(1))%50)/10;        */
                  
      /*ADtemp=ReadADC(2);
                TempData=(ReadADC(2))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
                  TempData=((ReadADC(2))%50)/10;*/
                                  led1=~led;         
                  
      ADtemp=ReadADC(3);
                TempData=(ADtemp)/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
                  TempData=(ADtemp)%50/10;       
                  
      disp();      
                }
         }
}

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

static uint j;
TH1=0xfb;                //重新赋值
TL1=0x00;
j++;
if(j==200)
    {
                j=0;ADFlag=1;
               led=~led;
        } //定时置位AD采样标志位
       
}       
//------------------------------------------

wain、huang 发表于 2013-5-23 23:02:57

大家帮帮忙啊
页: [1]
查看完整版本: 菜鸟求助!求各位大神帮帮忙,关于PGF8591 AD转换程序的