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

標(biāo)題: 串口通訊 問(wèn)題,請(qǐng)教高手。。 [打印本頁(yè)]

作者: sangyi159    時(shí)間: 2018-11-9 16:17
標(biāo)題: 串口通訊 問(wèn)題,請(qǐng)教高手。。
用的普中科技C51 單片機(jī)開(kāi)發(fā)板。
現(xiàn)在想實(shí)現(xiàn)AD轉(zhuǎn)換,我有一個(gè)直線電位計(jì),單片機(jī)通過(guò)AD轉(zhuǎn)換將電位計(jì)的數(shù)值顯示在動(dòng)態(tài)數(shù)碼管上,同時(shí)增加一個(gè)串口,從串口助手上發(fā)送1,單片機(jī)將當(dāng)前直線電位計(jì)的數(shù)值返回串口助手,如果發(fā)送的是其他數(shù),則返回 發(fā)送的數(shù)據(jù)。

現(xiàn)在的問(wèn)題:AD轉(zhuǎn)換和數(shù)碼管已經(jīng)調(diào)通了,但是串口這里有問(wèn)題,輸入1  返回的是亂碼(沒(méi)規(guī)律),輸入含有1 的字符串,返回的也是亂碼。只有輸入不含1的字符串,會(huì)原樣返回(這個(gè)是對(duì)的)。

本人初學(xué),求指點(diǎn)。

程序如下



#include "reg52.h"                         //此文件中定義了單片機(jī)的一些特殊功能寄存器
#include"XPT2046.h"       

typedef unsigned int u16;          //對(duì)數(shù)據(jù)類型進(jìn)行聲明定義
typedef unsigned char u8;

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;

u8 disp[8];
u8 smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

/*******************************************************************************
* 函 數(shù) 名         : delay
* 函數(shù)功能                   : 延時(shí)函數(shù),i=1時(shí),大約延時(shí)10us
*******************************************************************************/
void delay(u16 i)
{
        while(i--);       
}

/*******************************************************************************
* 函數(shù)名         :UsartInit()
* 函數(shù)功能                 :設(shè)置串口
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
*******************************************************************************/
void UsartInit()
{
        SCON=0X50;                        //設(shè)置為工作方式1
        TMOD=0X20;                        //設(shè)置計(jì)數(shù)器工作方式2
        PCON=0X80;                        //波特率加倍
        TH1=0XF3;                                //計(jì)數(shù)器初始值設(shè)置,注意波特率是4800的
        TL1=0XF3;
        ES=1;                                                //打開(kāi)接收中斷
        EA=1;                                                //打開(kāi)總中斷
        TR1=1;                                        //打開(kāi)計(jì)數(shù)器
}


/*******************************************************************************
* 函數(shù)名         :datapros()
* 函數(shù)功能                 :數(shù)據(jù)處理函數(shù)
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
*******************************************************************************/
void datapros()
{
        long int temp;
        static u8 i;
        float cd;
       
        if(i==20)
        {
                i=0;
                temp = Read_AD_Data(0xE4);                   //   AIN3 外部輸入
                cd=temp;
                  temp=(121-(cd*121)/4095)*10000;                 
        }
        i++;

       

/*        disp[0]=smgduan[(121-((temp)*121)/4095)/1000];//千位
        disp[1]=smgduan[(121-((temp)*121)/4095)%1000/100];//百位
        disp[2]=smgduan[(121-((temp)*121)/4095)%1000%100/10];//十位
        disp[3]=smgduan[(121-((temp)*121)/4095)%1000%100%10]| 0x80;                 //個(gè)位加點(diǎn)
        disp[4]=smgduan[temp/1000];
        disp[5]=smgduan[temp%1000/100];
        disp[6]=smgduan[temp%1000%100/10];
        disp[7]=smgduan[temp%1000%100%10];                                                             */

        disp[0]=smgduan[temp/10000000];//千位
        disp[1]=smgduan[temp%10000000/1000000];//百位
        disp[2]=smgduan[temp%10000000%1000000/100000];//十位
        disp[3]=smgduan[temp%10000000%1000000%100000/10000]| 0x80;                 //個(gè)位加點(diǎn)
        disp[4]=smgduan[temp%10000000%1000000%100000%10000/1000];
        disp[5]=smgduan[temp%10000000%1000000%100000%10000%1000/100];
        disp[6]=smgduan[temp%10000000%1000000%100000%10000%1000%100/10];
        disp[7]=smgduan[temp%10000000%1000000%100000%10000%1000%100%10];               
       
}


/*******************************************************************************
* 函數(shù)名         :DigDisplay()
* 函數(shù)功能                 :數(shù)碼管顯示函數(shù)
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<8;i++)
        {
                switch(i)         //位選,選擇點(diǎn)亮的數(shù)碼管,
                {
                        case(0):
                                LSA=0;LSB=0;LSC=0; break;//顯示第0位
                        case(1):
                                LSA=1;LSB=0;LSC=0; break;//顯示第1位
                        case(2):
                                LSA=0;LSB=1;LSC=0; break;//顯示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
                        case(4):
                                LSA=0;LSB=0;LSC=1; break;//顯示第4位
                        case(5):
                                LSA=1;LSB=0;LSC=1; break;//顯示第5位
                        case(6):
                                LSA=0;LSB=1;LSC=1; break;//顯示第6位
                        case(7):
                                LSA=1;LSB=1;LSC=1; break;//顯示第7位       
                }
                P0=disp[i];//發(fā)送數(shù)據(jù)
                delay(100); //間隔一段時(shí)間掃描       
                P0=0x00;//消隱
        }               
}

/*******************************************************************************
* 函 數(shù) 名       : main
* 函數(shù)功能                 : 主函數(shù)
* 輸    入       : 無(wú)
* 輸    出             : 無(wú)
*******************************************************************************/
void main()
{       
        UsartInit();  //        串口初始化
        while(1)
        {
                datapros();         //數(shù)據(jù)處理函數(shù)
                DigDisplay();//數(shù)碼管顯示函數(shù)               
        }               
}



