⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc0832.c

📁 AD转换芯片的程序
💻 C
字号:
#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

/*******LCD口线定义*******/
#define LCD_DATA P0		 //定义数据线D0-D7
sbit LCD_RS=P1^0;		  //定义寄存器选择位
sbit LCD_RW=P1^1;		 //定义读写信号线位
sbit LCD_E=P1^2;		 //定义使能信号位
sbit LCD_BUSY=LCD_DATA^7;//检测LCD状态字中BUSY标识

/*******ADC0832口线定义*******/
sbit AD_CLK=P3^6;
sbit AD_CS=P2^0;
sbit AD_DI=P3^7;

/*******通道定义*******/
sbit CH1=P3^0;
sbit CH2=P3^1;
/*******函数申明*******/
void LCD_Init(void);
void LCD_Write_Data(uchar dat);
void LCD_Write_Cmd(uchar cmd,BusyC);
void LCD_Disp_Char(uchar X,uchar Y,uchar DData);
void LCD_Disp_String(uchar X,uchar Y,uchar code *DData);
void LCD_Delay(uint ms);
uchar LCD_Check_Busy(void);
uchar readadc(void);

uchar code disptab[]={'0','1','2','3','4','5','6','7','8','9'};//字符代表码;
uchar code a_1[]={"WILLAR"};
uchar code a_2[]={"DIGITAL"};
uchar code a_3[]={"VOLTMETER"};
uchar code dispstring1[]={"VOLTAGE:"};
uchar code channel[]={"INPUT"};
uchar code channel2[]={"CHANNEL"};
/*******LCD函数部分*******/
void LCD_Init(void)
{
 LCD_DATA=0;			   
 LCD_Write_Cmd(0x38,0);	   //三次显示模式设置,不检测忙信号
 LCD_Delay(5);
 LCD_Write_Cmd(0x38,0);
 LCD_Delay(5);
 LCD_Write_Cmd(0x38,0);
 LCD_Delay(5);
 
 LCD_Write_Cmd(0x38,1);	  //显示模式设置,开始要求检测忙信号:8位、2行、5X7点阵
 LCD_Write_Cmd(0x08,1);   //关闭显示
 LCD_Write_Cmd(0x01,1);	  //清屏
 LCD_Write_Cmd(0x06,1);	  //显示光标移动设置:文字不动,光标自动右移
 LCD_Write_Cmd(0x0C,1);   //显示开及光标设置:光标关、光标不闪烁
}

void LCD_Write_Cmd(uchar cmd,BusyC)
{
 if(BusyC)	LCD_Check_Busy();
 LCD_DATA=cmd;
 LCD_RS=0;
 LCD_RW=0;
 LCD_E=0;
 LCD_Delay(5);
 LCD_E=1;
}

void LCD_Write_Data(uchar dat)
{
 LCD_Check_Busy();
 LCD_DATA=dat;
 LCD_RS=1;
 LCD_RW=0;
 LCD_E=0;
 LCD_Delay(5);
 LCD_E=1;
}

void LCD_Disp_Char(uchar X,uchar Y,uchar DData)
{
 Y &=0x01;
 X &=0x0F;
 if(Y) X|=0x40;
 X|=0x80;
 LCD_Write_Cmd(X,0);
 LCD_Write_Data(DData);
}

void LCD_Disp_String(uchar X,uchar Y,uchar code *DData)
{
 uchar StringLength;
 StringLength=0;
 Y &=0x01;
 X &=0x0F;
 while(DData[StringLength]>0x20)
 {
   if(X<=0x0F)
	{
	   LCD_Disp_Char(X,Y,DData[StringLength]); 
        StringLength++;
		X++;
     }
  }
}


uchar LCD_Check_Busy(void)
{
  LCD_DATA=0xFF;
  LCD_RS=0;
  LCD_RW=1;
  LCD_E=0;
  LCD_Delay(5);
  LCD_E=1;
  while(LCD_DATA & 0x80);
  return(LCD_DATA);
}

void LCD_Delay(uint ms)
{
  uchar i;
  while(ms--)
  {
    for(i=0;i<250;i++);
   }
}


