找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1952|回复: 4
打印 上一主题 下一主题
收起左侧

关于51单片机内部扩展ram的问题,代码实现的是串口通信的功能.我在这里定义了个最大

[复制链接]
跳转到指定楼层
楼主
ID:894654 发表于 2021-5-3 22:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
关于51单片机内部扩展ram的问题,代码实现的是串口通信的功能.我在这里定义了个最大数组,为什么采用了xdata定义数组在串口助手调试,接收缓冲区还是没有显示,当#define MAX_REV_NUM 小于256时,串口助手才能正常发送与接收,我用的是STC8A8K64S12的单片机,按理说应该有8192的外部扩展RAM,现在感觉是没有用上啊? 有大佬知道为什么吗?代码附上  救救孩子吧

单片机源程序如下:在2楼
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:894654 发表于 2021-5-3 23:00 | 只看该作者
  1. #include <STC8.H>
  2. #define MAX_REV_NUM 256 //定义最大接收数组

  3. unsigned int xdata recv_buf[MAX_REV_NUM];
  4. unsigned int xdata recv_cnt;
  5. unsigned char recv_flag;
  6. unsigned char machine_step=0;

  7. void UartInit(void);
  8. void sendByte(unsigned int dat);
  9. void clr_recvbuffer(unsigned int *buf);
  10. void sendString(unsigned int *dat);

  11. void DelayXms(unsigned int xms)
  12. {
  13. unsigned int i,j;
  14. for(i=xms;i>0;i--)
  15. for(j=124;j>0;j--);}

  16. void main()
  17. {
  18. UartInit();       
  19. DelayXms(10);
  20.          while(1)
  21.    {
  22.                  if(recv_flag==1)
  23.                  {recv_flag=0;//接收数据后,接收标志位清零
  24.                          sendString(recv_buf);//处理数据
  25.                         clr_recvbuffer(recv_buf);//清除缓冲BUFFER
  26.                  }
  27. }}

  28. void UartInit(void)                //波特率 达到 230400 @11.0592MHz
  29. {

  30.                 SCON = 0x50;                        //8位数据,可变波特率
  31.                 AUXR |= 0x01;                       
  32.                 AUXR |= 0x04;                        //定时器时钟为Fosc,1T模式
  33.                 T2L = 0xF4;                                //定时器初值,内部时钟11.0592M,波特率230400
  34.                 T2H = 0xFF;                                //定时器初值
  35.                 AUXR |= 0x10;                        //启动定时器
  36.          EA=1;
  37.     ES=1;                                         //串口中断开关
  38.     REN=1;                              //串口为工作方式1,允许接收数据
  39.     SM0=0;                                                //SM0 SM1串口工作方式选择,01:8位异步收发,波特率由定时器决定
  40.     SM1=1;
  41. }

  42. void sendByte(unsigned int dat)//发送一个字节
  43. {
  44. SBUF=dat;
  45. while(!TI);
  46. TI=0;}

  47. void sendString(unsigned int *dat)//发送字符串
  48. { while(*dat != '\0')
  49.         {
  50.           sendByte(*dat++);
  51.         }
  52. }

  53. void clr_recvbuffer(unsigned int *buf)//清空接收缓冲区 等待下一数据到来
  54. {unsigned char i;
  55. for(i=0;i<MAX_REV_NUM;i++)
  56. {buf[i]=0;}}

  57. void uart_ISR() interrupt 4
  58. {unsigned char recv_data;
  59. if(RI)
  60. {RI=0;
  61. recv_data=SBUF;
  62. switch(machine_step)
  63.         {case 0:
  64.                 if(recv_data==0xAA)//判断帧头AA
  65.                 {machine_step=1;}//如果AA正确 转到case 1
  66.                 else
  67.     {machine_step=0;
  68.                 }
  69.                 break;
  70.                 case 1:
  71.                 if(recv_data==0x55)//判断帧头55
  72.                 {machine_step=2;//如果55正确 转到case 2
  73.                         recv_cnt=0;//数组开始接收数据,从下标0开始
  74.                 }
  75.                 else
  76.     {machine_step=0;
  77.                 }
  78.                 break;
  79.                 case 2:recv_buf[recv_cnt]=recv_data;
  80.                       recv_cnt++;
  81.                 if(recv_data==0x0D)
  82.                 {machine_step=0;
  83.                 recv_cnt=0;
  84.                 recv_flag=1;
  85.                 }
  86.                 else
  87.     {machine_step=2;
  88.                 }
  89.                 break;
  90.                 break;
  91.                 default:break;
  92.                 }}
  93. if(TI)
  94. {TI=0;
  95. }}
复制代码
回复

使用道具 举报

板凳
ID:554500 发表于 2021-5-4 08:11 | 只看该作者
注意变量的数据类型
unsigned int xdata recv_buf[MAX_REV_NUM];  
这个数组是int型的,也就是一个元素为两个字节,数组为2*256=512字节

例如你的这个函数:

void clr_recvbuffer(unsigned int *buf)//清空接收缓冲区 等待下一数据到来
{unsigned char i;
for(i=0;i<MAX_REV_NUM;i++)
{buf[i]=0;}}

循环变量unsigned char i;为一个字节的,很明显不能清空整个缓冲区,也就是上面定义的数组。
只能清空数组下标为0-255的地址。寻着这个思路找找吧!

回复

使用道具 举报

地板
ID:390416 发表于 2021-5-4 14:56 | 只看该作者
参考 人人学会单片机 的视频教程 DMX512解码 就是用到串口通信和外部xdata数组
回复

使用道具 举报

5#
ID:894654 发表于 2021-5-5 22:49 | 只看该作者
18701931930 发表于 2021-5-4 08:11
注意变量的数据类型
unsigned int xdata recv_buf[MAX_REV_NUM];  
这个数组是int型的,也就是一个元素 ...

好的 解决了 谢谢前辈
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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