欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

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

QQ登錄

只需一步,快速開(kāi)始

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

請(qǐng)教單片機(jī)串口通信方面的問(wèn)題,希望做過(guò)這一方面的大佬能解答一下

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
最近正在用51單片機(jī)做串口通信,已經(jīng)完成了基本的發(fā)送接收。想做更深入一點(diǎn):1.對(duì)接收到的數(shù)據(jù)能進(jìn)行解析,比如串口助手發(fā)送了一組電壓電流數(shù)據(jù):V1012A0022,要把它還原成電壓1.012伏,電路0.022A,用兩數(shù)碼管顯示出來(lái)。
2.發(fā)送數(shù)據(jù)能不用中斷嗎?現(xiàn)在用的是interrupt 0(外部中斷0),能不能不用中斷,用單片機(jī)上任意的一個(gè)口控制發(fā)送。

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

使用道具 舉報(bào)

沙發(fā)
ID:303383 發(fā)表于 2018-4-23 17:28 | 只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動(dòng)屏蔽
回復(fù)

使用道具 舉報(bào)

板凳
ID:213173 發(fā)表于 2018-4-23 19:37 | 只看該作者
你可以自定義通訊協(xié)議,比如:數(shù)據(jù)頭0xff,電壓整數(shù)0x01,電壓小數(shù)0x0c,電流整數(shù)0x00,電流小數(shù)0x16,數(shù)據(jù)尾為有效數(shù)據(jù)和0x23,0xff 0x01 0x0c 0x00 0x16 0x23,由6組8位數(shù)據(jù)組成一個(gè)數(shù)據(jù)串,下位機(jī)收到數(shù)據(jù)串后保存在緩存中,根據(jù)數(shù)據(jù)頭尾判斷數(shù)據(jù)傳輸正確后對(duì)有效數(shù)據(jù)解析,提供給顯示模塊。
回復(fù)

使用道具 舉報(bào)

地板
ID:308816 發(fā)表于 2018-4-23 19:58 | 只看該作者
發(fā)數(shù)據(jù)不需要中斷接收需要
回復(fù)

使用道具 舉報(bào)

5#
ID:304431 發(fā)表于 2018-4-24 12:11 | 只看該作者
wulin 發(fā)表于 2018-4-23 19:37
你可以自定義通訊協(xié)議,比如:數(shù)據(jù)頭0xff,電壓整數(shù)0x01,電壓小數(shù)0x0c,電流整數(shù)0x00,電流小數(shù)0x16,數(shù)據(jù) ...

通過(guò)狀態(tài)機(jī)實(shí)現(xiàn)么?能否給一個(gè)大概的代碼框架么,因?yàn)閯偨佑|這方面,個(gè)人編程也不熟練,沒(méi)法直接根據(jù)您提供的思路搭建出來(lái)。
回復(fù)

使用道具 舉報(bào)

6#
ID:213173 發(fā)表于 2018-4-24 14:41 | 只看該作者
mdzzlsf 發(fā)表于 2018-4-24 12:11
通過(guò)狀態(tài)機(jī)實(shí)現(xiàn)么?能否給一個(gè)大概的代碼框架么,因?yàn)閯偨佑|這方面,個(gè)人編程也不熟練,沒(méi)法直接根據(jù)您提 ...

沒(méi)有你想的那么復(fù)雜,給你寫(xiě)一個(gè)示例程序參考,經(jīng)TX-1C實(shí)驗(yàn)板與串口助手驗(yàn)證無(wú)誤。
#include <reg51.h>
#define uint unsigned int
#define uchar unsigned char
sbit dula=P2^6;                        //段選
sbit wela=P2^7;                        //位選
uchar code table[]={                //共陰數(shù)碼管0~F、U數(shù)組
        0x3f,0x06,0x5b,0x4f,
        0x66,0x6d,0x7d,0x07,
        0x7f,0x6f,0x77,0x7c,
        0x39,0x5e,0x79,0x71,0x3e};
