0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ADC0808/0809模擬量檢測(cè)、數(shù)據(jù)轉(zhuǎn)換、1602顯示驅(qū)動(dòng)的實(shí)現(xiàn)

電子開發(fā)圈 ? 來源:電子開發(fā)圈 ? 2023-01-09 10:10 ? 次閱讀

51單片機(jī)結(jié)構(gòu)簡(jiǎn)單,架構(gòu)體系完備,學(xué)習(xí)資料豐富,應(yīng)用領(lǐng)域廣泛。通過對(duì)51單片機(jī)的學(xué)習(xí),可幫助小白實(shí)現(xiàn)快速入門電子設(shè)計(jì),理解電路系統(tǒng)工作原理,為高級(jí)嵌入式芯片的學(xué)習(xí)及開發(fā)打下堅(jiān)實(shí)基礎(chǔ)。

本篇描述

1、51+Proteus8.10;

2、學(xué)習(xí)ADC0808/0809模擬檢測(cè)、數(shù)據(jù)轉(zhuǎn)換、1602顯示驅(qū)動(dòng);

仿真設(shè)計(jì)

采用Proteus作為仿真設(shè)計(jì)工具。Proteus是一款著名的EDA工具(仿真軟件),從原理圖布圖、代碼調(diào)試到單片機(jī)與外圍電路協(xié)同仿真,一鍵切換到PCB設(shè)計(jì),真正實(shí)現(xiàn)了從概念到產(chǎn)品的完整設(shè)計(jì)。

軟件設(shè)計(jì)

采用Keil作為軟件設(shè)計(jì)工具。Keil提供了包括C編譯器、宏匯編、鏈接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開發(fā)方案,通過一個(gè)集成開發(fā)環(huán)境(μVision)將這些部分組合在一起。

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


unsigned char uc_Clock=0;    //?¨ê±?÷0?D????êy
bit b_DATransform=0;


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


  if(uiNumber>999)          
    uiNumber=999;


  ucaNumber[0]=uiNumber/100;                //°?????êy×?μ???????′?è?êy×é?£
  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);        //′óê×??μ?????eò?ê?3??£
    if(ucCount==0)
      vShowOneChar('.');
    }
}


void main()
{
  TMOD=0x01;      //?¨ê±?÷0£??£ê?1?£
  TH0=TIME0H;
  TL0=TIME0L;
  TR0=1;        //???ˉ?¨ê±?÷?£
  ET0=1;        //?a?¨ê±?÷?D???£
  EA=1;        //?a×ü?D??
  vdInitialize();
  vWriteCMD(0x84);     //D′è???ê??eê?μ??·£¨μú?tDDμúò???????£
  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;          //è?oó°?£ì£?£????aD′è??üá?×′ì??£
  LCDRS=0;
  LCDRW=0;
  LCDPORT=ucCommand;      //?ùê?3??üá??£
  LCDE=0;          //×?oó?′DD?üá??£
}


void vWriteData(unsigned char ucData)            
{
  vDelay();         //?è?óê±?£
  LCDE=1;           //è?oó°?£ì£?£????aD′è?êy?Y×′ì??£
  LCDRS=1;
  LCDRW=0;
  LCDPORT=ucData;         //?ùê?3?êy?Y?£
  LCDE=0;           //×?oó??ê?êy?Y?£
}


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);    //3?ê??ˉ
#define LCDRS P3_5  
#define LCDRW P3_6  
#define LCDE P3_7  
#define LCDPORT P0
voidvDelay();//?óê±oˉêy?£
voidvWriteCMD(unsignedcharucCommand);//°?1???üá?D′è?LCD?£
voidvWriteData(unsignedcharucData);//°?1??êy?YD′è?LCD?£
voidvShowOneChar(unsignedcharucChar);
voidvShowChar(unsignedcharucaChar[]);
#endif

DATransform.c

