找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2306|回复: 14
收起左侧

我想用单片机通过串口实现输入一组数据,然后在12864上的一行显示出来

[复制链接]
ID:755110 发表于 2020-5-19 22:24 | 显示全部楼层 |阅读模式
显示函数我写好了,请问就是怎么把串口收到的数据储存起来,然后怎么调用啊?


  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【】里了吧,大佬们看看有错误吗?
如果没错误怎么取出里面的数据啊,我要做显示用


回复

使用道具 举报

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 | 显示全部楼层
无论用那种单片机,道理差不多的。都要先申请一个全局变量的数组,将串口接收的数据放到该数组中。接受完数组后,串口会有特定的寄存器标志接收完成,检测到接收完成就将数组的数据显示,然后清空数组和寄存器的标志位。等待下一次接收。
回复

使用道具 举报

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;这样取出值的大小最后根据每个值得大小来显示自定义字符字库里的字符,这个思路对吗?
回复

使用道具 举报

ID:755110 发表于 2020-5-20 09:12 | 显示全部楼层
xxpp2011 发表于 2020-5-20 08:53
一位一位接收,放进数组里面,显示就从数组里面读

您好,我的12864是不带字库的,所以我定义了一个字符字库【】,里面是从1-9的字模,这样从数组里面读是不是得取位然后再显示?
回复

使用道具 举报

ID:440553 发表于 2020-5-20 10:40 | 显示全部楼层
用个数组,把接收到的数据存起来。然后把这个数组的内容显示在12864上
回复

使用道具 举报

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
回复

使用道具 举报

ID:755110 发表于 2020-5-20 15:03 | 显示全部楼层
黄youhui 发表于 2020-5-20 11:45
串口接收的数据是ASCII码,你接收到的也只能是ASCII码。ASCII是uint8_t(char)类型的所以最大只有0xff  ...

您好,谢谢您的解答,我还是有一点不明白,希望您能赐教,就是那个我该怎么知道temp【】数组里面的数是多少,师傅跟我说用for循环就能取出来,您能给我解释一下吗?
回复

使用道具 举报

ID:755110 发表于 2020-5-20 15:04 | 显示全部楼层
xxpp2011 发表于 2020-5-20 08:53
一位一位接收,放进数组里面,显示就从数组里面读

您好,我发了一下我的代码,您看看还要怎么做才能取出temp【】里面的数?
回复

使用道具 举报

ID:648281 发表于 2020-5-20 23:26 | 显示全部楼层
你好!
如果串口传什么汉字就显示什么的话,需要带有字库的液晶;
如果不含有字库的液晶,只能先制作字库,显示汉字数受限。
回复

使用道具 举报

ID:352449 发表于 2020-5-20 23:46 | 显示全部楼层
无论用那种单片机,道理差不多的。都要先申请一个全局变量的数组,将串口接收的数据放到该数组中。接受完数组后,串口会有特定的寄存器标志接收完成,检测到接收完成就将数组的数据显示,然后清空数组和寄存器的标志位。等待下一次接收。
回复

使用道具 举报

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;
}
}
您能给看看哪不对吗
回复

使用道具 举报

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的显示数据


你要自己建造一个字库,:
回复

使用道具 举报

ID:755110 发表于 2020-5-21 15:15 | 显示全部楼层
黄youhui 发表于 2020-5-21 08:56
1 如果你的串口通讯正常的并且temp数组足够大的话,那么你接受道所有的数剧都会在temp数组里面。2 读取数 ...

IM%85Y6XM]HQ_M5E]]K}_~M.png

定义的变量

定义的变量

数字字库

数字字库

数字显示函数

数字显示函数

初始化函数

初始化函数

串口中断及在主函数中的使用

串口中断及在主函数中的使用


回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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