搜索
bottom↓
回复: 4

51单片机仿真IIC总线,用proteus调试成功

[复制链接]

出0入0汤圆

发表于 2011-11-5 20:13:26 | 显示全部楼层 |阅读模式
以下是源程序:
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
#include<stdlib.h>
#include<string.h>

#define uchar unsigned char
#define uint unsigned int
#define WSLA 0xa0
#define RSLA 0xa1
                                                  
bit NACK;
sbit SDA=P1^6;
sbit  SCL =P1^7        ;
sbit LED1=P3^0;
sbit LED2=P3^1;
sbit LED3=P3^2;
sbit LED4=P3^3;
bit  flag=0,flag1,flag2=0;
uchar n=8;
uchar idata BufWrite[8];
uchar idata BufRead[8];
uchar addr=0x00;
uchar word[8]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
void display(uchar ch);

void delay()
{
  uchar k;
  for(k=0;k<5;k++)
        _nop_();
}

void start()
{
   SDA=1;
   _nop_();
   SCL=1;
   delay();
   SDA=0;
   delay();
   SCL=0;
   _nop_();
   
}       

void stop()
{

  SDA=0;
  _nop_();
  _nop_();
  SCL=1;
  delay();
  SDA=1;
  delay();
  SCL=0;
  SDA=0;

}
void CACK()
{
  SDA=1;
  SCL=1;
  flag=0;
  flag1=SDA;
  if( flag1==1)
      flag=1;
            
  SCL=0;
   _nop_();       

}
void N_ACK()
{
    SDA=1;
        _nop_();
        _nop_();
        _nop_();
        SCL=1;
        delay();
        SCL=0;
        _nop_();
        _nop_();
        SDA=0;
       
}
void  ACK()
{
          SDA=0;
          _nop_();
          _nop_();
          _nop_();
          SCL=1;
          delay();
          SCL=0;
          _nop_();
          _nop_();
          _nop_();
          SDA=1;
          _nop_();
          
  }




void WriteOneByte(uchar ch)
{
  uchar i;
  uchar Write;
  Write= ch;
   
  for( i=0;i<8;i++)
   {
      
     if((Write&0x80)==0x80)
           {
                 SDA=1;
                   }
          else
           {
                 SDA=0;
                  }
          _nop_();
          SCL=1;
          delay();
          SCL=0;
          Write= Write<<1;

    }
}
uchar ReadOneByte()
{
  uchar i;
  uchar Read=0x00;
  uchar m=8;
  SDA=1;
  for( i=0;i<8;i++)
    {
           SDA=1;
           _nop_();
           _nop_();
           SCL=1;
           delay();

           Read=Read<<1;
           if(SDA==1)
                 Read=Read|0x01;
           else
                     Read=Read &0xfe;
          
                SCL=0;
       
           /*
           flag2=SDA;
           Read=(_crol_(flag2,m--)|| Read);
           SCL=0; */
         }
         
        return Read;
}

void WriteByte(uchar addr)
{
  uchar i;
  start();
  WriteOneByte(WSLA);
  CACK();
         
  WriteOneByte(addr);
  CACK();
  for(i=0;i<n;i++)
  {
         
        WriteOneByte(BufWrite);
    CACK();
       
                 }

    stop();
       
}

void  ReadByte(uchar addr)
{
  uchar i;
  start();
  WriteOneByte(WSLA);
  CACK();
  WriteOneByte(addr);
  CACK();
  start();
  WriteOneByte(RSLA);
  CACK();
  for(i=0;i<n;i++)
  {
    BufRead=ReadOneByte();
         if(i==7)
            N_ACK();
         else
            ACK();
        display(BufRead);
        }
  stop();
          
            
}


void display(uchar ch)
{
           uchar j;
          uint k;
      P0= ch;
          LED1=0;
          for(k=0;k<10000;k++)
          {
            for(j=0;j<20;j++);
                }
   
}
/*   
void display()
{
  uchar i,j;
  uint k;
  for(i=0;i<n;i++)
   {
      P0= BufRead;
          LED1=0;
          for(k=0;k<10000;k++)
          {
            for(j=0;j<10;j++);
                }
   }
}
  */
void main()
{
  uchar i;
  uint k;
  for(i=0;i<n;i++)
   {
      BufWrite= word;
          
           }
while(1)
{

   WriteByte(0x00);
   for(k=0;k<10000;k++);
   ReadByte(0x00);
   for(k=0;k<10000;k++);
  }

}
加入proteus的调试ourdev_692249ESQROJ.rar(文件大小:53K) (原文件名:IIC.rar)

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2011-11-5 20:41:19 | 显示全部楼层
good

楼主的程序是要实现什么功能,说明一下吧

出0入0汤圆

 楼主| 发表于 2011-11-5 21:25:59 | 显示全部楼层
发送数据到IIC的存储器中,再读取出来。很简单的

出0入0汤圆

发表于 2011-11-5 21:29:56 | 显示全部楼层
think about how you could package the code to make it more generic for other i2c applications.

出0入0汤圆

发表于 2014-7-31 16:52:01 | 显示全部楼层
重新拾回单片机的乐趣,丢弃arm,嘿嘿,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 02:14

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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