单片机——AD_DA

该程序的功能是通过AD读出数据,并且通过LCD显示出来
#include <reg52.h>
#include "./delay/delay.h"
#define ERROR 1
#define SUCCESS 0
sbit SCL = P2^0;
sbit SDA = P2^1;
bit ack = 0;
sbit RS = P2^4;
sbit RW = P2^5;
sbit E = P2^6;
#define LCDPORT  P0
#define LCD_WRITE_DATA 1
#define LCD_WRITE_COM 0
void lcd_write(unsigned char byte, unsigned char flag)
{
   if(flag)
  {
     RS = LCD_WRITE_DATA;
  }
  else
  {
     RS = LCD_WRITE_COM;
  }
  RW = 0;
  E = 1;
  LCDPORT = byte;
  delay_us(7);
  E = 0;
}
void lcd_init()
{
   delay_ms(5);
   lcd_write(0x38,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x38,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x38,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x08,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x01,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x06,LCD_WRITE_COM);
   delay_ms(5);
   lcd_write(0x0C,LCD_WRITE_COM);
}
void lcd_display(unsigned char x,unsigned char y,unsigned byte)
{
   if(y == 0)
  {
       lcd_write(0x80 + (unsigned int)x*0x01,LCD_WRITE_COM);
       lcd_write(byte,LCD_WRITE_DATA);
  }
  else
  {
     lcd_write(0x80 + 0x40 + (unsigned int)x*0x01,LCD_WRITE_COM);
       lcd_write(byte,LCD_WRITE_DATA);
  }
}
void lcd_write_str(unsigned char x,unsigned char y,unsigned char *s)
{
  
   while(*s != '\0')
  {
     lcd_write(0x80 + x + y,LCD_WRITE_COM);
     lcd_write(*s ,LCD_WRITE_DATA);
     s++;
  }
}
void lcd_str_display(unsigned char x,unsigned char y,unsigned char *s)
{
   while(*s != '\0')
  {
     lcd_display(x++,y,*s);
     s++;
  }
}
void iic_start()
{
   SDA = 1;
   SCL = 1;
    delay_us(1);
   SDA = 0;
   delay_us(1);
   SCL = 0;
}
void iic_stop()
{
   SDA = 0;
   SCL = 1;
   delay_us(1);
   SDA = 1;
   delay_us(1);
   SCL = 0;
}
bit iic_send_byte(unsigned char byte)
{
   unsigned char i;
   for(i = 0; i < 8; i++)
   {
     SDA = byte & 0x80;
     SCL = 1;
     delay_us(1);
     SCL = 0;
     byte <<= 1;
  }
  SCL = 1;
  SDA = 1;
  delay_us(1);
  if(0 == SDA)
  {
     ack = 1;
  }
  else
  {
     ack = 0;
  }
  SCL = 0;
  
  return ack;
}
unsigned char iic_recv_byte()
{
   unsigned char temp = 0;
   unsigned char i;
   unsigned char a;
  
    SDA = 1;
 
   for(i = 0; i < 8; i++)
   {
     SCL = 0;
     delay_us(1);
     SCL = 1;
     if(SDA)
    {
       a = 0x01;
    }
    else
    {
       a = 0;
    }
     temp |= (a << (7 - i));
    delay_us(1);
  }
  
  SCL = 0;
  return temp;
}
void iic_ack()
{
   SDA = 0;
   SCL = 1;
   delay_us(1);
   SCL = 0;
}
void iic_noack()
{
   SDA = 1;
   SCL = 1;
   delay_us(1);
   SCL = 0;
}
unsigned char AD_Read()
{
   unsigned char temp;
 
   iic_start();
   iic_send_byte(0x90);
   if(0 == ack)
  {
     return ERROR;
    }
  iic_send_byte(0x40);
  if(0 == ack)
  {
     return ERROR;
    }
  iic_start();
  iic_send_byte(0x90 + 1);
  if(0 == ack)
  {
     return ERROR;
    }
  temp = iic_recv_byte();
  iic_noack();
  iic_stop();
  
    return temp;  
}
void lcd_char_sel(unsigned char num)
{
   lcd_write(0x40, LCD_WRITE_COM);
   lcd_write(0x0,LCD_WRITE_DATA);
   lcd_write(0x0,LCD_WRITE_DATA);
   lcd_write(0x0a,LCD_WRITE_DATA);
   lcd_write(0x0,LCD_WRITE_DATA);
   lcd_write(0x0,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x0e,LCD_WRITE_DATA);
   lcd_write(0x0,LCD_WRITE_DATA);
 
   lcd_write(0x80 + 0x40, LCD_WRITE_COM);
   lcd_write(0x0,LCD_WRITE_DATA);
 
   lcd_write(0x40 + 8, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
  
  lcd_write(0x40 + 16, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
  
  lcd_write(0x40 + 24, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
  
  lcd_write(0x40 + 32, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
  
  lcd_write(0x40 + 40, LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x11,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
  
  lcd_write(0x40 + 48 , LCD_WRITE_COM);
   lcd_write(0x04,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
   lcd_write(0x1f,LCD_WRITE_DATA);
  
  lcd_write(0x80 + 0x40 + 1, LCD_WRITE_COM);
     
    
    if(num == 0)
    {
       lcd_write(0x1,LCD_WRITE_DATA);
    }
    if(num == 1)
    {
       lcd_write(0x2,LCD_WRITE_DATA);
    }
    if(num == 2)
    {
       lcd_write(0x3,LCD_WRITE_DATA);
    }
    if(num == 3)
    {
       lcd_write(0x4,LCD_WRITE_DATA);
    }
    if(num == 4)
    {
       lcd_write(0x5,LCD_WRITE_DATA);
    }
    if(num == 5)
    {
       lcd_write(0x6,LCD_WRITE_DATA);
    }
}
void main()
{
   unsigned int temp;
   unsigned char num;
 
   lcd_init();
   while(1) 
  {
     temp = AD_Read();
     num = ((temp * 100) / 51) / 100;
   
     delay_ms(20);
     lcd_display(0,0,(temp / 100) + 0x30);
     lcd_display(1,0,((temp % 100)/10) + 0x30);
     lcd_display(2,0,(temp % 10) + 0x30);
   
     lcd_display(4,0,(((temp * 100) / 51) / 100) + 0x30);
     lcd_display(5,0,'.');
     lcd_display(6,0,((((temp * 100) / 51) % 100)/10) + 0x30);
     lcd_display(7,0,(((temp * 100) / 51) % 10) + 0x30);
     lcd_display(8,0,'V');
    
     if(temp < 255)
    {
       lcd_display(6,1,' ');
       lcd_display(3,1,((temp*100/255)%100)/10 + 0x30);
       lcd_display(4,1,(temp*100/255)%10 + 0x30);
       lcd_display(5,1,'%');
    }
    
    if(temp == 255)
    {
       lcd_display(3,1,(temp*100/255)/100 + 0x30);
       lcd_display(4,1,((temp*100/255)%100)/10 + 0x30);
       lcd_display(5,1,(temp*100/255)%10 + 0x30);
       lcd_display(6,1,'%');
    }
    
     lcd_char_sel(num);
        
    
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
基于51单片机使用PCF8591进行AD-DA转换,并用数码管显示是一种常见的嵌入式系统应用。 首先,我们需要了解PCF8591。PCF8591是一种集成了多功能I/O接口的IC芯片,可以同时实现AD转换和DA转换功能。它具有4个模拟输入通道和一个模拟输出通道,并且可以通过IIC总线与单片机进行通信。 接下来,我们需要连接PCF8591和51单片机。通常,我们将PCF8591的SDA和SCL引脚连接到51单片机的对应引脚,以建立IIC通信。同时,将PCF8591的AIN0引脚连接到我们需要进行模拟输入的信号源。如果需要模拟输出,还需要连接PCF8591的AOUT引脚到外部电路。 在软件层面,我们需要编写51单片机的程序来控制PCF8591进行AD-DA转换并将结果显示在数码管上。首先,我们需要初始化PCF8591,并设置相应的模式,如输入模式或输出模式。然后,我们可以通过IIC总线发送指令来读取或写入数据。对于AD转换,我们可以通过发送指定的通道号来读取对应的模拟输入信号,并将结果转换为数字量。对于DA转换,我们可以通过发送指定的数字量来输出对应的模拟输出信号。 最后,我们可以通过51单片机的IO口驱动数码管,将转换结果显示出来。通过将数值转换为对应的数码管段选码和位选码,我们可以依次点亮数码管的各个显示段。 综上所述,基于51单片机使用PCF8591进行AD-DA转换,并用数码管显示,需要进行硬件连接、软件编程和数码管驱动等步骤。这种应用可以广泛应用于模拟信号采集和控制系统中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值