/*******************************************************************************
* 函數(shù)名         : Usart() interrupt 4
* 函數(shù)功能                  : 串口通信中斷函數(shù)
* 輸入           : 無(wú)
* 輸出                  : 無(wú)
*******************************************************************************/
void Usart() interrupt 4
{
        u8 receiveData;

        if(RI == 1)
        {
                RI = 0;//清除接收中斷標(biāo)志位
                receiveData=SBUF;//儲(chǔ)存接收到的數(shù)據(jù)
       
                if(receiveData=='1')
                {
                        SBUF=Read_AD_Data(0xE4);       
                }
        else
                {
                        SBUF=receiveData;
                }
        }
        while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
        TI=0;                                                 //清除發(fā)送完成標(biāo)志位
}



主要問(wèn)題就是在中斷這里……



作者: sangyi159    時(shí)間: 2018-11-9 16:22
這個(gè)是串口助手的反饋

微信截圖_20181109162033.png (21.97 KB, 下載次數(shù): 36)

微信截圖_20181109162033.png

2.png (23.94 KB, 下載次數(shù): 28)

2.png

3.png (23.31 KB, 下載次數(shù): 33)

3.png

作者: sangyi159    時(shí)間: 2018-11-9 16:23
數(shù)碼管 是正常的

4.jpg (651.99 KB, 下載次數(shù): 38)

4.jpg

作者: sangyi159    時(shí)間: 2018-11-12 09:15
沒(méi)人嗎?呃
作者: sangyi159    時(shí)間: 2018-11-13 11:22
為什么沒(méi)人來(lái),能不能把這個(gè)貼子轉(zhuǎn)到問(wèn)答區(qū)啊
作者: guangshi_wq    時(shí)間: 2018-11-13 14:42
SBUF=Read_AD_Data(0xE4);        
沒(méi)有看見(jiàn)你的子涵數(shù)。不知道怎么調(diào)用啊。
作者: 15942379927    時(shí)間: 2018-11-13 15:32
1貌似跟停止位重復(fù)了 ,串口分不清楚到底是數(shù)據(jù)位還是停止位  我的分析
作者: 15942379927    時(shí)間: 2018-11-13 15:38
你可以試一試用八位的碼去驗(yàn)證 比如說(shuō)0x0a 是1  0x0b是2  。。。。。無(wú)非就是在case那里改一下
作者: sangyi159    時(shí)間: 2018-11-14 15:55
guangshi_wq 發(fā)表于 2018-11-13 14:42
SBUF=Read_AD_Data(0xE4);        
沒(méi)有看見(jiàn)你的子涵數(shù)。不知道怎么調(diào)用啊。

Read_AD_Data(0xE4)  這個(gè)里面就是0-4095,一共4096個(gè)數(shù),是我采直線電位計(jì)的返回值。。。現(xiàn)在確定就是中斷這塊的問(wèn)題,而且是 Read_AD_Data(0xE4)  里面的數(shù)字和字符串之間的矛盾,如果我把 Read_AD_Data(0xE4)  改成48,那么串口助手上的返回值就是0。。。。但是現(xiàn)在關(guān)鍵是 不知道這里怎么處理。
作者: sangyi159    時(shí)間: 2018-11-14 16:00
15942379927 發(fā)表于 2018-11-13 15:38
你可以試一試用八位的碼去驗(yàn)證 比如說(shuō)0x0a 是1  0x0b是2  。。。。。無(wú)非就是在case那里改一下

你的意思 就是  我 把receiveData=='1'  這里的1  改成0x0a嗎?這樣可以,但是并沒(méi)有解決返回值是亂碼的問(wèn)題。。 現(xiàn)在問(wèn)題的原因找到了,就是Read_AD_Data(0xE4)返回的是數(shù)字,而串口傳過(guò)去的是字符串,所以就是亂碼了。但是我不知道怎么寫。。

我嘗試用數(shù)組把數(shù)字摘出來(lái) ,一個(gè)一個(gè)傳

void Usart() interrupt 4
{
        u8 receiveData;
        u8 str[4];
        u8 i;
        u8 j;
       
        if(RI == 1)
        {
                RI = 0;//清除接收中斷標(biāo)志位
                receiveData=SBUF;//儲(chǔ)存接收到的數(shù)據(jù)         

                for(j=1;j<5;j++)
                {
                        if(receiveData=='1')
                        {
                                i=Read_AD_Data(0xE4);
                                str[1]=i/1000+48;
                                str[2]=i%1000/100+48;
                                str[3]=i%1000%100/10+48;
                                str[4]=i%1000%100%10+48;       
                                SBUF=str[j];       
                        }
                        else
                        {
                                SBUF=receiveData;
                        }
                }
        }
        while(!TI);                         //等待發(fā)送數(shù)據(jù)完成
        TI=0;                                                 //清除發(fā)送完成標(biāo)志位
}


但是這樣也不對(duì)。。。




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1