接近崩溃边缘,AD转换代码,结果老是不对啊!
时间:10-02
整理:3721RD
点击:
结果输出的都是000
和,相同的对照好几遍就是改不出来哪里错了!崩溃,有没有大神教一教!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define PCF8591_WRITE 0x90
#define PCF8591_READ 0x91
sbit scl=P2^1;
sbit sda=P2^0;
sbit wela=P2^7;
sbit dula=P2^6;
sbit DS1302 =P2^4;
void init();
void delay();
void delayms(uint);
void display(uchar ,uchar,uchar);
/*****************************************************/
// I2C总线
//
void start();
void end();
void respond();
void norespond();
// PCF8591
void write_byte(uchar);
uchar read_byte();
void readtbyte_8591(uchar);
void check_ack();
bit bdata SystemError=0;
// 存储以及显示
//uchar enter=0x42;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar idata date;
void main()
{
uchar bai,shi,ge;
delayms(10);
DS1302=0;
while(1)
{
init();
readtbyte_8591(0x42);
if(SystemError==1)
{
init();
readtbyte_8591(0x42);
}
bai=date/100;
shi=date/10%10;
ge=date%10;
display(bai,shi,ge);
}
}
void init()
{
scl=0;
end();
}
void delay()
{
_nop_();_nop_();
_nop_();_nop_();
}
void delayms(uint a)
{
uint i,j;
for(i=a;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)
{
wela=1;
P0=0xfe;
wela=0;
P0=0xff;
dula=1;
P0=table[bai];
dula=0;
delayms(5);
wela=1;
P0=0xfd;
wela=0;
P0=0xff;
dula=1;
P0=table[shi];
dula=0;
delayms(5);
wela=1;
P0=0xfb;
wela=0;
P0=0xff;
dula=1;
P0=table[ge];
dula=0;
delayms(5);
}
// I2C总线
void start()
{
sda=1;
scl=1;
sda=0;
delay();
scl=0;
}
void end()
{
sda=0;
scl=1;
delay();
sda=1;
delay();
scl=0;
}
void check_ack()
{
sda=1;
scl=1;
F0=0;
delay();
if(sda==1) F0=1;
scl=0;
}
void respond() //主机发送应答
{
sda=0;
scl=1;
delay();
scl=0;
}
void norespond()
{
sda=1;
scl=1;
delay();
sda=0;
scl=0;
}
void write_byte(uchar ch)
{
uint i;
for(i=8;i>0;i--)
{
if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
{
sda = 1;
scl=0; // 传送位1
scl = 1;
delay();
scl = 0;
}
else
{
sda = 0; // 否则传送位0
scl = 1;
delay();
scl = 0;
}
ch = ch<<1; // 数据左移一位
}
}
uchar read_byte()
{
uchar idata val=0;
uchar i;
for(i=8;i>0;i--)
{
sda = 1;
scl= 1;
val =val<<1; //左移一位
if(sda == 1)
sda = val|0x01; // 若接收到的位为1,则数据的最后一位置1
else
val = val&0xfe; // 否则数据的最后一位置0
scl = 0;
}
return (val);
}
// PCF9591
void readtbyte_8591(uchar control_byte)
{
uchar i=0;
start();
write_byte(PCF8591_WRITE);
check_ack();
if(F0 == 1)
{
SystemError = 1;
return ;
}
write_byte(control_byte);
check_ack();
if(F0 == 1)
{
SystemError = 1;
return ;
}
start();
write_byte(PCF8591_READ);
check_ack();
if(F0 == 1)
{
SystemError = 1;
return ;
}
read_byte();
respond();
date=read_byte();
norespond();
end();
}
和,相同的对照好几遍就是改不出来哪里错了!崩溃,有没有大神教一教!
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define PCF8591_WRITE 0x90
#define PCF8591_READ 0x91
sbit scl=P2^1;
sbit sda=P2^0;
sbit wela=P2^7;
sbit dula=P2^6;
sbit DS1302 =P2^4;
void init();
void delay();
void delayms(uint);
void display(uchar ,uchar,uchar);
/*****************************************************/
// I2C总线
//
void start();
void end();
void respond();
void norespond();
// PCF8591
void write_byte(uchar);
uchar read_byte();
void readtbyte_8591(uchar);
void check_ack();
bit bdata SystemError=0;
// 存储以及显示
//uchar enter=0x42;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar idata date;
void main()
{
uchar bai,shi,ge;
delayms(10);
DS1302=0;
while(1)
{
init();
readtbyte_8591(0x42);
if(SystemError==1)
{
init();
readtbyte_8591(0x42);
}
bai=date/100;
shi=date/10%10;
ge=date%10;
display(bai,shi,ge);
}
}
void init()
{
scl=0;
end();
}
void delay()
{
_nop_();_nop_();
_nop_();_nop_();
}
void delayms(uint a)
{
uint i,j;
for(i=a;i>0;i--)
for(j=110;j>0;j--);
}
void display(uchar bai,uchar shi,uchar ge)
{
wela=1;
P0=0xfe;
wela=0;
P0=0xff;
dula=1;
P0=table[bai];
dula=0;
delayms(5);
wela=1;
P0=0xfd;
wela=0;
P0=0xff;
dula=1;
P0=table[shi];
dula=0;
delayms(5);
wela=1;
P0=0xfb;
wela=0;
P0=0xff;
dula=1;
P0=table[ge];
dula=0;
delayms(5);
}
// I2C总线
void start()
{
sda=1;
scl=1;
sda=0;
delay();
scl=0;
}
void end()
{
sda=0;
scl=1;
delay();
sda=1;
delay();
scl=0;
}
void check_ack()
{
sda=1;
scl=1;
F0=0;
delay();
if(sda==1) F0=1;
scl=0;
}
void respond() //主机发送应答
{
sda=0;
scl=1;
delay();
scl=0;
}
void norespond()
{
sda=1;
scl=1;
delay();
sda=0;
scl=0;
}
void write_byte(uchar ch)
{
uint i;
for(i=8;i>0;i--)
{
if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
{
sda = 1;
scl=0; // 传送位1
scl = 1;
delay();
scl = 0;
}
else
{
sda = 0; // 否则传送位0
scl = 1;
delay();
scl = 0;
}
ch = ch<<1; // 数据左移一位
}
}
uchar read_byte()
{
uchar idata val=0;
uchar i;
for(i=8;i>0;i--)
{
sda = 1;
scl= 1;
val =val<<1; //左移一位
if(sda == 1)
sda = val|0x01; // 若接收到的位为1,则数据的最后一位置1
else
val = val&0xfe; // 否则数据的最后一位置0
scl = 0;
}
return (val);
}
// PCF9591
void readtbyte_8591(uchar control_byte)
{
uchar i=0;
start();
write_byte(PCF8591_WRITE);
check_ack();
if(F0 == 1)
{
SystemError = 1;
return ;
}
write_byte(control_byte);
check_ack();
if(F0 == 1)
{
SystemError = 1;
return ;
}
start();
write_byte(PCF8591_READ);
check_ack();
if(F0 == 1)
{
SystemError = 1;
return ;
}
read_byte();
respond();
date=read_byte();
norespond();
end();
}
小编,莫着急,上示波器了吗。看看时序对不对,看看数据引脚上有波形吗。
分两步调吧,先把显示调正确了,然后再确定IIC部分也正确了,只有每一部分都正确了,才好整体调整。
已经调出来