标题: 单片机串口控制程序,希望达成输入任意6位数,例如abcdef,使得lcd变为ab:cd:ef [打印本页]

作者: 刮痧小能手    时间: 2021-3-3 21:21
标题: 单片机串口控制程序,希望达成输入任意6位数,例如abcdef,使得lcd变为ab:cd:ef
以下只有串口中断部分,我希望达成输入任意6位数,例如abcdef,使得lcd变为ab:cd:ef
我现在只能固定时间为141225,希望大佬给我帮个忙,直接在我的程序上改就可以,球球大家了,这个
我已经搞了7,8天了,就差一点了。。。。

void Usart() interrupt 4
{
  u8 m;
  m=SBUF;         //收到数据给m
  if(m=="141225"+0x30)              //如果在串口里输入141225执行下面
  {
    a=0x31,b=0x34,c=0x31,d=0x32,e=0x32,f=0x35;    //收到141225使得lcd显示14:12:25
        LcdWriteCom(0x10);   //向左移,这个可以不用管,主要是则么去改输入什么出什么 的问题
        LcdWriteCom(0x10);   //LcdWriteCom为lcd命令控制
        LcdWriteCom(0x10);
        LcdWriteCom(0x10);
        LcdWriteCom(0x10);
        LcdWriteCom(0x10);
        LcdWriteCom(0x10);
        LcdWriteCom(0x10);
        LcdWriteData(a);
    LcdWriteData(b);          //LcdWriteData为lcd数据写入
    LcdWriteData(':');
    LcdWriteData(c);        
    LcdWriteData(d);
    LcdWriteData(':');
    LcdWriteData(e);        
    LcdWriteData(f);
  }
  RI=0;      
  SBUF=m;        //返回电脑
  while(!TI);
  TI=0;
}


作者: 刮痧小能手    时间: 2021-3-3 21:22
有大佬让我去学指针,我大概看了,太多了,而且也超纲了,对我来说,如果用到了,还请直接写代码,谢谢了!
作者: wulin    时间: 2021-3-4 06:57
《这个我已经搞了7,8天了,就差一点了。。。。》,差的可不是一点点哦。串口通讯一次只能传输一个字节,一个数字或字符占一个字节。要传输一串数字或字符就需要分N次完成。为了保证数据串传输正确还得插入识别信息和验证信息。以此例传输时钟信息14:12:25 举例。发送方在发送前要对数据作前期处理。比如加一个数据头0xaa(验证信息暂时不谈,以免你晕)。那么这个数据串用16进制(便于用助手测试)表述为:aa  0e  0c  19 共4个字节。接收端只有收到aa才认为是有效信息并继续接收后续数据,逐一保存在缓存数组中,否则当做无效信息抛弃。当一串数据接收完成后输出完成标志。在主函数中判断完成标志,并对数据解析处理及显示。特别提醒:所有与串口通讯无直接关系的事务不得放在串口中断中处理!
  1. u8 rec_buf[4];//缓存数组
  2. bit flag=0;//接收完成标志

  3. void Usart() interrupt 4
  4. {
  5.         static u8 num=0;                //静态变量
  6.         RI=0;                                        //接收中断请求标志位清0
  7.         rec_buf[num]=SBUF;                //保存SBUF接收到的数据
  8.         if(rec_buf[0]==0xaa)        //验证数据头
  9.         {
  10.                 num++;
  11.                 if(num>=4)
  12.                 {
  13.                         flag=1;                        //接收完成标志置1
  14.                         num=0;
  15.                 }
  16.         }
  17. }
复制代码



作者: wfqxgw    时间: 2021-3-4 08:05
楼上是对的.楼主的程序本身已经错了.
  u8 m;
  m=SBUF;         //收到数据给m
这里m只能接收一个.8位的数.比如你发的是字符.141225,这个u8的变量根据不可以一次接收得了.
m=="141225" ,这个明显是一个数组.
建议先弄清楚串口传输再处理数字.
建议用一个数组接收完后.再写LCD.
作者: wwh2382    时间: 2021-3-4 08:32
楼主的几个求助帖子就差找人手把手教你了。不过还真有本书就叫“手把手教你学51单片机”,是不是专为你写的?一定要看看
作者: 刮痧小能手    时间: 2021-3-4 13:42
wwh2382 发表于 2021-3-4 08:32
楼主的几个求助帖子就差找人手把手教你了。不过还真有本书就叫“手把手教你学51单片机”,是不是专为你写的 ...

