标题:
51单片机ADC0809的电压表设计(proteus仿真及keil代码)
[打印本页]
作者:
leos
时间:
2019-6-26 11:21
标题:
51单片机ADC0809的电压表设计(proteus仿真及keil代码)
电压表仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png
(17.89 KB, 下载次数: 160)
下载附件
2019-6-27 01:46 上传
单片机源程序如下:
//程序头函数
#include <reg51.h>
//宏定义
#define uint unsigned int
#define uchar unsigned char
#define Data_ADC0809 P1
sbit ST=P3^2;
sbit EOC=P3^3;
sbit OE=P3^1;
sbit N=P3^0;
sbit W=P3^4;
sbit DIAN = P0^7; //小数点
/*******************************定义全局变量********************************/
unsigned char dis[3]; //显示数值
unsigned char data adtab[8]=0;
unsigned int sum=0;
unsigned int dat=0;
unsigned char i=0;
unsigned char n=0;
/*******************************通道选择表*******************************/
unsigned char code ad[]={0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff};
/*******************************共阳LED段码表*******************************/
unsigned char code tab[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
// 0 1 2 3 4 5 6 7 8 9
/****************************************************************************
函数功能:AD转换子程序
****************************************************************************/
//ADC0809读取信息
uchar ADC0809()
{
uchar temp=0x00;
//初始化高阻太
OE=0;
//转化初始化
ST=0;
//开始转换
ST=1;
ST=0;
//外部中断等待AD转换结束
while(EOC==0)
//读取转换的AD值
OE=1;
Data_ADC0809=0xff;
temp=Data_ADC0809;
OE=0;
return temp;
}
/****************************************************************************
函数功能:延时子程序
入口参数:
出口参数:
****************************************************************************/
void delay(unsigned int x)
{
unsigned int i,j;
for(i=0;i<x;i++)
for(j=0;j<121;j++);
}
//=====================================================================================
//=====================================================================================
//=====================================================================================
/****************************************************************************
函数功能:将0-255级换算成0.00-5.00的电压数值
入口参数:i
出口参数:
****************************************************************************/
void convdata(unsigned char dat1)
{
unsigned int Vo;
Vo=dat1*1.96;
dis[0] = Vo/100; // 个位
dis[1] = Vo%100/10; // 小数点后一位
dis[2] = Vo%100%10; // 小数点后两位
}
/****************************************************************************
函数功能:数码管显示子程序
入口参数:
出口参数:
****************************************************************************/
void display(void)
{
convdata(adtab[n]);
P0=tab[dis[0]];
P2=0xfe;
DIAN=0;
delay(1);
P2=0xff;
P0=tab[dis[1]];
P2=0xfd;
DIAN=1;
delay(1);
P2=0xff;
P0=tab[dis[2]];
P2=0xfb;
DIAN=1;
delay(1);
P2=0xff;
P0=tab[n];
P2=0xf7;
DIAN=1;
delay(1);
P2=0xff;
}
/****************************************************************************
函数功能:按键选择对应通道输出
入口参数:
出口参数:
****************************************************************************/
uchar TDN()
{
if(N == 0)
{
delay(100);
if(N == 0)
{
n++;
if(n>7) n=0;
}
delay(100);
}
return n;
}
/****************************************************************************
函数功能:主程序
入口参数:
出口参数:
****************************************************************************/
void main(void)
{
while(i<8)
{
if(W == 0)
{
delay(100);
if(W == 0)
{
Data_ADC0809=ad[i];//选定通道
adtab[i]=ADC0809();//将转换结果存入数组
i++;
}
delay(100);
}
if(N == 0)
{
delay(100);
if(N == 0)
{
i=9;
}
delay(100);
}
}
while(1) //主循环
{
if(i==9)
{
Data_ADC0809=ad[0];//选定通道
adtab[0]=ADC0809();//将转换结果存入数组
n=TDN();
display();
}
if(i==8)
{
n=TDN();
display();
}
}
}
复制代码
所有资料51hei提供下载:
0809电压表.rar
(49.42 KB, 下载次数: 139)
2019-6-26 11:18 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
qq1354950094
时间:
2021-7-27 17:10
能调电压范围是多少啊
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1