📄 adc0832.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 + -