参照官方手册写了个8位AD的程序 然后用数码管显示转换结果 但是仿真时就显示一堆0
求各位大神指导
下面附上源代码(头文件是STC-ISP保存下来的)
#include <STC12C5A.h>//定义STC12C5A系列单片机头文件
#include <intrins.h>
typedef unsigned char uchar; //宏定义 定义无符号整型
/*******声明ADC寄存器********/
//sfrADC_CONTR =0xBC;
//sfrADC_RES =0xBD;
//sfrADC_LOW2 =0xBE;
//sfrP1ASF =0x9D;
/*******定义ADC寄存器控制常量****/
#define ADC_POWER 0X80 //启动ADC转换电源
#define ADC_FLAG 0X10 //定义ADC转换完成标志位
#define ADC_START 0X08 //启动ADC转换器
#define ADC_SPEED1 0X00 //转换速度 540clks
#define ADC_SPEED2 0X20 //转换速度 360clks
#define ADC_SPEED3 0X40 //转换速度 180clks
#define ADC_SPEED4 0X60 //转换速度 90clks
uchar code table[]= //七段共阴数码管0-9代码
{0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,
0x6f};
uchar ch=0;//设定ADC转换通道0
void delayms(uchar n); //延时子函数
uchar ADCresult(ch); //AD转换所需子函数
void Delayns(uchar m);
void InitADC();
float AD_work(ch);
/************************************/
/********延时子函数,用于数码管显示及按键延时消抖*********/
void delayms(uchar n)
{
uchar i;
uchar a,b;
for(i=0;i<n;i++)
{
for(a=10;a>0;a--)
for(b=225;b>0;b--);
}
}
/**************************************/
/***********AD转换结果返回子函数****************/
uchar ADCresult(ch)
{
ADC_CONTR=ADC_POWER|ADC_SPEED1|ch|ADC_START;
_nop_();//设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,
_nop_();//才能保证值被写入ADC_CONTR寄存器
_nop_();
_nop_();
while(!(ADC_CONTR&=~ADC_FLAG));//等待标志位完全结束
ADC_CONTR&=~ADC_FLAG;//关闭ADC
return ADC_RES;//返回转换结果
}
/*************************************************/
/***********ADC初始化子函数***/
void InitADC()
{
P1ASF=0x01;//选择P01为AD转换输入端
ADC_RES=0;//清除先前的转换结果
ADC_CONTR=ADC_POWER|ADC_SPEED1; //ADC电源启动并设定AD转换速度(speed1=0x00)
Delayns(2); //延时
}
/**********************/
/**********延时子函数***********/
void Delayns(uchar m)
{
uchar z;
while (m--)
{
z = 5000;
while (z--);
}
}
/***********************/
/************主函数*****************/
void main()
{
uchar k,k1,k2,k3,k4;
InitADC();
while(1)
{
k=AD_work(ch);//调用AD转换子函数
k1=k/1000;
k2=(k%1000)/100;
k3=((k%1000)%100)/10;
k4=k%10;
P2=0x10;
P0=table[k1];
delayms(1);
P2=0x20;
P0=table[k2];
delayms(1);
P2=0x40;
P0=table[k3];
delayms(1);
P2=0x80;
P0=table[k4];
delayms(1);
}
}
/************************************/
float AD_work(ch)
{ float AD_val; //????????AD_val????
unsigned char z;
for(z=0;z<100;z++)
AD_val+=ADCresult(ch); //??100?????(????)
AD_val/=100;
AD_val=(AD_val*5)/256; //AD???????????5v,???5??
return AD_val;
}
仿真图
求各位大神指导
下面附上源代码(头文件是STC-ISP保存下来的)
#include <STC12C5A.h>//定义STC12C5A系列单片机头文件
#include <intrins.h>
typedef unsigned char uchar; //宏定义 定义无符号整型
/*******声明ADC寄存器********/
//sfrADC_CONTR =0xBC;
//sfrADC_RES =0xBD;
//sfrADC_LOW2 =0xBE;
//sfrP1ASF =0x9D;
/*******定义ADC寄存器控制常量****/
#define ADC_POWER 0X80 //启动ADC转换电源
#define ADC_FLAG 0X10 //定义ADC转换完成标志位
#define ADC_START 0X08 //启动ADC转换器
#define ADC_SPEED1 0X00 //转换速度 540clks
#define ADC_SPEED2 0X20 //转换速度 360clks
#define ADC_SPEED3 0X40 //转换速度 180clks
#define ADC_SPEED4 0X60 //转换速度 90clks
uchar code table[]= //七段共阴数码管0-9代码
{0x3f,0x06,0x5b,
0x4f,0x66,0x6d,
0x7d,0x07,0x7f,
0x6f};
uchar ch=0;//设定ADC转换通道0
void delayms(uchar n); //延时子函数
uchar ADCresult(ch); //AD转换所需子函数
void Delayns(uchar m);
void InitADC();
float AD_work(ch);
/************************************/
/********延时子函数,用于数码管显示及按键延时消抖*********/
void delayms(uchar n)
{
uchar i;
uchar a,b;
for(i=0;i<n;i++)
{
for(a=10;a>0;a--)
for(b=225;b>0;b--);
}
}
/**************************************/
/***********AD转换结果返回子函数****************/
uchar ADCresult(ch)
{
ADC_CONTR=ADC_POWER|ADC_SPEED1|ch|ADC_START;
_nop_();//设置ADC_CONTR寄存器后需加4个CPU时钟周期的延时,
_nop_();//才能保证值被写入ADC_CONTR寄存器
_nop_();
_nop_();
while(!(ADC_CONTR&=~ADC_FLAG));//等待标志位完全结束
ADC_CONTR&=~ADC_FLAG;//关闭ADC
return ADC_RES;//返回转换结果
}
/*************************************************/
/***********ADC初始化子函数***/
void InitADC()
{
P1ASF=0x01;//选择P01为AD转换输入端
ADC_RES=0;//清除先前的转换结果
ADC_CONTR=ADC_POWER|ADC_SPEED1; //ADC电源启动并设定AD转换速度(speed1=0x00)
Delayns(2); //延时
}
/**********************/
/**********延时子函数***********/
void Delayns(uchar m)
{
uchar z;
while (m--)
{
z = 5000;
while (z--);
}
}
/***********************/
/************主函数*****************/
void main()
{
uchar k,k1,k2,k3,k4;
InitADC();
while(1)
{
k=AD_work(ch);//调用AD转换子函数
k1=k/1000;
k2=(k%1000)/100;
k3=((k%1000)%100)/10;
k4=k%10;
P2=0x10;
P0=table[k1];
delayms(1);
P2=0x20;
P0=table[k2];
delayms(1);
P2=0x40;
P0=table[k3];
delayms(1);
P2=0x80;
P0=table[k4];
delayms(1);
}
}
/************************************/
float AD_work(ch)
{ float AD_val; //????????AD_val????
unsigned char z;
for(z=0;z<100;z++)
AD_val+=ADCresult(ch); //??100?????(????)
AD_val/=100;
AD_val=(AD_val*5)/256; //AD???????????5v,???5??
return AD_val;
}
仿真图