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位结果
}
}
#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位结果
}
}