比较我是新手,才学20多天,能怎么办
作者: 黄youhui    时间: 2021-3-4 13:54
刮痧小能手 发表于 2021-3-4 13:42
比较我是新手,才学20多天,能怎么办

在串口接受中断建个全局变量的数组例如AA[10],将收到的数据放到该数组里面,
然后if(AA[0] = 0X11&&AA[1] ==0X22)//标志位代表接下来的6个数字是时间
hour = AA[2] *10 + AA[3];
min = AA[4] *10+AA[5];
sec = AA[6]*10+AA[7];
作者: lovezjf234    时间: 2021-3-4 16:42
刮痧小能手 发表于 2021-3-4 13:42
比较我是新手,才学20多天,能怎么办

如果是自学20天,也算不错了,不然你是学的有点慢
作者: 刮痧小能手    时间: 2021-3-4 17:00
wulin 发表于 2021-3-4 06:57
《这个我已经搞了7,8天了,就差一点了。。。。》,差的可不是一点点哦。串口通讯一次只能传输一个字节,一 ...

首先谢谢,我仔细看了这个代码,在我的理解是输入一个类似验证吗的代号,如aa,然后执行下面的时间,这样时间就只能设置几个,可是我这边是输入任意6位数字,任意的,要是如您这样,我要从111111到242359都要写上去了吗,我太笨了,还请解答,这是我10个任务中最后一个了,就它最离谱。。。
作者: game灬boy    时间: 2021-3-4 17:45
a=0x31,b=0x34,c=0x31,d=0x32,e=0x32,f=0x35;    //收到141225使得lcd显示14:12:25
你这样写后面的值都是按它来的了,和你串口输入没有一点关系2楼说的很有道理 先把数据保存接受完了再处理



作者: game灬boy    时间: 2021-3-4 17:47
game灬boy 发表于 2021-3-4 17:45
a=0x31,b=0x34,c=0x31,d=0x32,e=0x32,f=0x35;    //收到141225使得lcd显示14:12:25
你这样写后面的值都 ...

m=0;放在显示代码后面,这里写错位置了

作者: 刮痧小能手    时间: 2021-3-4 20:49
game灬boy 发表于 2021-3-4 17:45
a=0x31,b=0x34,c=0x31,d=0x32,e=0x32,f=0x35;    //收到141225使得lcd显示14:12:25
你这样写后面的值都 ...

木大木大(没有没有)呀,真的吐了,已经吧num=0放后面了

u8 num=0;     //数组索引
u8 rec_buf[7];//保存接收数据的缓冲数组
void Usart() interrupt 4
{
        RI=0;                      //接收中断请求标志位清0
        rec_buf[num]=SBUF;         //保存SBUF接收到的数据
        if(rec_buf[0]=='a')
         {
                num++;
                if(num>=7)         //接收完
                {
                       
                        LcdWriteData(rec_buf[1]);          //LcdWriteData为lcd数据写入
                        LcdWriteData(rec_buf[2]);
                        LcdWriteData(':');
                        LcdWriteData(rec_buf[3]);
                        LcdWriteData(rec_buf[4]);
                        LcdWriteData(':');
                        LcdWriteData(rec_buf[5]);
                        LcdWriteData(rec_buf[6]);
                         num=0;
                }
        }
}
作者: wulin    时间: 2021-3-5 06:45
刮痧小能手 发表于 2021-3-4 17:00
首先谢谢,我仔细看了这个代码,在我的理解是输入一个类似验证吗的代号,如aa,然后执行下面的时间,这样 ...

十进制任意6位数是指0~999999,与6个0~9的字符是完全不同的概念。把任意6位数用串口传输起码要分解为3个字节。比如242359换算16进制为0x03B2B7,再分解为0x03,0xB2,0xB7、3个字节。0~9的字符只是表示数字的符号,串口传输6个字符就是6个字节。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1