#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变量作为参数传递给该函数。

这段代码实现的功能是:

  1. 使用SPI通信协议读取ADC数据。
  2. 读取数据后将电压值显示在LCD液晶屏上。
  3. 通过按键选择要读取的ADC通道。

代码中使用了多个函数,分别对应不同的功能。例如,SPI_WriteSPI_Read函数用于实现SPI通信,Read_AD_Data函数用于读取ADC数据,lcd_write_cmdlcd_write_data函数用于控制LCD显示,delay_ms函数用于延时。

通过这段代码,可以实现使用51单片机测量电压并显示在LCD液晶屏上的功能。在实际应用中,可以根据需要修改代码中的参数和功能。

51单片机ADC测量电压显示到LCD液晶屏

原文地址: https://www.cveoy.top/t/topic/o38j 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录