#include 
#define START P3_4  //ATART£?ALE?ó?ú?£0->1->0:???ˉAD×a???£
#define EOC P3_3   //×a??íê±?óé0±?1.
#define OUTPORT P2 


unsigned int uiADTransform()
{
  unsigned int uiResult;


  START=1;       //???ˉAD×a???£
  START=0;


  while(EOC==0);     //μè′y×a???áê??£


  uiResult=OUTPORT;   //3?è?×a???á1??£


  uiResult=(100*uiResult)/51;       //′|àí?????á1??£


  return uiResult;
}

DATransform.h

#ifndef __DATRANSFORM_H__
#define__DATRANSFORM_H__
unsignedintuiADTransform();
#endif

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Proteus
    +關(guān)注

    關(guān)注

    78

    文章

    1692

    瀏覽量

    106207
  • 51單片機(jī)
    +關(guān)注

    關(guān)注

    273

    文章

    5696

    瀏覽量

    122755
  • keil
    +關(guān)注

    關(guān)注

    68

    文章

    1208

    瀏覽量

    166448
  • 顯示驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    1

    文章

    63

    瀏覽量

    14916
  • ADC0808
    +關(guān)注

    關(guān)注

    2

    文章

    52

    瀏覽量

    18427

原文標(biāo)題:5042-AD0808電壓檢測(cè)+1602顯示

