Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1056259
  • 博文数量: 573
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 66
  • 用 户 组: 普通用户
  • 注册时间: 2016-06-28 16:21
文章分类

全部博文(573)

文章存档

2018年(3)

2016年(48)

2015年(522)

分类: 嵌入式

2015-12-04 16:50:32

 

51单片机IIC总线编程

  1. #include  
  2. #define uchar unsigned char  
  3. sbit sda=P2^0;  
  4. sbit scl=P2^1;//用单片机的两个I/O口模拟I2C接口  
  5. uchar a;  
  6. ***************************************************************************  
  7. void delay()//简单延时函数  
  8. { ;; }  
  9. ***************************************************************************  
  10. void start()  //开始信号 SCL在高电平期间,SDA一个下降沿则表示启动信号  
  11. {     
  12.     sda=1; //释放SDA总线  
  13.     delay();  
  14.     scl=1;  
  15.     delay();  
  16.     sda=0;  
  17.     delay();  
  18. }  
  19. ***************************************************************************  
  20. void stop()   //停止 SCL在高电平期间,SDA一个上升沿则表示停止信号  
  21. {  
  22.     sda=0;  
  23.     delay();  
  24.     scl=1;  
  25.     delay();  
  26.     sda=1;  
  27.     delay();  
  28. }***************************************************************************  
  29. void respons()  //应答 SCL在高电平期间,SDA被从设备拉为低电平表示应答  
  30. {  
  31.     uchar i;  
  32.     scl=1;  
  33.     delay();  
  34.     while((sda==1)&&(i<250))i++;  
  35.     scl=0;  
  36.     delay();  
  37. }  
  38. ***************************************************************************  
  39. void init()//总线初始化 将总线都拉高一释放总线  发送启动信号前,要先初始化总线。即总有检测到总线空闲才开始发送启动信号  
  40. {  
  41.     sda=1;  
  42.     delay();  
  43.     scl=1;  
  44.     delay();  
  45. }  
  46. ***************************************************************************  
  47. void write_byte(uchar date) //写一个字节  
  48. {  
  49.     uchar i,temp;  
  50.     temp=date;  
  51.   
  52.   
  53.     for(i=0;i<8;i++)  
  54.     {  
  55.         temp=temp<<1;  
  56.         scl=0;//拉低SCL,因为只有在时钟信号为低电平期间按数据线上的高低电平状态才允许变化;并在此时和上一个循环的scl=1一起形成一个上升沿  
  57.         delay();  
  58.         sda=CY;  
  59.         delay();  
  60.         scl=1;//拉高SCL,此时SDA上的数据稳定  
  61.         delay();  
  62.     }  
  63.     scl=0;//拉低SCL,为下次数据传输做好准备  
  64.     delay();  
  65.     sda=1;//释放SDA总线,接下来由从设备控制,比如从设备接收完数据后,在SCL为高时,拉低SDA作为应答信号  
  66.     delay();  
  67. }  
  68. ***************************************************************************  
  69. uchar read_byte()//读一个字节  
  70. {  
  71.     uchar i,k;  
  72.     scl=0;  
  73.     delay();  
  74.     sda=1;  
  75.     delay();  
  76.     for(i=0;i<8;i++)  
  77.     {  
  78.         scl=1;//上升沿时,IIC设备将数据放在sda线上,并在高电平期间数据已经稳定,可以接收啦  
  79.         delay();      
  80.         k=(k<<1)|sda;  
  81.         scl=0;//拉低SCL,使发送端可以把数据放在SDA上  
  82.         delay();      
  83.     }  
  84.     return k;  
  85. }  
  86. ***************************************************************************  
  87. void write_add(uchar address,uchar date)//任意地址写一个字节  
  88. {  
  89.     start();//启动  
  90.     write_byte(0xa0);//发送从设备地址  
  91.     respons();//等待从设备的响应  
  92.     write_byte(address);//发出芯片内地址  
  93.     respons();//等待从设备的响应  
  94.     write_byte(date);//发送数据  
  95.     respons();//等待从设备的响应  
  96.     stop();//停止  
  97. }  
  98. ***************************************************************************  
  99. uchar read_add(uchar address)//读取一个自己  
  100. {  
  101.     uchar date;  
  102.     start();//启动  
  103.     write_byte(0xa0);//发送发送从设备地址 写操作  
  104.     respons();//等待从设备的响应  
  105.     write_byte(address);//发送芯片内地址  
  106.     respons();//等待从设备的响应  
  107.     start();//启动  
  108.     write_byte(0xa1);//发送发送从设备地址 读操作  
  109.     respons();//等待从设备的响应  
  110.     date=read_byte();//获取数据  
  111.     stop();//停止  
  112.     return date;//返回数据  
  113. }  
阅读(543) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~