0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ADC0808/0809模拟量检测、数据转换、1602显示驱动的实现

电子开发圈 来源:电子开发圈 2023-01-09 10:10 次阅读

51单片机结构简单,架构体系完备,学习资料丰富,应用领域广泛。通过对51单片机的学习,可帮助小白实现快速入门电子设计,理解电路系统工作原理,为高级嵌入式芯片的学习及开发打下坚实基础。

本篇描述

1、51+Proteus8.10;

2、学习ADC0808/0809模拟检测、数据转换、1602显示驱动;

仿真设计

采用Proteus作为仿真设计工具。Proteus是一款著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

软件设计

采用Keil作为软件设计工具。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。

#include 
#include "SMC1602.h"
#include "DATransform.h"
#define TIME0H 0x3C
#define TIME0L 0xB0


unsigned char uc_Clock=0;    //¶¨Ê±Æ÷0ÖжϼÆÊý
bit b_DATransform=0;


void vShowVoltage(unsigned int uiNumber)
{
  unsigned char ucaNumber[3],ucCount;


  if(uiNumber>999)          
    uiNumber=999;


  ucaNumber[0]=uiNumber/100;                //°Ñ¼ÆËãÊý×ÖµÄÿ¸öλ´æÈëÊý×é¡£
  ucaNumber[1]=(uiNumber-100*(int)ucaNumber[0])/10;              
  ucaNumber[2]=uiNumber-100*(int)ucaNumber[0]-10*ucaNumber[1];


  for(ucCount=0;ucCount<3;ucCount++)
    {
    vShowOneChar(ucaNumber[ucCount]+48);        //´ÓÊ×λµ½ÄλÖðÒ»Êä³ö¡£
    if(ucCount==0)
      vShowOneChar('.');
    }
}


void main()
{
  TMOD=0x01;      //¶¨Ê±Æ÷0£¬Ä£Ê½1¡£
  TH0=TIME0H;
  TL0=TIME0L;
  TR0=1;        //Æô¶¯¶¨Ê±Æ÷¡£
  ET0=1;        //¿ª¶¨Ê±Æ÷Öжϡ£
  EA=1;        //¿ª×ÜÖжÏ
  vdInitialize();
  vWriteCMD(0x84);     //дÈëÏÔʾÆðʼµØÖ·£¨µÚ¶þÐеÚÒ»¸öλÖã
  vShowChar("Voltage:");
  vWriteCMD(0xC9);
  vShowChar("(V)");


  while(1)
    {
    if(b_DATransform==1)
      {
      b_DATransform=0;
      vWriteCMD(0xC4);
      vShowVoltage(uiADTransform());
      }
    }
}


void Time0() interrupt 1
{
  if(uc_Clock==0)
    {
    uc_Clock=5;
    b_DATransform=1;
    }
  else
    uc_Clock--;


  TH0=TIME0H;       //»Ö¸´¶¨Ê±Æ÷0¡£
  TL0=TIME0L;
}

SMC1602.c

#include"SMC1602.h"


void vWriteCMD(unsigned char ucCommand)            
{
  vDelay();        //ÏÈÑÓʱ¡£
  LCDE=1;          //È»ºó°Ñ£Ì£Ã£Ä¸ÄΪдÈëÃüÁî״̬¡£
  LCDRS=0;
  LCDRW=0;
  LCDPORT=ucCommand;      //ÔÙÊä³öÃüÁî¡£
  LCDE=0;          //×îºóÖ´ÐÐÃüÁî¡£
}


void vWriteData(unsigned char ucData)            
{
  vDelay();         //ÏÈÑÓʱ¡£
  LCDE=1;           //È»ºó°Ñ£Ì£Ã£Ä¸ÄΪдÈëÊý¾Ý״̬¡£
  LCDRS=1;
  LCDRW=0;
  LCDPORT=ucData;         //ÔÙÊä³öÊý¾Ý¡£
  LCDE=0;           //×îºóÏÔʾÊý¾Ý¡£
}


