找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3760|回复: 16
收起左侧

高手求帮忙 关于I2c总线的编程无法实现

[复制链接]
ID:170144 发表于 2017-4-10 20:17 | 显示全部楼层 |阅读模式
这是程序代码   求帮忙 指出错误!
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
void delay()
{ ; ; }
bit write=0;
sbit sda=P2^0;
sbit scl=P2^1;
void init()
{
        scl=1;
        sda=1;
}
void start()
{
        sda=1;
        delay();
        scl=1;
        delay();
        sda=0;
        delay();
}
void stop()
{
        sda=0;
        delay();
        scl=1;
        delay();
        sda=1;
        delay();
}
void respons()
{
        uchar i=0;
        scl=1;
        delay();
        while((sda==1)&&(i<255))
                i++;
        scl=0;
        delay();
}
void delay1(uint xsm)
        {
                uint i,j;
                for(i=xsm;i>0;i--)
                        for(j=110;j>0;j--);
        }
void write_byte(uchar date)
{       
          uchar i,temp;
        temp=date;
        for(i=0;i<8;i++)
        {
                temp=temp<<1;
                sda=CY;
                scl=1;
                delay();
                scl=0;
                delay();
               
        }
                scl=0;
                delay();
                sda=1;
                delay();
       
}

uchar read_byte()
{
        uchar i,k;
        for(i=0;i<8;i++)
        {
                k=(k<<1)|sda;
                delay();
                scl=1;
                delay();
                scl=0;
                delay();
               
        }
                delay();
                return k;
               
}
void main()
{        uchar a;
        init();
        start();
        write_byte(0xa0);
        respons();
        write_byte(0xaa);
        respons();
        write_byte(0xaa);
        respons();
        stop();

        delay1(100);
        start();
        write_byte(0xa0);
        respons();
        write_byte(0xaa);
        respons();
        start();
        write_byte(0xa1);
        respons();
        write_byte(0xaa);
        a=read_byte();
        a=P1;
        stop();
        while(1);       
}






另外我想提出一些问题 希望有贵人能帮助我
1  我学的是郭天祥的书   快一个月了  我每天都花大量时间不比作者花的时间少  但是快一个月了还是只会编一些基础程序 ,高深的有点不行,我是一名专科生  ,难道这隐约能看出一个人的聪明程度吗  当我坚持不住编了一天的程序时得到的只是这一部分知识点的原因弄明白了,当我坚持不下去的时候我都会想起在工厂里的父亲,然后给我力量。
回复

使用道具 举报

ID:148552 发表于 2017-4-10 20:45 | 显示全部楼层
坚持下去你一定能有所突破,老实说大部分人智力都差不多,专科生只是基础差,因为你基础不够,要想写出优秀的程序,数学一定要好,要有很强的逻辑能力,但是我们就是数学不好怎么办,没事,有句话叫勤能补拙,多看些算法,多研究别人优秀的程序,多思考,单片机虽然是硬件,但比的还是编程能力,看100个程序不如自己写1个,加油,你一定可以很优秀

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:170144 发表于 2017-4-10 21:03 | 显示全部楼层
你像风儿来了 发表于 2017-4-10 20:45
坚持下去你一定能有所突破,老实说大部分人智力都差不多,专科生只是基础差,因为你基础不够,要想写出优秀 ...

受教了,谢谢
回复

使用道具 举报

ID:151348 发表于 2017-4-10 21:19 | 显示全部楼层
这是读写AT24吧

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:187614 发表于 2017-4-10 21:48 | 显示全部楼层
I2C使用的关键是时序,按技术资料的时序写没问题,范例中都有,重在调试。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:146949 发表于 2017-4-11 03:22 | 显示全部楼层
       a=read_byte();
        a=P1;
        stop();
        while(1);        
}
后面那句反了吧,改为P1=a;
宏芯I2C调试工具
http://www.51hei.com/bbs/dpj-79714-1.html
(出处: 单片机论坛)

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:187901 发表于 2017-4-11 09:41 | 显示全部楼层
买个便宜的逻辑分析仪,照着时序很容易调试的。  

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2017-4-11 11:03 | 显示全部楼层

