久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2042|回復: 4
打印 上一主題 下一主題
收起左側

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

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

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

使用道具 舉報

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

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

  30.                 SCON = 0x50;                        //8位數(shù)據(jù),可變波特率
  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,允許接收數(shù)據(jù)
  39.     SM0=0;                                                //SM0 SM1串口工作方式選擇,01:8位異步收發(fā),波特率由定時器決定
  40.     SM1=1;
  41. }

  42. void sendByte(unsigned int dat)//發(fā)送一個字節(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ù)到來
  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;//數(shù)組開始接收數(shù)據(jù),從下標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 發(fā)表于 2021-5-4 08:11 | 只看該作者
注意變量的數(shù)據(jù)類型
unsigned int xdata recv_buf[MAX_REV_NUM];  
這個數(shù)組是int型的,也就是一個元素為兩個字節(jié),數(shù)組為2*256=512字節(jié)

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

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

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

回復

使用道具 舉報

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

使用道具 舉報

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

好的 解決了 謝謝前輩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线视频国产一区 | 亚洲一区二区久久 | 久久久一区二区三区 | 欧洲一区视频 | www312aⅴ欧美在线看 | 国产精品.xx视频.xxtv | 欧美日韩亚洲二区 | 精品成人在线视频 | 国产视频久久 | www.日韩欧美 | 欧美一区二区在线免费观看 | 日韩成人在线播放 | 亚洲国产精品成人无久久精品 | 国产精品久久 | 成人欧美一区二区三区在线播放 | 欧美精品一区在线观看 | 一区二区免费视频 | 激情久久av一区av二区av三区 | 韩日一区二区 | 国产精品视频 | 国产在线视频网 | 日本不卡一区 | 99精品视频在线观看免费播放 | 国产一区在线免费观看视频 | 日韩免费一区 | 喷潮网站| 99资源站| 网站国产 | av在线免费观看网站 | 久久精品久久久久久 | 激情六月丁香婷婷 | 18性欧美 | 久久精品国产亚洲 | 波多野结衣中文字幕一区二区三区 | 国产精品视频网址 | 日本三级电影在线观看视频 | 不卡一区二区在线观看 | 欧美亚洲视频 | 亚洲一区二区中文字幕 | 日韩精品无码一区二区三区 | 少妇精品亚洲一区二区成人 |