[百分求助,还可以加分]89C51实现的电压表程序问题

时间:2023-02-21 22:25:29
刚接触单片机没多长时间,很多问题还不很清楚

这个是把电压值直接在数码管上显示出来的(从网上搜出类的)
可是我想通过单片机串口通信,将数值发送给上位机PC,不要显示
的,应该怎么修改下面的程序呢?
要删除数码管显示的部分,并加上串口通信的部分.请高手指点


另外,我的AD转换器老板给的是AD7731

谢谢




#include <AT89X51.H> 
#define uchar unsigned char;
uchar code scan_con[]={0x03,0x02,0x01,0x00};  //定义列扫描
uchar dispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//定义0~9的显示段码
uchar dispbuf[8]={0,0,0,0,0,0,0,0}; //定义8个存储空间
uchar dispcount=0; 
uchar getdata; 
unsigned int temp;//定义暂存空间
uchar i,j,k,l,m;
sbit s3=P2^7;  //位定义,控制模拟开关
sbit s2=P2^6;
sbit s1=P2^5;
sbit dp=P1^7; //定义小数点
#define v20_on {s3=1;s2=0;s1=0;} //宏定义不同量程,不同的开关状态
#define v2_on {s3=0;s2=1;s1=0;}
#define v02_on {s3=0;s2=0;s1=1;}
sbit ST=P2^0;   //定义单片机和ADC的控制信号
sbit OE=P2^1; 
sbit EOC=P2^2; 
main() 

   while(1) 
     { 
_20v:                        //2~20V量程
       v20_on;
      ST=0;                   //启动A/D转换
       ST=1;
       ST=0;   
          while(EOC==0);
           OE=0;
           getdata=P0;
           OE=1;
           if(getdata<21)            //量程不合适,切换
           {
            goto _2v; 
           }
           l=3;
           temp=getdata;      //量程合适,数据处理
           temp=temp*100;
           temp=(temp/51)*5;
           goto disp;                 //跳到数码管显示程序段
    _2v:                            //200MV~2V量程
          v2_on;
         ST=0;
          ST=1;
          ST=0;   
          while(EOC==0);
           OE=0;
           getdata=P0;
           OE=1;
           if(getdata<21)
           {
             goto _02v; 
           }
           else if(getdata>204)
           {
             goto _20v;
           }
           l=2;
           temp=getdata;
           temp=(temp*100/51)*10;
           temp=temp/2;
           goto disp;
      _02v:                        //0~200MV量程
          v02_on;
         ST=0;
          ST=1;
          ST=0;   
          while(EOC==0);
           OE=0;
           getdata=P0;
           OE=1;
          if(getdata>204)
           {
             goto _2v;
           }
           l=1;
           temp=getdata;
           temp=(temp*100/51)*100;
           temp=temp/20;
       
        disp:
             dispbuf[0]=0; 
              dispbuf[1]=0; 
              dispbuf[2]=0; 
              dispbuf[3]=0; 
              dispbuf[4]=0; 
              dispbuf[5]=0; 
              dispbuf[6]=0; 
              dispbuf[7]=0;
           i=0;
           while(temp/10)          //电压值的每个位计算
             { 
               dispbuf[i]=temp%10; 
               temp=temp/10; 
               i++; 
             }
             dispbuf[i]=temp;
           for(k=0;k<=3;k++)            //数码管显示
            {
             P1=dispcode[dispbuf[k]]; 
            P3=scan_con[k];
             if(l==3){if(k==2) { P1=P1 | 0x80; }} //小数点的确定
             else if(l==2) {if(k==3) { P1=P1 | 0x80; }}
             else if(l==1){if(k==1) { P1=P1 | 0x80; }}
             for(m=0;m<=2;m++)     //延时
             for(j=0;j<=100;j++);                
             }
    }
}
 

6 个解决方案

#1


没注意,分数写错了,如何追加或者修改/.?谢谢

#2


就把数码管显示那段改成发送到串口

#3


把你的得到的AD,转换成ASCII 然后写到串口发送缓冲区中,就OK了,前边在加上串口初始化,这些在网上很多代码的

#4


谢谢,

刚入门还是比较迷惑.

#5


找点别人的代码做瞧瞧就OK了,刚开始是比较迷惑的

#6


"可是我想通过单片机串口通信,将数值发送给上位机PC,不要显示"
发送给PC,还不去显示。楼主的目的是什么呢。
还是比较容易实现的。
下位机程序需要加上串口方面的代码
PC机部分,你是要怎么接收,不会是用串口调试助手吧。
PC部分需要自己写一下代码。用VC,VB都可以。操作串口收发就可以了。
还是比较简单的。
我也写过这方面的代码。将AD的采样值发送给WINCE,然后根据不同的AD采样值
绘制一个简单的动态曲线。
我这里是WINCE下,和你PC的WINDOWS下是一个道理的。
总之,楼主动手写吧。到具体细节不会的,再一起交流。
————————————————————————————————————————————————
现阶段连菜鸟都算不上,我就是来顶贴学习的! 

#1


没注意,分数写错了,如何追加或者修改/.?谢谢

#2


就把数码管显示那段改成发送到串口

#3


把你的得到的AD,转换成ASCII 然后写到串口发送缓冲区中,就OK了,前边在加上串口初始化,这些在网上很多代码的

#4


谢谢,

刚入门还是比较迷惑.

#5


找点别人的代码做瞧瞧就OK了,刚开始是比较迷惑的

#6


"可是我想通过单片机串口通信,将数值发送给上位机PC,不要显示"
发送给PC,还不去显示。楼主的目的是什么呢。
还是比较容易实现的。
下位机程序需要加上串口方面的代码
PC机部分,你是要怎么接收,不会是用串口调试助手吧。
PC部分需要自己写一下代码。用VC,VB都可以。操作串口收发就可以了。
还是比较简单的。
我也写过这方面的代码。将AD的采样值发送给WINCE,然后根据不同的AD采样值
绘制一个简单的动态曲线。
我这里是WINCE下,和你PC的WINDOWS下是一个道理的。
总之,楼主动手写吧。到具体细节不会的,再一起交流。
————————————————————————————————————————————————
现阶段连菜鸟都算不上,我就是来顶贴学习的!