单片机数字电压表mplab设计代码
时间: 2023-11-08 08:06:03 浏览: 103
用单片机设计一个数字电压表
以下是使用 MPLAB X IDE 和 PIC16F877A 单片机设计的数字电压表代码。
```c
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <stdbool.h>
#include <math.h>
// 配置寄存器
#pragma config FOSC = HS // 声明时钟源为高速晶振
#pragma config WDTE = OFF // 关闭看门狗定时器
#pragma config PWRTE = OFF // 关闭上电复位延时
#pragma config BOREN = OFF // 关闭低电压复位
#pragma config LVP = OFF // 关闭低电压编程模式
// 定义宏
#define _XTAL_FREQ 20000000 // 定义主频为20MHz
#define ADC_CHANNEL 0 // 定义ADC通道为0
// 函数声明
void init_adc(void); // 初始化ADC
int read_adc(void); // 读取ADC值
void init_uart(void); // 初始化串口
void send_uart(char data); // 发送数据
void send_string_uart(char *str); // 发送字符串
void send_int_uart(int num); // 发送整数
// 主函数
void main(void) {
// 初始化
TRISB = 0x00; // 设置B口为输出
PORTB = 0x00; // B口全部清零
init_adc(); // 初始化ADC
init_uart(); // 初始化串口
while (1) {
int adc_value = read_adc(); // 读取ADC值
float voltage = (adc_value * 5.0 / 1023.0); // 计算电压值
int voltage_int = (int) voltage; // 取整数部分
float voltage_decimal = (voltage - voltage_int) * 1000; // 取小数部分并转化为mV
int voltage_decimal_int = (int) voltage_decimal; // 取整数部分
// 发送电压值
send_string_uart("Voltage: ");
send_int_uart(voltage_int);
send_uart('.');
if (voltage_decimal_int < 10) {
send_uart('0'); // 如果小数部分小于10,前面补0
}
send_int_uart(voltage_decimal_int);
send_string_uart("V\r\n");
__delay_ms(500); // 延时500ms
}
}
// 初始化ADC
void init_adc(void) {
ADCON0 = 0b00000001; // 设置ADC通道和工作模式
ADCON1 = 0b10000000; // 设置参考电压和AD转换时钟
}
// 读取ADC值
int read_adc(void) {
ADCON0bits.GO = 1; // 开始ADC转换
while (ADCON0bits.GO); // 等待转换完成
return ((ADRESH << 8) + ADRESL); // 返回ADC值
}
// 初始化串口
void init_uart(void) {
TRISCbits.TRISC6 = 0; // 设置TX为输出
TRISCbits.TRISC7 = 1; // 设置RX为输入
TXSTAbits.SYNC = 0; // 设置异步模式
TXSTAbits.BRGH = 1; // 设置高波特率
BAUDCTLbits.BRG16 = 1; // 启用16位波特率发生器
SPBRG = 129; // 设置波特率为9600,主频20MHz
TXSTAbits.TXEN = 1; // 启用发送器
RCSTAbits.CREN = 1; // 启用接收器
}
// 发送数据
void send_uart(char data) {
while (!TXSTAbits.TRMT); // 等待发送缓冲区为空
TXREG = data; // 将数据发送到发送缓冲区
}
// 发送字符串
void send_string_uart(char *str) {
while (*str) {
send_uart(*str); // 发送一个字符
str++; // 指针指向下一个字符
}
}
// 发送整数
void send_int_uart(int num) {
char buffer[16]; // 定义一个缓冲区
sprintf(buffer, "%d", num); // 将整数转化为字符串
send_string_uart(buffer); // 发送字符串
}
```
该代码通过 ADC 读取电压值,并将其转化为数字发送到串口,实现了一个简单的数字电压表。注意,在使用该代码时需要将单片机连接至电路板并连接相关电路。
阅读全文