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

📄 adc0832.c

📁 ADC0832 和 LCD1602 的测试程序
💻 C
字号:
	 # include <AT89x52.h>

/*****************************************

         P0------DB0~DB7         
		 P1.0------RS
		 P1.1------RW
		 P1.2------E

*****************************************/

# define LCD_DB        P0

  sbit         LCD_RS=P1^0;

  sbit         LCD_RW=P1^1;

  sbit         LCD_E=P1^2;

  sbit ADC0832_CS =P2^0;

  sbit ADC0832_CLK=P3^6;

  sbit ADC0832_DO =P3^7;

  sbit ADC0832_DI =P3^7;

/******定义函数****************/

# define uchar unsigned char

# define uint unsigned int


void LCD_init(void);//初始化函数

void LCD_write_command(uchar command);//写指令函数

void LCD_write_data(uchar dat);//写数据函数

void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-16),y(1-2)

void delay_n40us(uint n);//延时函数



void Delay(unsigned char x)

{ 

 unsigned char i; 

 for(i=0;i<x;i++); //延时,脉冲一位持续的时间

}

 unsigned char ReadADC(void) //把模拟电压值转换成8位二进制数并返回

{ 

      unsigned char i,ch;

      ch = 0 ;

      
      ADC0832_CS=0;

      //ADC0832_DO=0;//片选,DO为高阻态

      for(i=0;i<100;i++)

            { ; }

      ADC0832_CLK=0;

      Delay(20);

      ADC0832_DI = 1 ; 

      ADC0832_CLK=1; 

      Delay(2); //第一个脉冲,起始位 

      ADC0832_CLK=0; 

      Delay(2); 

      ADC0832_DI=1; 

      ADC0832_CLK=1;

      Delay(20); //第二个脉冲,DI=1表示双通道单极性输入

      ADC0832_CLK=0;

      Delay(20);

      ADC0832_DI=0; 

      ADC0832_CLK=1;

      Delay(20); //第三个脉冲,DI=0表示选择通道0(CH2)

      //ADC0832_DI=1; 

      ADC0832_DO=1;//DI转为高阻态,DO脱离高阻态为输出数据作准备

      ADC0832_CLK=1;

      Delay(20);

      ADC0832_CLK=0; 

      Delay(20);//经实验,这里加一个脉冲AD便能正确读出数据,

           //不加的话读出的数据少一位(最低位d0读不出)

     for (i=0; i<8; i++)

     { 

        ADC0832_CLK=1; 

        Delay(20); 

        ADC0832_CLK=0; 

        Delay(20);

        ch=(ch<<1)|ADC0832_DO;//在每个脉冲的下降沿DO输出一位数据,最终ch为8位二进制数

   }

    ADC0832_CS=1;//取消片选,一个转换周期结束

    return(ch);//把转换结果返回

}


//*******初始化函数***************

void LCD_init(void)

{

    delay_n40us(10000);

    LCD_write_command(0x38);//设置8位格式,2行,5x7

    LCD_write_command(0x38);//设置8位格式,2行,5x7

    LCD_write_command(0x38);//设置8位格式,2行,5x7

    
	LCD_write_command(0x02);//整体显示,关光标,不闪烁

	LCD_write_command(0x0C);//清除屏幕显示

    LCD_write_command(0x06);//设定输入方式,增量不移位

}

//********************************

//********写指令函数************

void LCD_write_command(uchar dat)

{
    
    LCD_E = 0;
	
	LCD_RS=0;//指令

    LCD_RW=0;//写入

    LCD_DB=dat;
	
	LCD_E=1;//允许

	delay_n40us(10);//实践证明,我的LCD1602上,用for循环1次就能完成普通写指令。

    LCD_E = 0;
}

//*******************************

//********写数据函数*************

void LCD_write_data(uchar dat)

{

     LCD_E = 0;     

	 LCD_RS=1;//数据

     LCD_RW=0;//写入

     LCD_DB=dat;
	 
	 LCD_E=1;//允许

     delay_n40us(10);
     
	 LCD_E = 0;
}

//********************************

//*******显示一个字符函数*********

void LCD_disp_char(uchar x,uchar y,uchar dat)

{
	 uchar address;

     if(y==1)

              address=0x80+x;

     else

              address=0xc0+x;

     LCD_write_command(address);

     LCD_write_data(dat);
}



void delay_n40us(uint n)

{    
       uint i;

      uchar j;            

        for(i=n;i>0;i--)

           for(j=0;j<15;j++)
		          ;          //

}                                         //

//*******************************

//*********主函数*****************

void main(void)

{
	
        unsigned char result;        

		LCD_init();
		while(1)
		{
            result = ReadADC();
		    LCD_disp_char(1,1,result/100+0x30);
			result = result %100;
			LCD_disp_char(2,1,result/10+0x30);
			result = result %10;
			LCD_disp_char(3,1,result+0x30);
		 
		    delay_n40us(5000);
		 }
		 

        
}		  

⌨️ 快捷键说明

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