有关pcf8951的一个问题,求大神帮忙解答
时间:10-02
整理:3721RD
点击:
最近在学单片机 买了个学习板,板子上面有个pcf8951芯片,没找到有关教程,只找到了一下程序,但是在主函数中那句write_one(t); 没看懂,定义一个变量t 前面也 没有给t赋初值,直接做了子函数的实参,既然没有赋值,怎么能把t作为数据写入呢?求大神帮忙解惑,小弟感激不尽!小弟QQ11316725, 小弟初学单片机,有兴趣一起学习的可以加我QQ ,大家一起讨论。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0;
sbit scl=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管0-9 abcdef代码
void delay(uchar i);
void delay1(uchar z);
void init();
void start();
void stop();
void ack();
void write_one(uchar date);
uchar read_one();
void display(uint temp);
uint t;
void main()
{
init();
while(1)
{
start();
write_one(0x90);
ack();
write_one(0x40);
ack();
write_one(t);
ack();
stop();
delay(15);
start();
write_one(0x91);
ack();
t=read_one();
stop();
delay1(10);
display(t);
}
}
/********************************************
短暂的延时
********************************************/
void delay(uchar i)
{
while(i--);
}
/********************************************
延时
********************************************/
void delay1(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************************
I2C的初始化
********************************************/
void init()
{
sda=1;
scl=1;
}
/********************************************
I2C的开始信号
********************************************/
void start()
{
sda=1;
delay(1);
scl=1;
delay(1);
sda=0;
delay(1);
}
/********************************************
I2C的停止信号
********************************************/
void stop()
{
sda=0;
delay(1);
scl=1;
delay(1);
sda=1;
delay(1);
}
/********************************************
应答信号
********************************************/
void ack()
{
uchar i;
sda=1;
delay(1);
scl=1;
delay(1);
while((sda==0)&&(i<200))i++;
scl=0;
delay(1);
}
/********************************************
写一个字节
********************************************/
void write_one(uchar date)
{
uchar i,temp;
scl=0;
delay(1);
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
scl=1;
delay(1);
scl=0;
delay(1);
}
sda=1;
delay(1);
}
/********************************************
读一个字节
********************************************/
uchar read_one()
{
uchar i,j,k;
scl=0;
delay(1);
sda=1; //释放数据线
delay(1);
for(i=0;i<8;i++)
{
scl=1;
delay(1);
j=sda;
k=(k<<1)|j;
scl=0;
delay(1);
}
return k;
}
/********************************************
数码管的显示函数
********************************************/
void display(uint temp)
{
float m;
uchar ge,shi,bai;
m=(temp/255.0)*5.0;
temp=m*100;
ge=temp%10;
shi=temp%100/10;
bai=temp/100;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay1(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay1(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
/*delay1(1);*/
}
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit sda=P2^0;
sbit scl=P2^1;
sbit dula=P2^6;
sbit wela=P2^7;
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //数码管0-9 abcdef代码
void delay(uchar i);
void delay1(uchar z);
void init();
void start();
void stop();
void ack();
void write_one(uchar date);
uchar read_one();
void display(uint temp);
uint t;
void main()
{
init();
while(1)
{
start();
write_one(0x90);
ack();
write_one(0x40);
ack();
write_one(t);
ack();
stop();
delay(15);
start();
write_one(0x91);
ack();
t=read_one();
stop();
delay1(10);
display(t);
}
}
/********************************************
短暂的延时
********************************************/
void delay(uchar i)
{
while(i--);
}
/********************************************
延时
********************************************/
void delay1(uchar z)
{
uchar x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/********************************************
I2C的初始化
********************************************/
void init()
{
sda=1;
scl=1;
}
/********************************************
I2C的开始信号
********************************************/
void start()
{
sda=1;
delay(1);
scl=1;
delay(1);
sda=0;
delay(1);
}
/********************************************
I2C的停止信号
********************************************/
void stop()
{
sda=0;
delay(1);
scl=1;
delay(1);
sda=1;
delay(1);
}
/********************************************
应答信号
********************************************/
void ack()
{
uchar i;
sda=1;
delay(1);
scl=1;
delay(1);
while((sda==0)&&(i<200))i++;
scl=0;
delay(1);
}
/********************************************
写一个字节
********************************************/
void write_one(uchar date)
{
uchar i,temp;
scl=0;
delay(1);
temp=date;
for(i=0;i<8;i++)
{
temp=temp<<1;
sda=CY;
scl=1;
delay(1);
scl=0;
delay(1);
}
sda=1;
delay(1);
}
/********************************************
读一个字节
********************************************/
uchar read_one()
{
uchar i,j,k;
scl=0;
delay(1);
sda=1; //释放数据线
delay(1);
for(i=0;i<8;i++)
{
scl=1;
delay(1);
j=sda;
k=(k<<1)|j;
scl=0;
delay(1);
}
return k;
}
/********************************************
数码管的显示函数
********************************************/
void display(uint temp)
{
float m;
uchar ge,shi,bai;
m=(temp/255.0)*5.0;
temp=m*100;
ge=temp%10;
shi=temp%100/10;
bai=temp/100;
dula=1;
P0=table[bai];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay1(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay1(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
/*delay1(1);*/
}
哦 对了!这是一个完整并且正确的程序,小弟亲测过!
t在最开始已经定义了,这只是一个函数的调用而已,最下面有函数的定义
小编这个程序应该是个 储存芯片读写的测试程序吧,程序运行效果是否一直显示“0”呢,首先t是个全局变量,如果不赋值那么默认是“0”,按照我对程序结构的理解,程序实现的功能应该是首先将t写入进存储芯片,然后再去读取存储芯片内的数据,最后显示出来,,实际上就是验证是否能正常读写。小编你试着对t付个其他初值看看效果呢?
刚刚上网,谢谢楼上两位解答,小弟待会去测试下。