2648|0

280

帖子

0

TA的资源

一粒金砂(高级)

楼主
 

数字电压表 [复制链接]

下面是C语言程序#include
#define uchar unsigned char;
uchar code scan_con[]={0x03,0x02,0x01,0x00};  //定义列扫描
uchardispcode[]={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++);               
              }  
    }
}

此帖出自单片机论坛
点赞 关注
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表