51单片机可调数字电压表
时间: 2023-10-04 20:06:27 浏览: 41
51单片机可调数字电压表是一种基于51单片机的电子设备,可以测量电路中的电压,并将其以数字形式显示出来。它通常由51单片机、AD转换器、LCD显示屏和一些外围电路组成。
其中,AD转换器是将电路中的模拟信号转换为数字信号的重要部分,LCD显示屏则负责将数字信号以可视化的方式呈现给用户。
这种数字电压表具有调节精度高、显示直观、灵敏度高等优点,广泛应用于电子工程、自动化控制、仪器仪表等领域。
相关问题
51单片机数字电压表汇编语言
以下是51单片机数字电压表的汇编语言代码:
```
;51单片机数字电压表
;VCC为供电电压,REF为参考电压
;数码管显示电压值(VCC/255*AD值)
;P1.0-P1.7接数码管段选,P2.0-P2.3接数码管位选,P3.0接ADC输入
;使用定时器0和定时器1进行时间计数
ORG 0H ;程序从地址0开始
MOV P1, #0FFH ;P1口设置为输出,段选端口全部置高
MOV P2, #0F0H ;P2口设置为输出,位选端口全部置高
MOV P3, #00H ;P3口设置为输入,ADC输入端口
MOV TMOD, #11H ;定时器0和定时器1均为16位计数模式
MOV TH0, #0FEH ;定时器0初始值设为0FEH
MOV TL0, #0CCH ;定时器0初始值设为0CCH
MOV TH1, #0 ;定时器1初始值设为0
MOV TL1, #0 ;定时器1初始值设为0
SETB TR0 ;启动定时器0
SETB TR1 ;启动定时器1
LOOP: ;主程序循环
MOV A, P3 ;将ADC输入值读入寄存器A
DIV AB, #0FFH ;将寄存器A除以255,商存在B中,余数存在A中
MOV P2, #0F0H ;位选端口全部置高
MOV P1, #0FFH ;段选端口全部置高
CALL DISPLAY ;调用显示子程序
SJMP LOOP ;跳回主程序循环
DISPLAY: ;显示子程序
MOV C, #00H ;清零进位标志
MOV A, B ;将商B的值赋给寄存器A
CJNE A, #0, A1 ;如果A不为0,跳转A1
MOV A, #0 ;否则将寄存器A置为0
JMP A2 ;跳转A2
A1: ;A1标签
CLR C ;清零进位标志
MOV R0, #0AH ;将R0寄存器置为10
DIV AB, R0 ;将寄存器A除以R0,商存在B中,余数存在A中
MOV R1, A ;将余数A的值赋给R1寄存器
ADD A, #30H ;将寄存器A加上30H
MOV P1, A ;将寄存器A的值赋给段选端口
MOV A, B ;将商B的值赋给寄存器A
DIV AB, R0 ;将寄存器A除以R0,商存在B中,余数存在A中
ADD A, #30H ;将寄存器A加上30H
MOV P1+1, A ;将寄存器A的值赋给段选端口
MOV A, R1 ;将R1寄存器的值赋给寄存器A
ADD A, #30H ;将寄存器A加上30H
MOV P1+2, A ;将寄存器A的值赋给段选端口
A2: ;A2标签
MOV A, C ;将进位标志的值赋给寄存器A
JZ A3 ;如果进位标志为0,跳转A3
ADD A, #30H ;将寄存器A加上30H
MOV P1+3, A ;将寄存器A的值赋给段选端口
A3: ;A3标签
ACALL DELAY ;调用延时子程序
RET ;返回
DELAY: ;延时子程序
MOV R2, #0FFH ;将R2寄存器置为0FFH
MOV R3, #0FFH ;将R3寄存器置为0FFH
DJNZ R2, $ ;R2寄存器自减,如果不为0,跳转$
DJNZ R3, DELAY ;R3寄存器自减,跳转DELAY
RET ;返回
```
该程序使用定时器0和定时器1进行时间计数,并通过ADC输入端口读取电压值,然后将其转换成数码管可以显示的数字,并在数码管上显示。其中,P1.0-P1.7为数码管的段选端口,P2.0-P2.3为数码管的位选端口,P3.0为ADC输入端口。
在DISPLAY子程序中,使用了除法和取余操作,将电压值转换成可以在数码管上显示的数字。DELAY子程序用于延时,以便数码管上的数字能够稳定显示。
51单片机制作简易数字电压表
制作简易数字电压表需要以下材料:
- 51单片机
- 电压传感器模块(例如LM35)
- 七段数码管显示模块
- 连接线
- 面包板
步骤如下:
1. 将LM35模块的VCC引脚连接到单片机的5V引脚,GND引脚连接到单片机的GND引脚,OUT引脚连接到单片机的P1.0引脚。
2. 将七段数码管模块的引脚连接到单片机的IO引脚(可以参考七段数码管模块的说明文档)。
3. 在Keil或其他集成开发环境中编写程序,通过读取P1.0引脚的模拟电压值,计算出电压并将其显示在七段数码管上。
示例代码如下:
```c
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DIO = P2^0; //七段数码管数据引脚
sbit RCLK = P2^1; //七段数码管锁存引脚
sbit SCLK = P2^2; //七段数码管时钟引脚
void delay(uint i) //延时函数
{
while(i--);
}
void writeByte(uchar dat) //向七段数码管写入一个字节数据
{
uchar i;
for(i=0; i<8; i++)
{
SCLK = 0;
DIO = dat & 0x80;
dat <<= 1;
SCLK = 1;
}
}
void writeData(uchar dat) //向七段数码管写入显示数据
{
RCLK = 0;
writeByte(dat);
RCLK = 1;
}
void main()
{
uchar val;
float voltage;
while(1)
{
val = P1; //读取P1.0引脚的模拟电压值
voltage = val * 5.0 / 255.0; //计算电压值
writeData((uchar)(voltage * 10)); //将电压值乘以10并转换为整数,然后显示在七段数码管上
delay(1000); //延时1秒钟
}
}
```
以上代码仅供参考,具体实现需要根据实际情况进行修改。