找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2120|回复: 1
打印 上一主题 下一主题
收起左侧

51+LCD1602+ADC0808

[复制链接]
跳转到指定楼层
楼主
ID:212964 发表于 2017-6-20 15:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1、LCD1602.c源程序
//液晶控制与显示驱动程序
#include<reg52.h>
#include<intrins.h>
#include<string.h>
#include"LCD1602.h"
#include"ADC0808.h"
//---------------忙检查-------------------//
ucharLCD_Busy_Check()
{
    ucharLCD_Status;
    RS = 0;
    RW = 1;
    E = 1;
    delay4us();
    LCD_Status = P0;
    E = 0;
    return LCD_Status;
}
//--------------向LCD写入命令--------------------//
voidWrite_LCD_Command(uchar cmd)
{
    while((LCD_Busy_Check()&0x80)==0x80);     //忙等待
    RS = 0;
    RW = 0;
    E  =0;
    P0 = cmd;
    delay4us();
    E = 1;
    delay4us();
    E = 0;
}
//-----------向LCD写入一个字节的数据函数-----------------*/
voidWrite_LCD_Data(uchar dat)
{
    while((LCD_Busy_Check()&0x80)==0x80);
    RS = 1;
    RW = 0;
    E  =0;
    P0 = dat;
    delay4us();
    E = 1;
    delay4us();
    E = 0;
}
//-----------LCD初始化-----------------*/
voidInitialize_LCD1602() //液晶初始化函数
{
   Write_LCD_Command(0x38);delay50us(10);    //功能设置,数据长度为8位,双行显示,5×7点阵字体
   Write_LCD_Command(0x0C);delay50us(10); // 显示开,关光标
   Write_LCD_Command(0x06);delay50us(10); //字符进入模式:屏幕不动,字符后移
   Write_LCD_Command(0x01); delay50us(10);//清屏
}
//-----------在LCD上显示字符串-----------------*/
voidLCD_Display(uchar *str)
{
  uchar i;
  for(i=0;i<strlen(str);i++)
    {
     Write_LCD_Data(str);
     delay50us(100);
    }
}
2、lCD1602_H头文件
#ifndef__lCD1602_H__
#define __LCD1602_H__
#include<reg52.h>
#definedat_port P0
#defineuchar unsigned char
#defineuint unsigned int
#definedelay4us() {_nop_();_nop_();_nop_();_nop_();}
sbitRS=P2^0;//RS=1 数据 RS=0 命令
sbitRW=P2^1;//RW=1 读取 RW=0 写入
sbitE=P2^2;//E 使能信号
ucharLCD_Busy_Check();//忙检查
voidWrite_LCD_Command(uchar cmd);//向LCD写入命令
voidWrite_LCD_Data(uchar dat);  //向LCD写入一个字节的数据函数
voidInitialize_LCD1602(); //液晶初始化函数
voidLCD_Display(uchar *str);//在LCD上显示字符串
#endif
3、ADC0808.C源程序
#include<reg52.h>
#include<intrins.h>
#include"ADC0808.h"
unsignedlong dat_adc0808;
uchardisplay_buffer[][16]={
                             {"Currentvoltage:"},
                             {" (CH) =0.00V"}
                            };
voiddelay50us(uint m)
{
   uint n,k;
   for(n=m;n>0;n--)
    for(k=25;k>0;k--);
}
uintadc0808_init()      // AD初始化
{
  START=0;
  OE=0;
  START=1;
  START=0;
   while(EOC==0);
   OE=1;
   dat_adc0808=P1;
   OE=0;
  returndat_adc0808;
}
void Refresh_show()     //刷新显示
{
   uintt=dat_adc0808*500.0/255;    //
  display_buffer[1][7] = t/100+'0';    //整数位
  display_buffer[1][9] = t/10%10+'0';  //两个小数位
   display_buffer[1][10]= t%10+'0';
}
4、ADC0808.h 头文件
#ifndef__ADC0808_H__
#define __ADC0808_H__
#include<reg52.h>
#definedata_port P1
#defineuchar unsigned char
#defineuint unsigned int
sbitSTART=P2^3;
sbitEOC=P2^4;
sbitOE=P2^5;
voiddelay50us(uint m);//  延时
uintadc0808_init();      // AD初始化
voidRefresh_show();
#endif
5、main.c 主程序
#include<reg52.h>
#include<intrins.h>
#include"LCD1602.h"
#include"ADC0808.h"
sbitCLOCK=P2^6;
externuchar display_buffer[][16];
voidmain()
{
   TMOD=0x02;
   TH0=0x14;
   TL0=0x00;
   IE=0x82;
   TR0=1;
  Initialize_LCD1602();
  delay50us(10);
  Write_LCD_Command(0x80);//设置显示的初始位置
  LCD_Display(display_buffer[0]);//显示"Thevoltage is: "  
   while(1)
   {  
      adc0808_init();
     Refresh_show();   
     Write_LCD_Command(0xC0);//设置显示的初始位置
     LCD_Display(display_buffer[1]); //显示测得的数据
      
   }
}
voidTimer0_INT() interrupt 1
{
   CLOCK=!CLOCK;  
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:212595 发表于 2018-4-28 20:53 | 只看该作者
可否上个电路图
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表