微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 51单片机串口发送接收到的数据有很多位

51单片机串口发送接收到的数据有很多位

时间:10-02 整理:3721RD 点击:
我是一名单片机的初学者,这是我自己编的一个小程序,但是在键盘按键之后计算机收到的值有每次好几个,而且经常掺杂有错误值00,查询了好久还是不知道为什么,麻烦大家帮我看一下程序有什么错误,谢谢啦。
/*功能:以9600波特率发送矩阵键盘0~15值至计算机*/
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit wela=P2^7;
sbit dula=P2^6;
uchar flag,m,n,num;
void delay(uint);
uchar keyscan();

void main()
{       
        TMOD=0x20;//设置定时器1工作方式为八位自动重装
        TH1=0xFD;//设置串行口波特率为9600HZ
        TH0=0xFD;
        TR1=1;//启动T1
        SM0=0;
        SM1=1;//串口工作方式为1
        REN=1;//允许接收

        while(1)
        {
                keyscan();//键盘扫描
                if(flag==1)//按键完成标志位
                {
                        flag=0;
                        SBUF=keyscan();
                        while(!TI);
                        TI=0;
       
                };
        }
       

}
uchar keyscan()//键盘扫描
        P3=0xFE;
        m=P3;
        if(m!=0xFE)
        {
                delay(10);
                if(m!=0xFE)
                {
                        switch(m)
                        {
                                case 0xEE:num=0;
                                                break;
                                case 0xDE:num=1;
                                                break;
                                case 0xBE:num=2;
                                                break;
                                case 0x7E:num=3;
                                                break;
                               
                        };
                        while(m!=0xFE)
                        {
                                m=P3;
                        };       
                       
                        flag=1;
                };
        };

        P3=0xFD;
        m=P3;
        if(m!=0xFD)
        {
                delay(10);
                if(m!=0xFD)
                {
                        switch(m)
                        {
                                case 0xED:num=4;
                                                break;
                                case 0xDD:num=5;
                                                break;
                                case 0xBD:num=6;
                                                break;
                                case 0x7D:num=7;
                                                break;
                               
                        }
                        while(m!=0xFD)
                        {
                                m=P3;
                        };       
                        flag=1;
                };
        };

        P3=0xFB;
        m=P3;
        if(m!=0xFB)
        {
                delay(10);
                if(m!=0xFB)
                {
                        switch(m)
                        {
                                case 0xEB:num=8;
                                                break;
                                case 0xDB:num=9;
                                                break;
                                case 0xBB:num=10;
                                                break;
                                case 0x7B:num=11;
                                                break;
                               
                        }
                        while(m!=0xFB)
                        {
                                m=P3;
                        };
                        flag=1;       
                };
        };

        P3=0xF7;
        m=P3;
        if(m!=0xF7)
        {
                delay(10);
                if(m!=0xF7)
                {
                        switch(m)
                        {
                                case 0xE7:num=12;
                                                break;
                                case 0xD7:num=13;
                                                break;
                                case 0xB7:num=14;
                                                break;
                                case 0x77:num=15;
                                                break;
                               
                        }
                        while(m!=0xF7)
                        {
                                m=P3;
                        };
                        flag=1;       
                };
        };
return num;
}
void delay(uint z)//延时函数
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}

给你举个例子,个十百千怎么取,
    int n = 1234;
    int unitPlace = n / 1 % 10;//4
    int tenPlace = n / 10 % 10;//3
    int hundredPlace = n / 100 % 10;//2
    int thousandPlace = n / 1000 % 10;//1

你这个现象是波特率计算不对,重新计算一下值吧

T0第八位那是有些错误。 我修改了一下波特率,稳定了许多,但是还是有一些按键收到的数值不止一个,我再看看吧

你说的是稳定了很多那就还是不对的- -,必须确保无误码,你值还是错的.误差较大.

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top