2019-07-15 10:06发布
wulinwl 发表于 2017-7-25 21:35 仿真图可以不接复位电路和晶振以及电源VCC、GND,仿真软件默认它们存在,实际电路这些都不能少,这些是单片机工作的3个基本条件。
langzitianya 发表于 2017-7-26 10:01 我估计你是卡在读取24c的地方了,你把程序整个贴出来看看,我想你是想读取24c里边的东西显示出来,但是读取值你能确定吗?
最多设置5个标签!
应该是没有少的 因为用的单片机板子碰巧不是自己焊出来 的 是买的 所以晶振什么的是连好的 但是不排除板子上可能没焊好的情况
#include<reg51.h>
#include<intrins.h>
sbit SDA=P2^7;
sbit SCL=P2^6;
#define uint unsigned int
#define uchar unsigned char
uchar code DIS_CODE[12]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0xFF,0x0C};
void delay_ms(uint timer)
{
uchar j=0;
while(timer--)
{
for(j=124;j>0;j--)
{;}
}
}
void delay(void)
{
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
//初始化i2c
void init_I2C(void)
{
SDA=1;
delay();
SCL=1;
delay();
}
//起始信号 SCL高电平期间 SDA一个下降沿表示起始信号
void I2C_start(void)
{
SDA=1;
delay();
SCL=1;
delay();
SDA=0;
delay();
}
//结束信号 SCL高电平期间 SDA一个上升沿表示结束信号
void I2C_stop(void)
{
SDA=0;
delay();
SCL=1;
delay();
SDA=1;
delay();
}
//应答信号SCL高电平期间 如果SDA被从设备拉低 说明有应答信号 为防止因收不到器件应答信号而发送死循环 加i<250判断
void ack(void)
{
uchar i=0;
SCL=1;
delay();
while((SDA==1)&&(i<250))
{
i++;
}
SCL=0;
delay();
}
//非应答信号
void noack(void)
{
SDA=1;
delay();
SCL=1;
delay();
SCL=0;
delay();
}
//发送一字节 将一个数据按位从高到低发送在SDA数据线上 这里用tmp&0x80判断最高位
void I2C_write_byte(uchar dat)
{
uchar i,tmp;
tmp=dat;
for(i=0;i<8;i++)
{
SCL=0;
delay();
if(tmp&0x80)
{
SDA=1;
}else
{
SDA=0;
}
tmp=tmp<<1;
delay();
SCL=1;
delay();
}
SCL=0;
delay();
SDA=1;
delay();
}
//读取一字节
uchar I2C_read_byte(void)
{
uchar i,dat;
SCL=0;
delay();
SDA=1;
delay();
for(i=0;i<8;i++)
{
SCL=1;
delay();
dat=dat<<1;
if(SDA)
SCL=0;
{
dat++;
}
delay();
}
return dat;
}
//按地址写一字节数据
void write_I2C(uchar addr,uchar dat)
{
I2C_start();
I2C_write_byte(0xa0);
ack();
I2C_write_byte(addr);
ack();
I2C_write_byte(dat);
ack();
I2C_stop();
}
//按地址读一字节数据
uchar read_I2C(uchar addr)
{
uchar tmp;
I2C_start();
I2C_write_byte(0xa0);
ack();
I2C_write_byte(addr);
ack();
I2C_start();
I2C_write_byte(0xa1);
ack();
tmp=I2C_read_byte();
noack();
I2C_stop();
return tmp;
}
sbit LED1=P2^0;
sbit LED2=P2^1;
#define DAT_ADDR 0x03
uchar g_ucDat;
void display(uchar dat)
{
uchar sep_num;
uchar ten_num;
sep_num=dat%10;
ten_num=dat/10;
LED1=0;
LED2=1;
P0=DIS_CODE[sep_num];
delay_ms(10);
LED2=0;
LED1=1;
P0=DIS_CODE[ten_num];
delay_ms(10);
}
void int0_init()
{
EX0=1;
IT0=1;
EA=1;
}
//INT0中断函数
void int0_inter() interrupt 0
{
g_ucDat++;
}
void main()
{
uchar tmp=0;
P0=0x00;
P2=0x00;
g_ucDat=0;
int0_init();
init_I2C();
//先判断24c02是否被操作过 未初始化是 存储 的都是0xff
tmp=read_I2C(DAT_ADDR);
if(tmp=0xff)
{
tmp=0;
write_I2C(DAT_ADDR,tmp);
delay_ms(10);
}
g_ucDat=tmp;
while(1)
{
if(tmp!=g_ucDat)
{
if(g_ucDat>99)
{
g_ucDat=1;
}
tmp=g_ucDat;
write_I2C(DAT_ADDR,tmp);
}
display(tmp);
}
}
一周热门 更多>