本人菜鸟一枚,刚学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 uint unsigned 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 uint unsigned int
sbit EN=P3^4;
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
#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
----------------------------------
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[k]);
}
}
//----------------------------------------------
main.c
----------------------------------------------
sbit led=P1^0;
sbit led1=P1^1;
sbit led2=P1^2;
uchar FirstLine[16]={" . V "};
uchar TempData[8];
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]='0'+TempData[6];
FirstLine[2]='0'+TempData[7];
Display_String(0x00,FirstLine);
}
void main()
{
uchar ADtemp; //定义中间变量
LCD_Init();
Init_Timer1();
while(1)
{
if(ADFlag) //定时采集输入模拟量
{
ADFlag=0;
/* ADtemp=ReadADC(0);
TempData[0]=(ReadADC(0))/50;//处理0通道电压显示
TempData[1]=((ReadADC(0))%50)/10;
ADtemp=ReadADC(1);
TempData[2]=(ReadADC(1))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
TempData[3]=((ReadADC(1))%50)/10; */
/* ADtemp=ReadADC(2);
TempData[4]=(ReadADC(2))/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
TempData[5]=((ReadADC(2))%50)/10;*/
led1=~led;
ADtemp=ReadADC(3);
TempData[6]=(ADtemp)/50;//处理1通道电压显示 此通道暂时屏蔽,可以自行添加
TempData[7]=(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采样标志位
}
//------------------------------------------
一周热门 更多>