当前位置:   article > 正文

基于Proteus学习单片机系列(六)——I2C总线AT24C04_proteus at24c04

proteus at24c04

获取更多资源,请关注微信公众号:嵌入式基地

获取项目资源:公众号后台回复:单片机仿真

基于Proteus学习单片机系列(一)——点亮LED

基于Proteus学习单片机系列(二)——驱动数码管

基于Proteus学习单片机系列(三)——按键

基于Proteus学习单片机系列(四)——中断

基于Proteus学习单片机系列(五)——定时器实现电子表

基于Proteus学习单片机系列(六)——I2C总线AT24C04

基于Proteus学习单片机系列(七)——实时时钟DS1302

基于Proteus学习单片机系列(八)——AD转换及其应用--TLC549

基于Proteus学习单片机系列(九)——DA转换及其应用--TLC5615

基于Proteus学习单片机系列(十)——LCD1602

基于Proteus学习单片机系列(十一)——LCD12864

项目下载

点击下载

1.电路图

2.程序

    主函数

  1. #include<reg51.h>
  2. #include<AT24C04.c>
  3. void delay(unsigned int x )
  4. {
  5. while(x--);
  6. }
  7. void main()
  8. {
  9. init_24c04(); //I2总线初始化函数
  10. while(1)
  11. {
  12. write_add_dat_24c04(1,0x0f); //写入地址1,保存数据0x0f
  13. delay(300); //延时
  14. write_add_dat_24c04(2,0xf0); //写入地址二,保存数据0xf0
  15. delay(300); //延时
  16. P0 = read_add_dat_24c04(1); //读地址1,保存数据0x0f,并显示
  17. delay(50000); //延时
  18. P0 = read_add_dat_24c04(2); //读地址二,保存数据0xf0,并显示
  19. delay(50000); //延时
  20. }
  21. }

    I2C驱动

  1. #include<intrins.h>
  2. #define uchar unsigned char
  3. #define nop _nop_()
  4. sbit sda = P3^6; //sda接在P3^6
  5. sbit scl = P3^7; //scl接在P3^7
  6. /*I2总线启动*/
  7. void start_24c04() //scl为高电平时,SDA由高向低跳变,开始传送数据
  8. {
  9. scl = 1;nop;
  10. sda = 1;nop;
  11. sda = 0;nop;
  12. scl = 0;
  13. }
  14. /*I2总线停止*/
  15. void stop_24c04() //scl为高电平时,SDA由低向高跳变,结束传送数据
  16. {
  17. sda = 0;nop;
  18. scl = 1;nop;
  19. sda = 1;nop;
  20. }
  21. /*应答程序*/
  22. void ack_24c04()
  23. {
  24. uchar i = 255;
  25. scl = 1;nop;
  26. while(sda&&i--); //等待返回的低电平,若没有响应,适当延时自动向下执行
  27. scl = 0;nop;
  28. }
  29. /*I2总线初始化*/
  30. void init_24c04()
  31. {
  32. sda = 1;nop; //常态
  33. scl = 0;nop; //常态
  34. }
  35. /*读取一个字节*/
  36. uchar read_onebyte_24c04()
  37. {
  38. uchar i,dat;
  39. sda = 1; //释放总线
  40. for(i = 0;i<8;i++) //循环八次,得到八位的数据
  41. {
  42. scl = 1; //scl为高电平时,检测sda状态
  43. dat = dat<<1; //由高位向低位读取
  44. if(sda) //判断sda是否为高电平
  45. dat = dat|0x01; //若是,dat最低位置一,不是则为0
  46. scl = 0; //scl置低电平
  47. }
  48. sda = 1; //应答
  49. scl = 0; // 信号
  50. return(dat);
  51. }
  52. /*写入一个字节*/
  53. void write_onebyte_24c04(uchar dat)
  54. {
  55. uchar i;
  56. for(i=0;i<8;i++) //循环八次,得到八位的数据
  57. {
  58. sda = (bit)(dat&0x80); //取最高位
  59. dat = dat<<1; //由高位向低位写入
  60. scl = 1;
  61. scl = 0;
  62. }
  63. sda = 1; //应答
  64. scl = 0; // 信号
  65. }
  66. /*对某个地址写一字节的数据*/
  67. void write_add_dat_24c04(uchar add,dat)
  68. {
  69. start_24c04(); //启动
  70. write_onebyte_24c04(0xa0); //对AT24C04写操作
  71. ack_24c04(); //应答
  72. write_onebyte_24c04(add); //写入数据存放地址
  73. ack_24c04(); //应答
  74. write_onebyte_24c04(dat); //写入数据
  75. ack_24c04(); //应答
  76. stop_24c04(); //停止
  77. }
  78. /*读取某个地址一字节数据*/
  79. uchar read_add_dat_24c04(uchar add)
  80. {
  81. uchar dat;
  82. start_24c04(); //启动
  83. write_onebyte_24c04(0xa0); //对AT24C04写操作
  84. ack_24c04(); //应答
  85. write_onebyte_24c04(add); //写入将要读的数据地址
  86. ack_24c04(); //应答
  87. start_24c04(); //启动
  88. write_onebyte_24c04(0xa1); //对AT24C04读操作
  89. ack_24c04(); //应答
  90. dat = read_onebyte_24c04(); //赋值
  91. stop_24c04(); //停止
  92. return (dat);
  93. }

 

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/AllinToyou/article/detail/438259
推荐阅读
相关标签
  

闽ICP备14008679号