标题:
单片机adc0832获取光照强度,lcd一直显示255
[打印本页]
作者:
安临寒生
时间:
2023-3-25 01:02
标题:
单片机adc0832获取光照强度,lcd一直显示255
uchar ADC_read_data(uchar CH)
{
uchar i,test,adval;
adval = 0x00;
test = 0x00;
CLK = 0; //初始化
DATI = 1;
_nop_();
CS = 0;
_nop_();
CLK = 1;
_nop_();
if ( CH == 0x00 ) //通道选择
{
CLK = 0;
DATI = 1; //通道0的第一位
_nop_();
CLK = 1;
_nop_();
CLK = 0;
DATI = 0; //通道0的第二位
_nop_();
CLK = 1;
_nop_();
}
else
{
CLK = 0;
DATI = 1; //通道1的第一位
_nop_();
CLK = 1;
_nop_();
CLK = 0;
DATI = 1; //通道1的第二位
_nop_();
CLK = 1;
_nop_();
}
CLK = 0;
DATI = 1;
for( i = 0;i < 8;i++ ) //读取前8位的值
{
_nop_();
adval <<= 1;
CLK = 1;
_nop_();
CLK = 0;
if (DATO)
adval |= 0x01;
else
adval |= 0x00;
}
for (i = 0; i < 8; i++) //读取后8位的值
{
test >>= 1;
if (DATO)
test |= 0x80;
else
test |= 0x00;
_nop_();
CLK = 1;
_nop_();
CLK = 0;
}
// if (adval == test) //比较前8位与后8位的值,如果不相同舍去。若一直出现显示为零,请将该行去掉
dat = test;
nop_();
CS = 1; //释放ADC0832
DATO = 1;
CLK = 1;
return dat;
}
void main()
{
uchar adc = 0;
uint voltage = 0;
uchar LED_buffer1[16] = {" ADC: "};//ADC显示缓冲
uchar LED_buffer2[16] = {"voltage: V "};//电压显示缓冲
LCD_Init(); // 初始化LCD
while(1){
adc = ADC_read_data(0x00);//读取adc值
voltage = adc * 500.0 / 255;//将adc值换算成电压
LED_buffer1[9] = adc / 100 + '0'; //取adc百位
LED_buffer1[10] = adc % 100 / 10 + '0'; //取adc十位
LED_buffer1[11] = adc % 10 + '0'; //取adc个位
LED_buffer2[9] = voltage / 100 + '0'; //取电压个位
LED_buffer2[10] = '.';//小数点
LED_buffer2[11] = voltage / 10 % 10 + '0'; //取电压十分位
LED_buffer2[12] = voltage % 10 + '0'; //取电压百分位
LCD_ShowString(1, 1, &LED_buffer1[0]); //显示字符串
LCD_ShowString(2, 1, &LED_buffer2[0]); //显示字符串
}
}
3.png
(64.28 KB, 下载次数: 2)
下载附件
2023-3-25 01:32 上传
作者:
angmall
时间:
2023-3-25 15:06
应该是时序的问题。
unsigned char Get_AD_Result()
{
unsigned char i,dat1=0,dat2=0;
CS = 0; //起始控制位
CLK = 0;
DIO = 1; _nop_(); _nop_();
CLK = 1; _nop_(); _nop_();
CLK = 0;DIO = 1; _nop_(); _nop_(); //第一个下降沿之前,设DI= 1/0
CLK = 1; _nop_(); _nop_(); //轩子单端/差分(SGL/DIF)模式中的单端输入模式
CLK = 0;DIO = 1; _nop_(); _nop_(); //第二个下降沿之前,设DI = 0/1,选择CH0/CH1
CLK = 1;DIO = 1; _nop_(); _nop_();
CLK = 0;DIO = 1; _nop_(); _nop_(); //第三个下降沿之前,设DI = 1
for(i=0;i<8;i++) //第4~11个下降沿读数据(MSB->LSB)
{
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
dat1 = dat1 << 1 | DIO;
}
for(i=0;i<8;i++) //第11~18个下降沿读数据(LSB->MSB)
{
dat2 = dat2 << ((unsigned char)(DIO)<<i);
CLK = 1; _nop_(); _nop_();
CLK = 0; _nop_(); _nop_();
}
CS = 1;
return (dat1 == dat2) ? dat1:0; //如果MSB->LSB和LSB->MSB读取的结果相同,则返回读取的结果,否则返回0
}
复制代码
作者:
1973470203
时间:
2023-3-26 15:00
感觉没什么问题呀,我跟你一样的adc读取程序,除了显示部分有区别外,基本一致,我的能正常显示。
#include "reg51.h"
#include<intrins.h>
#include "lcd.h"
#define uint unsigned int
#define uchar unsigned char
uchar getdata=0;
unsigned char dat = 0;
unsigned long int voltage = 0;
sbit CLK = P2^0;
sbit CS = P2^1;
sbit dio1 = P2^2;
sbit dio0 = P2^2;
uchar ADC0832_Read(uchar CH)
{
unsigned char adval,test,i;
adval = 0x00;
test = 0x00;
CLK = 0;
dio1 = 1;
_nop_();
CS = 0;
_nop_();
CLK = 1;
_nop_();
if(CH == 0x00)
{
CLK = 0;
dio1 = 1;
_nop_();
CLK = 1;
_nop_();
CLK = 0;
dio1 = 0;
_nop_();
CLK = 1;
_nop_();
}
else
{
CLK = 0;
dio1 = 1;
_nop_();
CLK = 1;
_nop_();
CLK = 0;
dio1 = 1;
_nop_();
CLK = 1;
_nop_();
}
CLK = 0;
dio1 = 1;
for(i=0;i<8;i++)
{
_nop_();
adval<<=1;
CLK = 1;
_nop_();
CLK = 0;
if(dio0)
adval |= 0x01;
else
adval |= 0x00;
}
for(i=0;i<8;i++)
{
test>>=1;
if(dio0)
test |= 0x80;
else
test |= 0x00;
_nop_();
CLK = 1;
_nop_();
CLK = 0;
}
// if(test == adval)
getdata = test;
_nop_();
CS = 1;
dio0 = 1;
CLK = 1;
return getdata;
}
void ADC_change(uchar input)
{
unsigned char ADC[4] = {0};
voltage = input*5000.0/255;
ADC[0] = voltage/1000;
ADC[1] = voltage/100%10;
ADC[2] = voltage/10%10;
ADC[3] = voltage%10;
LcdWriteCom(0x80);
//LcdWriteCom(0x81);
LcdWriteData('0'+ADC[0]);
//LcdWriteCom(0x82);
LcdWriteData('0'+ADC[1]);
//LcdWriteCom(0x83);
LcdWriteData('0'+ADC[2]);
// LcdWriteCom(0x84);
LcdWriteData('0'+ADC[3]);
//LcdWriteCom(0x86);
LcdWriteData('m');
LcdWriteData('v');
}
void main()
{
LcdInit();
while(1)
{
dat = ADC0832_Read(0x00);
ADC_change(dat);
}
}
作者:
安临寒生
时间:
2023-3-26 17:16
angmall 发表于 2023-3-25 15:06
应该是时序的问题。
我用了您的程序并没有得到解决。我认为是adc0832程序读取的问题,使电阻改变lcd得不到改变,不知您有什么见解
作者:
安临寒生
时间:
2023-3-26 17:38
我用了别人的光照程序依旧不变,我已经开始怀疑是proteus的问题了,但我换了一个proteus8.13还是没用
作者:
安临寒生
时间:
2023-3-26 17:55
已解决,换了一个ADC0832.dll文件
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1