为什么一定要郭天祥的书?本网不乏质疑的帖子,盛名之下其实难符。我给你推荐2本书,书中案例个个能proteus仿真演示,直观能看,电路与程序真实可靠可信可行,语句条条有注解,便于阅读理解,便于自学。
《80C51单片机实用教程——基于Keil C和Proteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,双解c和汇编程序。《80C51单片机仿真设计实例教程——基于Keil C和Proteus》清华大学出版社ISBN 978-7-302-41682-1,内有常用的单片机应用100案例,用于仿真实验操作。
回复

使用道具 举报

ID:123289 发表于 2017-4-11 12:23 | 显示全部楼层
沙发说的很对,如果智力不够(成绩不好不等于智力不够,逻辑思维要好)不要涉及这一行。
做单片机,关键不在写程序是,而是构思如何达成目的,写程序按规则抄抄写写即可,而构思怎样的程序结构才能达成目的,才是关键。
就比如“I2c总线的编程”,写一下,短短一个小程序就OK了。但在写之前如何构思呢?
如打仗一样,知彼知已才行,首先必须弄清目标的原理。
1、IC2原理是什么?
当你弄清原理后,就面临以下问题:
2、要用到几根线通讯?
3、你打算用CPU上的哪几根引脚线?所用的这此线是否方便程序操作?
4、CLK脉冲如何做,频率如确定,何时给1何时给0,如何操作可以实现?
5、数据如何位读入,如何拼装成字节,存于何存储?又如何将字节分拆成位,如何逐位输出?
……还有还有,依程序的目的而定。
如果以上都清楚了,写程序也就不难了。如果有不清楚的地方,说明你还缺某方面的知识,需要补课。

如果楼主立志于单片机,我给你一张A4纸,读懂、弄清这张A4纸上的内容,51单片机就过关了。A4纸上浓缩了基本51的精华部分,读不懂的部分就说明要补课。

评分

参与人数 1黑币 +30 收起 理由
admin + 30 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:170144 发表于 2017-4-11 12:42 | 显示全部楼层

对  是的   
回复

使用道具 举报

ID:170144 发表于 2017-4-11 12:43 | 显示全部楼层
wosiyabo 发表于 2017-4-11 03:22
a=read_byte();
        a=P1;
        stop();

多谢帮忙   
回复

使用道具 举报

ID:170144 发表于 2017-4-11 12:44 | 显示全部楼层
51Lovers 发表于 2017-4-10 21:48
I2C使用的关键是时序,按技术资料的时序写没问题,范例中都有,重在调试。

对  但是我感觉按时序写出来总是有问题
回复

使用道具 举报

ID:111634 发表于 2017-4-11 22:06 | 显示全部楼层
愤怒的小鸟嗷 发表于 2017-4-11 12:44
对  但是我感觉按时序写出来总是有问题

⒈ I2C总线基本信号
I2C总线依靠两根线(数据线SDA和时钟线SCL)传送信息,对于虚拟I2C总线,有4个基本信号:起始信号S、终止信号P、应答信号A和 ,如图7-26所示。说明如下:
⑴ 起始信号S:如图7-26a所示,必须在时钟线SCL高电平时,数据线SDA出现从高电平到低电平的变化。即在时钟线SCL高电平期间,数据线SDA出现下降沿,启动I2C总线传送数据。
⑵ 终止信号P:如图7-26b所示,必须在时钟线SCL高电平时,数据线SDA出现从低电平到高电平的变化。即在时钟线SCL高电平期间,数据线SDA出现上升沿,停止I2C总线数据传送。
⑶ 应答信号分为两种:A和 。在SCL脉冲高电平时,数据线SDA低电平为应答信号A,如图7-26c所示;数据线SDA高电平为应答信号 ,如图7-26d所示。两种信号均在时钟SCL低电平时刷新,在时钟SCL高电平时传送。
I2C总线基本信号.jpg
需要说明的是,发送数据“0”的时序要求与应答A完全相同,发送数据“1”时序要求与应答 完全相同。从图7-26中看出,在时钟线SCL高电平期间,数据线SDA的电平不能变化,否则,将被认为是一个起始信号S或终止信号P,引起出错。因此,若需改变数据线SDA的电平,必须先拉低时钟线SCL电平。

