找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1780|回复: 2
收起左侧

把字符数组存到AT24c02并在串口调试助手显示的单片机程序怎么改?

[复制链接]
ID:623732 发表于 2019-11-10 08:46 | 显示全部楼层 |阅读模式
  1. #include<reg52.h>  //52系列单片机头文件
  2. #include<stdio.h>
  3. #define uchar unsigned char        //定义无符号数据类型
  4. #define uint unsigned int
  5. sbit sda=P2^0;//串行数据输入/输出端
  6. sbit scl=P2^0;//串行时钟输入端
  7. uint i;
  8. char b[8],su[8]={'s','u','j','u','n','j','u','n'};

  9. void delay(){;;} //定义延时空操作
  10. void init1(){
  11. PCON|=0x80;
  12. SCON=0x50;//串口控制寄存器,等价于SM0=0,SM1=1,SM2=0,串口方式一通信
  13. TMOD=0X20;    //设置定时器1为模式2,做为波特率发生器,8位初值自动重装的8位定时器,定时到TH1的值自动装到TL1        
  14. TH1=0xff;//设置波特率为9600
  15. TL1=0xff;        
  16.         
  17. TI = 1;//向CPU发送串口中断申请,直接使用printf必须加入此句才能实现发送        
  18. TR1=1;     //启动波特率发生器
  19. }
  20. void delay1ms(uint z)//延时1ms函数
  21. {
  22. uint x,y;
  23. for(x=z;x>0;x--)
  24. for(y=110;y>0;y--);
  25. }
  26. void start()//启动信号:SCL在高电平期间,SDA一个下降沿启动信号
  27. {
  28. sda=1;
  29. delay();//空操作延时
  30. scl=1;
  31. delay();
  32. sda=0;
  33. delay();
  34. }
  35. void stop()//停止信号:SCL在高电平期间,SDA一个上升沿停止信号
  36. {
  37. sda=0;
  38. delay();
  39. scl=1;
  40. delay();
  41. sda=1;
  42. delay();
  43. }
  44. void respons()//应答信号:SLC在高电平期间,SDA被从设备拉为低电平表示电平答应
  45. {
  46. uchar i;
  47. scl=1;
  48. delay();
  49. while((sda==1)&&(i<250))//若没有收到器件应答,主器件将默认已收到数据
  50. i++;
  51. scl=0;
  52. delay();
  53. }
  54. void init()        //总线初始化,将总线都拉高以释放总线
  55. {
  56. sda=1;
  57. delay();
  58. scl=1;
  59. delay();
  60. }
  61. void write_byte(uchar date)//写一个字节,串行发送1字节时,需要把其中的8位一位一位地发送出去
  62. {
  63. uchar i,temp;
  64. temp=date;
  65. for(i=0;i<8;i++);{
  66. temp=temp<<1;//将temp左移一位,最高位将移入PSW寄存器的CY位中
  67. scl=0;
  68. delay();
  69. sda=CY;//将CY赋给SDA进而在SCL的控制下发送出去
  70. delay();
  71. scl=1;
  72. delay();
  73. }
  74. scl=0;
  75. delay();
  76. sda=1;
  77. delay();
  78. }
  79. uchar read_byte()//读一字节
  80. {
  81. uchar i,k;//定义临时变量
  82. scl=0;
  83. delay();
  84. sda=1;
  85. delay();
  86. for(i=0;i<8;i++)//依次把8个独立的位放入1字节中来完成接收
  87. {
  88. scl=1;
  89. delay();
  90. k=(k<<1)|sda;//将k左移一位与SDA进行“或”运算
  91. scl=0;
  92. delay();
  93. }
  94. return k;
  95. }
  96. void write_add(uchar address,uchar date)
  97. {
  98. start();
  99. write_byte(0xa0);
  100. respons();
  101. write_byte(address);
  102. respons();
  103. write_byte(date);
  104. respons();
  105. stop();
  106. }
  107. uchar read_add(uchar address)
  108. {
  109. uchar date;
  110. start();
  111. write_byte(0xa0);
  112. respons();
  113. write_byte(address);
  114. respons();
  115. start();
  116. write_byte(0xa1);
  117. respons();
  118. start();
  119. date=read_byte();
  120. stop();
  121. return date;
  122. }

  123. void main()         //主函数
  124. {
  125. init();
  126. init1();
  127. P1=0xFF;
  128. while(1){
  129. for(i=0;i<8;i++)
  130. {
  131. b[i]=su[i];
  132. write_add(23,b[i]);
  133. delay1ms(100);
  134. P1=read_add(23);
  135. b[i]=read_add(23);
  136. }        

  137. delay1ms(1000);
  138. for(i=1;i<8;i++);
  139. printf("%c\n",b[i]);
  140. }

  141.    }
复制代码
回复

使用道具 举报

ID:584814 发表于 2019-11-13 10:36 | 显示全部楼层
AT24c02能保存数据(数字),对于字符必须行编码后保存,读出时还原成字符。
常用的编码为ASCII或区位码。
回复

使用道具 举报

ID:623732 发表于 2019-11-15 19:49 | 显示全部楼层
man1234567 发表于 2019-11-13 10:36
AT24c02能保存数据(数字),对于字符必须行编码后保存,读出时还原成字符。
常用的编码为ASCII或区位码。

怎么把字符转换成数字
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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