找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

單片機串口控制程序,希望達成輸入任意6位數,例如abcdef,使得lcd變?yōu)閍b:cd:ef

[復制鏈接]
跳轉到指定樓層
樓主
ID:885542 發(fā)表于 2021-3-3 21:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
以下只有串口中斷部分,我希望達成輸入任意6位數,例如abcdef,使得lcd變?yōu)閍b:cd:ef
我現在只能固定時間為141225,希望大佬給我?guī)蛡忙,直接在我的程序上改就可以,球球大家了,這個
我已經搞了7,8天了,就差一點了。。。。

void Usart() interrupt 4
{
  u8 m;
  m=SBUF;         //收到數據給m
  if(m=="141225"+0x30)              //如果在串口里輸入141225執(zhí)行下面
  {
    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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:885542 發(fā)表于 2021-3-3 21:22 | 只看該作者
有大佬讓我去學指針,我大概看了,太多了,而且也超綱了,對我來說,如果用到了,還請直接寫代碼,謝謝了!
回復

使用道具 舉報

板凳
ID:213173 發(fā)表于 2021-3-4 06:57 | 只看該作者
《這個我已經搞了7,8天了,就差一點了。。。!,差的可不是一點點哦。串口通訊一次只能傳輸一個字節(jié),一個數字或字符占一個字節(jié)。要傳輸一串數字或字符就需要分N次完成。為了保證數據串傳輸正確還得插入識別信息和驗證信息。以此例傳輸時鐘信息14:12:25 舉例。發(fā)送方在發(fā)送前要對數據作前期處理。比如加一個數據頭0xaa(驗證信息暫時不談,以免你暈)。那么這個數據串用16進制(便于用助手測試)表述為:aa  0e  0c  19 共4個字節(jié)。接收端只有收到aa才認為是有效信息并繼續(xù)接收后續(xù)數據,逐一保存在緩存數組中,否則當做無效信息拋棄。當一串數據接收完成后輸出完成標志。在主函數中判斷完成標志,并對數據解析處理及顯示。特別提醒:所有與串口通訊無直接關系的事務不得放在串口中斷中處理!
  1. u8 rec_buf[4];//緩存數組
  2. bit flag=0;//接收完成標志

  3. void Usart() interrupt 4
  4. {
  5.         static u8 num=0;                //靜態(tài)變量
  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 發(fā)表于 2021-3-4 08:05 | 只看該作者
樓上是對的.樓主的程序本身已經錯了.
  u8 m;
  m=SBUF;         //收到數據給m
這里m只能接收一個.8位的數.比如你發(fā)的是字符.141225,這個u8的變量根據不可以一次接收得了.
m=="141225" ,這個明顯是一個數組.
建議先弄清楚串口傳輸再處理數字.
建議用一個數組接收完后.再寫LCD.
回復

使用道具 舉報

5#
ID:748788 發(fā)表于 2021-3-4 08:32 | 只看該作者
樓主的幾個求助帖子就差找人手把手教你了。不過還真有本書就叫“手把手教你學51單片機”,是不是專為你寫的?一定要看看
回復

使用道具 舉報

6#
ID:885542 發(fā)表于 2021-3-4 13:42 來自手機 | 只看該作者
wwh2382 發(fā)表于 2021-3-4 08:32
樓主的幾個求助帖子就差找人手把手教你了。不過還真有本書就叫“手把手教你學51單片機”,是不是專為你寫的 ...

比較我是新手,才學20多天,能怎么辦
回復

使用道具 舉報

7#
ID:592807 發(fā)表于 2021-3-4 13:54 | 只看該作者
刮痧小能手 發(fā)表于 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 發(fā)表于 2021-3-4 16:42 | 只看該作者
刮痧小能手 發(fā)表于 2021-3-4 13:42
比較我是新手,才學20多天,能怎么辦

如果是自學20天,也算不錯了,不然你是學的有點慢
回復

使用道具 舉報

9#
ID:885542 發(fā)表于 2021-3-4 17:00 | 只看該作者
wulin 發(fā)表于 2021-3-4 06:57
《這個我已經搞了7,8天了,就差一點了。。。!罚畹目刹皇且稽c點哦。串口通訊一次只能傳輸一個字節(jié),一 ...

首先謝謝,我仔細看了這個代碼,在我的理解是輸入一個類似驗證嗎的代號,如aa,然后執(zhí)行下面的時間,這樣時間就只能設置幾個,可是我這邊是輸入任意6位數字,任意的,要是如您這樣,我要從111111到242359都要寫上去了嗎,我太笨了,還請解答,這是我10個任務中最后一個了,就它最離譜。。。
回復

使用道具 舉報

10#
ID:367369 發(fā)表于 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')        //驗證數據頭   在發(fā)送數字串前發(fā)送一個字符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 發(fā)表于 2021-3-4 17:47 | 只看該作者
game灬boy 發(fā)表于 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 發(fā)表于 2021-3-4 20:49 | 只看該作者
game灬boy 發(fā)表于 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 發(fā)表于 2021-3-5 06:45 | 只看該作者
刮痧小能手 發(fā)表于 2021-3-4 17:00
首先謝謝,我仔細看了這個代碼,在我的理解是輸入一個類似驗證嗎的代號,如aa,然后執(zhí)行下面的時間,這樣 ...

十進制任意6位數是指0~999999,與6個0~9的字符是完全不同的概念。把任意6位數用串口傳輸起碼要分解為3個字節(jié)。比如242359換算16進制為0x03B2B7,再分解為0x03,0xB2,0xB7、3個字節(jié)。0~9的字符只是表示數字的符號,串口傳輸6個字符就是6個字節(jié)。
回復

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表