#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar code led[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//数码管显示0-9的电平码
uint volt = 0,vtime = 0; //电压值测定值
uchar addr = 0;//测量地址位
sbit LW1=P2^3; //对应第4个数码管
sbit LW2=P2^2; //对应第3个数码管
sbit LW3=P2^1; //对应第2个数码管
sbit LW4=P2^0; //对应第1个数码管
sbit LW5=P1^4;//指示当前显示的是第几个转换值
sbit CLK=P2^4; //时钟信号
sbit START=P2^5; //转换启动开关
sbit EOC=P2^6; //转换结束标志
sbit OE=P2^7;//定义ADC0809各脚
sbit RESET_KEY=P1^5;//复位按键
/**********************************************************/
//函数名:delay(uint x)
//功能:延时程序 改变测量地址
//调用函数:
//输入参数:x
//输出参数:
//说明:程序的延时时间为x乘以0.5ms 每5s改变测量地址位
/**********************************************************/
void delay(uint x)
{
uchar y,z;
for(y=x;y>0;y--)
for(z=250;z>0;z--);//该步运行时间约为0.5ms
vtime++;
if(vtime==1000)
{
vtime=0;
if(addr<2)
addr++;
}
}
/**********************************************************/
//函数名:ADC()
//功能:数模转换程序
//调用函数:
//输入参数:
//输出参数:
//说明:将转换好的测定值保存在变量volt中
/**********************************************************/
void ADC()
{
EA=1;//开中断
//确保进入正常AD转换状态?
START=0;
START=1;
START=0;//ad开始转换
while(EOC==0); //等待转换结束
OE=1; //输出数据标志为真
EA=0;//关中断
volt=P3;//获取转换值保存到volt中,(P3为转换后数据)
volt=volt*196;//转换值处理 (例子的满量程为5V,转换分辩率为8位即最大值是255,5/255=196mV,即1代表196mV)
OE=0;//输出转换结束 (要在获取转换值之后)
}
/**********************************************************/
//函数名:display()
//功能:4位数码管显示
//调用函数:delay(uint x)
//输入参数:
//输出参数:
//说明:将处理后的电压值显示在4位数码管上
/**********************************************************/
void display()
{
P0=0xff;//消隐 (相当于全部灭灯,清除上次显示效果)
LW1=0;
P0=~led[volt/10000]&0x7f;//带小数点1伏显示位
delay(2);
P0=0xff;
LW1=1;
LW2=0;
P0=~led[(volt/1000)%10];//100毫伏显示位
delay(2);
P0=0xff;
LW2=1;
LW3=0;
P0=~led[(volt/100)%10];//10毫伏显示位
delay(2);
P0=0xff;
LW3=1;
LW4=0;
P0=~led[(volt/10)%10];//1毫伏显示位
delay(2);
P0=0xff;
LW4=1;
LW5=0;
P0=~led[addr+1];//显示电压测量位
delay(2);
LW5=1;//指示当前显示的是第几个转换值
}
/********************判断按键是否按下**********************************/
uint scan_key()
{
uchar y,z;
if(RESET_KEY==1)
{
for(y=5;y>0;y--)
for(z=250;z>0;z--);//简单消抖
if(RESET_KEY==1)
{
return 1;
}
}
return 0;
}
/**********************************************************/
//主程序
/**********************************************************/
void main()
{
EA=1;//开总中断
TMOD=0x01;//设定定时计数工作方式
//为定时器初赋值
TH0=0XFF;
TL0=0XB4;
ET0=1;//开定时器0中断
TR0=1;//开启定时器0
while(1)
{
if(addr<3)
P1=addr;//装入测量地址
if( scan_key() )//复位键被按下
{
addr=0;
P1=addr;
}
LW5=1;
ADC();//调用模数转换程序
display();//调用显示程序
}
}
/**********************************************************/
//函数名:timer() interrupt 1
//功能:定时中断0响应程序
//调用函数:
//输入参数:
//输出参数:
//说明:为ADC提供时钟信号
/**********************************************************/
void timer() interrupt 1
{
//初值重置
TH0=0XFF;
TL0=0XF0;
CLK=~CLK;//取反 产生时钟信号
}
408469701524563数字电压表(ADC0809)-按键复位.rar
需积分: 0 55 浏览量
2022-12-09
12:15:53
上传
评论
收藏 76KB RAR 举报
逆风中飞翔的雄鹰
- 粉丝: 0
- 资源: 1
最新资源
- Python脚本,它读取一个CSV文件,进行一些数据处理,并使用Matplotlib绘制结果
- 【完结】古代猎户的养家日常 作者 今日不上朝.txt
- python从CSV文件中读取数据,进行一些基本的数据分析,并绘制出数据的直方图
- VMware虚拟机安装教程.md
- 基于STM32的MQ2烟雾浓度检测和uyn6288语音播报
- 一个常见的任务是创建数据库、表,并插入一些示例数据
- openEuler-20.03-LTS-SP4-aarch64-dvd.zip.004
- python使用pandas来读取CSV文件,使用numpy进行一些数据操作,然后使用matplotlib进行数据可视化
- python基础知识点,有代码
- python读取一个CSV文件,对数据进行简单的清洗和处理,然后使用matplotlib进行可视化
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