打印
[51单片机]

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

[复制链接]
967|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mqzhou2006|  楼主 | 2016-4-2 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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读取子函数的函数

}

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

3

帖子

0

粉丝