uchar table0[] ="OK\n";        //用于串口助手返回驗(yàn)證
uchar table1[]="ERROR\n";//用于串口助手返回驗(yàn)證
uchar rec_buf[6];                        //緩存
uint swan,wan,qian,bai,shi,ge;//數(shù)碼管顯示位
bit flag=0;                                        //接收完成標(biāo)
/*************初始化串口**************/
void InitUART()                //9600bps@11.0592MHz
{
        PCON &= 0x7F;                //波特率不倍速
        SCON = 0x50;                //8位數(shù)據(jù),可變波特率
        TMOD= 0x20;                        //設(shè)定定時(shí)器1為8位自動(dòng)重裝方式
        TL1 = 0xFD;                        //設(shè)定定時(shí)初值
        TH1 = 0xFD;                        //設(shè)定定時(shí)器重裝值
        ET1 = 0;                                //禁止定時(shí)器1中斷
        TR1 = 1;                                //啟動(dòng)定時(shí)器1
        EA = 1;                                //開(kāi)總中斷
        ES = 1;                                //開(kāi)串口中斷
}
/**********串口發(fā)送函數(shù)*************/
void SendOneByte(uchar c)
{
    SBUF = c;                //發(fā)送數(shù)據(jù)
    while(!TI);        //等待發(fā)送完成
    TI = 0;                        //發(fā)送中斷請(qǐng)求標(biāo)志位清0
}
/************數(shù)據(jù)解析函數(shù)*************/
void analysis()
{
        uchar i;                        //臨時(shí)變量
        if(flag==1)                //一幀數(shù)據(jù)串接收完成
        {
                ES=0;                        //關(guān)串口中斷
                flag=0;                //接收完成標(biāo)志清0
                if(rec_buf[5]==rec_buf[1]+rec_buf[2]+rec_buf[3]+rec_buf[4])//驗(yàn)證數(shù)據(jù)和,超出8位溢出舍棄
                {
                        for(i=0;i<3;i++)
                        SendOneByte(table0);//返回OK
                }
                else
                {
                        for(i=0;i<6;i++)
                                SendOneByte(table1);//返回ERROR
                        rec_buf[0]=rec_buf[1]=rec_buf[2]=rec_buf[3]=rec_buf[4]=rec_buf[5]=0;//清除緩存數(shù)據(jù)
                }
                ES=1;                //開(kāi)串口中斷
        }
}
/*************數(shù)據(jù)分解***************/
void Transformation()
{
        static uint i=0;
        static bit j=0;
        i++;
        if(i==7500)                //計(jì)數(shù)延時(shí)切換顯示內(nèi)容
        {
                i=0;
                j=~j;
        }
        if(j==0)                        //換算電壓
        {
                swan = rec_buf[1]%100/10;                        // 十萬(wàn)位
                wan  = rec_buf[1]%10;                                // 萬(wàn)位
                qian = rec_buf[2]%1000/100;                // 千位
                bai  = rec_buf[2]%100/10;                        // 百位
                shi  = rec_buf[2]%10;                                // 十位
                ge   = 16;                                                                // 個(gè)位"V"
        }
        else                        //換算電流
        {
                swan = rec_buf[3]%100/10;                        // 十萬(wàn)位
                wan  = rec_buf[3]%10;                                // 萬(wàn)位
                qian = rec_buf[4]%1000/100;                // 千位
                bai  = rec_buf[4]%100/10;                        // 百位
                shi  = rec_buf[4]%10;                                // 十位
                ge   = 10;                                                                // 個(gè)位"A"
        }
}
/**********6位數(shù)碼管顯示程序************/
void display()
{
        static uchar k=0;                        //分時(shí)顯示變量
        switch(k)
        {
                case 0:
                   dula=0;
                   P0=table[swan];                //顯示十萬(wàn)位段碼
                   dula=1;
                   dula=0;
               
                   wela=0;
                   P0=0x7e;                                                //顯示十萬(wàn)位碼
                   wela=1;
                   wela=0;
                        k++;
                 break;       

                case 1:
                   dula=0;
                   P0=table[wan]|0x80;                //顯示萬(wàn)位段碼+小數(shù)點(diǎn)
                   dula=1;
                   dula=0;
               
                   wela=0;
                   P0=0x7d;                                                //顯示萬(wàn)位位碼
                   wela=1;
                   wela=0;
                        k++;
                 break;       

                case 2:
                   P0=table[qian];                        //顯示千位段碼
                   dula=1;
                   dula=0;
               
                   P0=0x7b;                                                //顯示千位位碼
                   wela=1;
                   wela=0;
                        k++;
                 break;       

                case 3:
                   P0=table[bai];                        //顯示百位段碼
                   dula=1;
                   dula=0;
               
                   P0=0x77;                                                //顯示百位位碼
                   wela=1;
                   wela=0;
                        k++;
                 break;       

                case 4:
                   P0=table[shi];                        //顯示十位段碼
                   dula=1;
                   dula=0;
               
                   P0=0xef;                                                //顯示十位位碼
                   wela=1;
                   wela=0;
                        k++;
                 break;       

                case 5:
                   P0=table[ge];                        //顯示個(gè)位段碼
                   dula=1;
                   dula=0;
               
                   P0=0xdf;                                                //顯示個(gè)位位碼
                   wela=1;
                   wela=0;
                        k=0;
                 break;       
        }
}
/**************主程序**************/
void main()
{
        InitUART();                //初始化串口
        while(1)
        {
                analysis();        //數(shù)據(jù)解析
                Transformation();//數(shù)據(jù)分解
                display();        //數(shù)碼管顯示
        }
}
/*********串口中斷服務(wù)程序**********/
void UARTInterrupt() 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]==0xff)        //驗(yàn)證數(shù)據(jù)頭(起始位)
        {
                num++;
                if(num>=6)
                {
                        flag=1;                        //接收完成標(biāo)志置1
                        num=0;                        //計(jì)數(shù)變量清0
                }
        }
}
//0xff 0x01 0x0c 0x00 0x16 0x23


