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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

我想用單片機通過串口實現輸入一組數據,然后在12864上的一行顯示出來

[復制鏈接]
跳轉到指定樓層
樓主
顯示函數我寫好了,請問就是怎么把串口收到的數據儲存起來,然后怎么調用啊?


  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define  uchar  unsigned char
  4. #define  uint  unsigned int
  5. #define Data_SIZE 10                      //   9位數據+  /r/n  -  /n =10位
  6. unsigned char i,receiveData;

  7. void UsartConfiguration();

  8. //=========================================================================================

  9. char RevBuf[Data_SIZE];     
  10. char temp[Data_SIZE];     
  11. unsigned char flished_flag=0;
  12. int data_count=0;  
  13. int temp_length;  
  14. int data_flished_count = 0;  //
  15. char data_flished;         //
  16. void UsartConfiguration()
  17. {
  18.          SCON=0X50;
  19.          TMOD=0X20;
  20.          TL1=0XFA;
  21.          TH1=0XFA;
  22.          TR1=1;
  23.          EA=1;
  24.          ES=1;
  25. }
  26. void UART_one_Interrupt_Receive(void) interrupt 4
  27. {  
  28.     uchar temp;
  29.            uchar receive;
  30.   if(RI==1)
  31.     {
  32.         RI=0;
  33.         temp=SBUF;
  34.         if(temp!='\n') //判斷是否收到結束符
  35.         {
  36.             RevBuf[data_count]=temp;// 否,存進revbuf
  37.             data_count++;
  38.         }
  39.         else
  40.         {
  41.             temp_length=data_count;//是,記錄數據長度
  42.             data_count=0;
  43.         }
  44.      
  45.     }

  46. }     
  47. void main(void)
  48. {
  49.      UsartConfiguration();  //串口初始化
  50.    while(1)
  51.     {
  52.           if(Data_SIZE == temp_length)   //判斷數據是否符合要求
  53.           {
  54.             for(i=0;i<Data_SIZE;i++)
  55.              {
  56.                 temp[i]=RevBuf[i];             // 將temp【】做為緩沖區
  57.              }
  58.             flished_flag=1;          //數據接受成功標注
  59.           }
  60.       if(1==flished_flag)  // 數據接受完整成功
  61.         {
  62.                       //
  63.                                 }
  64.                                     }
  65.   while(1);
  66. }
復制代碼
這是把接受的存到temp【】里了吧,大佬們看看有錯誤嗎?
如果沒錯誤怎么取出里面的數據啊,我要做顯示用


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:342911 發表于 2020-5-19 22:52 | 只看該作者
if(串口收到數據了)
{
    調用"屏幕顯示字符串函數"(傳參"串口收到的數據");
}

類似這樣?

評分

參與人數 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:452950 發表于 2020-5-20 08:53 | 只看該作者
一位一位接收,放進數組里面,顯示就從數組里面讀
回復

使用道具 舉報

地板
ID:592807 發表于 2020-5-20 09:03 | 只看該作者
無論用那種單片機,道理差不多的。都要先申請一個全局變量的數組,將串口接收的數據放到該數組中。接受完數組后,串口會有特定的寄存器標志接收完成,檢測到接收完成就將數組的數據顯示,然后清空數組和寄存器的標志位。等待下一次接收。
回復

使用道具 舉報

