微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 采集模拟信号(AD0804),然后转换成数字量,并在1602LCD 显示.

采集模拟信号(AD0804),然后转换成数字量,并在1602LCD 显示.

时间:10-02 整理:3721RD 点击:
/*采集模拟信号(AD0804),然后转换成数字量,并在1602LCD 显示,第一行"Voltage Is:"
  第二行显示实际电压“CH1--1.2344V”*/
/***********************************************************************/
#include<reg52.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char          //宏定义
#define uint unsigned int         //宏定义
uchar code table[]="Voltage Is:";
uchar code dis[]="CH1--1.2344V";
char str[6]; //定义一个6位的一维数组
float voltage;   //定义ad_vo为浮点形数
uchar num;
sbit lcden=P3^4; // LCD 使能信号E
sbit lcdrs=P3^5; // LCD 数据/命令先择端 RS
sbit dula=P2^6;//数码管段选信号
sbit wela=P2^7;        //数码管位选信号,Q7为ADC0804_CS片选信号
sbit adwr=P3^6;        //AD0804 写信号位
sbit adrd=P3^7;        //AD0804 读信号位
uchar get_ad(); //AD 读取子函数
void init();//初始化子函数
void write_com(uchar com); //LCD 写命令子函数
void write_dat(uchar dat); //LCD 写数据子函数
void delayms(uint xms);         //延时子函数
void main()
{
        init();
        for(num=0;num<11;num++)
        {
                write_dat(table[num]); //写入第一行数据
                delayms(10);
        }
        write_com(0x80+0x40);//数据指针初始化,换一行显示下面的数据(0x40)
        for(num=0;num<5;num++)
        {
                write_dat(dis[num]);
                delayms(10);
        }
        write_com(0x80+0x40+5);//数据指针初始化
        voltage=(float)get_ad()*5.0/256.0;
        sprintf(str,"%4f",voltage);//将浮点数转化为字符,并显示小数点后4位,并把这个字符串赋给str[6];
        for(num=0;num<6;num++)
        {
                write_dat(str[num]);
                delayms(10);
        }
        delayms(10);
        write_com(0x80+0x40+11);//数据指针初始化
        write_dat(dis[11]);
        delayms(10);
        while(1);
}
void init();
void write_com(uchar com); //LCD 写命令子函数
void write_dat(uchar dat); //LCD 写数据子函数
void delayms(uint xms);         //延时子函数
uchar get_ad(); //AD 读取子函数

void init()
{
        dula=0; //关数码管的段(因LCD与数码管都用P0口)
        wela=0;        //关数码管的位(因LCD与数码管都用P0口)
        lcden=0;// LCD 使能信号E 设为低电平
        write_com(0x38);// 显示模式设置,设置16*2显示,5*7点阵,8位数据接口
        write_com(0x0c);// 显示开/关设置即00001100,开显示且不显示光标
        write_com(0x06);// 光标设置00000110,当读/写一个字符后地地指针加1,且光标加1,且整屏显示不移动
        write_com(0x01);// 清屏指令,数据指针清零,所有显示清零。
        write_com(0x80);// 数据指针初始化,指向0x00
}
void write_com(uchar com)//LCD 写命令子函数
{
        lcdrs=0; // LCD 数据/命令先择端 RS设为低电平,即命令输入
        P0=com;          //把此命令赋给P0。即LCD的Data I/O 口。
        delayms(5);
        lcden=1; // LCD 使能信号E 设为高电平
        delayms(5);
        lcden=0; // LCD 使能信号E 设为低电平,一个高脉冲,LCD 读走命令。
}
void write_dat(uchar dat) //LCD 写数据子函数
{
        lcdrs=1; // LCD 数据/命令先择端 RS设为低电平,即数据输入
        P0=dat; //把此数据赋给P0。即LCD的Data I/O 口。
        delayms(5);
        lcden=1;  // LCD 使能信号E 设为高电平
        delayms(5);
        lcden=0; // LCD 使能信号E 设为低电平,一个高脉冲,LCD 读走数据。
}
void delayms(uint xms)        //延时子函数
{
        uint x,y;
        for(x=xms;x>0;x--)
                for(y=110;y>0;y--);
}
uchar get_ad() //AD 读取子函数
{
        uchar ad_val;
        wela=1;
        P0=0x7f; //将AD0804片选信号置0  (0111 1111=0x7f)
        wela=0;
        adwr=1;//关AD转换
        _nop_();//等待一个机器周期
        adwr=1;//开AD转换,将读到的值送入AD0804的锁存器中
        _nop_();//等待一个机器周期
        adwr=0;//关AD转换
        P1=0xff;         //P1口置高位
        adrd=1;//关AD0804读信号脚
        _nop_();
        adrd=0;//开AD0804读信号脚,单片机读取AD0804的锁存器中的值到P1口
        _nop_();
        ad_val=P1;//将AD0804的锁存器中读到的值赋给voltage
        adrd=1;//关AD0804读信号脚
        return ad_val;//将变量voltage的值返回给要调用的AD读取子函数的函数
}

期待中,希望会很有帮助

我以在开发板上测试过。OK。

得到的电压是静态的,如何能显示实时动态电压?