void vShowOneChar(unsigned char ucChar)
{
  switch(ucChar)
    {
    case ' ': vWriteData(0x20);break;
    case '!': vWriteData(0x21);break;
    case '"': vWriteData(0x22);break;
    case '#': vWriteData(0x23);break;
    case '$': vWriteData(0x24);break;
    case '%': vWriteData(0x25);break;
    case '&': vWriteData(0x26);break;
    case '>': vWriteData(0x27);break;
    case '(': vWriteData(0x28);break;
    case ')': vWriteData(0x29);break;
    case '*': vWriteData(0x20);break;
    case '+': vWriteData(0x2A);break;
    case '-': vWriteData(0x2D);break;
    case '/': vWriteData(0x2F);break;
    case '=': vWriteData(0x3D);break;
    case '<': vWriteData(0x3E);break;
    case '?': vWriteData(0x3F);break;
    case '.': vWriteData(0x2E);break;
    case ':': vWriteData(0x3A);break;


    case '0': vWriteData(0x30);break;
    case '1': vWriteData(0x31);break;
    case '2': vWriteData(0x32);break;
    case '3': vWriteData(0x33);break;
    case '4': vWriteData(0x34);break;
    case '5': vWriteData(0x35);break;
    case '6': vWriteData(0x36);break;
    case '7': vWriteData(0x37);break;
    case '8': vWriteData(0x38);break;
    case '9': vWriteData(0x39);break;


    case 'A': vWriteData(0x41);break;
    case 'B': vWriteData(0x42);break;
    case 'C': vWriteData(0x43);break;
    case 'D': vWriteData(0x44);break;
    case 'E': vWriteData(0x45);break;
    case 'F': vWriteData(0x46);break;
    case 'G': vWriteData(0x47);break;
    case 'H': vWriteData(0x48);break;
    case 'I': vWriteData(0x49);break;
    case 'J': vWriteData(0x4A);break;
    case 'K': vWriteData(0x4B);break;
    case 'L': vWriteData(0x4C);break;
    case 'M': vWriteData(0x4D);break;
    case 'N': vWriteData(0x4E);break;
    case 'O': vWriteData(0x4F);break;
    case 'P': vWriteData(0x50);break;
    case 'Q': vWriteData(0x51);break;
    case 'R': vWriteData(0x52);break;
    case 'S': vWriteData(0x53);break;
    case 'T': vWriteData(0x54);break;
    case 'U': vWriteData(0x55);break;
    case 'V': vWriteData(0x56);break;
    case 'W': vWriteData(0x57);break;
    case 'X': vWriteData(0x58);break;
    case 'Y': vWriteData(0x59);break;
    case 'Z': vWriteData(0x5A);break;


    case 'a': vWriteData(0x61);break;
    case 'b': vWriteData(0x62);break;
    case 'c': vWriteData(0x63);break;
    case 'd': vWriteData(0x64);break;
    case 'e': vWriteData(0x65);break;
    case 'f': vWriteData(0x66);break;
    case 'g': vWriteData(0x67);break;
    case 'h': vWriteData(0x68);break;
    case 'i': vWriteData(0x69);break;
    case 'j': vWriteData(0x6A);break;
    case 'k': vWriteData(0x6B);break;
    case 'l': vWriteData(0x6C);break;
    case 'm': vWriteData(0x6D);break;
    case 'n': vWriteData(0x6E);break;
    case 'o': vWriteData(0x6F);break;
    case 'p': vWriteData(0x70);break;
    case 'q': vWriteData(0x71);break;
    case 'r': vWriteData(0x72);break;
    case 's': vWriteData(0x73);break;
    case 't': vWriteData(0x74);break;
    case 'u': vWriteData(0x75);break;
    case 'v': vWriteData(0x76);break;
    case 'w': vWriteData(0x77);break;
    case 'x': vWriteData(0x78);break;
    case 'y': vWriteData(0x79);break;
    case 'z': vWriteData(0x7A);break;


    default: break;
    }
}


void vShowChar(unsigned char ucaChar[])
{
  unsigned char ucCount;
  for(ucCount=0;;ucCount++)
    {
    vShowOneChar(ucaChar[ucCount]);
    if(ucaChar[ucCount+1]=='�')
      break;
    }
}


void vDelay()
{
  unsigned int uiCount;
  for(uiCount=0;uiCount<250;uiCount++);
}

SMC1602.h

#ifndef __SMC1602_H__
#define__SMC1602_H__
#include 
#define vdInitialize()  vWriteCMD(0x01);vWriteCMD(0x38);vWriteCMD(0x0C);    //³õʼ»¯
#define LCDRS P3_5  
#define LCDRW P3_6  
#define LCDE P3_7  
#define LCDPORT P0
voidvDelay();//ÑÓʱº¯Êý¡£
voidvWriteCMD(unsignedcharucCommand);//°Ñ1¸öÃüÁîдÈëLCD¡£
voidvWriteData(unsignedcharucData);//°Ñ1¸öÊý¾ÝдÈëLCD¡£
voidvShowOneChar(unsignedcharucChar);
voidvShowChar(unsignedcharucaChar[]);
#endif

DATransform.c

#include 
#define START P3_4  //ATART£¬ALE½Ó¿Ú¡£0->1->0:Æô¶¯ADת»»¡£
#define EOC P3_3   //ת»»Íê±ÏÓÉ0±ä1.
#define OUTPORT P2 


unsigned int uiADTransform()
{
  unsigned int uiResult;


  START=1;       //Æô¶¯ADת»»¡£
  START=0;


  while(EOC==0);     //µÈ´ýת»»½áÊø¡£


  uiResult=OUTPORT;   //³öÈëת»»½á¹û¡£


  uiResult=(100*uiResult)/51;       //´¦ÀíÔËËã½á¹û¡£


  return uiResult;
}

DATransform.h

