数码管上电以后一直亮 不实现程序

2019-07-15 10:06发布

我是一个刚入门的学生  我在根据一本书做一个i2c总线的小程序 程序编译没有错误 仿真也能实现 但是实际硬件连接后 数码管上电后一直亮 不实现程序 求大神解答
P70725-201038.jpg
仿真.png
i2c.doc 下载积分: 积分 -1 分
2.96 KB, 下载次数: 9, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
12条回答
梦想城风
2019-07-16 10:49
langzitianya 发表于 2017-7-26 10:01
我估计你是卡在读取24c的地方了,你把程序整个贴出来看看,我想你是想读取24c里边的东西显示出来,但是读取值你能确定吗?

#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);
        }
}

一周热门 更多>