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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

串口通訊 問題,請教高手。。

[復制鏈接]
跳轉到指定樓層
樓主
用的普中科技C51 單片機開發板。
現在想實現AD轉換,我有一個直線電位計,單片機通過AD轉換將電位計的數值顯示在動態數碼管上,同時增加一個串口,從串口助手上發送1,單片機將當前直線電位計的數值返回串口助手,如果發送的是其他數,則返回 發送的數據。

現在的問題:AD轉換和數碼管已經調通了,但是串口這里有問題,輸入1  返回的是亂碼(沒規律),輸入含有1 的字符串,返回的也是亂碼。只有輸入不含1的字符串,會原樣返回(這個是對的)。

本人初學,求指點。

程序如下



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

typedef unsigned int u16;          //對數據類型進行聲明定義
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};

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

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


/*******************************************************************************
* 函數名         :datapros()
* 函數功能                 :數據處理函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/
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;                 //個位加點
        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;                 //個位加點
        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];               
       
}


/*******************************************************************************
* 函數名         :DigDisplay()
* 函數功能                 :數碼管顯示函數
* 輸入           : 無
* 輸出                  : 無
*******************************************************************************/
void DigDisplay()
{
        u8 i;
        for(i=0;i<8;i++)
        {
                switch(i)         //位選,選擇點亮的數碼管,
                {
                        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];//發送數據
                delay(100); //間隔一段時間掃描       
                P0=0x00;//消隱
        }               
}

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



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

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



主要問題就是在中斷這里……


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

使用道具 舉報

沙發
ID:423648 發表于 2018-11-9 16:22 | 只看該作者
這個是串口助手的反饋

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

微信截圖_20181109162033.png

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

2.png

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

3.png
回復

使用道具 舉報

板凳
ID:423648 發表于 2018-11-9 16:23 | 只看該作者
數碼管 是正常的

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

4.jpg
回復

使用道具 舉報

地板
ID:423648 發表于 2018-11-12 09:15 | 只看該作者
沒人嗎?呃
回復

使用道具 舉報

5#
ID:423648 發表于 2018-11-13 11:22 | 只看該作者
為什么沒人來,能不能把這個貼子轉到問答區啊
回復

使用道具 舉報

6#
ID:375003 發表于 2018-11-13 14:42 | 只看該作者
SBUF=Read_AD_Data(0xE4);        
沒有看見你的子涵數。不知道怎么調用啊。
回復

使用道具 舉報

7#
ID:331575 發表于 2018-11-13 15:32 | 只看該作者
1貌似跟停止位重復了 ,串口分不清楚到底是數據位還是停止位  我的分析
回復

使用道具 舉報

8#
ID:331575 發表于 2018-11-13 15:38 | 只看該作者
你可以試一試用八位的碼去驗證 比如說0x0a 是1  0x0b是2  。。。。。無非就是在case那里改一下
回復

使用道具 舉報

9#
ID:423648 發表于 2018-11-14 15:55 | 只看該作者
guangshi_wq 發表于 2018-11-13 14:42
SBUF=Read_AD_Data(0xE4);        
沒有看見你的子涵數。不知道怎么調用啊。

Read_AD_Data(0xE4)  這個里面就是0-4095,一共4096個數,是我采直線電位計的返回值。!,F在確定就是中斷這塊的問題,而且是 Read_AD_Data(0xE4)  里面的數字和字符串之間的矛盾,如果我把 Read_AD_Data(0xE4)  改成48,那么串口助手上的返回值就是0。。。。但是現在關鍵是 不知道這里怎么處理。
回復

使用道具 舉報

10#
ID:423648 發表于 2018-11-14 16:00 | 只看該作者
15942379927 發表于 2018-11-13 15:38
你可以試一試用八位的碼去驗證 比如說0x0a 是1  0x0b是2  。。。。。無非就是在case那里改一下

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

我嘗試用數組把數字摘出來 ,一個一個傳

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

                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);                         //等待發送數據完成
        TI=0;                                                 //清除發送完成標志位
}


但是這樣也不對。。。
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 精品小视频 | 欧美一级二级三级视频 | 在线a视频网站 | 久久不卡| 久久久青草婷婷精品综合日韩 | 一区视频| 日本亚洲精品成人欧美一区 | 久久精品亚洲精品国产欧美kt∨ | 免费国产一区二区 | 亚洲成人午夜电影 | 91资源在线| 成人福利网站 | 国产欧美日韩精品一区 | 二区在线观看 | 欧美一区二区三区的 | 99re6在线视频精品免费 | av黄色在线播放 | 精品欧美一区二区三区久久久 | 99久久久久久 | 成人精品视频在线观看 | 国产精品国产精品国产专区不卡 | 国产一区二区在线播放 | 91免费在线视频 | 精品国产综合 | 欧美精品一区二区免费 | 精品国产一区久久 | 免费在线看黄 | 九九久久精品 | 天天综合国产 | 在线观看av中文字幕 | 黄色三级免费网站 | 日韩亚洲一区二区 | 欧美美女被c | 亚洲精彩视频 | 中文字幕一级毛片 | 91av视频在线免费观看 | 欧美久久久久久 | 久久这里只有精品首页 | 伊人久久免费视频 | 91av视频在线免费观看 | 亚洲成av人片在线观看 |