/*******ADC0832函数部分*******/

uchar readadc1(void)
{
    uchar dat,i;
      
    AD_CS=1;         //芯片复位
	AD_CLK=0; 
    _nop_();

    AD_CS=0;         //CS拉低,启动A/D转换
    _nop_();
    
    AD_DI=1;         //启动标志位
    AD_CLK=1;        //第一个脉冲
    _nop_();
	AD_DI=0;         //在负跳变之前加一个DI反转操作
    AD_CLK=0;
    
    AD_DI=1;         //配置位1,单通道/差分输入选择
    _nop_();
	AD_CLK=1;        //第二个脉冲
    _nop_();
    AD_CLK=0;
    
    AD_DI=0;         //配置位2   
    _nop_();
	AD_CLK=1;        //第三个脉冲 
    _nop_();
    AD_CLK=0;        
    
	AD_DI=1;
    _nop_();         //空闲位
    AD_CLK=1;        //第四个脉冲
	
    for(i=0;i<=8;i++){             //读出8字节数据
        dat=dat<<1;
        _nop_();
        AD_CLK=1;                    //这里要先1后0...如果是先0后1则输出结果错误...
        if(AD_DI){
            dat|=0x01;
        }
        _nop_();
        AD_CLK=0;
    }
        
    AD_CS=1;        //关闭芯片
    return(dat);          //返回数据
}

uchar readadc2(void)
{
    uchar dat,i;
      
    AD_CS=1;         //芯片复位
	AD_CLK=0; 
    _nop_();

    AD_CS=0;         //CS拉低,启动A/D转换
    _nop_();
    
    AD_DI=1;         //启动标志位
    AD_CLK=1;        //第一个脉冲
    _nop_();
	AD_DI=0;         //在负跳变之前加一个DI反转操作
    AD_CLK=0;
    
    AD_DI=1;         //配置位1,单通道/差分输入选择
    _nop_();
	AD_CLK=1;        //第二个脉冲
    _nop_();
    AD_CLK=0;
    
    AD_DI=1;         //配置位2   
    _nop_();
	AD_CLK=1;        //第三个脉冲 
    _nop_();
    AD_CLK=0;        
    
	AD_DI=1;
    _nop_();         //空闲位
    AD_CLK=1;        //第四个脉冲
	
    for(i=0;i<=8;i++){             //读出8字节数据
        dat=dat<<1;
        _nop_();
        AD_CLK=1;                    //这里要先1后0...如果是先0后1则输出结果错误...
        if(AD_DI){
            dat|=0x01;
        }
        _nop_();
        AD_CLK=0;
    }
        
    AD_CS=1;        //关闭芯片
    return(dat);          //返回数据
}
/*******主函数部分*******/

void main(void)
{
  uint dat1,dat2;
  LCD_Delay(400);
  LCD_Init();
 
  LCD_Disp_String(1,0,a_1);
  LCD_Disp_String(8,0,a_2);
  LCD_Disp_String(4,1,a_3);
 
  LCD_Delay(1000);
  LCD_Init();

  LCD_Disp_String(1,0,channel);
  LCD_Disp_String(7,0,channel2);
  LCD_Disp_String(2,1,dispstring1);
  LCD_Disp_Char(11,1,'.');
  LCD_Disp_Char(14,1,'V');
 while(1)
  {
    while(!CH1)
  {
    dat1=readadc1()/0.51;
    LCD_Disp_Char(15,0,'0');
	LCD_Disp_Char(10,1,disptab[dat1/100]);
	LCD_Disp_Char(12,1,disptab[(dat1%100)/10]);
	LCD_Disp_Char(13,1,disptab[dat1%10]);
    LCD_Delay(400);
  }
  
   while(!CH2)
   {
     dat2=readadc2()/0.51;
    LCD_Disp_Char(15,0,'1');
	LCD_Disp_Char(10,1,disptab[dat2/100]);
	LCD_Disp_Char(12,1,disptab[(dat2%100)/10]);
	LCD_Disp_Char(13,1,disptab[dat2%10]);
    LCD_Delay(400);
   }

}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -