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

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索
查看: 2608|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

大家新年好,請(qǐng)教一個(gè)單片機(jī)串口通信問題

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:269508 發(fā)表于 2018-2-19 18:20 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
我現(xiàn)在寫出來(lái)一個(gè),單片機(jī)接收1個(gè)字符,用串口調(diào)試助手軟件通過串口向單片機(jī)發(fā)送數(shù)據(jù)。當(dāng)發(fā)送的數(shù)據(jù)為1到8時(shí),P1口分別對(duì)應(yīng)點(diǎn)亮相應(yīng)的發(fā)光二極管。發(fā)送其他數(shù)據(jù),蜂鳴器會(huì)響。 注意:波特率9600 。
1,現(xiàn)在我是想,如果我要一次接收3個(gè)字符,分別對(duì)應(yīng)控制P0-P2口的LED燈。如何寫呢?10位通信,只能有8個(gè)位是數(shù)據(jù)。是串口通信,只能一個(gè)10位接一個(gè)10位的發(fā)。怎么區(qū)分第二個(gè)是對(duì)應(yīng)P1口,第三個(gè)是對(duì)應(yīng)P2口呢?
2,這個(gè)一次只能點(diǎn)亮1個(gè)LED燈,如果我想同時(shí)點(diǎn)亮多個(gè)LED燈,那該怎么寫呢?
最后祝大家,新年快樂,恭喜發(fā)財(cái),萬(wàn)事如意。

這個(gè)是我寫的代碼
#include <reg52.h>
        
#define uchar  unsigned char
#define uint   unsigned int

uchar buf;

sbit beep=P2^3;

void main(void)
{
    SCON=0x50;           //設(shè)定串口工作方式
    PCON=0x00;           //波特率不倍增
                        
    TMOD=0x20;           //定時(shí)器1工作于8位自動(dòng)重載模式, 用于產(chǎn)生波特率
    EA=1;
    ES = 1;              //允許串口中斷
    TL1=0xfd;
    TH1=0xfd;             //波特率9600
    TR1=1;
    while(1);        
}
/*********************************************************

  串行中斷服務(wù)函數(shù)

*********************************************************/
void  serial() interrupt 4
{
   ES = 0;                //關(guān)閉串行中斷
   RI = 0;                //清除串行接受標(biāo)志位
   buf = SBUF;            //從串口緩沖區(qū)取得數(shù)據(jù)
  switch(buf)
   {
      case 0x31:  P1=0xfe;beep=1;break;  //接受到1,第一個(gè)LED亮         
      case 0x32:  P1=0xfd;beep=1;break;  //接受到2,第二個(gè)LED亮        
      case 0x33:  P1=0xfb;beep=1;break;  //接受到3,第三個(gè)LED亮        
      case 0x34:  P1=0xf7;beep=1;break;  //接受到4,第四個(gè)LED亮      
      case 0x35:  P1=0xef;beep=1;break;  //接受到5,第五個(gè)LED亮            
      case 0x36:  P1=0xdf;beep=1;break;  //接受到5,第六個(gè)LED亮                  
      case 0x37:  P1=0xbf;beep=1;break;  //接受到5,第七個(gè)LED亮
          case 0x38:  P1=0x7f;beep=1;break;  //接受到5,第八個(gè)LED亮
          default:    beep=0;P1=0xff;break;  //接受到其它數(shù)據(jù),蜂鳴器響         
   }
   ES = 1;    //允許串口中斷
}

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

使用道具 舉報(bào)

沙發(fā)
ID:213173 發(fā)表于 2018-2-20 14:56 | 只看該作者
//利用串口傳輸控制信號(hào)不是簡(jiǎn)單的發(fā)送一幀數(shù)據(jù),而是需要多功能的數(shù)據(jù)串,也不要把控制程序放在中斷里。
//以下是依你的程序和要求改為串口信號(hào)多功能控制,供參考。自定義協(xié)議:以此為例 "AA 55 AA 5A 59"共五位數(shù)據(jù)
//AA是數(shù)據(jù)頭,55 AA 5A 是三位有效數(shù)據(jù),59是數(shù)據(jù)尾,是三位有效數(shù)據(jù)和的余數(shù),依此驗(yàn)證數(shù)據(jù)傳輸是否正確
#include <reg52.h>        
#define uchar  unsigned char
#define uint   unsigned int
uchar table0[] ="OK ";        //用于串口助手返回驗(yàn)證
uchar table1[]="ERROR ";//用于串口助手返回驗(yàn)證
uchar rec_buf[5];                        //數(shù)據(jù)緩存
bit flag=0;                                        //接收完成標(biāo)志
bit sign=0;                                        //數(shù)據(jù)驗(yàn)證標(biāo)志
sbit beep=P2^3;

/**********串口發(fā)送函數(shù)*************/
void SendOneByte(uchar k)
{
    SBUF = k;                //發(fā)送數(shù)據(jù)
    while(!TI);        //等待發(fā)送完成
    TI = 0;                        //發(fā)送中斷請(qǐng)求標(biāo)志位清0
}