#ifndef __DATRANSFORM_H__
#define__DATRANSFORM_H__
unsignedintuiADTransform();
#endif

审核编辑:汤梓红
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Proteus
    +关注

    关注

    76

    文章

    1688

    浏览量

    105596
  • 51单片机
    +关注

    关注

    269

    文章

    5649

    浏览量

    120699
  • keil
    +关注

    关注

    68

    文章

    1196

    浏览量

    165311
  • 显示驱动
    +关注

    关注

    1

    文章

    61

    浏览量

    14721
  • ADC0808
    +关注

    关注

    2

    文章

    50

    浏览量

    18376

原文标题:5042-AD0808电压检测+1602显示

文章出处:【微信号:电子开发圈,微信公众号:电子开发圈】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于ADC0808模数转换

    `今天用仿真做了一下模数转换,开始时用的ADC0809,发现一指出现这种“NO model specified for u1"错误,最后还是百度一样它的意思,最后才知道它是“这个元件是没有仿真模型的”。最后用了ADC0808
    发表于 12-15 22:30

    adc0808实现间隔采样转换

    因为测量的是交流量,所以需要间隔采样,最后对采样的结果进行处理。我用的是89c52单片机加adc0808.但是我不知道怎么用adc0808进行间隔采样。希望会的能给我一个用c语言写的具体程序
    发表于 05-14 14:15

    仿真中的ADC0808与实物ADC0809的输出端是倒序的关系吗

    仿真中的ADC0808与实物ADC0809的输出端是倒序的关系吗
    发表于 05-28 11:25

    ADC0808/0809与8031单片机接口设计

    ADC0808/0809与8031单片机接口设计有没有大神会编写ADC0809与8031接口的10位转换最好是汇编语言C语言或者其他的也可以,谢谢大佬们,10位的实在不会写
    发表于 06-14 10:49

    89C51是如何使用ADC0808模数进行转换

    89C51使用ADC0808模数转换1、基本要求简介:1.1、采用中断方式,利用ADC0808实现8路模拟输入信号依次进行A/D
    发表于 07-26 07:47

    如何利用ADC0808实现8路模拟输入信号依次进行A/D转换

    如何利用ADC0808实现8路模拟输入信号依次进行A/D转换
    发表于 09-28 06:05

    通过ADC0808芯片进行高精度的电压转换

    以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换ADC0808ADC0809的简化版本,功能基本相同。一般在硬件仿真时采用
    发表于 12-08 06:57

    如何实现ADC0808/ADC0809的多通道电压采集程序设计?

    如何实现ADC0808/ADC0809的多通道电压采集程序设计?
    发表于 01-24 06:32

    ADC0808/ADC0809,pdf datasheet

    The ADC0808, ADC0809 data acquisition component is amonolithic CMOS device with an 8-bit
    发表于 10-12 08:34 112次下载

    ADC0808_ADC0809英文资料ADC0809引脚图封装应用电路图

    资料提供ADC0808/ADC0809英文Datasheet原版数据手册下载,ADC0809引脚图、封装图、ADC0809应用电路图,
    发表于 09-23 16:09 228次下载

    adc0809adc0808的区别,adc0809能否替代adc0808

     ADC是指将连续变化的模拟信号转换为离散的数字信号的器件。真实世界的模拟信号,例如温度、压力、声音或者图像等,需要转换成更容易储存、处理和
    发表于 10-19 14:48 2.9w次阅读

    adc0808模数转换电路图及程序

     ADC0808是采样分辨率为8位的、以逐次逼近原理进行模/数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换
    发表于 11-21 14:43 2w次阅读

    使用8通道模拟多路复用器的ADC0808ADC0809数据采集设备的使用概述

    本应用笔记讨论了使用8通道模拟多路复用器的ADC0808/ADC0809数据采集设备(DAD)的使用。ADC0808/
    发表于 05-29 19:36 47次下载
    使用8通道<b class='flag-5'>模拟</b>多路复用器的<b class='flag-5'>ADC0808</b>和<b class='flag-5'>ADC0809</b><b class='flag-5'>数据</b>采集设备的使用概述

    adc0808引脚图及功能

    ADC0808 是含8 位A/D 转换器、8 路多路开关,以及与微型计算机兼容的控制逻辑的CMOS组件,其转换方法为逐次逼近型。ADC0808的精度为 1/2LSB。在AD
    的头像 发表于 07-12 14:27 3.2w次阅读
    <b class='flag-5'>adc0808</b>引脚图及功能

    51单片机采用ADC0808检测ADC_LCD1602显示

    51单片机采用ADC0808检测ADC_LCD1602显示系统整体设计具体实现如下代码系统整体设计1)本设计的控制器采用51单片机2)
    发表于 11-17 16:06 37次下载
    51单片机采用<b class='flag-5'>ADC0808</b><b class='flag-5'>检测</b><b class='flag-5'>ADC_LCD1602</b><b class='flag-5'>显示</b>