找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1639|回复: 9
收起左侧

串口通讯 问题,请教高手。。

[复制链接]
ID:423648 发表于 2018-11-9 16:17 | 显示全部楼层 |阅读模式
用的普中科技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;                                                 //清除发送完成标志位
}



主要问题就是在中断这里……


回复

使用道具 举报

ID:423648 发表于 2018-11-9 16:22 | 显示全部楼层
这个是串口助手的反馈
微信截图_20181109162033.png
2.png
3.png
回复

使用道具 举报

ID:423648 发表于 2018-11-9 16:23 | 显示全部楼层
数码管 是正常的
4.jpg
回复

使用道具 举报

ID:423648 发表于 2018-11-12 09:15 | 显示全部楼层
没人吗?呃
回复

使用道具 举报

ID:423648 发表于 2018-11-13 11:22 | 显示全部楼层
为什么没人来,能不能把这个贴子转到问答区啊
回复

使用道具 举报

ID:375003 发表于 2018-11-13 14:42 | 显示全部楼层
SBUF=Read_AD_Data(0xE4);        
没有看见你的子涵数。不知道怎么调用啊。
回复

使用道具 举报

ID:331575 发表于 2018-11-13 15:32 | 显示全部楼层
1貌似跟停止位重复了 ,串口分不清楚到底是数据位还是停止位  我的分析
回复

使用道具 举报

ID:331575 发表于 2018-11-13 15:38 | 显示全部楼层
你可以试一试用八位的码去验证 比如说0x0a 是1  0x0b是2  。。。。。无非就是在case那里改一下
回复

使用道具 举报

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个数,是我采直线电位计的返回值。。。现在确定就是中断这块的问题,而且是 Read_AD_Data(0xE4)  里面的数字和字符串之间的矛盾,如果我把 Read_AD_Data(0xE4)  改成48,那么串口助手上的返回值就是0。。。。但是现在关键是 不知道这里怎么处理。
回复

使用道具 举报

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 单片机教程网

快速回复 返回顶部 返回列表