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

2019-07-15 10:06发布

我是一个刚入门的学生  我在根据一本书做一个i2c总线的小程序 程序编译没有错误 仿真也能实现 但是实际硬件连接后 数码管上电后一直亮 不实现程序 求大神解答
P70725-201038.jpg
仿真.png
i2c.doc 下载积分: 积分 -1 分
2.96 KB, 下载次数: 9, 下载积分: 积分 -1 分
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
wulinwl
1楼-- · 2019-07-15 22:19
仿真图可以不接复位电路和晶振以及电源VCC、GND,仿真软件默认它们存在,实际电路这些都不能少,这些是单片机工作的3个基本条件。
langzitianya
2楼-- · 2019-07-16 01:07
我估计你是卡在读取24c的地方了,你把程序整个贴出来看看,我想你是想读取24c里边的东西显示出来,但是读取值你能确定吗?
太子的空间
3楼-- · 2019-07-16 03:39
 精彩回答 2  元偷偷看……
呆呆呆梦
4楼-- · 2019-07-16 09:17
先看你的单片机能否正常工作    然后写个数码管静态程序  如果数码管显示不正常用万用表去测单片机输出脚的电平是否和你预想的一样
梦想城风
5楼-- · 2019-07-16 09:53
wulinwl 发表于 2017-7-25 21:35
仿真图可以不接复位电路和晶振以及电源VCC、GND,仿真软件默认它们存在,实际电路这些都不能少,这些是单片机工作的3个基本条件。

应该是没有少的 因为用的单片机板子碰巧不是自己焊出来 的 是买的 所以晶振什么的是连好的 但是不排除板子上可能没焊好的情况
梦想城风
6楼-- · 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);
        }
}

一周热门 更多>