微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > STC单片机数字电压表问题

STC单片机数字电压表问题

时间:10-02 整理:3721RD 点击:
为什么下面的程序,不能刷新电压变化,显示结果只有两种不测为0,测就是5。3V,不能随着调度变化而变化,求指教

#include "15f204ea.h"
#include "intrins.h"
typedef unsigned char uchar;
typedef unsigned int uint;
uint dat0,dat10,dat100;
/* ADC操作『ADC_CONTR寄存器』常量定义 */
#define ADC_POWER   0x80            //ADC电源控制位
#define ADC_FLAG    0x10            //ADC完成标志
#define ADC_START   0x08            //ADC起始控制位
#define ADC_SPEEDLL 0x00            //540个时钟
#define ADC_SPEEDL  0x20            //360个时钟
#define ADC_SPEEDH  0x40            //180个时钟
#define ADC_SPEEDHH 0x60            //90个时钟

sbit wei1=P3^2;
sbit wei2=P3^3;
sbit wei3=P3^4;
sbit wei4=P3^5;

uchar table[]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字不带点
uchar code table1[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //数字带点

/*----------------------------
软件延时
----------------------------*/
void Delay(uint n)
{
uint x,y;
for(x=n;x>0;x--)
         for(y=110;y>0;y--);
}
/*----------------------------
四位数码管显示
----------------------------*/
void display(uint dat)
{
uint qian,bai,shi,ge;

    qian=dat/1000;      //对变量temp求抹(就是千的倍数)
    bai=dat%1000/100; //对变量temp先求余数,再对余数进行100的求抹
    shi=dat%1000%100/10; // 对变量temp先求余数,再对余数进行100的求余,最后对余数进行10的求抹
    ge=dat%10;     //对变量temp求余数

  
   if(dat==dat10)  //如果在10伏以下
     {
        
        wei1=0;     //打开位选和第一位 ,因为位选是通过PNP5401作反相器来加大电流,所以用这
        P2=table1[qian]; //将求出来的千位数从数码表中取出送给P1口
        Delay(1);     //延时一下,这样好显示亮一下
        P2=0xff;//消影
        wei1=1;
     }
     else//否则
   
          wei1=0;     //打开位选和第一位 ,因为位选是通过PNP5401作反相器来加大电流,所以用这
        P2=table[qian]; //将求出来的千位数从数码表中取出送给P1口
        Delay(1);     //延时一下,这样好显示亮一下
        P2=0xff;//消影
        wei1=1;
//………………………………………………………………………………………………………………………………………………………………………………………………………………………………………  
     if(dat==dat100) //如果在10伏以下-100伏以下
     {
        wei2=0;     //打开位选和第二位  因为位选是通过PNP5401作反相器来加大电流,所以用这个
        P2=table1[bai];    //将求出来的百位数从数码表中取出送给P1口
        Delay(1);     //延时一下,这样好显示亮一下
        P2=0xff;//消影
        wei2=1;   
     }
     else//否则
     
    wei2=0;     //打开位选和第二位  因为位选是通过PNP5401作反相器来加大电流,所以用这个
    P2=table[bai];    //将求出来的百位数从数码表中取出送给P1口
    Delay(1);     //延时一下,这样好显示亮一下
    P2=0xff;//消影
    wei2=1;
    //………………………………
   
    wei3=0;  //打开位选和第三位  因为位选是通过PNP5401作反相器来加大电流,所以用这个
    P2=table[shi];    //将求出来的十位数从数码表中取出送给P1口
    Delay(1);      //延时一下,这样好显示亮一下
    P2=0xff;//消影
    wei3=1;
    //………………………………
   
    wei4=0;  //打开位选和第四位 因为位选是通过PNP5401作反相器来加大电流,所以用这个
    P2=table[ge];    //将求出来的个位数从数码表中取出送给P1口
    Delay(1);     //延时一下,这样好显示亮一下      
    P2=0xff;//消影
    wei4=1;//………………………………  

}

/*----------------------------
读取ADC结果
----------------------------*/
uint GetADCResult(uchar ch)
{
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL | ADC_START| ch ;  //打开AD转换电源|设置AD转换数度|开始AD转换|8路ADC其中一个通道号
    _nop_();                        //等待4个NOP
    _nop_();
    _nop_();
    _nop_();
  
    while (!(ADC_CONTR & ADC_FLAG));//等待ADC转换完成
    ADC_CONTR &= ~ADC_FLAG;         //Close ADC
//  if((ADC_RES*5.0/256)>0.71) //如果大于0.1伏
// {
  if((ADC_RES*5.0/256)<10) //如果小于10伏
    {
        dat10=((ADC_RES*5.3/256)+0.021)*1000;
         return dat10;  //返回ADC结果
     }
  if((ADC_RES*5.0/256)>9)//如果大于10伏
    {
    dat100=((ADC_RES*5.3/256)+0.021)*1000;
         return dat100;      //返回ADC结果
     }
// }
//  else//否则
}
/*----------------------------
初始化ADC
----------------------------*/
void InitADC()
{

   P1ASF = 0x01;                   //设置P1.0口为AD口
  //  P1ASF = 0xff;                   //设置P1口(P1.0-P1.7)为AD口
    ADC_RES = 0;                    //清除结果寄存器
    ADC_CONTR = ADC_POWER | ADC_SPEEDLL;
    Delay(2);                       //ADC上电并延时
}

//…………………………………………………………………………………………………………
   void main()
{
    InitADC();                      //初始化ADC
    while (1)
    {
    display(GetADCResult(0));     //显示0通道(P1。0)的ADC高8位结果
    }
}


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

网站地图

Top