文章出處:【微信號(hào):電子開發(fā)圈,微信公眾號(hào):電子開發(fā)圈】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    基于ADC0808模數(shù)轉(zhuǎn)換

    `今天用仿真做了一下模數(shù)轉(zhuǎn)換,開始時(shí)用的ADC0809,發(fā)現(xiàn)一指出現(xiàn)這種“NO model specified for u1"錯(cuò)誤,最后還是百度一樣它的意思,最后才知道它是“這個(gè)元件是沒有仿真模型的”。最后用了ADC0808
    發(fā)表于 12-15 22:30

    仿真中的ADC0808與實(shí)物ADC0809的輸出端是倒序的關(guān)系嗎

    仿真中的ADC0808與實(shí)物ADC0809的輸出端是倒序的關(guān)系嗎
    發(fā)表于 05-28 11:25

    ADC0808/0809與8031單片機(jī)接口設(shè)計(jì)

    ADC0808/0809與8031單片機(jī)接口設(shè)計(jì)有沒有大神會(huì)編寫ADC0809與8031接口的10位轉(zhuǎn)換最好是匯編語(yǔ)言C語(yǔ)言或者其他的也可以,謝謝大佬們,10位的實(shí)在不會(huì)寫
    發(fā)表于 06-14 10:49

    89C51是如何使用ADC0808模數(shù)進(jìn)行轉(zhuǎn)換

    89C51使用ADC0808模數(shù)轉(zhuǎn)換1、基本要求簡(jiǎn)介:1.1、采用中斷方式,利用ADC0808實(shí)現(xiàn)8路模擬輸入信號(hào)依次進(jìn)行A/D
    發(fā)表于 07-26 07:47

    如何利用ADC0808實(shí)現(xiàn)8路模擬輸入信號(hào)依次進(jìn)行A/D轉(zhuǎn)換?

    如何利用ADC0808實(shí)現(xiàn)8路模擬輸入信號(hào)依次進(jìn)行A/D轉(zhuǎn)換?
    發(fā)表于 09-28 06:05

    通過ADC0808芯片進(jìn)行高精度的電壓轉(zhuǎn)換

    以根據(jù)地址碼鎖存譯碼后的信號(hào),只選通8路模擬輸入信號(hào)中的一個(gè)進(jìn)行A/D轉(zhuǎn)換ADC0808ADC0809的簡(jiǎn)化版本,功能基本相同。一般在硬件仿真時(shí)采用
    發(fā)表于 12-08 06:57

    如何實(shí)現(xiàn)ADC0808/ADC0809的多通道電壓采集程序設(shè)計(jì)?

    如何實(shí)現(xiàn)ADC0808/ADC0809的多通道電壓采集程序設(shè)計(jì)?
    發(fā)表于 01-24 06:32

    ADC0808/ADC0809,pdf datasheet

    The ADC0808, ADC0809 data acquisition component is amonolithic CMOS device with an 8-bit
    發(fā)表于 10-12 08:34 ?112次下載

    adc0809adc0808的區(qū)別,adc0809能否替代adc0808

     ADC是指將連續(xù)變化的模擬信號(hào)轉(zhuǎn)換為離散的數(shù)字信號(hào)的器件。真實(shí)世界的模擬信號(hào),例如溫度、壓力、聲音或者圖像等,需要轉(zhuǎn)換成更容易儲(chǔ)存、處理和
    發(fā)表于 10-19 14:48 ?3w次閱讀

    adc0808模數(shù)轉(zhuǎn)換電路圖及程序

     ADC0808是采樣分辨率為8位的、以逐次逼近原理進(jìn)行模/數(shù)轉(zhuǎn)換的器件。其內(nèi)部有一個(gè)8通道多路開關(guān),它可以根據(jù)地址碼鎖存譯碼后的信號(hào),只選通8路模擬輸入信號(hào)中的一個(gè)進(jìn)行A/D轉(zhuǎn)換
    發(fā)表于 11-21 14:43 ?2.1w次閱讀

    ADC0808/0809與8031單片機(jī)接口設(shè)計(jì)

    ADC0808/0809與8031單片機(jī)的硬件接口有三種方式,查詢方式,中斷方式和等待延時(shí)方式。究竟采用何種方式,應(yīng)視具體情況,按總體要求而選擇。
    發(fā)表于 11-21 16:53 ?1.1w次閱讀

    使用8通道模擬多路復(fù)用器的ADC0808ADC0809數(shù)據(jù)采集設(shè)備的使用概述

    本應(yīng)用筆記討論了使用8通道模擬多路復(fù)用器的ADC0808/ADC0809數(shù)據(jù)采集設(shè)備(DAD)的使用。ADC0808/
    發(fā)表于 05-29 19:36 ?47次下載
    使用8通道<b class='flag-5'>模擬</b>多路復(fù)用器的<b class='flag-5'>ADC0808</b>和<b class='flag-5'>ADC0809</b><b class='flag-5'>數(shù)據(jù)</b>采集設(shè)備的使用概述

    51單片機(jī)采用ADC0808檢測(cè)ADC_LCD1602顯示

    51單片機(jī)采用ADC0808檢測(cè)ADC_LCD1602顯示系統(tǒng)整體設(shè)計(jì)具體實(shí)現(xiàn)如下代碼系統(tǒng)整體設(shè)計(jì)1)本設(shè)計(jì)的控制器采用51單片機(jī)2)
    發(fā)表于 11-17 16:06 ?38次下載
    51單片機(jī)采用<b class='flag-5'>ADC0808</b><b class='flag-5'>檢測(cè)</b><b class='flag-5'>ADC_LCD1602</b><b class='flag-5'>顯示</b>

    ADC0808/ADC0809模數(shù)轉(zhuǎn)換數(shù)據(jù)

    電子發(fā)燒友網(wǎng)站提供《ADC0808/ADC0809模數(shù)轉(zhuǎn)換數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:42 ?1次下載
    <b class='flag-5'>ADC0808</b>/<b class='flag-5'>ADC0809</b>模數(shù)<b class='flag-5'>轉(zhuǎn)換</b>器<b class='flag-5'>數(shù)據(jù)</b>表

    adc0809輸入電壓范圍 adc0809adc0808區(qū)別

    ADC0809ADC0808都是8位模數(shù)轉(zhuǎn)換器(ADC),它們可以將模擬信號(hào)轉(zhuǎn)換為數(shù)字信號(hào)。這
    的頭像 發(fā)表于 10-21 09:30 ?94次閱讀