登录
|
立即注册
|
使用QQ帐号登录
论坛
>
24小时必答区
发帖
|
PCF8591+单片机测光强程序哪里有问题,串口得到的数据全是255
看3059
|
回3
|
收藏
楼主
ID:508775
只看他
2019-4-24 16:02
大家好,我是个小白,然后这个问题也是问了很多次了,我这边这个程序写完之后串口得到的数据一直是255,另外我使用的芯片是PCF8591,一路输入模拟信号用来测光强,请大家看看我的程序看看我的问题究竟出在哪里,谢谢各位大佬了,各位觉得有任何问题都可以提出来,我这边真的想不出来办法了。
单片机源程序如下:
代码:
#include "reg52.h"
#include <intrins.h>
#define unchar unsigned char
#define uint unsigned int
sbit scl=P2^1;
sbit sda=P2^0;
unchar dat[4]={'0','0','0','0'};
void delay_4us()
{
_nop_();
_nop_();
_nop_();
_nop_();
}
void delay(uint i)
{
while(i--);
}
void i2c_init()
{
scl=0;
sda=1;
delay_4us();
scl=1;
delay_4us();
scl=0;
}
void i2c_start()
{
scl=0;
delay_4us();
sda=1;
delay_4us();
scl=1;
delay_4us();
sda=0;
delay_4us();
scl=0;
}
void i2c_stop()
{
scl=0;
delay_4us();
sda=0;
delay_4us();
scl=1;
delay_4us();
sda=1;
delay_4us();
scl=0;
delay_4us();
}
void i2c_ack(unchar ackbit)
{
if(!ackbit)
{
sda=0;
}
else
{
sda=1;
}
delay_4us();
scl=1;
delay_4us();
scl=0;
delay_4us();
sda=1;
delay_4us();
scl=1;
delay_4us();
scl=0;
}
bit i2c_waitack()
{
sda=1;
delay_4us();
scl=1;
delay_4us();
if(sda)
{
scl=0;
i2c_stop();
return 0;
}
else
{
scl=0;
return 1;
}
}
void i2c_send(unchar byte)
{
unchar i;
for(i=0;i++;i<8)
{
if(byte&0x80)
{
sda=1;
}
else
{
sda=0;
}
delay_4us();
byte<<=1;
delay_4us();
scl=0;
}
}
unchar i2c_receive()
{
unchar dat,i;
for(i=0;i<8;i++)
{
scl=1;
delay_4us();
dat <<=1;
if(sda)
{
dat|=0x01;
}
scl=0;
delay_4us();
}
return dat;
}
void ustart_init()
{
PCON= 0x80; //????????SMOD
SCON= 0x50; //8???,?????
TMOD= 0x20; //?????1?8???????
TL1 = 0xF3; //??????
TH1 = 0xF3;
ET1 = 0; //?????1??
TR1 = 1; //?????1
ES=1;
EA=1;
}
void ustart_send(unchar c)
{
SBUF=c;
while(!TI);
TI=0;
}
void main()
{
unchar temp[12] ="hguangqiang:";
unchar i,j;
unchar shuju;
while(1)
{
i2c_start();
i2c_send(0x90);
i2c_waitack();
i2c_send(0x00);
i2c_waitack();
i2c_send(0x91);
i2c_waitack();
shuju=i2c_receive();
i2c_ack(1);
i2c_stop();
dat[0]='0'+shuju/1000;
dat[1]='0'+shuju%1000/100;
dat[2]='0'+shuju%100/10;
dat[3]='0'+shuju%10;
ustart_init();
for(i=0;i<12;i++)
{
ustart_send(temp[i]);
}
delay(10000);
for(j=0;j<4;j++)
{
ustart_send(dat[j]);
}
delay(10000);
}
}
void zhognduan() interrupt 4
{
unchar receiveData;
RI=0;
receiveData=SBUF;
SBUF=receiveData;
while(!TI);
TI=0;
}
沙发
ID:507540
只看他
2019-4-30 09:12
感觉程序上没大问题,可能是硬件上的问题,是不是用光敏电阻和固定电阻的分压啊,建议使用下vcc和GND间用个蓝白可调电阻来分压当做模拟输入量,这几天我也在研究这个芯片。。。
程序上感觉dat[4]没必要,输出数字量最大为255,用dat[3]不就可以了?
板凳
ID:849422
只看他
2020-11-29 19:47
楼主解决了吗?我也是这样的问题,头都快炸了
地板
ID:960769
只看他
2021-8-25 10:13
楼主解决了码?我也遇到了同样的问题,求解答
51黑电子论坛
Powered by
Discuz!
X3.1
首页
|
标准版
|
触屏版
|
电脑版