微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 单片机初学者,帮我看看哪里错了,我实在卡的不行了

单片机初学者,帮我看看哪里错了,我实在卡的不行了

时间:10-02 整理:3721RD 点击:
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit SDA=P3^2;
sbit SCL=P3^3;
uchar date;
void start_iic() //起始信号
        {
     SCL=1;
         SDA=1;
         _nop_();
     _nop_();
         SDA=0;
         _nop_();
         SCL=0;
        }
void stop_iic() //停止信号
        {
         SCL=1;
         _nop_();
     _nop_();
         SDA=0;
         SDA=1;
         _nop_();
     _nop_();
         SCL=0;
        }
void ack_iic() //应答信号
        {
     uchar i;
         SCL=1;
         _nop_();
     _nop_();
         while(SDA==1&&i<250)
                 {
                  i++;
                  SCL=0;
              _nop_();
          _nop_();
                 }
         }
void noack_iic() //非应答信号
        {
         SCL=1;//第9个时钟
         _nop_();
     _nop_();
         SDA=1;
         SDA=0;
         SCL=0;
    }
void write_byte(uchar dat) //写入一个字节到总线
        {
         uchar temp,i;
         temp=dat;
         for(i=0;i<8;i++)
                 {
                   temp=temp<<1;
                   SCL=0;
                   _nop_();
           _nop_();
                   SDA=CY ;
                   _nop_();
           _nop_(); //SCL=0时,SDA电平变换
                   SCL=1;        //送数
                   _nop_();
           _nop_();         
                 }
                 SCL=0;
             _nop_();
         _nop_();       
                 SDA=1;
                 _nop_();
         _nop_();        //释放总线
         }
  uchar read_byte()        //读入一个字节到总线
        {
                 uchar i,j,k;
                 SCL=0;
                 _nop_();
             _nop_();       
                 for(i=0;i<8;i++)
                         {
                                         SCL=1;
                                         _nop_();
                                    _nop_();       
                                         j=SDA;
                                         k=(k<<1)|j; //j为0或1,K不管为何值,左移一位变成0
                                         SCL=0;
                                        _nop_();
                    _nop_();       
                         }
                         return k;
         }
void write_at24c02(uchar add,uchar dataa)
        {
         start_iic();
         write_byte(0xa0);
         ack_iic();
         write_byte(add);
         ack_iic();
         write_byte(dataa);
         ack_iic;
         stop_iic();
    }
uchar read_at24c02(uchar add)
        {
         start_iic();
         write_byte(0xa0);
         ack_iic();
         write_byte(add);
         ack_iic();
         start_iic();
         write_byte(0xa1);
         ack_iic;
         date=read_byte();
         noack_iic();
         stop_iic();
         return date;
    }
void at24c02_init()        //总线初始化
{             
     SCL=1;       
        _nop_();
    _nop_();       
        SDA=1;
        _nop_();
    _nop_();                   //把总线拉高以释放总线
}
main()
        {
          unsigned char dat;
          at24c02_init();
          write_at24c02(0x33,0);   
          dat= read_at24c02(0x33);
          while(1)
          P0=dat;
    }

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top