串口通讯出现问题,求大神帮忙

2019-07-15 19:30发布

本程序的主要用途是利用上位机显示AD0804转换后的电压值,利用上位机发送1,就会每个一秒的时间在上位机上显示电压值,当发送2时,退出显示电压值,一旦发送除这两个字以外的数字,就会出现ERROR的字眼字样,,但是我在调试的过程发现有一个问题,就是无论我在上位机上面对单片机发送什么数据,包括1和2,都会显示ERROR的字眼,找了很久也找不到原因在哪里,所以发上论坛,大家谈论一下,,问题究竟在哪里~??当然啦,数码管也是显示全部000000.。。。

#include<reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
sbit seg04=P2^3;
sbit seg03=P2^2;
sbit seg02=P2^1;
sbit seg01=P2^0;
sbit adcwr=P3^6;
sbit adcrd=P3^7;
uint t0_num,a;
uchar flag_time,flag_uart,flag_on;
uint A1,A2,A3,A4;
float adcunm2;
long adcunm3,adcunm,ad_val,ad_vo;
uchar code table1[]={
                        0x3f,0x06,0x5b,0x4f,
                        0x66,0x6d,0x7d,0x07,
                        0x7f,0x6f
};

uchar code table2[]={
                        0xBf,0x86,0xDb,0xCf,
                        0xE6,0xEd,0xFd,0x87,
                        0xFf,0xEf
};

void delayms(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}

void init()
{
        TMOD=0x21;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        TH1=0xfd;
        TH1=0xfd;
        TR1=1;
        ET0=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
}

void display(long adcunm13)
{
        A1=adcunm13/1000;
        A2=adcunm13%1000/100;
        A3=adcunm13%100/10;
        A4=adcunm13%10;
        P0=0xff;
        seg01=0;
        seg02=1;
        seg03=1;
        seg04=1;
        P0=table2[A1];
        delayms(5);
       
        seg01=1;
        P0=0xff;
        seg02=0;
        seg03=1;
        seg04=1;
        P0=table1[A2];
        delayms(5);
       
        seg01=1;
        seg02=1;
        P0=0xff;
        seg03=0;
        seg04=1;
        P0=table1[A3];
        delayms(3);
       
                seg01=1;
        seg02=1;
        P0=0xff;
        seg03=1;
        seg04=0;
        P0=table1[A4];
        delayms(3);
        }
       
long start()
{
       
        adcwr=1;
        _nop_();
        adcwr=0;
        _nop_();
        adcwr=1;
        _nop_();
        _nop_();
        _nop_();
        P1=0xff;
        adcrd=1;
        _nop_();
        adcrd=0;
        _nop_();
        adcunm=P1;
        adcrd=1;
        adcunm2=adcunm*(5.0000/256);
        adcunm3=adcunm2*1000;
        return adcunm3;
}



void main()
{init();

       
        while (1)
        {
                if (flag_uart==1)
                {
                        flag_uart=0;
                        ES=0;
                        TI=1;
                        switch (flag_on)
                        {
                        case 0:
                                puts("Turn on ad ");
                                TR0=1;
                                break;
                        case 1:
                                printf("Turn off ad ");
                                TR0=0;
                                break;
                        case 2:
                                puts("Error");
                                break;
                        }
                        while (!TI);
                        TI=0;
                        ES=1;
                }
                if (flag_time==1)
                {
                        flag_time=0;
                        ad_val=start();
                        //ad_vo=(float)adcunm*5.0000/256.0;
                        ES=0;
                        TI=1;
                        printf("the voltage is %lV ",ad_val);
                        while (!TI);
                        TI=0;
                        ES=1;
                }
                display(ad_val);
        }
}

void time0() interrupt 1
{
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        t0_num++;
        if(t0_num==20)
        {
                t0_num=0;
                flag_time=1;
        }
}

void ser() interrupt 4
{
        RI=0;
        a=SBUF;
        flag_uart=1;
        if(a==1)
                flag_on=0;
        else if(a==2)
                flag_on=1;
        else
                flag_on=2;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。