说明 按键按下去 进入单路电压采集模式(及电压表模式) 按键弹起来 就是8路电压轮流采集模式
基于51单片机的ADC0809 4路数字电压表下面是仿真图
以下代码已经测试过
单片机代码:
#include <reg52.h> //头文件
#define uchar unsigned char //宏定义无符号字符型
#define uint unsigned int //宏定义无符号整型
code uchar seg7code[10]={ 0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //显示段码 数码管字跟
sbit ST=P3^0; //A/D启动转换信号
sbit OE=P3^1; //数据输出允许信号
sbit EOC=P3^2; //A/D转换结束信号
sbit CLK=P3^3; //时钟脉冲
sbit KEY=P2^7;
uint z,x,AD0809, date; //定义数据类型
/******************************************************************
延时函数
******************************************************************/
void delay(uchar t)
{
uchar i,j;
for(i=0;i<t;i++)
{
for(j=13;j>0;j--);
{ ;
}
}
}
/**********************************************************************
数码管动态扫描
*********************************************************************/
void xianshi() //显示函数
{
uint z,x;
z=date%100/10; //求千位
x=date%10; //求百位
P3&=0x0f;
P0=seg7code[z]&0x7f;
P3|=0X10;
delay(80);
P3&=0X0f;
P0=seg7code[x];
P3|=0X20;
//delay(80);
}
unsigned char GetVoltage(unsigned char ch)
{
float temp;
unsigned char value=0;
P2=0xf0;
P2|=ch;
delay(1);
ST=0; //使采集信号为低
delay(1);
ST=1; //开始数据转换
delay(1);
ST=0; //停止数据转换
delay(1);
while(!EOC); //等待数据转换完毕
OE=1; //允许数据输出信号
delay(1);
AD0809=P1; //读取数据
OE=0; //关闭数据输出允许信号
temp=AD0809;
temp=temp*19.531f; //计算出电压值(19.531=5000mv除以AD的位数值256=5000/256)
value=temp/100;//为了方便显示 进行缩小 转换成整形 比如实际电压1.5V 1500mv/100=15 15在的十位显示的时候作为电压的整数位 个位作为小数位
return value;
}
void Timer0Init(void) //20毫秒@12.000MHz
{
TMOD &= 0xF0; //设置定时器模式
TL0 = 0xE0; //设置定时初值
TH0 = 0xB1; //设置定时初值
TF0 = 0; //清除TF0标志
TR0 = 1; //定时器0开始计时
ET0=1;
EA=1;
}
/*************************************************************************
主函数
**************************************************************************/
unsigned char count=0;
void main()
{
KEY=1;
Timer0Init();
while(1) //无限循环
{
if(KEY==0)
{
date=GetVoltage(0); //数码管显示的数据值,其中20为采集数据的毫安值
}
else
{
date=GetVoltage(count);//采集第count路AD值
}
xianshi(); //数码管显示函数
}
}
unsigned char delay1=0;
void timer0( ) interrupt 1 //定时器0 10ms定时
{
TL0 = 0xE0; //设置定时初值
TH0 = 0xB1; //设置定时初值
delay1++;
if(delay1>20)
{//AD切换显示的定时时间到
delay1=0;//中断计数清零
count++;//路数变量自加
if(count>7)//路数变量大于7
count=0;//清零
}
}
Keil代码与Proteus仿真下载:
仿真代码.7z
(899.14 KB, 下载次数: 72)
|