找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1826|回复: 12
打印 上一主题 下一主题
收起左侧

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

[复制链接]
跳转到指定楼层
楼主
ID:885542 发表于 2021-3-3 21:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
以下只有串口中断部分,我希望达成输入任意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;
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:885542 发表于 2021-3-3 21:22 | 只看该作者
有大佬让我去学指针,我大概看了,太多了,而且也超纲了,对我来说,如果用到了,还请直接写代码,谢谢了!
回复

使用道具 举报

板凳
ID:213173 发表于 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. }
复制代码


回复

使用道具 举报

地板
ID:419909 发表于 2021-3-4 08:05 | 只看该作者
楼上是对的.楼主的程序本身已经错了.
  u8 m;
  m=SBUF;         //收到数据给m
这里m只能接收一个.8位的数.比如你发的是字符.141225,这个u8的变量根据不可以一次接收得了.
m=="141225" ,这个明显是一个数组.
建议先弄清楚串口传输再处理数字.
建议用一个数组接收完后.再写LCD.
回复

使用道具 举报

5#
ID:748788 发表于 2021-3-4 08:32 | 只看该作者
楼主的几个求助帖子就差找人手把手教你了。不过还真有本书就叫“手把手教你学51单片机”,是不是专为你写的?一定要看看
回复

使用道具 举报

6#
ID:885542 发表于 2021-3-4 13:42 来自手机 | 只看该作者
wwh2382 发表于 2021-3-4 08:32
楼主的几个求助帖子就差找人手把手教你了。不过还真有本书就叫“手把手教你学51单片机”,是不是专为你写的 ...

比较我是新手,才学20多天,能怎么办
回复

使用道具 举报

7#
ID:592807 发表于 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];
回复

使用道具 举报

8#
ID:739545 发表于 2021-3-4 16:42 | 只看该作者
刮痧小能手 发表于 2021-3-4 13:42
比较我是新手,才学20多天,能怎么办

如果是自学20天,也算不错了,不然你是学的有点慢
回复

使用道具 举报

9#
ID:885542 发表于 2021-3-4 17:00 | 只看该作者
wulin 发表于 2021-3-4 06:57
《这个我已经搞了7,8天了,就差一点了。。。。》,差的可不是一点点哦。串口通讯一次只能传输一个字节,一 ...

首先谢谢,我仔细看了这个代码,在我的理解是输入一个类似验证吗的代号,如aa,然后执行下面的时间,这样时间就只能设置几个,可是我这边是输入任意6位数字,任意的,要是如您这样,我要从111111到242359都要写上去了吗,我太笨了,还请解答,这是我10个任务中最后一个了,就它最离谱。。。
回复

使用道具 举报

10#
ID:367369 发表于 2021-3-4 17:45 | 只看该作者
a=0x31,b=0x34,c=0x31,d=0x32,e=0x32,f=0x35;    //收到141225使得lcd显示14:12:25
你这样写后面的值都是按它来的了,和你串口输入没有一点关系2楼说的很有道理 先把数据保存接受完了再处理
  • u8 num=0;     //数组索引
  • u8 rec_buf[7];//保存接收数据的缓冲数组
  • void Usart() interrupt 4
  • {
  •         RI=0;                      //接收中断请求标志位清0
  •         rec_buf[num]=SBUF;         //保存SBUF接收到的数据
  •         if(rec_buf[0]=='a')        //验证数据头   在发送数字串前发送一个字符a表示开始  开头不是a的数据就忽略
  •         {
  •                 num++;
  •                 if(num>=7)         //接收完
  •                 {
  •                         num=0;
  •                         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]);
  •                 }
  •         }
  • }


回复

使用道具 举报

11#
ID:367369 发表于 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;放在显示代码后面,这里写错位置了
回复

使用道具 举报

12#
ID:885542 发表于 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;
                }
        }
}
回复

使用道具 举报

13#
ID:213173 发表于 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个字节。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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