找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 1952|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

關(guān)于51單片機(jī)內(nèi)部擴(kuò)展ram的問(wèn)題,代碼實(shí)現(xiàn)的是串口通信的功能.我在這里定義了個(gè)最大

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:894654 發(fā)表于 2021-5-3 22:57 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
關(guān)于51單片機(jī)內(nèi)部擴(kuò)展ram的問(wèn)題,代碼實(shí)現(xiàn)的是串口通信的功能.我在這里定義了個(gè)最大數(shù)組,為什么采用了xdata定義數(shù)組在串口助手調(diào)試,接收緩沖區(qū)還是沒(méi)有顯示,當(dāng)#define MAX_REV_NUM 小于256時(shí),串口助手才能正常發(fā)送與接收,我用的是STC8A8K64S12的單片機(jī),按理說(shuō)應(yīng)該有8192的外部擴(kuò)展RAM,現(xiàn)在感覺(jué)是沒(méi)有用上啊? 有大佬知道為什么嗎?代碼附上  救救孩子吧

單片機(jī)源程序如下:在2樓
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:894654 發(fā)表于 2021-5-3 23:00 | 只看該作者
  1. #include <STC8.H>
  2. #define MAX_REV_NUM 256 //定義最大接收數(shù)組

  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;//接收數(shù)據(jù)后,接收標(biāo)志位清零
  24.                          sendString(recv_buf);//處理數(shù)據(jù)
  25.                         clr_recvbuffer(recv_buf);//清除緩沖BUFFER
  26.                  }
  27. }}

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

  30.                 SCON = 0x50;                        //8位數(shù)據(jù),可變波特率
  31.                 AUXR |= 0x01;                       
  32.                 AUXR |= 0x04;                        //定時(shí)器時(shí)鐘為Fosc,1T模式
  33.                 T2L = 0xF4;                                //定時(shí)器初值,內(nèi)部時(shí)鐘11.0592M,波特率230400
  34.                 T2H = 0xFF;                                //定時(shí)器初值
  35.                 AUXR |= 0x10;                        //啟動(dòng)定時(shí)器
  36.          EA=1;
  37.     ES=1;                                         //串口中斷開(kāi)關(guān)
  38.     REN=1;                              //串口為工作方式1,允許接收數(shù)據(jù)
  39.     SM0=0;                                                //SM0 SM1串口工作方式選擇,01:8位異步收發(fā),波特率由定時(shí)器決定
  40.     SM1=1;
  41. }

  42. void sendByte(unsigned int dat)//發(fā)送一個(gè)字節(jié)
  43. {
  44. SBUF=dat;
  45. while(!TI);
  46. TI=0;}

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

  53. void clr_recvbuffer(unsigned int *buf)//清空接收緩沖區(qū) 等待下一數(shù)據(jù)到來(lái)
  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正確 轉(zhuǎn)到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正確 轉(zhuǎn)到case 2
  73.                         recv_cnt=0;//數(shù)組開(kāi)始接收數(shù)據(jù),從下標(biāo)0開(kāi)始
  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. }}
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

板凳
ID:554500 發(fā)表于 2021-5-4 08:11 | 只看該作者
注意變量的數(shù)據(jù)類(lèi)型
unsigned int xdata recv_buf[MAX_REV_NUM];  
這個(gè)數(shù)組是int型的,也就是一個(gè)元素為兩個(gè)字節(jié),數(shù)組為2*256=512字節(jié)

例如你的這個(gè)函數(shù):

void clr_recvbuffer(unsigned int *buf)//清空接收緩沖區(qū) 等待下一數(shù)據(jù)到來(lái)
{unsigned char i;
for(i=0;i<MAX_REV_NUM;i++)
{buf[i]=0;}}

循環(huán)變量unsigned char i;為一個(gè)字節(jié)的,很明顯不能清空整個(gè)緩沖區(qū),也就是上面定義的數(shù)組。
只能清空數(shù)組下標(biāo)為0-255的地址。尋著這個(gè)思路找找吧!

回復(fù)

使用道具 舉報(bào)

地板
ID:390416 發(fā)表于 2021-5-4 14:56 | 只看該作者
參考 人人學(xué)會(huì)單片機(jī) 的視頻教程 DMX512解碼 就是用到串口通信和外部xdata數(shù)組
回復(fù)

使用道具 舉報(bào)

5#
ID:894654 發(fā)表于 2021-5-5 22:49 | 只看該作者
18701931930 發(fā)表于 2021-5-4 08:11
注意變量的數(shù)據(jù)類(lèi)型
unsigned int xdata recv_buf[MAX_REV_NUM];  
這個(gè)數(shù)組是int型的,也就是一個(gè)元素 ...

好的 解決了 謝謝前輩
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表