評(píng)分

參與人數(shù) 1黑幣 +5 收起 理由
mdzzlsf + 5 很給力!

查看全部評(píng)分

回復(fù)

使用道具 舉報(bào)

7#
ID:266627 發(fā)表于 2018-4-24 16:16 | 只看該作者
接收要用中斷,因?yàn)榻邮站彌_區(qū)只有一個(gè)字節(jié),不停下手頭的事去接收,SBUF會(huì)被下一個(gè)字節(jié)改變。
發(fā)送不用中斷。

將發(fā)送的數(shù)據(jù)包裝成一個(gè)個(gè)的數(shù)據(jù)幀,加上幀頭和校驗(yàn),一般還是很可靠的。
回復(fù)

使用道具 舉報(bào)

8#
ID:304431 發(fā)表于 2018-4-25 11:40 | 只看該作者
wulin 發(fā)表于 2018-4-24 14:41
沒(méi)有你想的那么復(fù)雜,給你寫(xiě)一個(gè)示例程序參考,經(jīng)TX-1C實(shí)驗(yàn)板與串口助手驗(yàn)證無(wú)誤。
#include
#define  ...

謝謝您的解答!
回復(fù)

使用道具 舉報(bào)

9#
ID:451441 發(fā)表于 2019-9-5 10:36 | 只看該作者
謝謝LZ分享,借鑒下
回復(fù)

使用道具 舉報(bào)

10#
ID:438771 發(fā)表于 2019-9-7 20:17 來(lái)自觸屏版 | 只看該作者
緒爺 發(fā)表于 2018-4-23 19:58
發(fā)數(shù)據(jù)不需要中斷接收需要

請(qǐng)教一下怎么發(fā)送?我每次發(fā)送數(shù)據(jù)都上位機(jī)都亂碼了
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表