程序就是根据I2C时序图编的,例如:


启动信号通用子程序STAT
void  STAT ( ){                     //启动信号子函数STAT
  SCL=0;SDA=1;                  //时钟线电平期间,改变SDA电平(高电平)
  SCL=1;                               //时钟线发出时钟脉冲
  SDA=0;                              //在时钟线高电平期间,SDA下跳变(启动信号规定动作)
  SCL=0;}                            //SCL电平复位,与SCL=1组成时钟脉冲


而你上传的程序少了一句SCL=0,使得时序出错。当然上述程序少了4us延时,用于proteus仿真没问题,用于实例最好加4us延时。
⒉ I2C总线数据传送时序
I2C总线数据传送时序如图7-27所示。说明如下:
⑴ 数据传送以起始位开始,以终止位结束。
⑵ 每次传送的字节数没有限制,但要求每传送一个字节,对方回应一个应答位。即每帧数据9位,前8位是数据位,最后一位为应答位ACK,传送数据位的顺序是从高位到低位。
⑶ 每次传送的第一个字节应为寻址字节(包括寻址和数据传送方向)。
一次完整的数据传送过程应包括起始S、发送寻址字节(SLA  R/ )、应答、发送数据、应答、…、发送数据、应答、终止P。如图7-27所示。
I2C总线数据传送时序.jpg


以上摘自张志良编著《80C51单片机实用教程——基于Keil CProteus》高等教育出版社ISBN 978-7-04-044532-9, 用于学习51单片机原理,程序(双解c和汇编)语句条条有注解,便于阅读理解,便于自学。
关键还是你没学好没理解,没学好没理解的原因可能有多种,其中之一是没有好教材,没有便于阅读理解的教材,有些教材没讲透讲细,高职生就更不易理解了。我推荐的书绝不忽悠你,有比较才能有鉴别!


回复

使用道具 举报

ID:169626 发表于 2017-4-11 22:28 | 显示全部楼层
yzwzfyz 发表于 2017-4-11 12:23
沙发说的很对,如果智力不够(成绩不好不等于智力不够,逻辑思维要好)不要涉及这一行。
做单片机,关键不 ...

这张A4纸可否也给我一张.....
回复

使用道具 举报

ID:170144 发表于 2017-4-13 12:28 | 显示全部楼层
yzwzfyz 发表于 2017-4-11 12:23
沙发说的很对,如果智力不够(成绩不好不等于智力不够,逻辑思维要好)不要涉及这一行。
做单片机,关键不 ...

我的确想弄 那你能不能给我参考一下 不胜感激
回复

使用道具 举报

ID:170144 发表于 2017-4-13 12:33 | 显示全部楼层
zl2168 发表于 2017-4-11 22:06
⒈ I2C总线基本信号
I2C总线依靠两根线(数据线SDA和时钟线SCL)传送信息,对于虚拟I2C总线,有4个基本 ...

楼业的内容实在精辟  让我受益匪浅  谢谢
回复

使用道具 举报

ID:111634 发表于 2017-4-13 18:25 | 显示全部楼层
愤怒的小鸟嗷 发表于 2017-4-13 12:33
楼业的内容实在精辟  让我受益匪浅  谢谢

仅仅是上传了一部分,你还得进一步学,才能掌握。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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