OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3557|回复: 0

I2C通讯,为什么数码管显示的是255啊,不知道哪里错了,有没有大神指点一下

[复制链接]

2

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
82
金钱
82
注册时间
2018-7-10
在线时间
11 小时
发表于 2018-7-13 22:51:02 | 显示全部楼层 |阅读模式
#include <reg52.h>
//SCL=0 SDA才可以变化
sbit SDA=P2^0 ;
sbit SCL=P2^1 ;
sbit DU = P2^6;//数码管段选
sbit WE = P2^7;//数码管段选
typedef unsigned char uchar;
bit AckFlag;
uchar num;
#define EEPROM_ADDS 0xa0
#define SEND 0
#define RESIVE 1
uchar code SMGduan[]= {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};
//数码管位选码
uchar code SMGwei[] = {0xfe, 0xfd, 0xfb};
void timer0Init()
{
        EA = 1;        //打开总中断
        ET0 = 1;//打开定时器0中断
        TR0 = 1;         //启动定时器0
        TMOD |= 0X01; //定时器工作模式1,16位定时模式
        TH0 = 0xED;
        TL0 = 0xFF; //定时5ms
}
void display(uchar i)
{
        static uchar wei;                
        P0 = 0XFF;//清除断码
        WE = 1;//打开位选锁存器
        P0 = SMGwei[wei];
        WE = 0;//锁存位选数据
        switch(wei)
        {
                case 0: DU = 1; P0 = SMGduan[i / 100]; DU = 0; break;
                case 1: DU = 1; P0 = SMGduan[i % 100 / 10]; DU = 0; break;       
                case 2: DU = 1; P0 = SMGduan[i % 10]; DU = 0; break;               
        }
        wei++;
        if(wei == 3)
                wei = 0;
}
void delay(void)   //误差 -0.074652777778us  5.5us
{
    unsigned char a;
    for(a=1;a>0;a--);
}
void start_()
{
SCL=1;
SDA=1;
delay();
SDA=0;
delay();
}

void stop_()
{
SCL=0;
SDA=0;
SCL=1;
delay();
SDA=1;
delay();
}
bit ReadACK()
{
        SCL = 0;//拉低时钟总线,允许从机控制SDA
        SCL = 1;//拉高,读SDA
        delay();
        if(SDA)//NOACK
        {
                SCL = 0;
                return(1);//返回1
        }
        else//ACK
        {
                SCL = 0;
                return(0);//返回0
        }
}

void SendACK(bit i)
{
        SCL = 0;//拉低时钟总线,允许主机控制SDA
        if(i)        //发非应答
                SDA = 1;
        else        //发应答
                SDA = 0;
        SCL = 1;  //拉高总线,让从机读SDA
        delay();//保持5us
        SCL = 0; //拉低时钟总线,允许SDA释放
        SDA = 1;//释放数据总线
}
void send_byte(unsigned char DATA)
{       
unsigned char i;
for(i=0;i<8;i++)
        {
                SCL=0;
                if(DATA & 0x80) SDA=1;
          else SDA=0;
                SCL=1;
                DATA <<=1;
  }
SCL=0;
SDA=1;
}

uchar resive_byte()
{
        uchar i, DAT;
        for(i=0; i<8; i++)//分别读8次,每次读一位
        {
                DAT <<= 1; //数据左移1位,准备接收一位
                SCL = 0;   //拉低时钟总线,允许从机控制SDA变化
                SCL = 1;   //拉高时钟总线,读取SDA上的数据
                if(SDA)
                        DAT |= 0X01;//为1则写1,否则不行执行写1,通过左移补0
        }
        return(DAT); //返回读出的数据
}
//uchar resive_byte()
//{
//unsigned char i,DATA;
//for(i=0;i<8;i++)
//{
//SCL=0;
//SCL=1;
//DATA |=SDA;
//DATA <<=DATA;
//}       
//return DATA;
//}
void delay1(uchar z)
{
        uchar x,y;
        for(x = z; x > 0; x--)
                for(y = 114; y > 0 ; y--);                
}
void main()
{
timer0Init();
EA=0;
start_();
send_byte(EEPROM_ADDS + SEND);
        if(ReadACK())//读从机应答
                AckFlag = 1;
        else
                AckFlag = 0;
send_byte(3);
        if(ReadACK())//读从机应答
                AckFlag = 1;
        else
                AckFlag = 0;
send_byte(188);
        if(ReadACK())//读从机应答
                AckFlag = 1;
        else
                AckFlag = 0;
stop_();

start_();
send_byte(EEPROM_ADDS + SEND);
        if(ReadACK())//读从机应答
                AckFlag = 1;
        else
                AckFlag = 0;
send_byte(3);
        if(ReadACK())//读从机应答
                AckFlag = 1;
        else
                AckFlag = 0;
start_();
send_byte(EEPROM_ADDS + RESIVE);
        if(ReadACK())//读从机应答
                AckFlag = 1;
        else
                AckFlag = 0;
num=resive_byte();
SendACK(1);
stop_();
EA=1;
while(1);
}
void timer0() interrupt 1
{
        TH0 = 0xED;
        TL0 = 0xFF; //定时5ms
        display(num); //数码管显示函数       
}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 18:58

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表