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

hsygzdc   2009-11-9 15:42 楼主
刚接触单片机没多长时间,很多问题还不很清楚

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


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

谢谢




#include
#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=temp%10;
               temp=temp/10;
               i++;
             }
             dispbuf=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)

没注意,分数写错了,如何追加或者修改/.?谢谢
点赞  2009-11-9 15:43
就把数码管显示那段改成发送到串口
点赞  2009-11-9 15:45
把你的得到的AD,转换成ASCII 然后写到串口发送缓冲区中,就OK了,前边在加上串口初始化,这些在网上很多代码的
点赞  2009-11-9 19:39
谢谢,

刚入门还是比较迷惑.
点赞  2009-11-10 11:10
找点别人的代码做瞧瞧就OK了,刚开始是比较迷惑的
点赞  2009-11-10 13:03
"可是我想通过单片机串口通信,将数值发送给上位机PC,不要显示"
发送给PC,还不去显示。楼主的目的是什么呢。
还是比较容易实现的。
下位机程序需要加上串口方面的代码
PC机部分,你是要怎么接收,不会是用串口调试助手吧。
PC部分需要自己写一下代码。用VC,VB都可以。操作串口收发就可以了。
还是比较简单的。
我也写过这方面的代码。将AD的采样值发送给WINCE,然后根据不同的AD采样值
绘制一个简单的动态曲线。
我这里是WINCE下,和你PC的WINDOWS下是一个道理的。
总之,楼主动手写吧。到具体细节不会的,再一起交流。
————————————————————————————————————————————————
现阶段连菜鸟都算不上,我就是来顶贴学习的!
点赞  2009-11-11 09:11
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复