欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2216|回復: 4
收起左側

關于51單片機內部擴展ram的問題,代碼實現的是串口通信的功能.我在這里定義了個最大

[復制鏈接]
ID:894654 發表于 2021-5-3 22:57 | 顯示全部樓層 |閱讀模式
關于51單片機內部擴展ram的問題,代碼實現的是串口通信的功能.我在這里定義了個最大數組,為什么采用了xdata定義數組在串口助手調試,接收緩沖區還是沒有顯示,當#define MAX_REV_NUM 小于256時,串口助手才能正常發送與接收,我用的是STC8A8K64S12的單片機,按理說應該有8192的外部擴展RAM,現在感覺是沒有用上啊? 有大佬知道為什么嗎?代碼附上  救救孩子吧

單片機源程序如下:在2樓
回復

使用道具 舉報

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數組
回復

使用道具 舉報

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 單片機教程網

快速回復 返回頂部 返回列表