5#
ID:755110 發表于 2020-5-20 09:10 | 只看該作者
muzhi 發表于 2020-5-19 22:52
if(串口收到數據了)
{
    調用"屏幕顯示字符串函數"(傳參"串口收到的數據");

您好,能稍微講一下傳參嗎,我現在應該是可以把接收到的數據緩存到一個數組,但是我用的12864是不帶字庫的,所以得知道數組里面的數的大小,然后在yi==temp%1000000000/100000000
                               
                                        qianwan=temp%100000000/10000000
                                       
                                        baiwan=temp%10000000/1000000
                                       
                                        shiwan=temp%1000000/100000                               
           wan=temp%100000/10000;                                           

                 qian=temp%10000/1000;

                 bai=temp%1000/100;               

                 shi=temp%100/10;

                 ge=temp%10;這樣取出值的大小最后根據每個值得大小來顯示自定義字符字庫里的字符,這個思路對嗎?
回復

使用道具 舉報

6#
ID:755110 發表于 2020-5-20 09:12 | 只看該作者
xxpp2011 發表于 2020-5-20 08:53
一位一位接收,放進數組里面,顯示就從數組里面讀

您好,我的12864是不帶字庫的,所以我定義了一個字符字庫【】,里面是從1-9的字模,這樣從數組里面讀是不是得取位然后再顯示?
回復

使用道具 舉報

7#
ID:440553 發表于 2020-5-20 10:40 | 只看該作者
用個數組,把接收到的數據存起來。然后把這個數組的內容顯示在12864上
回復

使用道具 舉報

8#
ID:592807 發表于 2020-5-20 11:45 | 只看該作者
chengyuyu 發表于 2020-5-20 09:10
您好,能稍微講一下傳參嗎,我現在應該是可以把接收到的數據緩存到一個數組,但是我用的12864是不帶字庫 ...

串口接收的數據是ASCII碼,你接收到的也只能是ASCII碼。ASCII是uint8_t(char)類型的所以最大只有0xff 也就是說你從串口接收到的數字是255,不存在大于256的數字。
而且你發送1000.串口傳輸給單片機或者單片機傳給串口的就是  0x31  0X30  0X30這三個數字,
0X31在ASCII里面就是1   0X30就是0.
如圖所示如果發送或者接收的數字大于126,那么串口會默認將這個大于126的數字和下一個數字組合,湊成一個漢字,也就是為什么漢字占兩個字節,而數字符號占一個字節的原因。

51hei截圖20200520113747.png (44.57 KB, 下載次數: 70)

51hei截圖20200520113747.png
回復

使用道具 舉報

9#
ID:755110 發表于 2020-5-20 15:03 | 只看該作者
黃youhui 發表于 2020-5-20 11:45
串口接收的數據是ASCII碼,你接收到的也只能是ASCII碼。ASCII是uint8_t(char)類型的所以最大只有0xff  ...

您好,謝謝您的解答,我還是有一點不明白,希望您能賜教,就是那個我該怎么知道temp【】數組里面的數是多少,師傅跟我說用for循環就能取出來,您能給我解釋一下嗎?
回復

使用道具 舉報

10#
ID:755110 發表于 2020-5-20 15:04 | 只看該作者
xxpp2011 發表于 2020-5-20 08:53
一位一位接收,放進數組里面,顯示就從數組里面讀

您好,我發了一下我的代碼,您看看還要怎么做才能取出temp【】里面的數?
回復

使用道具 舉報

11#
ID:648281 發表于 2020-5-20 23:26 | 只看該作者
你好!
如果串口傳什么漢字就顯示什么的話,需要帶有字庫的液晶;
如果不含有字庫的液晶,只能先制作字庫,顯示漢字數受限。
回復

使用道具 舉報

12#
ID:352449 發表于 2020-5-20 23:46 | 只看該作者
無論用那種單片機,道理差不多的。都要先申請一個全局變量的數組,將串口接收的數據放到該數組中。接受完數組后,串口會有特定的寄存器標志接收完成,檢測到接收完成就將數組的數據顯示,然后清空數組和寄存器的標志位。等待下一次接收。
回復

使用道具 舉報

13#
ID:755110 發表于 2020-5-21 08:40 | 只看該作者
763900682 發表于 2020-5-20 23:46
無論用那種單片機,道理差不多的。都要先申請一個全局變量的數組,將串口接收的數據放到該數組中。接受完數 ...

void UsartConfiguration()
{
         SCON=0X50;//&sup1;¤×÷·&frac12;&Ecirc;&frac12;1
         TMOD=0X20;
         TL1=0XFA;
         TH1=0XFA;
         TR1=1;
         EA=1;
         ES=1;
}
void main(void)
{
while(1)       
  {               
        UsartConfiguration();
         if(rcv_date_ok_flag==1)
              {
                      rcv_date_ok_flag=0;
                      for(i=0;i<rcv_len;i++)
                      shu_disp_1(2,i,rcv_buf);
              }
  }
}                               
void UART_one_Interrupt_Receive(void) interrupt 4
{         
        unsigned char i;   
uchar temp =SBUF;

if(temp==0x02)
{
        rcv_date_ok_flag=0;
        rcv_len=0;
}
else if(temp==0x03)
{
        rcv_date_ok_flag=1;
}
else
{
        rcv_buf[rcv_len++]=temp;
}
}
您能給看看哪不對嗎
回復

使用道具 舉報

14#
ID:592807 發表于 2020-5-21 08:56 | 只看該作者
chengyuyu 發表于 2020-5-20 15:03
您好,謝謝您的解答,我還是有一點不明白,希望您能賜教,就是那個我該怎么知道temp【】數組里面的數是多 ...

1 如果你的串口通訊正常的并且temp數組足夠大的話,那么你接受道所有的數劇都會在temp數組里面。2 讀取數據問題著個全是可以不用解釋,數據就在數組里面,你復制出來也行,直接調用也行
3 著個應該才是你要問的問題,比如串口發送:“1 2 3  a b c 你好嗎”怎么在顯示屏顯示,做法如下
定義結構體:
typedef struct
{
u8 sign_name;//數字和字符的ASCII碼
u8 sign_data[16];//顯示數據局,字庫
}sign_number;

typedef struct
{
u8 font[2];//漢字的ASCII碼,
u8 chinese1[16];//漢字上半部分字庫
u8 chinese2[16];//下半部分字庫
}chinese;

1 的ASCII碼是0X31,用for循環檢索到temp里面有0x31就往顯示屏輸送1的顯示數據


你要自己建造一個字庫,:
回復

使用道具 舉報

15#
ID:755110 發表于 2020-5-21 15:15 | 只看該作者
黃youhui 發表于 2020-5-21 08:56
1 如果你的串口通訊正常的并且temp數組足夠大的話,那么你接受道所有的數劇都會在temp數組里面。2 讀取數 ...



回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本三级线观看 视频 | 亚洲巨乳自拍在线视频 | 国产精品区一区二 | com.色.www在线观看 | 综合九九 | 美女福利网站 | 国产福利在线免费观看 | 欧美一级片在线观看 | 成人精品在线视频 | 亚洲国产成人av好男人在线观看 | 91玖玖| 91精品国产91久久久久久最新 | 北条麻妃99精品青青久久主播 | 欧美一二区 | 黄色一级电影在线观看 | 久久精品久久久 | 成人国产精品免费观看视频 | 国产综合精品一区二区三区 | 91高清免费| 国产色片 | 欧美在线观看免费观看视频 | 日韩欧美操 | 国产欧美视频一区 | 久久久www成人免费精品张筱雨 | 天天摸天天看 | 欧美一级全黄 | 精品自拍视频在线观看 | 亚洲视频一区在线观看 | 国产不卡视频 | a免费在线 | 国产成人精品久久 | 精品国产一区二区三区性色av | 亚洲欧美激情国产综合久久久 | 91在线| 欧美99久久精品乱码影视 | 欧美日韩久久精品 | 91毛片在线看 | 免费精品| 91av视频 | 欧美性成人 | 日本国产高清 |