void main(void)
{
        uchar i,j;                                //臨時(shí)變量
        SCON=0x50;           //設(shè)定串口工作方式
        PCON=0x00;           //波特率不倍增                        
        TMOD=0x20;           //定時(shí)器1工作于8位自動(dòng)重載模式, 用于產(chǎn)生波特率
        TL1=0xfd;
        TH1=0xfd;             //波特率9600
        TR1=1;
        EA=1;
        ES = 1;              //允許串口中斷
        while(1)
        {/************數(shù)據(jù)解析*************/
                if(flag==1)                //5位數(shù)據(jù)串接收完成
                {
                        ES=0;                        //關(guān)串口中斷
                        flag=0;                //接收完成標(biāo)志清0
                        j=rec_buf[1]+rec_buf[2]+rec_buf[3];//三位有效數(shù)據(jù)的和,溢出部分舍棄
                        if(rec_buf[4]==j)//驗(yàn)證數(shù)據(jù)和
                        {
                                for(i=0;i<3;i++)
                                        SendOneByte(table0[i]);//返回串口助手字符"OK"
                                sign=1;                        //數(shù)據(jù)傳輸正確
                        }
                        else
                        {
                                for(i=0;i<6;i++)
                                        SendOneByte(table1[i]);//返回串口助手字符"ERROR"
                                sign=0;                        //數(shù)據(jù)傳輸錯(cuò)誤
                        }
                        ES=1;                //開串口中斷

        /******控制任務(wù)*******/
                        if(sign==1)
                        {
                                P0=rec_buf[1];
                                P1=rec_buf[2];
                                P2=rec_buf[3];
                                beep=1;
                        }
                        else
                        {
                                P0=0xff;
                                P1=0xff;
                                P2=0xff;
                                beep=0;
                        }
                }
        }
}
/*********************************************************
  串口中斷服務(wù)函數(shù)
*********************************************************/
void serial() interrupt 4
{
        static uchar num=0;        //靜態(tài)計(jì)數(shù)變量
        RI=0;                                                //接收中斷請(qǐng)求標(biāo)志位清0
        rec_buf[num]=SBUF;        //接收到的數(shù)據(jù)串保存在緩存數(shù)組
        if(rec_buf[0]==0xAA)        //驗(yàn)證數(shù)據(jù)頭(起始位)
        {
                num++;
                if(num>=5)
                {
                        flag=1;                        //接收完成標(biāo)志置1
                        num=0;                        //計(jì)數(shù)變量清0
                }
        }
}

評(píng)分

參與人數(shù) 1黑幣 +8 收起 理由
arthuryu + 8 贊一個(gè)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

板凳
ID:222948 發(fā)表于 2018-2-20 15:12 | 只看該作者
一次接收3個(gè)是嗎,也就是說(shuō)把這個(gè)分門別類就行,比如說(shuō)接收到的數(shù)據(jù)是1,就寫p0=???;如果是2就寫p2=???;用case語(yǔ)句就足夠了

評(píng)分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

地板
ID:250496 發(fā)表于 2018-2-21 17:31 | 只看該作者
如果只是控制兩個(gè)端口的16個(gè)等的話,而且是可以一次點(diǎn)亮多個(gè),如果是三幀數(shù)據(jù),可以對(duì)著三幀數(shù)據(jù)進(jìn)行編碼,將解碼函數(shù)放在外部,不必放在串口中斷內(nèi),設(shè)置一個(gè)標(biāo)志位,接收到數(shù)據(jù)后,標(biāo)志位置1,主函數(shù)檢測(cè)到標(biāo)志位時(shí),關(guān)閉串口中斷以防下一幀數(shù)據(jù)影響到這一幀數(shù)據(jù)的處理,并進(jìn)行數(shù)據(jù)的解碼以及置位標(biāo)志位,解碼并執(zhí)行開關(guān)完畢后打開串口中斷,準(zhǔn)備接收下一幀數(shù)據(jù)。
舉個(gè)例子
收到三幀數(shù)據(jù),00 fe 01
串口接收并存入數(shù)據(jù)緩沖區(qū)后,解碼函數(shù)對(duì)第一針數(shù)據(jù)解碼,00代表開燈操作,進(jìn)入開燈的函數(shù),在開燈函數(shù)內(nèi)將收到的數(shù)據(jù)按位與進(jìn)入P1端口,將第三幀數(shù)據(jù)按位或進(jìn)入P2口,這時(shí),第二第三針數(shù)據(jù)中對(duì)應(yīng)的0位會(huì)使對(duì)應(yīng)位輸出位零,
當(dāng)收到第一幀數(shù)據(jù)為ff時(shí),進(jìn)入關(guān)燈程序,第二與第三幀要按位與進(jìn)入對(duì)應(yīng)的端口,否則會(huì)使某些燈關(guān)不掉。
當(dāng)?shù)谝粠瑪?shù)據(jù)為其他時(shí),蜂鳴器響。

評(píng)分

參與人數(shù) 1黑幣 +80 收起 理由
admin + 80 回帖助人的獎(jiǎng)勵(lì)!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 欧美福利视频 | 亚洲一区在线日韩在线深爱 | 一区二区三区精品在线 | 羞羞视频网 | 亚洲一区中文字幕 | 亚洲欧美一区二区三区1000 | 亚洲一区欧美一区 | 久久出精品 | 伊人狠狠| 精品欧美一区二区精品久久久 | 国产精品免费高清 | 激情五月婷婷综合 | 国产精品国产三级国产aⅴ无密码 | 成年视频在线观看 | 日韩精品av一区二区三区 | 国产粉嫩尤物极品99综合精品 | 51ⅴ精品国产91久久久久久 | 久久99国产精一区二区三区 | 91精品久久久久久久久久入口 | 在线欧美视频 | 韩日一区二区 | 在线午夜 | 亚洲国产精品一区二区久久 | 91亚洲国产 | 很黄很污的网站 | 亚洲免费观看视频网站 | 国产999精品久久久久久 | 国产精品一区二区三区在线 | 亚洲精品一区二区三区四区高清 | 91av小视频| 一区二区在线看 | 日韩欧美综合 | 一区二区三区成人 | 亚洲欧洲av在线 | 日日操操操 | 午夜激情视频 | 亚洲国产精品成人无久久精品 | 国产免费又色又爽又黄在线观看 | 日韩第一页| 国产精品毛片av | 一级二级三级在线观看 |