51单片机ADC测量电压显示到LCD液晶屏
#include <reg51.h>
#include <stdio.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define LCD_DB P0
sbit LCD_RS = P2^6;
sbit LCD_RW = P2^5;
sbit LCD_E = P2^7;
sbit DIN=P3^4;
sbit CS=P3^5;
sbit CLK=P3^6;
sbit DOUT=P3^7;
sbit KEY1 = P3^0;
sbit KEY2 = P3^1;
void SPI_Write(uchar dat){
uchar i;
CLK = 0;
for(i=0;i<8;i++)
{
DIN = dat >> 7;
dat <<= 1;
CLK = 0;
_nop_();
CLK = 1;
}
}
uint SPI_Read(){
uint i, dat=0;
CLK = 0;
for(i=0; i<8; i++)
{
dat <<= 1;
CLK = 1;
_nop_();
CLK = 0;
dat |= DOUT;
}
return dat;
}
uint Read_AD_Data(uchar cmd){
uchar i;
uint AD_Value;
CLK = 0;
CS = 0;
SPI_Write(cmd);
for(i=6;i>0;i--);
CLK=0;
_nop_();
CLK = 1;
_nop_();
CLK = 0;
_nop_();
_nop_();
AD_Value=SPI_Read();
CS = 1;
return AD_Value;
}
void delay_ms(unsigned int ms){
unsigned int i, j;
for (i = 0; i < ms; i++)
for (j = 0; j < 112; j++);
}
void lcd_write_cmd(unsigned char cmd){
LCD_RS = 0;
LCD_RW = 0;
LCD_DB = cmd;
LCD_E = 1;
_nop_();
LCD_E = 0;
}
void lcd_write_data(unsigned char dat){
LCD_RS = 1;
LCD_RW = 0;
LCD_DB = dat;
LCD_E = 1;
_nop_();
LCD_E = 0;
}
void lcd_init(){
lcd_write_cmd(0x38);
lcd_write_cmd(0x0c);
lcd_write_cmd(0x06);
lcd_write_cmd(0x01);
}
void lcd_clear(){
lcd_write_cmd(0x01);
}
void lcd_display_voltage(float voltage){
unsigned int date;
unsigned char str[4];
date=voltage*1000;
str[0] = date / 1000 + '0';
str[1] = (date % 1000) / 100 + '0';
str[2] = (date % 100) / 10 + '0';
str[3] = date % 10 + '0';
lcd_write_cmd(0xc0);
lcd_write_data(str[0]);
lcd_write_data(str[1]);
lcd_write_data('.');
lcd_write_data(str[2]);
lcd_write_data(str[3]);
lcd_write_data('V');
}
void main(){
float voltage = 0.0;
unsigned char channel = 0;
unsigned char measure = 0;
lcd_init();
lcd_clear();
while (1)
{
if (!KEY1)
{
delay_ms(20);
if (!KEY1)
{
channel = 0;
measure = 1;
lcd_clear();
lcd_write_cmd(0x80);
lcd_write_data('0');
delay_ms(500);
}
}
if (!KEY2)
{
delay_ms(20);
if (!KEY2)
{
channel = 1;
measure = 1;
lcd_clear();
lcd_write_cmd(0x80);
lcd_write_data('1');
delay_ms(500);
}
}
if (measure)
{
voltage=Read_AD_Data(channel);
lcd_display_voltage(voltage);
measure = 0;
}
}
}
在代码中,函数Read_AD_Data需要一个参数cmd,表示要读取的ADC通道。在调用该函数时,需要传递一个参数。例如,代码中使用voltage=Read_AD_Data(channel);来调用Read_AD_Data函数,并将channel变量作为参数传递给该函数。
这段代码实现的功能是:
- 使用SPI通信协议读取ADC数据。
- 读取数据后将电压值显示在LCD液晶屏上。
- 通过按键选择要读取的ADC通道。
代码中使用了多个函数,分别对应不同的功能。例如,SPI_Write和SPI_Read函数用于实现SPI通信,Read_AD_Data函数用于读取ADC数据,lcd_write_cmd和lcd_write_data函数用于控制LCD显示,delay_ms函数用于延时。
通过这段代码,可以实现使用51单片机测量电压并显示在LCD液晶屏上的功能。在实际应用中,可以根据需要修改代码中的参数和功能。
原文地址: https://www.cveoy.top/t/topic/o38j 著作权归作者所有。请勿转载和采集!