我写的没用  和你的挺像的 连基本的table里的都不显示  可以帮我看看吗

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit adcs=P2^0;           //片选
sbit adwr=P2^1;
sbit adrd=P2^2;
sbit lcden=P3^4;
sbit lcdrs=P3^5;   //数据还是命令
sbit lcdrw=P3^6;   //读高写低
uchar num;       
/*
sbit vR1=P3^0;
sbit VR2=P3^1;
sbit VR3=P3^2;
sbit VR4=P3^3;
*/
uchar dianyar,dianyax;
uchar code table[]="R is:";
void delay(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void write_com(uchar com)
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}
void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}
void init()
{
        lcden=0;
        lcdrw=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void read_ad0804()
{
        adcs=0;
        while(1)
        {
                adwr=1;
                _nop_();
                adwr=0;
                _nop_();
                adwr=1;
                P1=0xff;
                adrd=1;
                _nop_();
                adrd=0;
                _nop_();
                dianyar=P1;
                adrd=1;
                adcs=1;
        }
}
void display()
{
//        uchar qian,bai,shi,ge;                  
        write_com(0x80);
        for(num=0;num<5;num++)
        {
                write_data(table[num]);
                delay(5);
        }
       
/*        dianyax=dianyar*10000/(5-dianyar);
        write_com(0x86);
        qian=dianyax/1000;
        write_data(qian);
        bai=dianyax/100%10;
        write_data(bai);
        shi=dianyax%100/10;
        write_data(shi);
        ge=dianyax%10;
        write_data(ge);
*/
}
void main()
{
        init();
        read_ad0804();
        display();
        while(1);
}

#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit adcs=P2^0;           //片选
sbit adwr=P2^1;
sbit adrd=P2^2;
sbit lcden=P3^4;
sbit lcdrs=P3^5;   //数据还是命令
sbit lcdrw=P3^6;   //读高写低
uchar num;       
/*
sbit vR1=P3^0;
sbit VR2=P3^1;
sbit VR3=P3^2;
sbit VR4=P3^3;
*/
uchar dianyar,dianyax;
uchar code table[]="R is:";
void delay(uint xms)
{
        uint i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void write_com(uchar com)
{
        lcdrs=0;
        P0=com;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}
void write_data(uchar date)
{
        lcdrs=1;
        P0=date;
        delay(5);
        lcden=1;
        delay(5);
        lcden=0;       
}
void init()
{
        lcden=0;
        lcdrw=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);
}
void read_ad0804()
{
        adcs=0;
        while(1)
        {
                adwr=1;
                _nop_();
                adwr=0;
                _nop_();
                adwr=1;
                P1=0xff;
                adrd=1;
                _nop_();
                adrd=0;
                _nop_();
                dianyar=P1;
                adrd=1;
                adcs=1;
        }
}
void display()
{
//        uchar qian,bai,shi,ge;                  
        write_com(0x80);
        for(num=0;num<5;num++)
        {
                write_data(table[num]);
                delay(5);
        }
       
/*        dianyax=dianyar*10000/(5-dianyar);
        write_com(0x86);
        qian=dianyax/1000;
        write_data(qian);
        bai=dianyax/100%10;
        write_data(bai);
        shi=dianyax%100/10;
        write_data(shi);
        ge=dianyax%10;
        write_data(ge);
*/
}
void main()
{
        init();
        read_ad0804();
        display();
        while(1);
}

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. sbit adcs=P2^0;           //片选
  6. sbit adwr=P2^1;
  7. sbit adrd=P2^2;
  8. sbit lcden=P3^4;
  9. sbit lcdrs=P3^5;   //数据还是命令
  10. sbit lcdrw=P3^6;   //读高写低
  11. uchar num;       
  12. /*
  13. sbit vR1=P3^0;
  14. sbit VR2=P3^1;
  15. sbit VR3=P3^2;
  16. sbit VR4=P3^3;
  17. */
  18. uchar dianyar,dianyax;
  19. uchar code table[]="R is:";

  20. void delay(uint xms)
  21. {
  22.         uint i,j;
  23.         for(i=xms;i>0;i--)
  24.                 for(j=110;j>0;j--);
  25. }

  26. void write_com(uchar com)
  27. {
  28.         lcdrs=0;
  29.         P0=com;
  30.         delay(5);
  31.         lcden=1;
  32.         delay(5);
  33.         lcden=0;       
  34. }

  35. void write_data(uchar date)
  36. {
  37.         lcdrs=1;
  38.         P0=date;
  39.         delay(5);
  40.         lcden=1;
  41.         delay(5);
  42.         lcden=0;       
  43. }

  44. void init()
  45. {
  46.         lcden=0;
  47.         lcdrw=0;
  48.         write_com(0x38);
  49.         write_com(0x0c);
  50.         write_com(0x06);
  51.         write_com(0x01);
  52. }

  53. void read_ad0804()
  54. {
  55.         adcs=0;
  56.         while(1)
  57.         {
  58.                 adwr=1;
  59.                 _nop_();
  60.                 adwr=0;
  61.                 _nop_();
  62.                 adwr=1;
  63.                 P1=0xff;
  64.                 adrd=1;
  65.                 _nop_();
  66.                 adrd=0;
  67.                 _nop_();
  68.                 dianyar=P1;
  69.                 adrd=1;
  70.                 adcs=1;

  71.         }
  72. }
  73. void display()
  74. {
  75. //        uchar qian,bai,shi,ge;                  
  76.         write_com(0x80);
  77.         for(num=0;num<5;num++)
  78.         {
  79.                 write_data(table[num]);
  80.                 delay(5);
  81.         }
  82.        
  83. /*        dianyax=dianyar*10000/(5-dianyar);

  84.         write_com(0x86);
  85.         qian=dianyax/1000;
  86.         write_data(qian);
  87.         bai=dianyax/100%10;
  88.         write_data(bai);
  89.         shi=dianyax%100/10;
  90.         write_data(shi);
  91.         ge=dianyax%10;
  92.         write_data(ge);
  93. */
  94. }
  95. void main()
  96. {

  97.         init();
  98.         read_ad0804();
  99.         display();
  100.         while(1);
  101. }

复制代码

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top